# 许可证合规检查

检查仓库的 LICENSE 文件完整性、一致性以及源码版权声明。

## 检查步骤

### 1. LICENSE 文件检查

```bash
# 检查 LICENSE 文件是否存在
test -f LICENSE && echo "LICENSE 存在" || echo "缺少 LICENSE 文件"

# 读取 LICENSE 内容，识别许可证类型
cat LICENSE
```

### 2. 许可证类型识别

通过 LICENSE 文本关键词自动判断：

| 关键词 | 许可证类型 |
|--------|-----------|
| `Mulan Permissive Software License` | Mulan PSL v2 |
| `Apache License, Version 2.0` | Apache-2.0 |
| `Permission is hereby granted, free of charge` (且无 copyleft 条款) | MIT |
| `GNU GENERAL PUBLIC LICENSE` + `Version 3` | GPL-3.0 |
| `GNU GENERAL PUBLIC LICENSE` + `Version 2` | GPL-2.0 |
| `GNU AFFERO GENERAL PUBLIC LICENSE` | AGPL-3.0 |
| `GNU LESSER GENERAL PUBLIC LICENSE` | LGPL |
| `Redistribution and use in source and binary forms` + 3 条款 | BSD-3-Clause |
| `Redistribution and use in source and binary forms` + 2 条款 | BSD-2-Clause |
| `Mozilla Public License` | MPL-2.0 |

### 3. 声明一致性检查

```bash
# 检查 package.json 中的 license 字段
grep -E '"license"\s*:' package.json 2>/dev/null

# 检查 go.mod 是否声明了许可证（Go 社区通常依赖 LICENSE 文件）
test -f go.mod && echo "Go 项目 — 许可证以 LICENSE 文件为准"

# 检查 npm 子包的 license 声明
grep -E '"license"\s*:' npm/package.json 2>/dev/null
```

### 4. 占位符检查

```bash
# 检查 LICENSE 中是否有未填写的占位符
grep -n '\[year\]\|\[Year\]\|\[name of copyright holder\]\|\[yyyy\]' LICENSE
```

### 5. 源码版权头检查

```bash
# 检查 Go 源文件是否有版权声明（前 10 行）
find . -name "*.go" -not -path "./vendor/*" | while read f; do
  if ! head -10 "$f" | grep -qiE 'copyright|license|SPDX-License-Identifier'; then
    echo "缺少版权头: $f"
  fi
done
```

## 输出示例

```
== 许可证合规报告 ==

[✓] LICENSE 文件: Mulan PSL v2（存在）
[✗] npm/package.json: 声明 Apache-2.0（与根 LICENSE 不一致）
[✗] 占位符: LICENSE 中 [Year] 和 [name of copyright holder] 未填写
[✗] 源码版权头: 25 个 .go 文件中 25 个缺少版权声明
```

## Mulan PSL v2 版权头模板

```
Copyright (c) [Year] [name of copyright holder]
Mulan Permissive Software License，Version 2

```

每份源文件开头建议附加上述声明。

## 兼容性矩阵

| 项目许可证 | 可使用 MIT | 可使用 Apache-2.0 | 可使用 BSD | 可使用 GPL | 可使用 MulanPSL |
|-----------|-----------|-------------------|-----------|-----------|----------------|
| MIT | ✓ | ✓ | ✓ | ✓ | ✓ |
| Apache-2.0 | ✓ | ✓ | ✓ | ✗ (仅 GPLv3) | ✓ |
| BSD-3-Clause | ✓ | ✓ | ✓ | ✗ | ✓ |
| BSD-2-Clause | ✓ | ✓ | ✓ | ✗ | ✓ |
| Mulan PSL v2 | ✓ | ✓ | ✓ | ✗ | ✓ |
| GPL-3.0 | ✗ | ✓ | ✗ | ✓ | ✗ |
| GPL-2.0 | ✗ | ✗ | ✗ | ✓ | ✗ |
| AGPL-3.0 | ✗ | ✓ (仅 AGPLv3+) | ✗ | ✗ (GPLv3 → AGPLv3 OK) | ✗ |
