Merge pull request 'feat(skills): add gitlink-code-review, gitlink-insight, gitlink-compliance Skills' (#28) from Leo77/gitlink-cli:master into master
This commit is contained in:
commit
255410181f
|
|
@ -0,0 +1,238 @@
|
|||
# gitlink-code-review API 参考
|
||||
|
||||
## PR 相关 API
|
||||
|
||||
### 获取 PR 详情
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +view --id <pull_request_id> --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.issue.id` | int | Issue/PR 内部 ID |
|
||||
| `data.issue.subject` | string | PR 标题 |
|
||||
| `data.issue.description` | string | PR 描述 |
|
||||
| `data.issue.created_at` | string | 创建时间 |
|
||||
| `data.issue.issue_status` | string | 状态 |
|
||||
| `data.issue.author_login` | string | 作者登录名 |
|
||||
| `data.issue.author_name` | string | 作者名称 |
|
||||
| `data.pull_request.base` | string | 目标分支 |
|
||||
| `data.pull_request.head` | string | 源分支 |
|
||||
| `data.pull_request.status` | int | 0=open, 1=merged, 2=closed |
|
||||
| `data.pull_request.state` | string | "open" / "closed" |
|
||||
| `data.pull_request.mergeable` | boolean | 是否可合并 |
|
||||
| `data.pull_request.reviewers` | array | 审查者列表 |
|
||||
| `data.commits_count` | int | 提交数 |
|
||||
| `data.files_count` | int | 变更文件数 |
|
||||
| `data.conflict_files` | array | 冲突文件列表 |
|
||||
|
||||
### 获取 PR 变更文件列表
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +files --id <pull_request_id> --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `files_count` | int | 文件总数 |
|
||||
| `total_addition` | int | 新增行数 |
|
||||
| `total_deletion` | int | 删除行数 |
|
||||
| `files[].name` | string | 文件名 |
|
||||
| `files[].addition` | int | 该文件新增行数 |
|
||||
| `files[].deletion` | int | 该文件删除行数 |
|
||||
| `files[].type` | int | 1=新增, 2=修改, 3=删除 |
|
||||
| `files[].isCreated` | boolean | 是否新建文件 |
|
||||
| `files[].isDeleted` | boolean | 是否删除文件 |
|
||||
| `files[].isRenamed` | boolean | 是否重命名 |
|
||||
|
||||
### 获取 PR Diff
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +diff --id <pull_request_id> --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `files_count` | int | 文件总数 |
|
||||
| `total_addition` | int | 总新增行数 |
|
||||
| `total_deletion` | int | 总删除行数 |
|
||||
| `files[].sections[].lines[].leftIdx` | int | 原文件行号 |
|
||||
| `files[].sections[].lines[].rightIdx` | int | 新文件行号 |
|
||||
| `files[].sections[].lines[].type` | int | 1=未变, 2=新增, 3=删除, 4=统计信息 |
|
||||
| `files[].sections[].lines[].content` | string | 行内容 |
|
||||
|
||||
---
|
||||
|
||||
## PR 列表 API
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +list --state <open|merged|closed> --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.open_count` | int | 开放 PR 数 |
|
||||
| `data.close_count` | int | 关闭 PR 数 |
|
||||
| `data.merged_issues_size` | int | 已合并 PR 数 |
|
||||
| `data.issues[].id` | int | PR 内部 ID |
|
||||
| `data.issues[].pull_request_number` | int | PR 编号(对外展示用) |
|
||||
| `data.issues[].name` | string | PR 标题 |
|
||||
| `data.issues[].author_login` | string | 作者登录名 |
|
||||
| `data.issues[].author_name` | string | 作者名称 |
|
||||
| `data.issues[].pull_request_status` | int | **关键字段:** 0=open, 1=merged, 2=closed |
|
||||
| `data.issues[].pull_request_base` | string | 目标分支 |
|
||||
| `data.issues[].pull_request_head` | string | 源分支 |
|
||||
| `data.issues[].pr_created_unix` | int | 创建时间戳 |
|
||||
| `data.issues[].pr_full_time` | string | 创建完整时间 |
|
||||
| `data.issues[].journals_count` | int | 评论数 |
|
||||
| `data.issues[].reviewers` | array | Reviewers 列表 |
|
||||
| `data.issues[].fork_project_id` | int | Fork 项目 ID |
|
||||
| `data.issues[].is_original` | boolean | 是否来自 Fork |
|
||||
|
||||
---
|
||||
|
||||
## Issue 相关 API
|
||||
|
||||
### 获取 Issue 列表
|
||||
|
||||
```bash
|
||||
gitlink-cli issue +list --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.closed_count` | int | 已关闭 Issue 数 |
|
||||
| `data.issues[].id` | int | Issue ID |
|
||||
| `data.issues[].name` | string | Issue 标题 |
|
||||
| `data.issues[].author.login` | string | 作者登录名 |
|
||||
| `data.issues[].author.name` | string | 作者名称 |
|
||||
| `data.issues[].assigners` | array | 指派人列表 |
|
||||
| `data.issues[].priority.name` | string | 优先级名称 |
|
||||
| `data.issues[].priority.id` | int | 优先级 ID |
|
||||
| `data.issues[].created_at` | string | 创建时间 |
|
||||
| `data.issues[].milestone_name` | string | 里程碑名称 |
|
||||
| `data.issues[].due_date` | string | 截止日期 |
|
||||
|
||||
---
|
||||
|
||||
## 仓库 API
|
||||
|
||||
### 获取仓库信息
|
||||
|
||||
```bash
|
||||
gitlink-cli repo +info --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.project_id` | int | 项目 ID |
|
||||
| `data.identifier` | string | 仓库标识 |
|
||||
| `data.name` | string | 项目名称 |
|
||||
| `data.full_name` | string | 全名(owner/repo) |
|
||||
| `data.default_branch` | string | 默认分支 |
|
||||
| `data.private` | boolean | 是否私有 |
|
||||
| `data.empty` | boolean | 是否空仓库 |
|
||||
| `data.issues_count` | int | Issue 总数 |
|
||||
| `data.pull_requests_count` | int | PR 总数 |
|
||||
| `data.forked_count` | int | Fork 数 |
|
||||
| `data.praises_count` | int | Star 数 |
|
||||
| `data.watchers_count` | int | 关注数 |
|
||||
| `data.contributor_users_count` | int | 贡献者数 |
|
||||
| `data.version_releases_count` | int | Release 数 |
|
||||
| `data.size` | string | 仓库大小 |
|
||||
| `data.clone_url` | string | HTTPS 克隆地址 |
|
||||
| `data.ssh_url` | string | SSH 克隆地址 |
|
||||
| `data.author.login` | string | 仓库所有者 |
|
||||
|
||||
### 获取仓库文件列表
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=<path>&ref=<branch>' --format json
|
||||
```
|
||||
|
||||
**返回字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.entries[].name` | string | 文件/目录名 |
|
||||
| `data.entries[].type` | string | "dir" 或 "file" |
|
||||
| `data.entries[].path` | string | 相对路径 |
|
||||
| `data.entries[].size` | int | 文件大小(bytes) |
|
||||
| `data.entries[].sha` | string | 文件 SHA |
|
||||
| `data.entries[].content` | string | 文件内容(部分文件可能直接返回) |
|
||||
|
||||
### 获取仓库语言统计
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/languages --format json
|
||||
```
|
||||
|
||||
**返回示例:**
|
||||
```json
|
||||
{ "Ruby": "90.2%", "JavaScript": "6.1%", "CSS": "3.7%" }
|
||||
```
|
||||
|
||||
### 获取仓库原始文件
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/raw/<branch>/<filepath>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 用户 API
|
||||
|
||||
### 查看当前用户
|
||||
|
||||
```bash
|
||||
gitlink-cli user +me --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.login` | string | 登录名 |
|
||||
| `data.user_id` | int | 用户 ID |
|
||||
| `data.username` | string | 用户名 |
|
||||
| `data.email` | string | 邮箱 |
|
||||
| `data.phone` | string | 手机号 |
|
||||
| `data.admin` | boolean | 是否管理员 |
|
||||
|
||||
### 获取用户信息
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /users/:user_id --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.login` | string | 登录名 |
|
||||
| `data.name` | string | 显示名称 |
|
||||
| `data.user_id` | int | 用户 ID |
|
||||
| `data.user_identity` | string | 身份(专业人士/学生等) |
|
||||
| `data.user_projects_count` | int | 项目数 |
|
||||
| `data.common_projects_count` | int | 参与项目数 |
|
||||
| `data.created_time` | string | 注册时间 |
|
||||
| `data.gender` | int | 性别 |
|
||||
|
||||
---
|
||||
|
||||
## 数据获取最佳实践
|
||||
|
||||
1. **始终使用 `--format json`** 确保可解析输出
|
||||
2. PR ID 使用 `pull_request_id`(内部 ID),PR 编号展示用 `pull_request_number`
|
||||
3. PR 状态通过 `pull_request_status` 判断:0=open, 1=merged, 2=closed
|
||||
4. 大型 PR 的 diff 可能非常大,建议按文件分组逐文件分析
|
||||
5. Issue 的 `closed_count` 和 `open_count` 在列表的数据顶层
|
||||
|
|
@ -0,0 +1,321 @@
|
|||
---
|
||||
name: gitlink-code-review
|
||||
version: 1.0.0
|
||||
description: "智能代码审查:获取 PR 变更、分析代码质量、自动生成 Review 评论与摘要报告。当用户需要审查 Pull Request、检查代码质量或生成审查报告时触发。"
|
||||
metadata:
|
||||
requires:
|
||||
bins: ["gitlink-cli"]
|
||||
cliHelp: "gitlink-cli pr --help"
|
||||
---
|
||||
|
||||
# gitlink-code-review(智能代码审查)
|
||||
|
||||
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
|
||||
**CRITICAL — 所有写入/删除操作前,务必先确认用户意图。**
|
||||
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`(GitHub CLI)操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
|
||||
|
||||
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
|
||||
|
||||
## 工作流概览
|
||||
|
||||
本 Skill 提供一套完整的 AI 驱动代码审查工作流,覆盖从获取 PR 变更到生成审查报告的全过程。不需要额外的 CLI Shortcuts——现有 `gitlink-cli` 命令 + AI Agent 的分析能力即可完成。
|
||||
|
||||
| 阶段 | 操作 | AI Agent 角色 |
|
||||
|------|------|--------------|
|
||||
| ① 获取上下文 | 拉取 PR 详情、变更文件、Diff | 执行 CLI 命令采集数据 |
|
||||
| ② 分析代码 | 检查每个文件的变更 | 逐文件审查,标记问题 |
|
||||
| ③ 结构化反馈 | 按严重程度分级输出审查意见 | 生成分级 Review 评论 |
|
||||
| ④ 提交评论 | 发表 Review 到 PR | 通过 API 提交 |
|
||||
| ⑤ 生成报告 | 输出审查摘要 | 生成 Markdown 摘要 |
|
||||
|
||||
---
|
||||
|
||||
## 详细工作流
|
||||
|
||||
### 工作流 1:PR 代码审查
|
||||
|
||||
**场景**:收到 PR Review 请求后,进行完整代码审查。
|
||||
|
||||
#### Step 1:获取 PR 上下文
|
||||
|
||||
```bash
|
||||
# 获取 PR 详情
|
||||
gitlink-cli pr +view --id <pr_id> --format json
|
||||
|
||||
# 获取变更文件列表
|
||||
gitlink-cli pr +files --id <pr_id> --format json
|
||||
|
||||
# 获取 Diff 内容(含变更行号和代码上下文)
|
||||
gitlink-cli pr +diff --id <pr_id> --format json
|
||||
```
|
||||
|
||||
#### Step 2:逐文件分析
|
||||
|
||||
对每个变更文件,根据文件类型执行针对性检查:
|
||||
|
||||
**Python 文件检查项:**
|
||||
- 语法与导入:未使用的 import、循环导入、wildcard import
|
||||
- 代码规范:PEP 8 风格偏离、过长行(>88 chars)、命名规范
|
||||
- 安全:硬编码密钥、SQL 注入风险、`eval()`/`exec()` 使用
|
||||
- 性能:不必要的循环、缺少缓存、N+1 查询
|
||||
- 错误处理:裸 `except`、吞异常、缺少 finally
|
||||
|
||||
**JavaScript/TypeScript 文件检查项:**
|
||||
- 安全:`innerHTML` 直接赋值、`eval()` 使用
|
||||
- 类型安全:`any` 滥用、缺失类型定义
|
||||
- 性能:不必要的 re-render、大对象深拷贝
|
||||
- 异步:未处理的 Promise、缺少 error boundary
|
||||
- 依赖:已废弃 API 使用
|
||||
|
||||
**Go 文件检查项:**
|
||||
- 错误处理:未检查的 error return、panic 滥用
|
||||
- 并发:goroutine 泄漏、缺少 sync 保护
|
||||
- 资源管理:未关闭的 file/conn、defer 使用
|
||||
- 命名:导出标识符缺少注释、变量 shadowing
|
||||
|
||||
**通用检查项:**
|
||||
- 硬编码的配置值、密钥、URL
|
||||
- 缺少或错误的边界条件检查
|
||||
- 过于复杂的函数(圈复杂度高)
|
||||
- 魔法数字(未命名的常量)
|
||||
- 重复代码(DRY 违反)
|
||||
- 缺少或过时的注释
|
||||
- 测试覆盖不足
|
||||
|
||||
#### Step 3:生成结构化审查结果
|
||||
|
||||
按以下 Severity 分级输出:
|
||||
|
||||
```markdown
|
||||
## PR #<id> 代码审查报告
|
||||
|
||||
### 🔴 Critical(必须修改)
|
||||
- <问题描述> — <文件>:<行号>
|
||||
> <修改建议>
|
||||
|
||||
### 🟡 Warning(建议修改)
|
||||
- <问题描述> — <文件>:<行号>
|
||||
> <修改建议>
|
||||
|
||||
### 🔵 Suggestion(可选优化)
|
||||
- <问题描述> — <文件>:<行号>
|
||||
> <修改建议>
|
||||
|
||||
### ✅ Positive(值得肯定)
|
||||
- <做得好的地方>
|
||||
```
|
||||
|
||||
#### Step 4:提交 Review 评论
|
||||
|
||||
```bash
|
||||
# 方式 1:提交整体 Review
|
||||
gitlink-cli api POST /:owner/:repo/pulls/:id/reviews --body '{
|
||||
"body": "## 审查结果\n\n### 🔴 Critical\n...\n\n### 🟡 Warning\n...\n\n总体评价:...",
|
||||
"event": "COMMENT"
|
||||
}'
|
||||
|
||||
# 方式 2:在特定行添加内联评论(逐条提交)
|
||||
gitlink-cli api POST /:owner/:repo/pulls/:id/reviews --body '{
|
||||
"body": "这里存在安全风险:用户输入未经转义直接拼接到 SQL 查询中,存在注入风险。建议使用参数化查询。",
|
||||
"event": "COMMENT",
|
||||
"commit_id": "<commit_sha>",
|
||||
"path": "src/query.py",
|
||||
"position": 42
|
||||
}'
|
||||
```
|
||||
|
||||
> **注意:** `event` 参数支持 `COMMENT`(普通评论)和 `APPROVE`(批准)。对于需要修改的问题,使用 `COMMENT`。
|
||||
|
||||
#### Step 5:生成审查摘要
|
||||
|
||||
审查完成后,输出 Markdown 摘要供用户查阅:
|
||||
|
||||
```markdown
|
||||
## 📋 审查摘要 — PR #<id> <title>
|
||||
|
||||
| 指标 | 数据 |
|
||||
|------|------|
|
||||
| 审查文件数 | <n> |
|
||||
| 变更行数 | +<add> / -<del> |
|
||||
| Critical 问题 | <n> |
|
||||
| Warning | <n> |
|
||||
| Suggestion | <n> |
|
||||
|
||||
### 主要发现
|
||||
1. **[Critical]** <最严重的问题>
|
||||
2. **[Warning]** <次要问题>
|
||||
3. **[Suggestion]** <优化建议>
|
||||
|
||||
### 总体评价
|
||||
<整体评估:代码质量、审查通过建议>
|
||||
|
||||
---
|
||||
*由 gitlink-code-review Skill 自动生成*
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 工作流 2:仓库代码健康度扫描
|
||||
|
||||
**场景**:对仓库整体代码质量进行评估,不依赖 PR。
|
||||
|
||||
```bash
|
||||
# 1. 获取仓库信息
|
||||
gitlink-cli repo +info --owner <owner> --repo <repo> --format json
|
||||
|
||||
# 2. 获取仓库文件列表(遍历关键目录)
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=src&ref=master'
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=tests&ref=master'
|
||||
|
||||
# 3. 获取关键文件内容
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/README.md
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/.gitignore
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/.eslintrc.js # 或类似配置
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/package.json # 或 go.mod, Cargo.toml
|
||||
|
||||
# 4. 获取语言统计和贡献者
|
||||
gitlink-cli api GET /:owner/:repo/languages
|
||||
gitlink-cli api GET /:owner/:repo/contributors
|
||||
```
|
||||
|
||||
**健康度检查清单:**
|
||||
|
||||
| 检查项 | 标准 | 评分依据 |
|
||||
|--------|------|----------|
|
||||
| 文档完整性 | 有 README、CONTRIBUTING、CHANGELOG | 文件是否存在、内容质量 |
|
||||
| 许可证 | 有 LICENSE 文件 | 是否存在、是否合规 |
|
||||
| CI 配置 | 有 CI 配置(.github/workflows, Jenkinsfile 等) | 文件是否存在 |
|
||||
| 代码规范 | 有 linter 配置 | eslint/prettier/ruff/pylint 等 |
|
||||
| 测试覆盖 | 有 test 目录或测试文件 | 测试文件比例 |
|
||||
| 依赖管理 | 依赖文件完整且无已知漏洞 | package-lock/go.sum/poetry.lock |
|
||||
| Issue 健康度 | Issue 有分类标签、响应及时 | 通过 Issue 列表分析 |
|
||||
|
||||
**输出格式:**
|
||||
|
||||
```markdown
|
||||
## 🏥 仓库健康度报告 — <owner>/<repo>
|
||||
|
||||
### 总体评分:<⭐x/5>
|
||||
|
||||
| 维度 | 状态 | 评分 | 建议 |
|
||||
|------|:----:|:----:|------|
|
||||
| 📖 文档 | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
| 📜 许可证 | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
| 🔧 CI/CD | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
| 🎨 代码规范 | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
| 🧪 测试覆盖 | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
| 📦 依赖安全 | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
| 🐛 Issue 管理 | ✅/⚠️/❌ | ☆☆☆☆☆ | <建议> |
|
||||
|
||||
### 关键发现
|
||||
1. <最需要改进的问题>
|
||||
2. <次要问题>
|
||||
3. <做得好的方面>
|
||||
|
||||
### 改进路线图
|
||||
- **紧急(本周):** ...
|
||||
- **短期(本月):** ...
|
||||
- **长期(本季度):** ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 工作流 3:批量 Issue Triage + 自动分配
|
||||
|
||||
**场景**:对新 Issue 进行自动分类、标签分配和责任人推荐。
|
||||
|
||||
```bash
|
||||
# 1. 获取未标记的 Issue
|
||||
gitlink-cli issue +list --state open --format json
|
||||
|
||||
# 2. 逐个分析 Issue 内容
|
||||
gitlink-cli issue +view --id <issue_id> --format json
|
||||
|
||||
# 3. 根据内容智能分类
|
||||
# 分析标题和描述后,通过 Raw API 打标签
|
||||
gitlink-cli api POST /:owner/:repo/issues/:id --body '{
|
||||
"issue_tag_ids": [<tag_id>],
|
||||
"done_ratio": 0,
|
||||
"subject": "<原始标题>",
|
||||
"description": "<原始描述>"
|
||||
}'
|
||||
```
|
||||
|
||||
**分类规则参考:**
|
||||
|
||||
| Issue 关键词 | 推荐标签 | 优先级 |
|
||||
|-------------|----------|:------:|
|
||||
| bug, 错误, 失败, crash, 崩溃 | bug | 🔴 High |
|
||||
| feature, 新增, 建议, 希望 | enhancement | 🔵 Low |
|
||||
| 安全, 漏洞, 权限, 泄露 | security | 🔴 High |
|
||||
| 性能, 慢, 卡顿, 优化 | performance | 🟡 Medium |
|
||||
| 文档, README, 注释 | documentation | 🔵 Low |
|
||||
| question, 如何, 怎么, 请问 | question | 🟡 Medium |
|
||||
| 测试, test, 覆盖率 | testing | 🔵 Low |
|
||||
|
||||
---
|
||||
|
||||
## Raw API 参考
|
||||
|
||||
代码审查相关的 GitLink API 端点:
|
||||
|
||||
```bash
|
||||
# 获取 PR 详情
|
||||
gitlink-cli api GET /:owner/:repo/pulls/:id --format json
|
||||
|
||||
# 获取 PR 变更文件列表
|
||||
gitlink-cli api GET /:owner/:repo/pulls/:id/files --format json
|
||||
|
||||
# 获取 PR Diff
|
||||
gitlink-cli api GET /:owner/:repo/pulls/:id/diff --format json
|
||||
|
||||
# 提交 PR Review
|
||||
gitlink-cli api POST /:owner/:repo/pulls/:id/reviews --body '{"body":"...","event":"COMMENT"}'
|
||||
|
||||
# 获取仓库文件列表
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=<path>&ref=<branch>'
|
||||
|
||||
# 获取仓库语言统计
|
||||
gitlink-cli api GET /:owner/:repo/languages --format json
|
||||
|
||||
# 获取贡献者列表
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
|
||||
# 获取仓库动态
|
||||
gitlink-cli api GET /:owner/:repo/activity --format json
|
||||
```
|
||||
|
||||
## 代码审查最佳实践
|
||||
|
||||
### 审查原则
|
||||
|
||||
1. **先大局后细节**:先理解 PR 的目的和整体变更范围,再逐文件审查
|
||||
2. **关注行为,而非风格**:自动化工具(linter/formatter)能处理的风格问题优先交给工具
|
||||
3. **提供可操作的建议**:不只是指出问题,要给出具体的修改方案
|
||||
4. **肯定好的代码**:发现好的设计、清晰的命名、完善的测试时给予正面反馈
|
||||
5. **控制评论量**:避免信息过载——最严重的 3-5 个问题比 20 个小问题更有价值
|
||||
|
||||
### 安全红线
|
||||
|
||||
以下问题必须标记为 **Critical**,不得忽略:
|
||||
|
||||
- 硬编码的密钥 / Token / 密码
|
||||
- SQL / NoSQL 注入漏洞
|
||||
- 命令注入(shell 命令拼接)
|
||||
- 路径遍历(用户输入直接用于文件路径)
|
||||
- 不安全的反序列化
|
||||
- XSS(未转义的用户输入直接渲染)
|
||||
|
||||
### 输出规范
|
||||
|
||||
- 始终使用 `--format json` 获取结构化数据
|
||||
- 审查报告输出为 **Markdown 格式**,便于直接粘贴到 PR 评论
|
||||
- 涉及文件/行号时使用精准引用,方便定位
|
||||
- 批量操作前使用 `--dry-run` 预检
|
||||
|
||||
## 注意事项
|
||||
|
||||
- PR Review 提交后会通知所有关注该 PR 的参与者,评论内容请保持专业
|
||||
- `pr +diff` 输出可能很大(大型 PR),Agent 应分段处理
|
||||
- API 的 PR files 和 diff 接口有频率限制,避免短时间内重复请求
|
||||
- 对于 draft PR(草稿),应提示用户先将其标记为 Ready for Review
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
# PR 代码审查完整工作流示例
|
||||
|
||||
**场景**:团队成员提交了一个 PR,需要进行代码审查。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- `gitlink-cli` 已安装并登录
|
||||
- 用户拥有 PR 所在仓库的读取权限
|
||||
|
||||
## 工作流步骤
|
||||
|
||||
### Step 1:获取 PR 上下文
|
||||
|
||||
```bash
|
||||
# 查看 PR 列表,找到待审查的 PR
|
||||
gitlink-cli pr +list --state open --format json
|
||||
|
||||
# 获取特定 PR 详情
|
||||
gitlink-cli pr +view --id 42 --format json
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"data": {
|
||||
"id": 42,
|
||||
"title": "feat: add user authentication module",
|
||||
"body": "实现了基于 JWT 的用户认证模块,包含登录、注册、Token 刷新功能。",
|
||||
"state": "open",
|
||||
"author": "developer_a",
|
||||
"created_at": "2026-05-18T10:30:00+08:00",
|
||||
"source_branch": "feat/auth-module",
|
||||
"target_branch": "master"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 2:获取变更文件
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +files --id 42 --format json
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"data": [
|
||||
{ "filename": "src/auth/login.py", "status": "added", "additions": 120, "deletions": 0 },
|
||||
{ "filename": "src/auth/token.py", "status": "added", "additions": 85, "deletions": 0 },
|
||||
{ "filename": "src/config.py", "status": "modified", "additions": 5, "deletions": 2 },
|
||||
{ "filename": "tests/test_auth.py", "status": "added", "additions": 200, "deletions": 0 },
|
||||
{ "filename": "requirements.txt", "status": "modified", "additions": 3, "deletions": 0 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Step 3:获取 Diff 内容
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +diff --id 42 --format json
|
||||
```
|
||||
|
||||
### Step 4:逐文件审查
|
||||
|
||||
对每个变更文件,分析代码质量。以下是审查结果示例:
|
||||
|
||||
```markdown
|
||||
## PR #42 代码审查报告
|
||||
|
||||
### 🔴 Critical
|
||||
|
||||
1. **JWT Secret 硬编码** — `src/config.py:15`
|
||||
> `JWT_SECRET = "my-secret-key-123"` 硬编码在源码中,存在泄露风险。建议:
|
||||
> - 使用环境变量:`JWT_SECRET = os.getenv("JWT_SECRET")`
|
||||
> - 或使用配置文件(不提交到版本控制)
|
||||
|
||||
2. **SQL 注入风险** — `src/auth/login.py:42`
|
||||
> `cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")` 直接拼接用户输入,存在 SQL 注入风险。建议使用参数化查询:
|
||||
> ```python
|
||||
> cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
|
||||
> ```
|
||||
|
||||
### 🟡 Warning
|
||||
|
||||
1. **密码明文存储** — `src/auth/login.py:88`
|
||||
> 密码直接存储到数据库,建议使用 `bcrypt` 或 `argon2` 进行哈希处理。
|
||||
|
||||
2. **缺少输入验证** — `src/auth/login.py:15`
|
||||
> `login()` 函数没有对 `username` 和 `password` 进行长度和格式校验。建议:
|
||||
> ```python
|
||||
> if len(username) < 3 or len(username) > 50:
|
||||
> raise ValueError("用户名长度应在 3-50 个字符之间")
|
||||
> ```
|
||||
|
||||
### 🔵 Suggestion
|
||||
|
||||
1. **Token 过期时间可配置** — `src/auth/token.py:30`
|
||||
> `ACCESS_TOKEN_EXPIRE_MINUTES = 30` 建议改为从环境变量读取,方便不同环境配置。
|
||||
|
||||
2. **测试可增加边界用例** — `tests/test_auth.py`
|
||||
> 现有测试覆盖了正常流程,建议补充:
|
||||
> - 空用户名/密码
|
||||
> - 超长输入
|
||||
> - Token 过期处理
|
||||
> - 并发登录场景
|
||||
|
||||
### ✅ Positive
|
||||
|
||||
- 完整的测试覆盖(200 行测试代码,覆盖主要功能路径)
|
||||
- 清晰的模块划分(login / token 职责分离)
|
||||
- 有类型注解,代码可读性好
|
||||
```
|
||||
|
||||
### Step 5:提交 Review
|
||||
|
||||
```bash
|
||||
# 提交整体 Review 评论
|
||||
gitlink-cli api POST /Gitlink/forgeplus/pulls/42/reviews --body '{
|
||||
"body": "## PR #42 代码审查报告\n\n### 🔴 Critical\n\n1. **JWT Secret 硬编码** — `src/config.py:15`\n JWT_SECRET 硬编码在源码中。建议使用 `os.getenv(\"JWT_SECRET\")`。\n\n2. **SQL 注入风险** — `src/auth/login.py:42`\n 直接拼接用户输入到 SQL 查询。建议使用参数化查询。\n\n### 🟡 Warning\n\n1. **密码明文存储** — 建议使用 bcrypt 哈希处理。\n\n### 总体评价\n\n代码整体结构清晰,测试覆盖良好。建议修复 Critical 问题后合并。",
|
||||
"event": "COMMENT"
|
||||
}'
|
||||
```
|
||||
|
||||
### Step 6:输出审查摘要
|
||||
|
||||
```markdown
|
||||
## 📋 审查摘要 — PR #42 feat: add user authentication module
|
||||
|
||||
| 指标 | 数据 |
|
||||
|------|------|
|
||||
| 审查文件数 | 5 |
|
||||
| 变更行数 | +413 / -2 |
|
||||
| Critical 问题 | 2 |
|
||||
| Warning | 2 |
|
||||
| Suggestion | 2 |
|
||||
|
||||
### 主要发现
|
||||
1. **[Critical]** JWT Secret 硬编码在源码中
|
||||
2. **[Critical]** SQL 查询存在注入风险
|
||||
3. **[Warning]** 密码明文存储
|
||||
|
||||
### 总体评价
|
||||
代码结构良好,测试覆盖完整。修复两个安全关键问题后即可合并。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 完整命令速览
|
||||
|
||||
```bash
|
||||
# 获取 PR 详情
|
||||
gitlink-cli pr +view --id <id> --format json
|
||||
|
||||
# 获取变更文件
|
||||
gitlink-cli pr +files --id <id> --format json
|
||||
|
||||
# 获取 Diff
|
||||
gitlink-cli pr +diff --id <id> --format json
|
||||
|
||||
# 提交 Review
|
||||
gitlink-cli api POST /:owner/:repo/pulls/:id/reviews --body '{"body":"...","event":"COMMENT"}'
|
||||
```
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
# gitlink-compliance API 参考
|
||||
|
||||
## 文件检查 API
|
||||
|
||||
合规检查的核心是读取仓库中的文件内容,判断是否存在、内容是否正确。
|
||||
|
||||
### 读取文件内容
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/raw/<branch>/<filepath>
|
||||
```
|
||||
|
||||
**说明:** 直接返回文件原始内容,用于检查 LICENSE、README、CONTRIBUTING 等文件。
|
||||
|
||||
### 获取文件列表
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=<path>&ref=<branch>' --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.entries[].name` | string | 文件名 |
|
||||
| `data.entries[].type` | string | "file" 或 "dir" |
|
||||
| `data.entries[].size` | int | 文件大小(字节) |
|
||||
| `data.entries[].sha` | string | 文件 SHA |
|
||||
| `data.entries[].commit.message` | string | 最后提交信息 |
|
||||
| `data.entries[].commit.created_at` | string | 最后修改时间 |
|
||||
| `data.entries[].is_readme_file` | boolean | 是否为 README 文件 |
|
||||
| `data.entries[].direct_download` | boolean | 是否可直接下载 |
|
||||
|
||||
### 获取仓库信息
|
||||
|
||||
```bash
|
||||
gitlink-cli repo +info --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 用途 |
|
||||
|------|------|------|
|
||||
| `data.private` | boolean | 判断仓库可见性 |
|
||||
| `data.default_branch` | string | 默认分支 |
|
||||
| `data.license` | string | 许可证(如平台有返回) |
|
||||
| `data.author.login` | string | 所有者 |
|
||||
|
||||
### 获取贡献者列表
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
```
|
||||
|
||||
用于检查贡献者是否签署了 CLA/DCO。
|
||||
|
||||
---
|
||||
|
||||
## 常见许可证识别
|
||||
|
||||
通过读取 LICENSE 文件内容,关键字匹配识别许可证类型:
|
||||
|
||||
| 许可证 | 关键字 | 兼容性 |
|
||||
|--------|--------|--------|
|
||||
| MIT | "MIT License", "Permission is hereby granted" | Apache-2.0, BSD, ISC |
|
||||
| Apache-2.0 | "Apache License", "Version 2.0" | MIT, BSD, ISC |
|
||||
| GPL-2.0 | "GNU GENERAL PUBLIC LICENSE", "Version 2" | 严格 copyleft |
|
||||
| GPL-3.0 | "GNU GENERAL PUBLIC LICENSE", "Version 3" | 严格 copyleft |
|
||||
| BSD-2/3 | "BSD", "Redistribution and use" | MIT, Apache-2.0 |
|
||||
| MulanPSL-2 | "木兰", "Mulan Permissive Software License" | MIT, Apache-2.0, BSD |
|
||||
| LGPL | "GNU LESSER GENERAL PUBLIC LICENSE" | 弱 copyleft |
|
||||
| AGPL | "GNU AFFERO GENERAL PUBLIC LICENSE" | 严格 copyleft(网络传播) |
|
||||
| Unlicense | "Unlicense", "public domain" | 所有许可证 |
|
||||
| CC0 | "CC0", "Creative Commons Zero" | 公共领域 |
|
||||
|
||||
---
|
||||
|
||||
## 许可证兼容性矩阵
|
||||
|
||||
| 项目许可证 | 兼容的依赖许可证 | 不兼容的依赖许可证 |
|
||||
|-----------|-----------------|-------------------|
|
||||
| MIT | MIT, Apache-2.0, BSD-2/3, Unlicense, ISC, CC0, MulanPSL-2 | GPL-2/3 (仅分发时), AGPL |
|
||||
| Apache-2.0 | Apache-2.0, MIT, BSD-2/3, ISC, Unlicense | GPL-2/3 |
|
||||
| GPL-3.0 | GPL-3.0, MIT, Apache-2.0, BSD | —(兼容大多数) |
|
||||
| BSD-3 | MIT, BSD-2/3, Apache-2.0, ISC | GPL-2/3, AGPL |
|
||||
| MulanPSL-2 | MulanPSL-2, MIT, Apache-2.0, BSD | GPL-3 (需确认) |
|
||||
|
||||
---
|
||||
|
||||
## 合规检查清单
|
||||
|
||||
### 🔴 必须项检查
|
||||
|
||||
| 检查项 | 检查方法 | 通过标准 |
|
||||
|--------|----------|----------|
|
||||
| LICENSE 存在 | `raw/HEAD/LICENSE` != 404 | 文件存在且非空 |
|
||||
| 许可证有效 | 内容匹配已知许可证关键字 | 可识别为 OSI 批准的许可证 |
|
||||
| README 存在 | `sub_entries` 中 `is_readme_file=true` | 文件存在 |
|
||||
| .gitignore 存在 | `sub_entries` 中 name=".gitignore" | 文件存在 |
|
||||
|
||||
### 🟡 建议项检查
|
||||
|
||||
| 检查项 | 检查方法 | 通过标准 |
|
||||
|--------|----------|----------|
|
||||
| CONTRIBUTING.md | `sub_entries` 或 `raw` | 文件存在 |
|
||||
| SECURITY.md | `sub_entries` 或 `raw` | 文件存在 |
|
||||
| CODE_OF_CONDUCT.md | `sub_entries` 或 `raw` | 文件存在 |
|
||||
| CHANGELOG 或 Release | `sub_entries` 或 `release +list` | 任一存在 |
|
||||
|
||||
### 🔵 优化项检查
|
||||
|
||||
| 检查项 | 检查方法 | 通过标准 |
|
||||
|--------|----------|----------|
|
||||
| CI 配置 | 检查 `.trustie-pipeline.yml` / `.github/workflows` 等 | 存在即通过 |
|
||||
| 源文件版权头 | 采样检查源码文件前 5 行 | 50% 以上文件有版权声明 |
|
||||
| 依赖配置文件 | 检查 package.json / go.mod / Cargo.toml 等 | 存在即通过 |
|
||||
|
||||
---
|
||||
|
||||
## 输出格式规范
|
||||
|
||||
### 合规报告 Markdown 模板
|
||||
|
||||
```markdown
|
||||
## ⚖️ 合规检查报告 — <owner>/<repo>
|
||||
|
||||
📅 检查时间:<YYYY-MM-DD>
|
||||
📋 项目许可证:<识别到的许可证>
|
||||
|
||||
### 🔴 必须修复
|
||||
| # | 问题 | 文件 | 建议 |
|
||||
|---|------|------|------|
|
||||
|
||||
### 🟡 建议修复
|
||||
| # | 问题 | 文件 | 建议 |
|
||||
|---|------|------|------|
|
||||
|
||||
### 🔵 可选优化
|
||||
| # | 建议 | 说明 |
|
||||
|---|------|------|
|
||||
|
||||
### 📊 合规评分
|
||||
| 维度 | 状态 | 评分 |
|
||||
|------|:----:|:----:|
|
||||
| 📜 许可证 | ✅/⚠️/❌ | ☆☆☆☆☆ |
|
||||
| 🏷️ 版权声明 | ✅/⚠️/❌ | ☆☆☆☆☆ |
|
||||
| 📦 依赖合规 | ✅/⚠️/❌ | ☆☆☆☆☆ |
|
||||
| 🔒 安全策略 | ✅/⚠️/❌ | ☆☆☆☆☆ |
|
||||
| 📖 项目文档 | ✅/⚠️/❌ | ☆☆☆☆☆ |
|
||||
|
||||
**总体合规评分:<分数>/100**
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 合规检查结果仅基于仓库中可读取的信息,不构成法律建议
|
||||
2. 许可证兼容性问题建议咨询法务或 OSPO
|
||||
3. 依赖分析需要根据项目语言选择对应的依赖文件
|
||||
4. 不同许可证的兼容性规则可能因 Jurisdiction 而异
|
||||
5. MulanPSL-2.0 是中国广泛使用的开源许可证,在 GitLink 平台上常见
|
||||
6. 版权声明检查为采样性质,100% 覆盖需专业扫描工具
|
||||
7. RAW API 返回的某些文件可能包含完整内容(`replace_content` 字段)
|
||||
|
|
@ -0,0 +1,231 @@
|
|||
---
|
||||
name: gitlink-compliance
|
||||
version: 1.0.0
|
||||
description: "开源合规检查:扫描仓库许可证、版权声明、依赖合规性,生成合规报告与修复建议。当用户需要检查项目合规状态、许可证兼容性或准备开源发布时触发。"
|
||||
metadata:
|
||||
requires:
|
||||
bins: ["gitlink-cli"]
|
||||
cliHelp: "gitlink-cli repo --help"
|
||||
---
|
||||
|
||||
# gitlink-compliance(开源合规检查)
|
||||
|
||||
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
|
||||
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`(GitHub CLI)操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
|
||||
|
||||
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
|
||||
|
||||
---
|
||||
|
||||
## 工作流概览
|
||||
|
||||
本 Skill 提供开源项目的合规性自动化检查能力,帮助 Maintainer 在发布前发现并修复合规问题。
|
||||
|
||||
| 检查类型 | 覆盖范围 | 严重程度 |
|
||||
|----------|---------|:--------:|
|
||||
| 许可证检查 | LICENSE 文件存在性、许可证类型识别 | 🔴 / 🟡 |
|
||||
| 版权声明 | 源文件头部版权注释 | 🟡 |
|
||||
| 依赖合规 | 第三方依赖许可证兼容性 | 🔴 |
|
||||
| 安全策略 | SECURITY.md、安全披露流程 | 🟡 |
|
||||
| 贡献者协议 | CLA / DCO 要求 | 🔵 |
|
||||
|
||||
---
|
||||
|
||||
## 工作流 1:完整合规检查
|
||||
|
||||
**场景**:项目准备开源发布前,进行全面的合规性审查。
|
||||
|
||||
### 采集数据
|
||||
|
||||
```bash
|
||||
# 1. 获取仓库文件结构
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=&ref=master'
|
||||
|
||||
# 2. 读取 LICENSE 文件
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/LICENSE
|
||||
|
||||
# 3. 检查关键文档是否存在
|
||||
# 检查以下文件是否存在:
|
||||
# - LICENSE / LICENSE.txt / LICENSE.md
|
||||
# - CONTRIBUTING / CONTRIBUTING.md
|
||||
# - SECURITY / SECURITY.md
|
||||
# - CODE_OF_CONDUCT / CODE_OF_CONDUCT.md
|
||||
# - .gitignore
|
||||
# - README.md
|
||||
|
||||
# 4. 获取依赖配置
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/package.json # Node.js
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/go.mod # Go
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/requirements.txt # Python
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/Cargo.toml # Rust
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/pom.xml # Java/Maven
|
||||
|
||||
# 5. 获取源文件检查(按语言采样)
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=src&ref=master'
|
||||
|
||||
# 6. 获取仓库基本信息
|
||||
gitlink-cli repo +info --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
### 检查清单
|
||||
|
||||
#### 🔴 必须修复项
|
||||
|
||||
| 检查项 | 标准 | 判定方法 |
|
||||
|--------|------|----------|
|
||||
| LICENSE 文件 | 根目录存在 LICENSE 文件且内容有效 | 检查文件是否存在、内容是否为空 |
|
||||
| 许可证类型 | 使用 OSI 批准的开放源码许可证 | 解析 LICENSE 内容,识别许可证类型 |
|
||||
| 许可证兼容性 | 项目许可证与依赖许可证兼容 | 检查依赖许可证,对比兼容性矩阵 |
|
||||
| 安全漏洞 | 依赖无已知 CVE | 检查依赖版本(需外部数据源) |
|
||||
|
||||
#### 🟡 建议修复项
|
||||
|
||||
| 检查项 | 标准 | 判定方法 |
|
||||
|--------|------|----------|
|
||||
| 版权声明 | 源文件头部包含版权和许可证信息 | 采样检查源文件头部注释 |
|
||||
| SECURITY.md | 存在安全策略披露流程 | 检查文件是否存在 |
|
||||
| CONTRIBUTING.md | 存在贡献指南 | 检查文件是否存在 |
|
||||
| 商标声明 | 正确使用项目/组织商标 | 检查 README 和 LICENSE 中的商标声明 |
|
||||
|
||||
#### 🔵 可选优化项
|
||||
|
||||
| 检查项 | 标准 | 判定方法 |
|
||||
|--------|------|----------|
|
||||
| CODE_OF_CONDUCT | 存在行为准则 | 检查文件是否存在 |
|
||||
| .gitignore | 存在且配置完整 | 检查文件是否存在、内容是否覆盖常见模式 |
|
||||
| README 质量 | README 包含安装、使用、贡献说明 | 检查内容长度和关键章节 |
|
||||
|
||||
### 输出格式
|
||||
|
||||
```markdown
|
||||
## ⚖️ 合规检查报告 — <owner>/<repo>
|
||||
|
||||
📅 检查时间:<YYYY-MM-DD>
|
||||
📋 项目许可证:<许可证类型>
|
||||
|
||||
### 🔴 必须修复
|
||||
|
||||
| # | 问题 | 文件 | 建议 |
|
||||
|---|------|------|------|
|
||||
| 1 | 缺少 LICENSE 文件 | — | 添加 LICENSE 文件,建议使用 <推荐许可证> |
|
||||
| 2 | 依赖 xxx 使用 GPL 许可证,与项目 MIT 许可证不兼容 | package.json | 替换为兼容许可证的替代库 |
|
||||
| 3 | 源文件缺少版权声明头 | src/*.py | 添加标准版权注释头 |
|
||||
|
||||
### 🟡 建议修复
|
||||
|
||||
| # | 问题 | 文件 | 建议 |
|
||||
|---|------|------|------|
|
||||
| 1 | 缺少 SECURITY.md | — | 添加安全漏洞披露流程文档 |
|
||||
| 2 | CONTRIBUTING.md 不存在 | — | 添加贡献指南 |
|
||||
|
||||
### 🔵 可选优化
|
||||
|
||||
| # | 建议 | 说明 |
|
||||
|---|------|------|
|
||||
| 1 | 添加 CODE_OF_CONDUCT.md | 规范社区行为准则 |
|
||||
| 2 | 完善 README 安装说明 | 当前缺少环境要求部分 |
|
||||
|
||||
### 📊 合规评分
|
||||
|
||||
| 维度 | 状态 | 评分 |
|
||||
|------|:----:|:----:|
|
||||
| 📜 许可证 | ✅ / ⚠️ / ❌ | ☆☆☆☆☆ |
|
||||
| 🏷️ 版权声明 | ✅ / ⚠️ / ❌ | ☆☆☆☆☆ |
|
||||
| 📦 依赖合规 | ✅ / ⚠️ / ❌ | ☆☆☆☆☆ |
|
||||
| 🔒 安全策略 | ✅ / ⚠️ / ❌ | ☆☆☆☆☆ |
|
||||
| 📖 项目文档 | ✅ / ⚠️ / ❌ | ☆☆☆☆☆ |
|
||||
|
||||
**总体合规评分:<分数>/100**
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 工作流 2:许可证兼容性检查
|
||||
|
||||
**场景**:检查项目使用的第三方依赖是否与项目许可证兼容。
|
||||
|
||||
```bash
|
||||
# 1. 获取依赖配置文件
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/package.json
|
||||
```
|
||||
|
||||
### 许可证兼容性参考
|
||||
|
||||
| 项目许可证 | 兼容的依赖许可证 | 不兼容的依赖许可证 |
|
||||
|-----------|-----------------|-------------------|
|
||||
| MIT | MIT, Apache-2.0, BSD-2/3, Unlicense, ISC, CC0 | GPL-2/3, AGPL |
|
||||
| Apache-2.0 | Apache-2.0, MIT, BSD-2/3, ISC, Unlicense | GPL-2/3 |
|
||||
| GPL-3.0 | GPL-3.0, MIT, Apache-2.0, BSD | — |
|
||||
| BSD-3 | MIT, BSD-2/3, Apache-2.0, ISC | GPL-2/3, AGPL |
|
||||
| MulanPSL-2 | MulanPSL-2, MIT, Apache-2.0, BSD | GPL-3, AGPL (需确认) |
|
||||
|
||||
### 输出格式
|
||||
|
||||
```bash
|
||||
# 依赖合规分析(示例输出结构)
|
||||
|
||||
## 📦 依赖合规分析
|
||||
|
||||
| 依赖 | 版本 | 许可证 | 兼容性 | 建议 |
|
||||
|------|:----:|:------:|:------:|------|
|
||||
| express | 4.18.2 | MIT | ✅ 兼容 | — |
|
||||
| lodash | 4.17.21 | MIT | ✅ 兼容 | — |
|
||||
| anticonflict-lib | 1.0.0 | GPL-3.0 | ❌ 不兼容 | 替换为兼容替代库 |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 工作流 3:版权声明批量检查
|
||||
|
||||
**场景**:检查项目中所有源文件是否包含正确的版权声明头。
|
||||
|
||||
```bash
|
||||
# 1. 遍历源文件目录
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=src&ref=master'
|
||||
|
||||
# 2. 采样检查源文件头部(取前 5-10 行)
|
||||
gitlink-cli api GET /:owner/:repo/raw/master/src/main.py
|
||||
```
|
||||
|
||||
### 标准版权声明模板
|
||||
|
||||
```python
|
||||
# Copyright (c) <年份> <组织/作者>
|
||||
# Licensed under the <许可证> License.
|
||||
# See LICENSE file in the project root for full license information.
|
||||
```
|
||||
|
||||
### 常见问题
|
||||
|
||||
| 问题 | 说明 |
|
||||
|------|------|
|
||||
| 缺少头部注释 | 源文件没有版权/许可证信息 |
|
||||
| 年份过时 | 版权年份未更新到当前年份 |
|
||||
| 许可证不匹配 | 声明的许可证与实际 LICENSE 文件不一致 |
|
||||
| 组织名称错误 | 版权声明的组织名称与项目所属不一致 |
|
||||
|
||||
---
|
||||
|
||||
## Raw API 参考
|
||||
|
||||
```bash
|
||||
# 获取文件内容
|
||||
gitlink-cli api GET /:owner/:repo/raw/<branch>/<path>
|
||||
|
||||
# 获取文件列表(遍历目录)
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=<path>&ref=<branch>'
|
||||
|
||||
# 获取仓库信息
|
||||
gitlink-cli api GET /:owner/:repo --format json
|
||||
|
||||
# 获取贡献者列表
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 合规检查结果仅基于仓库中可读取的文件,不构成法律建议
|
||||
- 对于许可证兼容性问题,建议在实际发布前咨询法务或开源办公室(OSPO)
|
||||
- 不同语言的依赖管理文件格式不同,需要根据项目主语言选择对应的依赖文件分析
|
||||
- 版权声明检查是采样性的,100% 覆盖需要运行专门的扫描工具
|
||||
- MulanPSL-2(木兰许可证)是 GitLink 平台上常用的许可证,需注意其与 GPL 的兼容性
|
||||
|
|
@ -0,0 +1,185 @@
|
|||
# gitlink-insight API 参考
|
||||
|
||||
## 数据聚合 API
|
||||
|
||||
以下 API 用于采集项目健康度、协作洞察所需的基础数据。
|
||||
|
||||
### 仓库信息
|
||||
|
||||
```bash
|
||||
gitlink-cli repo +info --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.project_id` | int | 项目 ID |
|
||||
| `data.identifier` | string | 仓库标识 |
|
||||
| `data.issues_count` | int | Issue 总数 |
|
||||
| `data.pull_requests_count` | int | PR 总数 |
|
||||
| `data.forked_count` | int | Fork 数 |
|
||||
| `data.praises_count` | int | Star 数 |
|
||||
| `data.watchers_count` | int | 关注数 |
|
||||
| `data.contributor_users_count` | int | 贡献者数 |
|
||||
| `data.version_releases_count` | int | 版本发布数 |
|
||||
| `data.default_branch` | string | 默认分支 |
|
||||
| `data.author.login` | string | 所有者 |
|
||||
| `data.author.name` | string | 所有者名称 |
|
||||
| `data.private` | boolean | 是否私有 |
|
||||
| `data.clone_url` | string | 克隆地址 |
|
||||
|
||||
### Issue 列表
|
||||
|
||||
```bash
|
||||
gitlink-cli issue +list --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.closed_count` | int | 已关闭总数 |
|
||||
| `data.issues[].id` | int | Issue ID |
|
||||
| `data.issues[].name` | string | 标题 |
|
||||
| `data.issues[].author.login` | string | 作者 |
|
||||
| `data.issues[].assigners` | array | 指派人 |
|
||||
| `data.issues[].created_at` | string | 创建时间 |
|
||||
| `data.issues[].priority.name` | string | 优先级 |
|
||||
| `data.issues[].milestone_name` | string | 里程碑 |
|
||||
| `data.issues[].comment_journals_count` | int | 评论数 |
|
||||
|
||||
### PR 列表
|
||||
|
||||
```bash
|
||||
gitlink-cli pr +list --state <open|merged|closed> --owner <owner> --repo <repo> --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.open_count` | int | 开放 PR 数 |
|
||||
| `data.close_count` | int | 关闭 PR 数 |
|
||||
| `data.merged_issues_size` | int | 已合并 PR 数 |
|
||||
| `data.search_count` | int | 搜索总数 |
|
||||
| `data.issues[].pull_request_number` | int | PR 编号 |
|
||||
| `data.issues[].name` | string | PR 标题 |
|
||||
| `data.issues[].author_login` | string | 作者登录名 |
|
||||
| `data.issues[].author_name` | string | 作者显示名 |
|
||||
| `data.issues[].pull_request_status` | int | **0=open, 1=merged, 2=closed** |
|
||||
| `data.issues[].pull_request_base` | string | 目标分支 |
|
||||
| `data.issues[].pull_request_head` | string | 源分支 |
|
||||
| `data.issues[].pr_created_unix` | int | 创建时间戳 |
|
||||
| `data.issues[].pr_full_time` | string | 创建完整时间 |
|
||||
| `data.issues[].journals_count` | int | 评论数 |
|
||||
| `data.issues[].is_original` | boolean | 是否原始 PR |
|
||||
| `data.issues[].fork_project_user` | string | Fork 来源用户 |
|
||||
|
||||
### Release 列表
|
||||
|
||||
```bash
|
||||
gitlink-cli release +list --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data[].version_id` | int | 版本 ID |
|
||||
| `data[].title` | string | 版本标题 |
|
||||
| `data[].tag_name` | string | 标签名 |
|
||||
| `data[].created_at` | string | 创建时间 |
|
||||
| `data[].body` | string | 发布说明 |
|
||||
|
||||
### 仓库文件列表
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=&ref=<branch>' --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.entries[].name` | string | 文件名 |
|
||||
| `data.entries[].type` | string | "file" 或 "dir" |
|
||||
| `data.entries[].size` | int | 文件大小 |
|
||||
| `data.entries[].sha` | string | 文件 SHA |
|
||||
|
||||
### 仓库语言统计
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/languages --format json
|
||||
```
|
||||
|
||||
**返回示例:** `{ "Ruby": "90.2%", "JavaScript": "6.1%", "CSS": "3.7%" }`
|
||||
|
||||
### 贡献者列表
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data[].login` | string | 登录名 |
|
||||
| `data[].name` | string | 显示名 |
|
||||
| `data[].image_url` | string | 头像 |
|
||||
| `data[].commits_count` | int | 提交数(如返回) |
|
||||
|
||||
### 仓库动态
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/activity --format json
|
||||
```
|
||||
|
||||
### 获取用户详情
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /users/:user_id --format json
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `data.login` | string | 登录名 |
|
||||
| `data.name` | string | 名称 |
|
||||
| `data.user_id` | int | 用户 ID |
|
||||
| `data.user_identity` | string | 身份 |
|
||||
| `data.user_projects_count` | int | 项目数 |
|
||||
| `data.created_time` | string | 注册时间 |
|
||||
|
||||
---
|
||||
|
||||
## 健康度评分标准
|
||||
|
||||
| 维度 | 权重 | 数据来源 | 评分方法 |
|
||||
|------|:----:|----------|----------|
|
||||
| 文档完整性 | 15% | `sub_entries` 检查 README、CONTRIBUTING、CHANGELOG | 存在=5分/个,内容质量酌情加减 |
|
||||
| 许可证合规 | 10% | `sub_entries` 检查 LICENSE | 存在=10分,有内容=+5分 |
|
||||
| 工程化程度 | 15% | CI 配置、linter、.gitignore | 每项配置=5分 |
|
||||
| 代码质量 | 20% | 测试文件数 / 源码文件数 | >30%=满分,逐步递减 |
|
||||
| 协作指标 | 20% | Issue/PR 响应和关闭数据 | 响应<24h=10分,关闭率>80%=10分 |
|
||||
| 社区活跃 | 10% | Star/Fork/贡献者数 | 相对评分,取仓库间的百分位 |
|
||||
| 依赖管理 | 10% | 依赖配置文件完整性 | 有配置文件=10分 |
|
||||
|
||||
---
|
||||
|
||||
## 时间范围过滤
|
||||
|
||||
对于周报/月报报告,通过 API 返回的 `created_at` / `pr_full_time` 字段在 Agent 端过滤:
|
||||
|
||||
```javascript
|
||||
// 示例:获取本周的数据
|
||||
const now = new Date();
|
||||
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
||||
// 客户端过滤 pr_full_time >= weekAgo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 分页处理
|
||||
|
||||
对于大量 Issue/PR,API 使用服务端分页:
|
||||
|
||||
```bash
|
||||
# 目前 API 返回所有数据,无显式分页参数
|
||||
# Agent 端可根据数据量自行分批处理
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- PR 列表返回的 `--state` 参数仅影响统计计数,实际过滤需客户端判断 `pull_request_status`
|
||||
- 仓库活动(activity)API 返回的数据格式未完全验证,Agent 需做容错处理
|
||||
- 贡献者详情需循环调用 `/users/:user_id` 分别获取
|
||||
- 所有数据尽可能使用 `--format json` 以确保解析稳定性
|
||||
|
|
@ -0,0 +1,283 @@
|
|||
---
|
||||
name: gitlink-insight
|
||||
version: 1.0.0
|
||||
description: "项目健康度与协作洞察:分析 Issue/PR 指标、贡献者活跃度、生成项目周报和健康度报告。当用户需要了解项目进展、团队协作状况或生成报告时触发。"
|
||||
metadata:
|
||||
requires:
|
||||
bins: ["gitlink-cli"]
|
||||
cliHelp: "gitlink-cli issue --help"
|
||||
---
|
||||
|
||||
# gitlink-insight(项目健康度与协作洞察)
|
||||
|
||||
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
|
||||
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`(GitHub CLI)操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
|
||||
|
||||
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
|
||||
|
||||
---
|
||||
|
||||
## 工作流概览
|
||||
|
||||
本 Skill 通过聚合 GitLink API 数据,生成多维度的项目协作洞察报告。
|
||||
|
||||
| 报告类型 | 数据来源 | 适用场景 |
|
||||
|----------|---------|----------|
|
||||
| 项目健康度 | 仓库元数据 + 代码规范 + 测试 + 文档 | 项目 Maintainer 评估仓库状态 |
|
||||
| Sprint 周报 | Issue + PR + Release | 团队每周同步 |
|
||||
| 贡献者洞察 | 贡献者列表 + 活跃度 + PR 数据 | 管理者了解团队贡献分布 |
|
||||
| Issue 分析 | Issue 列表 + 标签 + 状态 | 项目管理跟踪进度 |
|
||||
|
||||
---
|
||||
|
||||
## 工作流 1:项目健康度报告
|
||||
|
||||
**场景**:评估一个仓库的整体健康状况。
|
||||
|
||||
### 采集数据
|
||||
|
||||
```bash
|
||||
# 1. 获取仓库基本信息
|
||||
gitlink-cli repo +info --owner <owner> --repo <repo> --format json
|
||||
|
||||
# 2. 获取 Issue 统计
|
||||
gitlink-cli issue +list --state open --format json
|
||||
gitlink-cli issue +list --state closed --format json
|
||||
|
||||
# 3. 获取 PR 统计
|
||||
gitlink-cli pr +list --state open --format json
|
||||
gitlink-cli pr +list --state merged --format json
|
||||
|
||||
# 4. 获取仓库文件结构(检查文档、CI 配置)
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=&ref=master'
|
||||
|
||||
# 5. 获取语言统计
|
||||
gitlink-cli api GET /:owner/:repo/languages --format json
|
||||
|
||||
# 6. 获取贡献者列表
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
```
|
||||
|
||||
### 分析指标
|
||||
|
||||
| 维度 | 指标 | 计算方法 | 权重 |
|
||||
|------|------|----------|:----:|
|
||||
| 📖 文档 | README 质量、CONTRIBUTING 存在性、CHANGELOG | 检查关键文档文件是否存在 | 15% |
|
||||
| 📜 合规 | LICENSE 文件、版权声明 | 检查 LICENSE 文件 | 10% |
|
||||
| 🔧 工程化 | CI 配置、linter 配置、.gitignore | 检查 CI/linter 配置文件 | 15% |
|
||||
| 🧪 质量 | 测试文件比例、代码规范 | 测试文件占源码比例 | 20% |
|
||||
| 🐛 协作 | Issue 响应时间、PR 合并率 | 分析 Issue/PR 时间序列 | 20% |
|
||||
| 👥 社区 | 贡献者数量、Fork 数、Star 数 | 从仓库元数据获取 | 10% |
|
||||
| 📦 依赖 | 依赖配置文件、依赖数量 | 检查 package.json / go.mod 等 | 10% |
|
||||
|
||||
### 输出格式
|
||||
|
||||
```markdown
|
||||
## 🏥 项目健康度报告 — <owner>/<repo>
|
||||
|
||||
📅 报告时间:<YYYY-MM-DD>
|
||||
|
||||
### 总体评分:<⭐x5>(<分数>/100)
|
||||
|
||||
| 维度 | 评分 | 详情 |
|
||||
|------|:----:|------|
|
||||
| 📖 文档 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
| 📜 合规 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
| 🔧 工程化 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
| 🧪 质量 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
| 🐛 协作 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
| 👥 社区 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
| 📦 依赖 | ☆☆☆☆☆ / 5 | <详情> |
|
||||
|
||||
### 📊 关键指标
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|:----:|
|
||||
| 总 Issue(开放/关闭) | <n> / <n> |
|
||||
| 总 PR(开放/已合并) | <n> / <n> |
|
||||
| 贡献者 | <n> 人 |
|
||||
| 主要语言 | <语言> |
|
||||
| Star / Fork | <n> / <n> |
|
||||
|
||||
### ✅ 亮点
|
||||
- <做得好的地方>
|
||||
|
||||
### ⚠️ 待改进
|
||||
- <需要改进的地方>
|
||||
|
||||
### 🎯 建议行动
|
||||
1. <优先级最高的改进建议>
|
||||
2. <次要建议>
|
||||
3. <可选的优化建议>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 工作流 2:Sprint 周报
|
||||
|
||||
**场景**:每周自动生成团队协作周报。
|
||||
|
||||
```bash
|
||||
# 1. 获取时间范围内关闭的 Issue
|
||||
gitlink-cli issue +list --state closed --format json
|
||||
|
||||
# 2. 获取时间范围内合并的 PR
|
||||
gitlink-cli pr +list --state merged --format json
|
||||
|
||||
# 3. 获取新的 Release
|
||||
gitlink-cli release +list --format json
|
||||
|
||||
# 4. 获取开放中的 Issue(正在进行的任务)
|
||||
gitlink-cli issue +list --state open --format json
|
||||
|
||||
# 5. 获取项目动态
|
||||
gitlink-cli api GET /:owner/:repo/activity --format json
|
||||
```
|
||||
|
||||
### 输出格式
|
||||
|
||||
```markdown
|
||||
## 📅 Sprint 周报 — <owner>/<repo>
|
||||
|
||||
📆 周期:<YYYY-MM-DD> ~ <YYYY-MM-DD>
|
||||
|
||||
### ✅ 本周完成
|
||||
| 类型 | 数量 | 详情 |
|
||||
|------|:----:|------|
|
||||
| Issue 关闭 | <n> | <关键 Issue 列表> |
|
||||
| PR 合并 | <n> | <关键 PR 列表> |
|
||||
| Release | <n> | <版本号列表> |
|
||||
|
||||
### 🚧 进行中
|
||||
| Issue | 负责人 | 状态 |
|
||||
|-------|:------:|:----:|
|
||||
| <标题> | <assignee> | 进行中 / Review 中 / 阻塞 |
|
||||
|
||||
### 📊 统计
|
||||
| 指标 | 本周 | 上周 | 环比 |
|
||||
|------|:----:|:----:|:----:|
|
||||
| 关闭 Issue | <n> | <n> | ±<n>% |
|
||||
| 合并 PR | <n> | <n> | ±<n>% |
|
||||
| 新增 Issue | <n> | <n> | ±<n>% |
|
||||
| 新增贡献者 | <n> | <n> | ±<n> |
|
||||
|
||||
### ⚠️ 风险与阻塞
|
||||
- <需要关注的问题>
|
||||
|
||||
---
|
||||
|
||||
## 工作流 3:贡献者洞察
|
||||
|
||||
**场景**:分析团队成员的贡献分布和活跃度。
|
||||
|
||||
```bash
|
||||
# 1. 获取贡献者列表
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
|
||||
# 2. 获取每个贡献者的 PR
|
||||
# 通过 PR 列表按 author 过滤
|
||||
gitlink-cli pr +list --state merged --format json
|
||||
|
||||
# 3. 获取用户信息
|
||||
gitlink-cli user +info --login <username> --format json
|
||||
```
|
||||
|
||||
### 输出格式
|
||||
|
||||
```markdown
|
||||
## 👥 贡献者洞察 — <owner>/<repo>
|
||||
|
||||
| 贡献者 | 合并 PR | 关闭 Issue | 最近活跃 | 角色 |
|
||||
|--------|:-------:|:----------:|:---------:|:----:|
|
||||
| <user> | <n> | <n> | <日期> | Maintainer / Contributor |
|
||||
|
||||
### 活跃度分布
|
||||
- 核心贡献者(本月 5+ PR):<n> 人
|
||||
- 活跃贡献者(本月 1-4 PR):<n> 人
|
||||
- 新增贡献者(本月首次贡献):<n> 人
|
||||
|
||||
### 贡献趋势
|
||||
- 本月 PR 合并数:<n>(环比 <±n%>)
|
||||
- 本月 Issue 响应中位数:<n> 小时
|
||||
- 本月 PR Review 中位数:<n> 小时
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 工作流 4:Issue 积压分析
|
||||
|
||||
**场景**:分析未处理的 Issue 积压情况,帮助排期。
|
||||
|
||||
```bash
|
||||
# 1. 获取所有开放 Issue
|
||||
gitlink-cli issue +list --state open --format json
|
||||
|
||||
# 2. 按标签分析分布
|
||||
# 遍历每个 Issue,统计标签分布
|
||||
|
||||
# 3. 获取最老的 Issue(积压时间最长)
|
||||
# 按 created_at 排序,取前 10
|
||||
```
|
||||
|
||||
### 输出格式
|
||||
|
||||
```markdown
|
||||
## 🐛 Issue 积压分析 — <owner>/<repo>
|
||||
|
||||
### 总览
|
||||
- 开放 Issue:<n>
|
||||
- 最老 Issue 已存在:<n> 天
|
||||
- 平均存留时间:<n> 天
|
||||
|
||||
### 标签分布
|
||||
| 标签 | 数量 | 占比 |
|
||||
|------|:----:|:----:|
|
||||
| bug | <n> | <n>% |
|
||||
| enhancement | <n> | <n>% |
|
||||
| question | <n> | <n>% |
|
||||
| <其他> | <n> | <n>% |
|
||||
|
||||
### 需要关注的积压 Issue
|
||||
1. ⏰ <标题>(已开放 <n> 天)— <标签>
|
||||
2. ⏰ <标题>(已开放 <n> 天)— <标签>
|
||||
3. ⏰ <标题>(已开放 <n> 天)— <标签>
|
||||
|
||||
### 建议
|
||||
- 本周应优先处理的 Issue:<n> 个
|
||||
- 可关闭的过期 Issue:<n> 个
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Raw API 参考
|
||||
|
||||
```bash
|
||||
# 仓库信息
|
||||
gitlink-cli api GET /:owner/:repo --format json
|
||||
|
||||
# 仓库语言统计
|
||||
gitlink-cli api GET /:owner/:repo/languages --format json
|
||||
|
||||
# 贡献者列表
|
||||
gitlink-cli api GET /:owner/:repo/contributors --format json
|
||||
|
||||
# 仓库动态
|
||||
gitlink-cli api GET /:owner/:repo/activity --format json
|
||||
|
||||
# 文件列表(检查文档/配置完整性)
|
||||
gitlink-cli api GET /:owner/:repo/sub_entries --query 'filepath=&ref=master'
|
||||
|
||||
# 获取用户信息
|
||||
gitlink-cli api GET /users/:user_id --format json
|
||||
|
||||
# 用户贡献热力图
|
||||
gitlink-cli api GET /users/:user_id/headmaps --format json
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 所有报告输出为 **Markdown 格式**,可直接粘贴到 Issue、Wiki 或 PR 描述中
|
||||
- 数据分析基于 API 返回的实时数据,不依赖本地缓存
|
||||
- 对于大型仓库(100+ Issue/PR),使用分页参数 `page=1&limit=50` 逐页获取
|
||||
- 趋势分析建议每周运行一次,形成历史对比基线
|
||||
- `pr +list` 的 `--state` 参数可能不精确过滤——需客户端通过 `pull_request_status` 字段判断:0=open, 1=merged, 2=closed
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
# Sprint 周报生成工作流示例
|
||||
|
||||
**场景**:每周五下午,项目 Maintainer 需要生成团队周报。
|
||||
|
||||
## Step 1:获取本周完成的工作
|
||||
|
||||
```bash
|
||||
# 获取本周合并的 PR(按状态过滤)
|
||||
gitlink-cli pr +list --state merged --format json
|
||||
|
||||
# 获取本周关闭的 Issue
|
||||
gitlink-cli issue +list --state closed --format json
|
||||
|
||||
# 获取本周创建的 Release
|
||||
gitlink-cli release +list --format json
|
||||
```
|
||||
|
||||
## Step 2:获取进行中的工作
|
||||
|
||||
```bash
|
||||
# 获取所有开放 Issue
|
||||
gitlink-cli issue +list --state open --format json
|
||||
|
||||
# 获取开放 PR
|
||||
gitlink-cli pr +list --state open --format json
|
||||
```
|
||||
|
||||
## Step 3:获取项目动态
|
||||
|
||||
```bash
|
||||
gitlink-cli api GET /:owner/:repo/activity --format json
|
||||
```
|
||||
|
||||
## Step 4:生成周报
|
||||
|
||||
将采集的数据整理为以下格式:
|
||||
|
||||
```markdown
|
||||
## 📅 Sprint 周报 — Gitlink/forgeplus
|
||||
|
||||
📆 周期:2026-05-14 ~ 2026-05-20
|
||||
|
||||
### ✅ 本周完成
|
||||
| 类型 | 数量 | 关键事项 |
|
||||
|------|:----:|----------|
|
||||
| Issue 关闭 | 12 | #234 用户权限修复、#235 性能优化 |
|
||||
| PR 合并 | 8 | feat: 添加登录模块、fix: 修复内存泄漏 |
|
||||
| Release | 1 | v2.3.0 发布 |
|
||||
|
||||
### 🚧 进行中
|
||||
| Issue | 负责人 | 状态 |
|
||||
|-------|:------:|:----:|
|
||||
| #240 API 文档重构 | zhangsan | Review 中 |
|
||||
| #241 数据导出功能 | lisi | 进行中 |
|
||||
|
||||
### 📊 本周统计
|
||||
| 指标 | 本周 | 上周 | 环比 |
|
||||
|------|:----:|:----:|:----:|
|
||||
| 关闭 Issue | 12 | 8 | +50% |
|
||||
| 合并 PR | 8 | 6 | +33% |
|
||||
| 新增 Issue | 5 | 7 | -29% |
|
||||
| 新增贡献者 | 2 | 1 | +100% |
|
||||
|
||||
### ⚠️ 关注事项
|
||||
- #238 数据库迁移 PR 依赖基础设施组支持,已阻塞 3 天
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 自动化建议
|
||||
|
||||
每周固定时间运行时,可以:
|
||||
1. 保存上一期报告的输出
|
||||
2. 本期与上期数据做环比
|
||||
3. 在项目 Wiki 中归档历史周报
|
||||
4. 在团队 Issue 或 Discussion 中发布
|
||||
Loading…
Reference in New Issue