Skip to content

依赖协议审计 - AI 自动化引导

本页面专为 AI 助手设计

用户可以将本页面的 URL 发送给 AI 助手(如 Claude Code、Cursor、Google Antigravity 等),AI 助手会阅读本页内容,自动完成依赖协议审计、生成合规报告、并安装持续检查 Skill。

使用示例

将以下提示词发送给你的 AI 助手:

"使用 websearch 访问 https://tpscsm-docs.pages.dev/license-audit/ 按照里面的步骤帮我完成依赖协议审计"

AI 会阅读本页内容,自动扫描项目依赖、查询协议、生成合规报告、安装持续检查 Skill。


面向 AI 助手的说明

你正在阅读一份依赖协议审计自动化指南。你需要对用户当前项目的所有直接依赖进行协议(License)审计,生成合规报告文件,并安装一个持续检查的 Skill,确保后续依赖变更时能自动触发重新检查。

分发场景前提

⚠️ 重要前提:本审计以"开源分发"为基准。

被审计的项目将上传到 GitHub 公开仓库,属于开源分发形式。所有后续的合规判定均以此为基准。这意味着:

  1. 所有依赖必须是开源协议 — 依赖必须具有经 OSI 认证的开源协议(如 MIT、Apache-2.0、GPL 等)。未知协议(UNKNOWN)或非开源协议视为不合规。
  2. 项目协议必须与依赖协议兼容 — 项目自身的协议必须与所有依赖的协议在分发场景下兼容(参见附录 A 的兼容性矩阵)。
  3. 必须满足分发要求 — 必须满足所有依赖协议的分发要求,包括但不限于:保留版权声明(attribution)、Copyleft 传染性义务、专利授权声明等。

强制执行规则

你必须严格遵守以下规则,不得违反:

  1. 必须创建 Checklist — 在开始之前,创建以下完整的 checklist,在整个流程中持续跟踪进度:
☐ Step 0: 环境检测 — 检测项目类型和依赖清单文件
☐ Step 0.5: 检查项目自身协议 — 识别项目 LICENSE 文件的 SPDX 标识符
☐ Step 1: 提取直接依赖 — 从依赖清单中提取所有直接依赖
☐ Step 2: 查询协议 — 使用 WebSearch 查询每个依赖的协议,并判定是否为开源协议
☐ Step 3: 生成 LICENSE.LIST — 生成依赖协议清单文件
☐ Step 4: 生成 LICENSE — 生成合规参考报告,含项目协议与依赖协议兼容性判定
☐ Step 5: 安装 Skill — 安装依赖协议持续检查 Skill
☐ Step 6: 生成审计报告 — 生成完整的中文审计报告,含版权协议合规结论
  1. 必须逐步执行 — 按照 Step 0 到 Step 6(含 Step 0.5)的顺序逐一执行,禁止跳过任何步骤禁止合并步骤
  2. 必须通知用户 — 每个步骤开始执行前完成后都必须通知用户当前进度。
  3. 必须完成每个子任务 — 每个步骤内部的子任务也必须全部完成,不得偷懒省略。
  4. 遇到错误必须处理 — 如果某个步骤执行失败,必须尝试修复或告知用户具体的错误原因,不得静默跳过。
  5. 只处理直接依赖 — 不要处理传递依赖(transitive dependencies),只审计用户直接声明的依赖。

Step 0: 环境检测

目标: 检测当前项目类型,识别包管理器和依赖清单文件。

0.1 检测项目类型

检查用户当前项目根目录中的文件,判断项目类型:

检测文件项目类型包管理器依赖清单文件
package.jsonNode.js / 前端项目npm / yarn / pnpmpackage.json
go.modGo 项目go modulesgo.mod
requirements.txtPython 项目piprequirements.txt
pyproject.tomlPython 项目pip / poetrypyproject.toml
Cargo.tomlRust 项目cargoCargo.toml
*.csproj.NET 项目nuget*.csproj

如果项目中包含多种依赖清单文件(例如同时有 package.jsongo.mod),则所有类型都需要审计。

0.2 处理未识别的项目

如果项目不匹配上述任何类型,通知用户:

我无法自动识别你的项目类型。请告诉我:

  1. 你的项目使用什么编程语言?
  2. 依赖声明在哪个文件中?

等待用户回复后,手动指定依赖清单文件继续执行。

完成后更新 checklist:

☑ Step 0: 环境检测 — 检测项目类型和依赖清单文件

Step 0.5: 检查项目自身协议

目标: 识别项目自身使用的开源协议,作为后续兼容性判定的基准。

0.5.1 读取 LICENSE 文件

检查项目根目录是否存在 LICENSELICENSE.md 文件:

  • 如果存在,读取文件内容
  • 如果不存在,跳转到 0.5.3

0.5.2 识别协议类型

根据 LICENSE 文件内容,识别其 SPDX 协议标识符。常见的识别方式:

关键文本特征对应协议
"MIT License" 或 "Permission is hereby granted, free of charge"MIT
"Apache License, Version 2.0"Apache-2.0
"GNU GENERAL PUBLIC LICENSE Version 3"GPL-3.0-only
"GNU GENERAL PUBLIC LICENSE Version 2"GPL-2.0-only
"GNU LESSER GENERAL PUBLIC LICENSE"LGPL-3.0-only 或 LGPL-2.1-only
"BSD 3-Clause" 或 "Redistribution and use in source and binary forms"BSD-3-Clause
"ISC License"ISC

