33c8de02da
## dev-workflow - Spec-Driven 开发流程 - 从需求生成 spec.md - 创建功能分支 - 调用子代理开发 - 自动创建 Gitea PR ## pr-review-gate - 3 审查者并行审查(安全/质量/逻辑) - 自动合并逻辑 - 修复循环(最多3次) ## .planning - PROJECT.md: 项目定义 - REQUIREMENTS.md: 需求列表 - ROADMAP.md: 开发路线图 - STATE.md: 当前状态
6.8 KiB
6.8 KiB
name, description
| name | description |
|---|---|
| pr-review-gate | PR 审查门禁技能。当 PR 创建后自动触发,启动 3 个审查子代理并行审查。 |
pr-review-gate - PR 审查门禁
什么时候使用
- PR 创建后自动触发
- 用户说"审查 PR #xxx"
- 用户说"开始审查"
环境变量
| 变量名 | 用途 | 必需 |
|---|---|---|
GITEA_TOKEN |
Gitea API Token | 是 |
GITEA_URL |
Gitea 服务地址 | 否 |
GITEA_REPO |
仓库路径 | 否 |
工作流程
PR 创建
↓
┌─────────────────────────────────────────────────────┐
│ 并行启动 3 个审查子代理 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Security │ │ Quality │ │ Logic │ │
│ │ Reviewer │ │ Reviewer │ │ Reviewer │ │
│ │ (安全) │ │ (质量) │ │ (逻辑) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ approve? approve? approve? │
│ │ │ │ │
└─────────┼───────────────┼───────────────┼───────────┘
│ │ │
└───────────────┼───────────────┘
▼
┌───────────────────────┐
│ 收集审查结果 │
└───────────┬───────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
全部 approve 有 reject CI 失败
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 自动合并 │ │ 修复循环 │ │ 等待修复 │
│ 到 main │ │ (最多3次) │ │ │
└───────────┘ └───────────┘ └───────────┘
审查者角色
1. Security Reviewer (安全审查者)
关注点:
- 输入验证
- SQL 注入 / XSS / CSRF
- 敏感数据处理
- 权限检查
- 依赖安全
审查清单:
- 所有用户输入都经过验证和清理
- 没有硬编码的密钥或凭据
- 文件操作有路径检查
- API 调用有适当的认证
2. Quality Reviewer (代码质量审查者)
关注点:
- 代码可读性
- 命名规范
- 代码结构
- 测试覆盖
- 文档完整性
审查清单:
- 函数/变量命名清晰
- 代码有适当的注释
- 复杂逻辑有文档说明
- 有单元测试覆盖
- SKILL.md 已更新(如适用)
3. Logic Reviewer (业务逻辑审查者)
关注点:
- 需求是否满足
- 边界条件处理
- 错误处理
- 与现有功能的兼容性
- 性能影响
审查清单:
- 实现符合 spec 描述
- 边界条件已处理
- 错误情况有适当的处理
- 不会破坏现有功能
- 性能可接受
执行步骤
Step 1: 获取 PR 信息
python3 pr_gate.py --get-pr --number 123
获取 PR 的:
- 标题和描述
- 变更文件列表
- diff 内容
Step 2: 启动审查子代理
使用 sessions_spawn 并行启动 3 个审查子代理:
# Security Reviewer
sessions_spawn(
task="审查 PR #xxx 的安全性",
label="security-reviewer",
runtime="subagent"
)
# Quality Reviewer
sessions_spawn(
task="审查 PR #xxx 的代码质量",
label="quality-reviewer",
runtime="subagent"
)
# Logic Reviewer
sessions_spawn(
task="审查 PR #xxx 的业务逻辑",
label="logic-reviewer",
runtime="subagent"
)
Step 3: 收集审查结果
等待所有子代理完成,收集结果:
{
"security": {
"reviewer": "security",
"result": "approve|reject",
"comments": ["..."],
"issues": []
},
"quality": {
"reviewer": "quality",
"result": "approve",
"comments": ["..."],
"issues": []
},
"logic": {
"reviewer": "logic",
"result": "approve",
"comments": ["..."],
"issues": []
}
}
Step 4: 决策
全部 approve + CI 通过:
python3 pr_gate.py --merge-pr --number 123
有 reject:
python3 pr_gate.py --fix-loop --number 123 --attempt 1
Step 5: 修复循环(最多 3 次)
- 汇总所有问题
- 启动修复子代理
- 修复后重新审查
- 3 次后仍有问题 → 汇报失败
CLI 命令
# 获取 PR 信息
python3 pr_gate.py --get-pr --number 123
# 启动审查
python3 pr_gate.py --review --number 123
# 检查审查结果
python3 pr_gate.py --check-results --number 123
# 合并 PR
python3 pr_gate.py --merge-pr --number 123
# 修复循环
python3 pr_gate.py --fix-loop --number 123 --attempt 1
# 完整流程
python3 pr_gate.py --full-pipeline --number 123
输出格式
审查通过
✅ PR #123 审查通过
**审查结果:**
| 审查者 | 结果 | 评论数 |
|--------|------|--------|
| Security | ✅ approve | 0 |
| Quality | ✅ approve | 2 |
| Logic | ✅ approve | 1 |
**CI 状态:** ✅ 通过
正在合并到 main...
需要修复
⚠️ PR #123 需要修复
**问题汇总:**
| 审查者 | 问题 |
|--------|------|
| Security | 输入验证缺失 (HIGH) |
| Quality | 缺少单元测试 (MEDIUM) |
启动修复流程 (尝试 1/3)...
最终失败
❌ PR #123 修复失败
经过 3 次修复尝试,以下问题仍未解决:
1. [Security] 输入验证缺失
- 位置: dev_workflow.py:45
- 描述: 用户输入未经过验证直接使用
请人工介入处理。
与其他技能的协作
| 技能 | 协作方式 |
|---|---|
| dev-workflow | PR 创建后触发审查 |
| Gitea CI | 等待 CI 通过后才合并 |
注意事项
- 审查子代理必须独立运行,互不干扰
- 修复循环有明确的上限(3 次)
- 最终失败必须汇报详细问题
- 合并前必须确认 CI 通过