gitlink-cli/skills/gitlink-cli-contract-guard/SKILL.md

184 lines
6.6 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.

---
name: gitlink-cli-contract-guard
description: "CLI 契约守卫:审查 GitLink CLI 改动是否破坏既有命令契约,重点检查 flags 与默认值、命令层级与帮助文本、`--format json` 输出结构、错误提示与编码质量、README/示例命令和实际行为是否漂移。用于用户需要判断某个 PR 或本地改动会不会破坏旧用法、引入不兼容输出、造成帮助文档失真,或在合并前补做兼容性审查时。"
---
# gitlink-cli-contract-guard
**CRITICAL - 如果需要拉取 GitLink 上的 PR 元数据、diff 或评论,先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md)。**
**CRITICAL - 这个 skill 默认只读分析,不直接修改远端评论、标签或分配关系。**
**CRITICAL - 这个 skill 只关注 CLI 对用户承诺的行为契约,不负责判断 PR 是否应当合并。**
这个 skill 的目标很窄,也很硬:**找出会把现有 CLI 用户用法搞坏的改动。**
它重点审查五类契约面:
1. **参数契约**flag 名称、短别名、默认值、必填规则、参数语义。
2. **帮助契约**:命令层级、`--help` 内容、国际化文案、示例命令。
3. **输出契约**`--format json` 结构、字段名、字段类型、包裹 envelope。
4. **错误契约**:错误提示、退出语义、编码质量、用户可理解性。
5. **文档契约**README、示例、帮助文本与真实行为是否一致。
## 不覆盖的内容
下面这些不属于这个 skill 的职责:
- PR 是否值得合并:交给 `gitlink-pr-assessor`
- PR 是否适合集成主线:交给 `gitlink-pr-integrator`
- commit message、分支命名、PR 模板质量:交给 `gitlink-commit-quality`
- 维护者今日值班优先级:交给 `gitlink-maintainer-radar`
## 工作流
### Step 1确定分析对象
优先区分两种输入:
- **本地改动**:当前工作区已有变更或已 checkout 到目标分支,直接看 `git diff`、文件改动和本地测试。
- **远端 PR**:用户只给出 GitLink PR 编号,需要先通过 `gitlink-cli` 拉 PR 元数据和 diff再结合本地代码理解。
如果是本地改动,优先看:
```bash
git diff --name-only
git diff --stat
```
如果是 GitLink PR优先看
```bash
gitlink-cli pr +view --owner <owner> --repo <repo> -i <number> --format json
gitlink-cli pr +version-diff --owner <owner> --repo <repo> -i <number> --format json
```
### Step 2把改动映射到契约面
根据改动文件,先判断它可能影响哪一类契约。常见映射见 [`references/contract-surfaces.md`](references/contract-surfaces.md)。
重点关注这些高风险位置:
- `cmd/`:根命令、全局 flag、命令层级、帮助文本
- `shortcuts/*/*.go`shortcut 参数、默认值、必填规则、输出行为
- `shortcuts/common/`:通用运行时、输出封装、参数解析
- `internal/client/`、`internal/auth/`API client 行为、header、错误处理
- `internal/i18n/`:国际化文案、语言切换、编码风险
- `README.md`、`README.zh-CN.md`、`examples/`:文档和真实行为漂移
### Step 3逐类检查契约是否被破坏
#### 3.1 参数契约
检查:
- 是否删除或重命名了已有 flag
- 是否变更了短别名
- 是否改了默认值但没有迁移说明
- 是否把原本可选参数改成必填
- 是否改变了 flag 含义但名字未变
对 shortcut 代码重点查看 `Name`、`Short`、`Default`、`Required`、`Bool`、`Usage`。
#### 3.2 帮助契约
检查:
- 命令层级是否变了
- `--help` 内容是否仍然描述真实行为
- 示例命令是否还可运行
- 中英文帮助文本是否同步
- 本地化 key 是否丢失或回退异常
如果触及 `cmd/root.go`、`shortcuts/register.go` 或 i18n 文案,优先检查 help 相关测试。
#### 3.3 输出契约
检查:
- `--format json` 是否仍然返回既有结构
- 字段名是否发生破坏性变更
- 字段类型是否变化
- envelope 是否还保持稳定
- 机器可读消费者依赖的路径是否变化
如果字段是新增但非破坏性变更,要明确说明是“扩展”而不是“破坏”。
#### 3.4 错误契约
检查:
- 错误消息是否退化为难以理解的技术细节
- 中文或多语言提示是否出现乱码
- `suggestFix`、校验错误、缺参错误是否还可读
- 渲染后的 header、path 模板或其他用户输入是否可能导致非法请求
尤其要把 **中文 mojibake、编码损坏、格式化后非法 header/path** 当成高风险契约问题。
#### 3.5 文档契约
检查:
- README 中的示例命令是否与当前实现一致
- 文档新增内容是否引入乱码
- 文档说支持的参数/输出,代码是否真的支持
- 代码新增能力后,帮助或 README 是否漏更新
### Step 4要求验证证据
只指出风险还不够,要同时判断“有没有证据证明它没坏”。
常用验证方式:
```bash
go build ./...
go test ./cmd/... ./shortcuts/...
go test ./...
```
需要更聚焦时,优先跑与改动最相关的包测试。典型情况:
-`cmd/` 或帮助/i18n优先看 `cmd/root_test.go`
- 改 shortcut 参数或输出:优先看对应 `shortcuts/<name>/*_test.go`
- 改 API client 或错误处理:优先看 `internal/...` 和相关 shortcut 测试
如果改动了契约面,但没有补测试或现有测试没覆盖到,直接把它列为缺口。
### Step 5按严重性归类
用 [`references/severity-rubric.md`](references/severity-rubric.md) 把问题分成:
- `blocking`:明确破坏旧用法或输出契约
- `high`:高概率影响真实用户或自动化脚本
- `medium`:存在漂移或边界缺口,但不一定立即破坏
- `low`:文案、可读性或一致性问题
### Step 6输出契约审查结论
推荐输出结构:
```markdown
# CLI 契约审查报告
## 高风险问题
- `--header` 模板渲染后未再次校验,可能生成非法 header。
- README.zh-CN 新增示例出现中文乱码,会污染用户可见文档。
## 契约面影响
- 参数契约:`--header` 新增并改变请求构造行为。
- 输出契约:无破坏性字段变更证据。
- 错误契约:中文错误提示存在编码退化风险。
## 缺失验证
- 缺少对 `Accept` 头覆盖行为的边界测试。
- 缺少对渲染后非法 header 的测试。
## 结论
- 需要修改后再合并。
```
## 典型触发语句
- “帮我看这个改动会不会破坏现有 CLI 用法。”
- “检查这个 PR 有没有 flag / help / JSON 输出兼容性问题。”
- “看看这个命令改动会不会影响脚本调用方。”
- “帮我做一轮 CLI 行为契约审查。”