如果无法通过文件内容识别,可以使用 WebSearch 搜索 "<项目名称>" site:github.com license 辅助确认。

记录结果: 将识别到的 SPDX 标识符记录下来,后续 Step 4 兼容性判定会用到。

0.5.3 处理特殊情况

场景 A:有 LICENSE 文件且可识别

通知用户:

已识别项目协议为 <SPDX 标识符>(如 MIT),将以此作为后续兼容性判定的基准。

场景 B:有 LICENSE 文件但无法识别

通知用户:

项目中存在 LICENSE 文件,但内容为自定义协议或无法自动识别其 SPDX 标识符。 请确认项目使用的协议:

  1. 这是一个标准开源协议?请告诉我协议名称
  2. 这是自定义协议?请注意:自定义协议可能与某些依赖协议不兼容
  3. 需要更换为标准开源协议?建议选择 MIT、Apache-2.0 或 GPL-3.0

等待用户回复后,记录确认的协议标识符继续执行。

场景 C:没有 LICENSE 文件

通知用户:

⚠️ 项目没有 LICENSE 文件。 作为开源分发的项目,必须有明确的协议声明。没有协议的代码在法律上默认"保留所有权利",他人无权使用、修改或分发。

请选择一个开源协议:

  1. MIT — 最宽松,允许任何用途,只需保留版权声明
  2. Apache-2.0 — 宽松 + 专利授权保护
  3. GPL-3.0 — Copyleft,衍生作品须同协议开源
  4. 其他(请指定)

等待用户选择后,记录协议标识符继续执行。

完成后更新 checklist:

☑ Step 0.5: 检查项目自身协议 — 项目协议为 <SPDX 标识符>

Step 1: 提取直接依赖

目标: 从依赖清单文件中提取所有直接依赖的名称和版本。

1.1 读取依赖清单文件

根据项目类型,按以下规则提取直接依赖(不含传递依赖):

Node.js (package.json)

读取 package.json 中的 dependencies 字段。不要读取 devDependenciespeerDependenciesoptionalDependencies

json
{
  "dependencies": {
    "express": "^4.18.2",    // ← 提取这些
    "lodash": "^4.17.21"
  },
  "devDependencies": {
    "typescript": "^5.0.0"   // ← 忽略这些
  }
}

Go (go.mod)

读取 go.modrequire 块的依赖。不要提取带有 // indirect 注释的传递依赖。

go
require (
    github.com/gin-gonic/gin v1.9.1          // ← 提取这个
    github.com/go-sql-driver/mysql v1.7.1     // ← 提取这个
    golang.org/x/net v0.10.0 // indirect      // ← 忽略这个
)

Python (requirements.txt)

