gitlink-cli/examples/workflows/pr-quality-gatekeeper/README.md

70 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PR 质量门禁工作流pr-quality-gatekeeper
把已收录的 [`gitlink-gatekeeper` Skill](../../../skills/gitlink-gatekeeper/SKILL.md)Policy-as-Code 合并门禁)包成**可直接运行的端到端工作流**
> **采集 → 路由 → 裁决 → 回写/善后**:读取一个真实 PR 的元信息/变更文件/commits/CI按变更路径建议 reviewer依 `gatekeeper.yaml` 策略算出**确定性 0100 评分卡**与**三态裁决**PASS / REQUEST_CHANGES / COMMENT仅在 `--apply` 时把评分卡评论、裁决标签、tracking issue 真实回写到 GitLink。
与仓库内已有能力的关系:`label` 命令(裁决标签)→ `gitlink-gatekeeper` Skill裁决知识**本工作流(可复现闭环)**,三层共用同一套策略文件,互为支撑而非重复。
## 交付物
- `scripts/gatekeeper_workflow.py`:单 PR 门禁闭环纯标准库Python ≥3.9,零第三方依赖)
- `scripts/gatekeeper_sweep.py`**仓库级批量体检**——对全部 open PR 逐个 dry-run产出治理报告
- `owner-rules.example.yaml`:变更路径 → reviewer 的路由表样例
- `config.example.yaml`:工作流配置样例(命令行参数可覆盖)
- `findings.example.json`AI/人工审查发现注入样例(**来自对真实 PR diff 的真实审查**,行号可复核)
- `docs/architecture.md` · `docs/quickstart.md` · `docs/runbook.md` · `docs/verification.md`
- `ci-example/`Gitea Actions 接入示例PR 触发自动门禁,退出码 2 = REQUEST_CHANGES
- `examples/demo-outputs/`真实平台运行产物PASS 90 评分卡 / 注入发现后的 55 分评分卡 / 113 个 open PR 的全仓体检报告)
- `tests/test_scoring.py`:确定性回归护栏(同输入 → 同分 → 同裁决)
## 快速运行(默认 dry-run不写远端
```bash
npm install -g @gitlink-ai/cli # ≥0.2.0,自带 label 命令与 gitlink-gatekeeper Skill
gitlink-cli auth login
python3 scripts/gatekeeper_workflow.py \
--owner <owner> --repo <repo> --pr <PR号> \
--policy ../../../skills/gitlink-gatekeeper/examples/gatekeeper.yaml \
--owner-rules owner-rules.example.yaml \
--output-dir outputs
```
- 注入审查发现得到含扣分的评分卡:加 `--findings findings.example.json`
- 真实回写(评论 + 标签 + tracking issue`--apply`(请先在自有仓库演练)
- 全仓批量体检(只读,零写入):
```bash
python3 scripts/gatekeeper_sweep.py \
--owner <owner> --repo <repo> \
--policy ../../../skills/gitlink-gatekeeper/examples/gatekeeper.yaml \
--owner-rules owner-rules.example.yaml \
--output-dir sweep-out --date-label $(date +%F)
```
更多见 [`docs/quickstart.md`](docs/quickstart.md) 与 [`docs/runbook.md`](docs/runbook.md)。
## 已在真实平台验证
全部证据见 [`docs/verification.md`](docs/verification.md),要点:
| 验证 | 对象 | 结果 |
|------|------|------|
| dry-run | 本仓库真实 PRpull_request_id 15222 | ✅ PASS 90/1008 个变更文件路由正确 |
| 注入真实审查发现 | 同一 PR + `findings.example.json` | ❌ REQUEST_CHANGES 55/100裁决翻转确定性可复算 |
| `--apply` 真实回写 | 自有 fork 的演练 PR | 评分卡评论 + tracking issue + 裁决标签全部由 API 回执确认 |
| **全仓批量体检** | 本仓库**全部 113 个 open PR** | 113/113 成功PASS 105 / COMMENT 6 / REQUEST_CHANGES 2均分 88.596% 未关联 issue |
| 单测 | `tests/test_scoring.py` | 全绿(锁定四个权威裁决案例的分值与裁决) |
## 设计要点
- **确定性评分**AI 只负责产出「发现列表」(可选注入),扣分与裁决由纯函数完成——同策略 + 同 PR → 同裁决,可逐位手算复现、可审计。
- **安全默认**:默认 dry-run 什么都不写;即便策略开了 `auto_merge`,也必须 `verdict == PASS` 且显式 `--apply` 才会合并;强语义的 approve/reject 始终留给人,自动裁决只以建议性 `common` 评论 + 标签呈现。
- **原生适配 GitLink**PR 标题/描述取自 `pr +view``issue.subject/description`;标签挂载走「`label +list` 查 id → Raw API `POST /:owner/:repo/issues/<issue_id>`」;尊重 `common/approved/rejected` 三态 review。
- **零依赖、零常驻**:纯标准库脚本 + `gitlink-cli`,无需部署 webhook 服务或数据库CI 一条 step 即可接入(见 `ci-example/`);确定性意味着**大规模治理零 AI 成本**。
## 许可证
随仓库 [MulanPSL-2.0](../../../LICENSE)。