generate-sbom
SKILL.md
Skill: 自动生成 SBOM 文件
功能描述
当用户提供一个 GitLab 仓库地址和分支名称时,自动克隆该仓库并使用 cdxgen 工具生成符合 CycloneDX 规范的 SBOM(软件物料清单)JSON 文件。
前置依赖检查
在执行前需确认以下工具已安装:
| 工具 | 检查命令 | 安装方式 |
|---|---|---|
| git | git --version |
https://git-scm.com |
| cdxgen | cdxgen --version |
npm install -g @cyclonedx/cdxgen |
| python | python --version |
https://python.org(需 ≥ 3.10) |
若 cdxgen 未安装,提示用户执行:
npm install -g @cyclonedx/cdxgen
执行命令
所有脚本位于 skills/generate_sbom/scripts/ 目录下,在项目根目录执行以下命令:
公开仓库
python skills/generate_sbom/scripts/generate_sbom.py --url {repo_url} --branch {branch}
私有仓库(需要 Token)
python skills/generate_sbom/scripts/generate_sbom.py --url {repo_url} --branch {branch} --token {access_token}
指定输出文件
python skills/generate_sbom/scripts/generate_sbom.py --url {repo_url} --branch {branch} --output {output_file}
指定项目类型(跳过自动检测)
python skills/generate_sbom/scripts/generate_sbom.py --url {repo_url} --branch {branch} --type {project_type}
参数收集规则
- 若用户未提供
repo_url,必须询问:请提供 GitLab 仓库地址(https://...) - 若用户未提供
branch,必须询问:请提供要分析的分支名称 - 若用户未提供
access_token且克隆失败提示权限错误,询问:该仓库是私有仓库吗?如是,请提供 GitLab Access Token output_file和project_type为可选项,不需要主动询问
结果反馈格式
执行成功后,向用户输出以下摘要:
✅ SBOM 生成成功
📄 输出文件:{sbom_file_path}
🏷️ 项目名称:{project_name} {project_version}
📦 组件总数:{component_count}
🗂️ 组件类型分布:
- library : N
- framework : N
⏱️ 生成时间:{timestamp}
错误处理
| 错误特征 | 处理方式 |
|---|---|
Authentication failed / could not read Username |
提示:该仓库为私有仓库,请提供 --token 参数 |
Remote branch not found / pathspec |
提示:分支名称不存在,请确认分支名是否正确 |
cdxgen: command not found |
提示:执行 npm install -g @cyclonedx/cdxgen 安装 cdxgen |
python: command not found |
提示:请安装 Python 3.10+ |
| SBOM 文件为空或组件数为 0 | 提示:项目类型可能未被识别,请尝试添加 --type 参数手动指定 |
支持的项目类型
--type 值 |
识别文件 | 技术栈 |
|---|---|---|
maven |
pom.xml | Java/Kotlin (Maven) |
gradle |
build.gradle, build.gradle.kts | Java/Kotlin (Gradle) |
npm |
package.json | Node.js/JS/TS |
python |
requirements.txt, setup.py, Pipfile, pyproject.toml | Python |
go |
go.mod | Go |
rust |
Cargo.toml | Rust |
dotnet |
*.csproj, *.sln | C#/.NET |
php |
composer.json | PHP |
ruby |
Gemfile | Ruby |
对话示例
示例 1 — 公开仓库,信息完整
用户:帮我对 https://gitlab.example.com/team/myapp 的 main 分支生成 SBOM
执行:
python skills/generate_sbom/scripts/generate_sbom.py --url https://gitlab.example.com/team/myapp --branch main
示例 2 — 私有仓库
用户:https://gitlab.company.com/backend/order-service 分支 release/2.0 生成 sbom,token 是 glpat-abc123
执行:
python skills/generate_sbom/scripts/generate_sbom.py --url https://gitlab.company.com/backend/order-service --branch release/2.0 --token glpat-abc123
示例 3 — 信息不完整
用户:帮我生成 SBOM
回复:
请提供以下信息:
1. GitLab 仓库地址(https://...)
2. 要分析的分支名称