逐行读取,每行一个依赖。忽略注释行(以 # 开头)和空行。

flask==2.3.2          # ← 提取
requests>=2.28.0      # ← 提取
# dev dependency       # ← 忽略

Python (pyproject.toml)

读取 [project.dependencies][tool.poetry.dependencies] 中的依赖。不要读取 [project.optional-dependencies][tool.poetry.dev-dependencies]

Rust (Cargo.toml)

读取 [dependencies] 部分。不要读取 [dev-dependencies][build-dependencies]

.NET (*.csproj)

读取 <PackageReference> 标签中的 IncludeVersion 属性。

1.2 生成待查询列表

将提取的依赖整理成一个列表,格式如下:

1. express (^4.18.2) — npm
2. lodash (^4.17.21) — npm
3. github.com/gin-gonic/gin (v1.9.1) — go
...

通知用户:

共检测到 N 个直接依赖,接下来将逐一查询其协议信息。

1.3 处理空依赖

如果依赖清单为空(没有直接依赖),通知用户:

项目没有直接依赖,无需进行协议审计。流程结束。

完成后更新 checklist:

☑ Step 1: 提取直接依赖 — 从依赖清单中提取所有直接依赖

Step 2: 查询协议

目标: 使用 WebSearch 查询每个直接依赖的协议类型。

2.1 逐一搜索依赖协议

对每个依赖,使用 WebSearch 进行搜索。使用以下推荐搜索词模板以提高准确性:

生态系统推荐搜索词示例
npm<包名> npm package licenseexpress npm package license
Go<模块路径> go module licensegithub.com/gin-gonic/gin go module license
Python<包名> pypi licenseflask pypi license
Rust<包名> crates.io licenseserde crates.io license
.NET<包名> nuget licenseNewtonsoft.Json nuget license

2.2 记录搜索结果

对每个依赖,记录以下信息:

  • SPDX 协议标识符:如 MITApache-2.0GPL-3.0-only 等。参考本页末尾的协议兼容性参考表进行标准化。
  • 来源 URL:协议信息的来源页面(如 npm 包页面、GitHub 仓库等)
  • 确认状态已确认待确认
  • 开源状态:判定该协议是否为开源协议
    • ✅ 开源:经 OSI 认证的开源协议(MIT、BSD-2-Clause、BSD-3-Clause、ISC、Apache-2.0、GPL-2.0、GPL-3.0、LGPL-2.1、LGPL-3.0、MPL-2.0、AGPL-3.0、Unlicense、CC0-1.0 等)
    • ⚠️ 非传统开源:非 OSI 认证但有条件允许使用的协议(CC-BY-4.0、CC-BY-SA-4.0 等);或限制商业用途的协议(CC-BY-NC-4.0 等)
    • ❌ 非开源:自定义协议、私有协议、商业协议(BSL-1.1、SSPL-1.0 等限制性协议也归入此类)
    • ❌ 无法验证:UNKNOWN,无法通过搜索确定协议类型

2.2.1 搜索结果记录示例

依赖名称协议 (SPDX)来源 URL确认状态开源状态
expressMIThttps://www.npmjs.com/package/express已确认✅ 开源
some-libCC-BY-NC-4.0https://github.com/xxx/some-lib已确认⚠️ 非传统开源
private-tool自定义协议https://example.com/private-tool已确认❌ 非开源
unknown-libUNKNOWN待确认❌ 无法验证

2.3 交叉验证不确定的结果

如果某个依赖的搜索结果不明确(多个来源给出不同协议),进行二次搜索:

  • 搜索词:<包名> github LICENSE file
  • 或搜索词:<包名> SPDX license identifier

如果二次搜索仍无法确定,将该依赖标记为 UNKNOWN

2.4 批量搜索进度通知

每完成 5 个依赖的搜索,通知用户当前进度:

协议查询进度:已完成 10/25,目前未发现风险协议。

或:

协议查询进度:已完成 15/25,发现 2 个需要关注的协议(GPL-3.0、AGPL-3.0)。

完成后更新 checklist:

☑ Step 2: 查询协议 — 使用 WebSearch 查询每个依赖的协议

Step 3: 生成 LICENSE.LIST

目标: 在项目根目录生成 LICENSE.LIST 文件。

3.1 文件格式

使用以下 Markdown 格式生成 LICENSE.LIST 文件:

markdown
# 依赖协议清单 (LICENSE.LIST)

> 本文件由 AI 助手自动生成,记录项目所有直接依赖的协议信息。
> 生成时间:YYYY-MM-DD
> 审计工具:AI 依赖协议审计 (https://tpscsm-docs.pages.dev/license-audit/)

## 统计摘要

| 协议类型 | 数量 | 风险等级 |
|---------|------|---------|
| MIT | 15 | ✅ 低风险 |
| Apache-2.0 | 5 | ✅ 低风险 |
| BSD-3-Clause | 3 | ✅ 低风险 |
| GPL-3.0-only | 1 | ⚠️ 需关注 |
| UNKNOWN | 1 | ❌ 需手动确认 |

**总计:** 25 个直接依赖

## 依赖详情

| 序号 | 依赖名称 | 版本 | 协议 (SPDX) | 来源 | 风险 | 备注 |
|------|---------|------|-------------|------|------|------|
| 1 | express | ^4.18.2 | MIT | https://www.npmjs.com/package/express | ✅ | |
| 2 | some-gpl-lib | ^1.0.0 | GPL-3.0-only | https://github.com/xxx/some-gpl-lib | ⚠️ | 分发时须开源 |
| 3 | unknown-lib | ^2.0.0 | UNKNOWN | — | ❌ | 需手动确认协议 |

3.2 风险标记规则

  • 低风险:MIT、BSD-2-Clause、BSD-3-Clause、ISC、Apache-2.0、Unlicense、CC0-1.0
  • ⚠️ 需关注:GPL-2.0、GPL-3.0、AGPL-3.0、LGPL-2.1、LGPL-3.0、MPL-2.0、CC-BY-SA-4.0、BSL-1.1、SSPL-1.0
  • 需手动确认:UNKNOWN、CC-BY-NC-4.0、自定义协议

3.3 写入文件

将生成的内容写入项目根目录的 LICENSE.LIST 文件。如果文件已存在,先通知用户:

项目中已存在 LICENSE.LIST 文件,是否覆盖?

等待用户确认后再写入。

完成后更新 checklist:

☑ Step 3: 生成 LICENSE.LIST — 生成依赖协议清单文件

Step 4: 生成合规 LICENSE

目标: 在项目根目录生成 LICENSE 合规参考报告。

重要说明: 这是一份合规参考报告,不是具有法律约束力的协议文件。目的是帮助开发者了解项目的协议合规情况。

4.1 分析协议兼容性

根据本页末尾的协议兼容性参考表,分析所有依赖的协议,确定:

  1. 最严格的继承限制:如果包含 GPL 依赖,项目在分发时须遵守 GPL 要求
  2. 所有 attribution 要求:哪些协议要求保留版权声明(MIT、BSD、Apache 等)
  3. 商用限制:是否有依赖禁止商业用途(CC-NC 等)
  4. 分发限制:是否有依赖限制分发方式
  5. 项目协议与依赖协议兼容性:逐一检查每个依赖协议与项目协议的兼容性

4.1.1 项目协议与依赖协议兼容性检查

使用本页附录 A 中的协议兼容性矩阵,逐一检查项目协议(Step 0.5 识别的协议)与每个依赖协议的兼容关系:

  1. 在矩阵中找到项目协议所在的行
  2. 找到依赖协议所在的列
  3. 查看交叉点的判定结果:
    • — 兼容,无需额外操作
    • ⚠️ — 有条件兼容,需要满足特定条件(参见矩阵脚注)
    • — 不兼容,分发时存在协议冲突

对于每个 不兼容的依赖,记录:

  • 冲突原因(如"MIT 项目不能在分发时包含 GPL-3.0 依赖")
  • 修复建议:
    • 方案 A:将项目协议更换为与该依赖兼容的协议
    • 方案 B:替换该依赖为使用兼容协议的替代库
    • 方案 C:移除该依赖

如果依赖协议不在矩阵中,参见附录 A 的"矩阵外协议处理规则"。

4.2 文件格式

使用以下格式生成 LICENSE 文件:

markdown
# 项目协议合规报告

> 本文件由 AI 助手自动生成,旨在帮助了解项目的协议合规情况。
> 本文件为合规参考,不构成法律建议。如有疑问请咨询法律专业人士。
> 生成时间:YYYY-MM-DD
> 审计工具:AI 依赖协议审计 (https://tpscsm-docs.pages.dev/license-audit/)

## 项目协议

[此处填写项目自身的协议,如果项目已有协议则引用,如果没有则提示用户选择]

## 版权协议合规结论

> 本结论基于项目协议与所有直接依赖协议的兼容性分析,以开源分发为前提。

### ✅ 合规 — 可开源分发

[如果所有依赖协议与项目协议兼容,且所有依赖均为开源协议:]

项目协议 `<项目 SPDX>` 与所有 XX 个直接依赖的协议兼容,满足开源分发要求。

分发时须满足以下义务:
- [列出 attribution 要求]
- [列出其他分发义务]

### ❌ 不合规 — 不可分发

[如果存在不兼容或非开源依赖:]

项目协议 `<项目 SPDX>` 与以下依赖存在合规问题:

| 序号 | 依赖名称 | 依赖协议 | 问题类型 | 冲突说明 | 修复建议 |
|------|---------|---------|---------|---------|---------|
| 1 | some-gpl-lib | GPL-3.0 | 协议不兼容 | MIT 项目不能包含 GPL 依赖并分发 | 将项目改为 GPL-3.0 或移除该依赖 |
| 2 | unknown-lib | UNKNOWN | 协议未知 | 无法验证合规性 | 联系维护者确认协议或替换 |
| 3 | private-tool | 自定义协议 | 非开源 | 不满足开源分发要求 | 替换为开源替代库 |

**在解决上述问题之前,项目不应进行公开分发。**

## 依赖协议摘要

- 宽松协议 (MIT/BSD/ISC): XX 个 — ✅ 无特殊限制
- Apache-2.0: XX 个 — ✅ 需保留 NOTICE 和版权声明
- 弱 Copyleft (LGPL/MPL): XX 个 — ⚠️ 修改部分须开源
- 强 Copyleft (GPL/AGPL): XX 个 — ⚠️ 分发时须开源衍生作品
- 未知协议: XX 个 — ❌ 需手动确认

## 协议兼容性详情

基于项目协议 `<项目 SPDX>` 与各依赖协议的逐项判定结果:

### ✅ 兼容的依赖

| 依赖名称 | 依赖协议 | 兼容性 | 分发义务 |
|---------|---------|--------|---------|
| express | MIT | ✅ 兼容 | 保留版权声明 |
| lodash | MIT | ✅ 兼容 | 保留版权声明 |
| axios | MIT | ✅ 兼容 | 保留版权声明 |

### ⚠️ 有条件兼容的依赖

| 依赖名称 | 依赖协议 | 条件 | 当前使用方式是否满足 |
|---------|---------|------|-------------------|
| some-lgpl-lib | LGPL-3.0 | 动态链接可豁免 | [需确认] |

### ❌ 不兼容的依赖

| 依赖名称 | 依赖协议 | 冲突原因 | 修复建议 |
|---------|---------|---------|---------|
| some-gpl-lib | GPL-3.0 | 项目协议 MIT 与 GPL-3.0 不兼容 | 方案 A/B/C |

## 第三方协议声明

[按协议类型分组,列出每个依赖的版权声明]

### MIT License

以下组件使用 MIT 协议:

- express (^4.18.2) — Copyright (c) 2009-2014 TJ Holowaychuk
- lodash (^4.17.21) — Copyright JS Foundation and other contributors

MIT 协议全文:
[MIT 协议文本]

### Apache License 2.0

以下组件使用 Apache-2.0 协议:

- xxx — Copyright 20xx xxx

Apache-2.0 协议全文:
[Apache 协议文本]

## 风险提示与建议

1. [根据实际情况给出具体建议]
2. 建议定期重新审计依赖协议(可使用本审计工具的 Skill 功能自动检查)
3. 如有法律疑问,请咨询专业法律顾问

4.3 处理已有 LICENSE 文件

如果项目中已存在 LICENSE 文件:

  1. 读取现有 LICENSE 文件内容
  2. 将现有内容作为"项目协议"部分保留
  3. 通知用户:

项目中已存在 LICENSE 文件。我会将现有协议内容保留在"项目协议"部分,并在后面追加依赖合规分析。是否继续?

等待用户确认后再写入。

完成后更新 checklist:

☑ Step 4: 生成 LICENSE — 生成合规参考报告

Step 5: 安装持续检查 Skill

目标: 在项目中安装一个 Skill,确保后续依赖变更时能自动触发协议检查。

5.1 检测当前 AI 编辑器

判断你当前运行在哪个 AI 编辑器中:

判断方式编辑器Skill 路径
你能调用 Claude Code 的内置工具(如 Read、Write、Edit、Bash)Claude Code.claude/skills/license-audit/SKILL.md
你运行在 Cursor IDE 中,能看到 .cursor/ 目录Cursor.cursor/rules/license-audit.mdc
你运行在 Google Antigravity 中,能看到 .agent/ 目录或 ~/.gemini/ 配置Google Antigravity.agent/skills/license-audit/SKILL.md

如果无法确定,询问用户:

你使用的是哪个 AI 编辑器?

  1. Claude Code
  2. Cursor
  3. Google Antigravity
  4. 其他

5.2 写入 Skill 文件

根据检测到的编辑器类型,从本页末尾的 Skill 模板附录 中复制对应格式的模板,写入项目中。

Claude Code

创建目录和文件:

  • 路径:.claude/skills/license-audit/SKILL.md
  • 内容:使用本页 附录 B: Claude Code Skill 模板 中的完整内容

Cursor

创建文件:

  • 路径:.cursor/rules/license-audit.mdc
  • 内容:使用本页 附录 C: Cursor Skill 模板 中的完整内容

Google Antigravity

创建目录和文件:

  • 路径:.agent/skills/license-audit/SKILL.md
  • 内容:使用本页 附录 D: Google Antigravity Skill 模板 中的完整内容

5.3 通知用户

写入完成后,通知用户:

已安装依赖协议持续检查 Skill。当你添加新依赖、更新依赖版本时,AI 助手会自动提醒你重新检查协议合规性。

Skill 文件位置:[具体路径]

完成后更新 checklist:

☑ Step 5: 安装 Skill — 安装依赖协议持续检查 Skill

Step 6: 生成审计报告

目标: 生成一份完整的中文审计报告,总结本次审计结果。

6.1 报告模板

# 依赖协议审计报告

## 项目信息
- 项目名称:xxx
- 项目路径:xxx
- 项目类型:xxx
- 审计时间:YYYY-MM-DD

## 版权协议合规结论

**最终判定:** ✅ 合规 — 可开源分发 / ❌ 不合规 — 不可分发

[如果合规:]
项目协议 `<SPDX>` 与所有 XX 个直接依赖协议兼容。分发时须满足以下义务:
- [attribution 要求列表]

[如果不合规:]
项目协议 `<SPDX>` 存在以下合规问题:

| 依赖名称 | 依赖协议 | 问题类型 | 修复建议 |
|---------|---------|---------|---------|
| xxx | GPL-3.0 | 协议不兼容 | 更换项目协议或移除依赖 |
| xxx | UNKNOWN | 协议未知 | 联系维护者确认或替换 |

## 审计结果摘要

| 指标 | 数值 |
|------|------|
| 直接依赖总数 | XX |
| 已确认协议 | XX |
| 未确认协议 | XX |
| 低风险 (✅) | XX |
| 需关注 (⚠️) | XX |
| 需确认 (❌) | XX |

## 协议分布

| 协议 | 数量 | 占比 |
|------|------|------|
| MIT | XX | XX% |
| Apache-2.0 | XX | XX% |
| ... | ... | ... |

## 风险发现

### 协议不兼容

[如果存在与项目协议不兼容的依赖:]

| 依赖名称 | 依赖协议 | 项目协议 | 冲突说明 | 修复建议 |
|---------|---------|---------|---------|---------|
| xxx | GPL-3.0 | MIT | MIT 不能包含 GPL 依赖并分发 | 更换项目协议为 GPL-3.0 或移除该依赖 |

[如果不存在不兼容:]
未发现协议不兼容问题。✅

### 协议未知

[如果存在 UNKNOWN 协议的依赖:]

| 依赖名称 | 版本 | 处理建议 |
|---------|------|---------|
| xxx | ^1.0.0 | 手动查看仓库 LICENSE 文件,或联系维护者 |
| xxx | ^2.0.0 | 考虑替换为协议明确的替代库 |

[如果不存在 UNKNOWN:]
所有依赖协议均已确认。✅

## 生成文件

| 文件 | 路径 | 说明 |
|------|------|------|
| LICENSE.LIST | ./LICENSE.LIST | 依赖协议清单 |
| LICENSE | ./LICENSE | 合规参考报告 |

## 已安装 Skill

| 编辑器 | Skill 路径 | 说明 |
|--------|-----------|------|
| [编辑器名] | [路径] | 依赖变更时自动触发协议检查 |

## 后续建议

1. 请人工确认所有标记为 ❌ 的依赖协议
2. 如果项目需要分发,请特别关注 ⚠️ 标记的 Copyleft 协议依赖
3. 依赖更新后,AI 助手会通过已安装的 Skill 自动提醒重新检查
4. 建议每季度进行一次完整的依赖协议审计
5. 如有法律疑问,请咨询专业法律顾问

根据实际审计结果填充报告内容。

完成后更新 checklist:

☑ Step 6: 生成审计报告 — 生成完整的中文审计报告

附录 A: 协议兼容性参考表

以下参考表供 AI 助手在生成合规报告时引用,用于判断各协议的类型、限制和风险等级。

宽松协议 (Permissive)

SPDX 标识符协议名称关键要求风险等级
MITMIT License保留版权声明和协议文本✅ 低
BSD-2-ClauseBSD 2-Clause保留版权声明✅ 低
BSD-3-ClauseBSD 3-Clause保留版权声明,禁止用作者名字推广✅ 低
ISCISC License保留版权声明✅ 低
Apache-2.0Apache License 2.0保留声明 + 标注变更 + 包含 NOTICE 文件 + 专利授权✅ 低

弱 Copyleft

SPDX 标识符协议名称关键要求风险等级
LGPL-2.1-only / LGPL-2.1-or-laterGNU LGPL 2.1修改库本身须开源;动态链接可豁免⚠️ 中
LGPL-3.0-only / LGPL-3.0-or-laterGNU LGPL 3.0修改库本身须开源;动态链接可豁免⚠️ 中
MPL-2.0Mozilla Public License 2.0修改的源文件须开源(文件级 copyleft)⚠️ 中

强 Copyleft

SPDX 标识符协议名称关键要求风险等级
GPL-2.0-only / GPL-2.0-or-laterGNU GPL 2.0衍生作品必须使用同一协议开源⚠️ 高
GPL-3.0-only / GPL-3.0-or-laterGNU GPL 3.0衍生作品必须使用同一协议开源 + 禁止 Tivoization⚠️ 高
AGPL-3.0-only / AGPL-3.0-or-laterGNU AGPL 3.0通过网络提供服务也视为分发,须开源⚠️ 高

非商用 / 限制性协议

SPDX 标识符协议名称关键要求风险等级
CC-BY-NC-4.0CC BY-NC 4.0禁止商业用途❌ 需确认
CC-BY-NC-SA-4.0CC BY-NC-SA 4.0禁止商业用途 + 衍生作品须同协议❌ 需确认
BSL-1.1Business Source License 1.1有使用限制期(通常 3-4 年后转为开源)⚠️ 高
SSPL-1.0Server Side Public License提供服务须开源整个服务平台⚠️ 高

公共领域

SPDX 标识符协议名称关键要求风险等级
UnlicenseThe Unlicense无限制,公共领域✅ 无
CC0-1.0CC0 1.0无限制,公共领域✅ 无

Creative Commons

SPDX 标识符协议名称关键要求风险等级
CC-BY-4.0CC BY 4.0须署名✅ 低
CC-BY-SA-4.0CC BY-SA 4.0须署名 + 衍生作品须同协议⚠️ 中

协议继承规则

当项目同时包含多种协议的依赖时,遵循以下继承规则:

  1. Copyleft 传染性:如果包含 GPL/AGPL 依赖,且以静态链接或源码方式使用,项目在分发时须遵守 GPL/AGPL 条款
  2. LGPL 豁免:LGPL 依赖如果以动态链接方式使用(如 npm 包引用),通常无需开源项目代码
  3. Attribution 合并:所有要求 attribution 的协议(MIT、BSD、Apache 等),其版权声明须在 LICENSE 文件中列出
  4. 最严格原则:当多个限制冲突时,以最严格的限制为准
  5. 商用限制继承:任何一个依赖禁止商用,整个项目在商用场景下须移除该依赖

分发场景下的协议兼容性矩阵

以下矩阵用于判定"项目协议"与"依赖协议"在开源分发场景下的兼容性。行为项目协议,列为依赖协议。

项目协议 ↓ \ 依赖协议 →MITBSD-3-ClauseApache-2.0LGPL-2.1LGPL-3.0MPL-2.0GPL-2.0GPL-3.0AGPL-3.0
MIT⚠️¹⚠️¹⚠️²
Apache-2.0⚠️¹⚠️¹⚠️²
GPL-2.0-only❌³❌⁴❌⁵❌⁴
GPL-3.0-only❌⁴
AGPL-3.0-only❌⁴

脚注说明:

  • ¹ LGPL 有条件兼容:LGPL 依赖如果以动态链接方式使用(如 npm 包引用、pip 安装的独立包),通常可以豁免 copyleft 要求,项目无需开源。但如果以静态链接或源码嵌入方式使用(如 Go 语言的静态编译),则修改部分须以 LGPL 开源。在 Node.js/Python/Rust 生态中通常为动态链接,可视为兼容。
  • ² MPL-2.0 文件级 copyleft:MPL-2.0 要求对修改过的源文件以 MPL-2.0 开源,但不要求整个项目开源。如果只是引用 MPL 依赖而未修改其源码,则兼容;如果修改了 MPL 依赖的源文件,被修改的文件须以 MPL-2.0 发布。
  • ³ Apache-2.0 与 GPL-2.0 不兼容:Apache-2.0 包含专利授权条款,与 GPL-2.0 的条款存在冲突。但 Apache-2.0 与 GPL-3.0 兼容(FSF 已确认)。
  • ⁴ GPL 版本不兼容GPL-2.0-onlyGPL-3.0-only 互不兼容。但 GPL-2.0-or-later 与 GPL-3.0 兼容(因为 "or later" 允许升级到 GPL-3.0)。判定时须注意依赖声明的是 -only 还是 -or-later
  • ⁵ MPL-2.0 与 GPL-2.0 的兼容性:MPL-2.0 第 3 条允许将代码转为 GPL-2.0+ 分发,但 GPL-2.0-only 不接受此转换,因此不兼容。与 GPL-3.0 兼容。

矩阵外协议处理规则

如果依赖的协议不在上述矩阵中(如 Artistic License、EUPL、Zlib、0BSD 等),按以下步骤处理:

  1. 搜索兼容性信息:使用 WebSearch 搜索 "<依赖协议名>" compatibility with "<项目协议名>""
  2. 查询 OSI 认证:搜索 "<协议名>" OSI approved license,确认是否为 OSI 认证的开源协议
  3. 参考 FSF 列表:搜索 "<协议名>" FSF GPL compatible,查看 FSF 是否认定该协议与 GPL 兼容
  4. 无法确定时:标记为 ⚠️ 需人工确认,在审计报告中提示用户手动核实

常见的矩阵外协议快速参考:

协议类型与 MIT 兼容与 GPL-3.0 兼容备注
0BSD宽松比 MIT 更宽松,无需保留声明
Zlib宽松类似 MIT,常见于游戏库
Artistic-2.0弱 CopyleftPerl 生态常见
EUPL-1.2强 Copyleft欧盟公共许可证,与 GPL-3.0 兼容
WTFPL宽松非正式协议,等同公共领域

附录 B: Claude Code Skill 模板

以下是 Claude Code 的 Skill 模板完整内容。在 Step 5 中,将此内容写入 .claude/skills/license-audit/SKILL.md

markdown
---
description: 依赖协议合规检查 — 当依赖文件变更时自动检查协议合规性
---

# 依赖协议审计 Skill

## 触发条件

当以下任一文件被修改时,自动触发本 Skill:

- `package.json`(Node.js 项目)
- `go.mod`(Go 项目)
- `requirements.txt``pyproject.toml`(Python 项目)
- `Cargo.toml`(Rust 项目)
- `*.csproj`(.NET 项目)

## 执行指令

当检测到上述依赖文件变更时,执行以下操作:

### 1. 检测变更的依赖

对比当前依赖文件与 `LICENSE.LIST` 中已记录的依赖,找出:
- **新增的依赖**:在依赖文件中存在但 LICENSE.LIST 中没有的
- **版本变更的依赖**:版本号发生变化的
- **移除的依赖**:在 LICENSE.LIST 中存在但依赖文件中已删除的

### 2. 查询新增/变更依赖的协议

对新增或版本变更的依赖,使用 WebSearch 查询其协议:
- 搜索词模板:`<包名> <生态系统> license`(如 `express npm package license`
- 如果搜索结果不明确,进行二次搜索交叉验证
- 无法确定的标记为 UNKNOWN

### 3. 检查协议兼容性

对新增或版本变更的依赖,检查其协议与项目协议的兼容性:
- 读取项目根目录的 LICENSE 文件,识别项目协议的 SPDX 标识符
- 对照协议兼容性矩阵(参见 https://tpscsm-docs.pages.dev/license-audit/),判定每个新增依赖的协议与项目协议是否兼容
- 兼容(✅):无需额外操作
- 有条件兼容(⚠️):提示用户注意使用方式
- 不兼容(❌):警告用户存在协议冲突,给出修复建议

### 4. 更新 LICENSE.LIST

- 添加新增依赖的协议信息
- 更新版本变更的依赖信息
- 移除已删除的依赖条目
- 更新统计摘要

### 5. 更新 LICENSE

- 重新分析协议兼容性
- 更新继承限制部分
- 更新第三方协议声明

### 6. 通知用户

完成后通知用户变更结果:

> 依赖协议检查完成:
> - 新增 X 个依赖,协议均为 [协议列表]
> - 更新 X 个依赖版本
> - 移除 X 个依赖
> - 兼容性检查:✅ 所有新增依赖与项目协议兼容 / ❌ 以下依赖与项目协议不兼容:[列表]
> - 风险提示:[如有新增风险协议则列出]

## 重要说明

- 只检查直接依赖,不检查传递依赖
- 协议信息通过 WebSearch 查询,可能存在不准确的情况
- UNKNOWN 协议的依赖需要用户手动确认
- 完整的协议兼容性参考表请访问:https://tpscsm-docs.pages.dev/license-audit/

附录 C: Cursor Skill 模板

以下是 Cursor 的 Skill 模板完整内容。在 Step 5 中,将此内容写入 .cursor/rules/license-audit.mdc

markdown
---
description: "依赖协议合规检查 — 当依赖文件变更时自动检查协议合规性"
globs: ["package.json", "go.mod", "requirements.txt", "pyproject.toml", "Cargo.toml", "*.csproj"]
---

# 依赖协议审计规则

当匹配的依赖文件被修改时,执行以下协议合规检查:

## 检测变更

对比当前依赖文件与项目根目录的 `LICENSE.LIST` 中已记录的依赖,找出:
- **新增的依赖**:在依赖文件中存在但 LICENSE.LIST 中没有的
- **版本变更的依赖**:版本号发生变化的
- **移除的依赖**:在 LICENSE.LIST 中存在但依赖文件中已删除的

## 查询协议

对新增或版本变更的依赖,使用 WebSearch 查询其协议:
- npm 包搜索:`<包名> npm package license`
- Go 模块搜索:`<模块路径> go module license`
- Python 包搜索:`<包名> pypi license`
- Rust 包搜索:`<包名> crates.io license`
- .NET 包搜索:`<包名> nuget license`

如果搜索结果不明确,进行二次搜索:`<包名> github LICENSE file`

## 检查协议兼容性

对新增或版本变更的依赖,检查其协议与项目协议的兼容性:
- 读取项目 LICENSE 文件,识别项目协议
- 对照协议兼容性矩阵(参见 https://tpscsm-docs.pages.dev/license-audit/),判定兼容性
- 不兼容时警告用户并给出修复建议(更换项目协议/替换依赖/移除依赖)

## 更新文件

1. 更新 `LICENSE.LIST`:添加/更新/移除依赖条目,更新统计摘要
2. 更新 `LICENSE`:重新分析协议兼容性,更新继承限制和第三方声明

## 风险标记

- ✅ 低风险:MIT、BSD、ISC、Apache-2.0、Unlicense、CC0-1.0
- ⚠️ 需关注:GPL、AGPL、LGPL、MPL、BSL、SSPL
- ❌ 需确认:UNKNOWN、CC-BY-NC、自定义协议

## 通知用户

完成后通知用户变更结果:

> 依赖协议检查完成:
> - 新增 X 个依赖,协议均为 [协议列表]
> - 更新 X 个依赖版本
> - 移除 X 个依赖
> - 兼容性检查:✅ 所有新增依赖与项目协议兼容 / ❌ 以下依赖与项目协议不兼容:[列表]
> - 风险提示:[如有新增风险协议则列出]

## 重要说明

- 只检查直接依赖(dependencies),不检查 devDependencies 和传递依赖
- UNKNOWN 协议需要用户手动确认
- 完整的协议兼容性参考表:https://tpscsm-docs.pages.dev/license-audit/

附录 D: Google Antigravity Skill 模板

以下是 Google Antigravity 的 Skill 模板完整内容。在 Step 5 中,将此内容写入 .agent/skills/license-audit/SKILL.md

markdown
---
name: license-audit
description: 依赖协议合规检查 — 当依赖文件变更时自动检查协议合规性
triggers:
  - file_changed: "package.json"
  - file_changed: "go.mod"
  - file_changed: "requirements.txt"
  - file_changed: "pyproject.toml"
  - file_changed: "Cargo.toml"
  - file_changed: "*.csproj"
---

# 依赖协议审计 Skill

## 何时使用

当用户修改了依赖文件(package.json、go.mod、requirements.txt、pyproject.toml、Cargo.toml、*.csproj)时自动触发。

## 不要使用

当用户只是阅读或查看依赖文件而没有修改时,不要触发本 Skill。

## 执行步骤

### 1. 检测变更的依赖

对比当前依赖文件与项目根目录的 `LICENSE.LIST` 中已记录的依赖,找出:
- **新增的依赖**:在依赖文件中存在但 LICENSE.LIST 中没有的
- **版本变更的依赖**:版本号发生变化的
- **移除的依赖**:在 LICENSE.LIST 中存在但依赖文件中已删除的

### 2. 查询新增/变更依赖的协议

对新增或版本变更的依赖,使用 WebSearch 查询其协议:
- npm 包:搜索 `<包名> npm package license`
- Go 模块:搜索 `<模块路径> go module license`
- Python 包:搜索 `<包名> pypi license`
- Rust 包:搜索 `<包名> crates.io license`
- .NET 包:搜索 `<包名> nuget license`

如果搜索结果不明确,二次搜索:`<包名> github LICENSE file`
无法确定的标记为 UNKNOWN。

### 3. 检查协议兼容性

对新增或版本变更的依赖,检查其协议与项目协议的兼容性:
- 读取项目根目录的 LICENSE 文件,识别项目协议的 SPDX 标识符
- 对照协议兼容性矩阵(参见 https://tpscsm-docs.pages.dev/license-audit/),判定兼容性
- 不兼容时警告用户并给出修复建议

### 4. 更新 LICENSE.LIST

- 添加新增依赖的协议信息
- 更新版本变更的依赖信息
- 移除已删除的依赖条目
- 更新统计摘要

### 5. 更新 LICENSE

- 重新分析协议兼容性
- 更新继承限制部分
- 更新第三方协议声明

### 6. 通知用户

完成后通知用户变更结果:

> 依赖协议检查完成:
> - 新增 X 个依赖,协议均为 [协议列表]
> - 更新 X 个依赖版本
> - 移除 X 个依赖
> - 兼容性检查:✅ 所有新增依赖与项目协议兼容 / ❌ 以下依赖与项目协议不兼容:[列表]
> - 风险提示:[如有新增风险协议则列出]

## 风险分类

- ✅ 低风险:MIT、BSD、ISC、Apache-2.0、Unlicense、CC0-1.0
- ⚠️ 需关注:GPL、AGPL、LGPL、MPL、BSL、SSPL
- ❌ 需确认:UNKNOWN、CC-BY-NC、自定义协议

## 重要说明

- 只检查直接依赖,不检查传递依赖
- UNKNOWN 协议需要用户手动确认
- 完整参考表:https://tpscsm-docs.pages.dev/license-audit/

常见问题

Q: 为什么只审计直接依赖,不包含传递依赖?

直接依赖是开发者主动选择引入的,其协议风险由开发者直接承担。传递依赖数量通常远大于直接依赖(npm 项目可达数百个),逐一 WebSearch 查询不现实。如需审计传递依赖,建议使用专业的协议扫描工具。

Q: UNKNOWN 协议的依赖怎么处理?

  1. 手动访问该依赖的源代码仓库,查找 LICENSE 文件
  2. 联系依赖的维护者确认协议
  3. 如果无法确认,考虑替换为协议明确的替代依赖

Q: 协议信息不准确怎么办?

WebSearch 查询的协议信息可能存在不准确的情况。建议:

  1. 对 ⚠️ 和 ❌ 标记的依赖手动核实
  2. 直接查看依赖的 GitHub 仓库中的 LICENSE 文件
  3. 查看包管理器(npm、PyPI 等)上的官方协议声明

Q: Skill 安装后如何验证?

安装 Skill 后,尝试添加一个新依赖(如 npm install dayjs),然后让 AI 助手处理。如果 Skill 正常工作,AI 会自动提示需要更新 LICENSE.LIST 和 LICENSE。