docs: add Chinese (zh-CN) documentation
- Add language switch link to root README - Translate README.md to docs/zh-CN/README.md - Translate USER-GUIDE.md to docs/zh-CN/USER-GUIDE.md - Translate all 13 reference documents to docs/zh-CN/references/ Key terminology mappings: - context engineering → 上下文工程 - spec-driven development → 规格驱动开发 - context rot → 上下文衰减 - phase → 阶段 - milestone → 里程碑 - roadmap → 路线图 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
|
||||
**Solves context rot — the quality degradation that happens as Claude fills its context window.**
|
||||
|
||||
[**English**](README.md) | [**简体中文**](docs/zh-CN/README.md)
|
||||
|
||||
[](https://www.npmjs.com/package/get-shit-done-cc)
|
||||
[](https://www.npmjs.com/package/get-shit-done-cc)
|
||||
[](https://github.com/glittercowboy/get-shit-done/actions/workflows/test.yml)
|
||||
|
||||
707
docs/zh-CN/README.md
Normal file
707
docs/zh-CN/README.md
Normal file
@@ -0,0 +1,707 @@
|
||||
<div align="center">
|
||||
|
||||
# GET SHIT DONE
|
||||
|
||||
**一个轻量级且强大的元提示、上下文工程和规格驱动开发系统,支持 Claude Code、OpenCode、Gemini CLI 和 Codex。**
|
||||
|
||||
**解决上下文衰减 —— 即 Claude 填充上下文窗口时发生的质量退化问题。**
|
||||
|
||||
[](https://www.npmjs.com/package/get-shit-done-cc)
|
||||
[](https://www.npmjs.com/package/get-shit-done-cc)
|
||||
[](https://github.com/glittercowboy/get-shit-done/actions/workflows/test.yml)
|
||||
[](https://discord.gg/gsd)
|
||||
[](https://x.com/gsd_foundation)
|
||||
[](https://dexscreener.com/solana/dwudwjvan7bzkw9zwlbyv6kspdlvhwzrqy6ebk8xzxkv)
|
||||
[](https://github.com/glittercowboy/get-shit-done)
|
||||
[](LICENSE)
|
||||
|
||||
<br>
|
||||
|
||||
```bash
|
||||
npx get-shit-done-cc@latest
|
||||
```
|
||||
|
||||
**支持 Mac、Windows 和 Linux。**
|
||||
|
||||
<br>
|
||||
|
||||

|
||||
|
||||
<br>
|
||||
|
||||
*"如果你清楚自己想要什么,它真的会帮你构建出来。不忽悠。"*
|
||||
|
||||
*"我试过 SpecKit、OpenSpec 和 Taskmaster —— 这是我用过的效果最好的。"*
|
||||
|
||||
*"这是我用过的 Claude Code 最强大的扩展。没有过度设计。真的就是把事情做完。"*
|
||||
|
||||
<br>
|
||||
|
||||
**被 Amazon、Google、Shopify 和 Webflow 的工程师信赖使用。**
|
||||
|
||||
[我为什么开发这个](#我为什么开发这个) · [工作原理](#工作原理) · [命令](#命令) · [为什么有效](#为什么有效) · [用户指南](USER-GUIDE.md)
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 我为什么开发这个
|
||||
|
||||
我是一名独立开发者。我不写代码 —— Claude Code 写。
|
||||
|
||||
其他规格驱动开发工具确实存在,比如 BMAD、Speckit... 但它们似乎都把事情搞得比实际需要的复杂得多(冲刺会议、故事点、干系人同步、回顾、Jira 工作流),或者缺乏对你正在构建的东西的真正大局理解。我不是一个 50 人的软件公司。我不想搞企业级表演。我只是个想构建出好用的东西的创意人。
|
||||
|
||||
所以我开发了 GSD。复杂性在系统内部,不在你的工作流里。幕后是:上下文工程、XML 提示格式、子代理编排、状态管理。你看到的是:几个命令,用就完了。
|
||||
|
||||
系统给 Claude 提供了它完成工作**以及**验证工作所需的一切。我信任这个工作流。它就是做得好。
|
||||
|
||||
这就是它的本质。没有企业级角色扮演的废话。只是一个让 Claude Code 稳定可靠地构建酷东西的极其有效的系统。
|
||||
|
||||
— **TÂCHES**
|
||||
|
||||
---
|
||||
|
||||
Vibecoding 名声不好。你描述想要什么,AI 生成代码,结果得到不一致的垃圾,规模一大就崩。
|
||||
|
||||
GSD 解决了这个问题。它是让 Claude Code 变得可靠的上下文工程层。描述你的想法,让系统提取它需要知道的一切,然后让 Claude Code 开始工作。
|
||||
|
||||
---
|
||||
|
||||
## 这个工具适合谁
|
||||
|
||||
想要描述需求然后正确构建出来的人 —— 不用假装自己在运营一个 50 人的工程组织。
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
```bash
|
||||
npx get-shit-done-cc@latest
|
||||
```
|
||||
|
||||
安装程序会提示你选择:
|
||||
1. **运行时** —— Claude Code、OpenCode、Gemini、Codex 或全部
|
||||
2. **位置** —— 全局(所有项目)或本地(仅当前项目)
|
||||
|
||||
验证安装:
|
||||
- Claude Code / Gemini: `/gsd:help`
|
||||
- OpenCode: `/gsd-help`
|
||||
- Codex: `$gsd-help`
|
||||
|
||||
> [!NOTE]
|
||||
> Codex 安装使用技能(`skills/gsd-*/SKILL.md`)而非自定义提示。
|
||||
|
||||
### 保持更新
|
||||
|
||||
GSD 快速迭代。定期更新:
|
||||
|
||||
```bash
|
||||
npx get-shit-done-cc@latest
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary><strong>非交互式安装(Docker、CI、脚本)</strong></summary>
|
||||
|
||||
```bash
|
||||
# Claude Code
|
||||
npx get-shit-done-cc --claude --global # 安装到 ~/.claude/
|
||||
npx get-shit-done-cc --claude --local # 安装到 ./.claude/
|
||||
|
||||
# OpenCode(开源,免费模型)
|
||||
npx get-shit-done-cc --opencode --global # 安装到 ~/.config/opencode/
|
||||
|
||||
# Gemini CLI
|
||||
npx get-shit-done-cc --gemini --global # 安装到 ~/.gemini/
|
||||
|
||||
# Codex(技能优先)
|
||||
npx get-shit-done-cc --codex --global # 安装到 ~/.codex/
|
||||
npx get-shit-done-cc --codex --local # 安装到 ./.codex/
|
||||
|
||||
# 所有运行时
|
||||
npx get-shit-done-cc --all --global # 安装到所有目录
|
||||
```
|
||||
|
||||
使用 `--global`(`-g`)或 `--local`(`-l`)跳过位置提示。
|
||||
使用 `--claude`、`--opencode`、`--gemini`、`--codex` 或 `--all` 跳过运行时提示。
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong>开发安装</strong></summary>
|
||||
|
||||
克隆仓库并本地运行安装程序:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/glittercowboy/get-shit-done.git
|
||||
cd get-shit-done
|
||||
node bin/install.js --claude --local
|
||||
```
|
||||
|
||||
安装到 `./.claude/` 用于在贡献前测试修改。
|
||||
|
||||
</details>
|
||||
|
||||
### 推荐:跳过权限模式
|
||||
|
||||
GSD 设计为无摩擦自动化。运行 Claude Code 时使用:
|
||||
|
||||
```bash
|
||||
claude --dangerously-skip-permissions
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> 这是 GSD 的预期使用方式 —— 停下来 50 次批准 `date` 和 `git commit` 会失去意义。
|
||||
|
||||
<details>
|
||||
<summary><strong>替代方案:细粒度权限</strong></summary>
|
||||
|
||||
如果你不想使用那个标志,在项目的 `.claude/settings.json` 中添加:
|
||||
|
||||
```json
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(date:*)",
|
||||
"Bash(echo:*)",
|
||||
"Bash(cat:*)",
|
||||
"Bash(ls:*)",
|
||||
"Bash(mkdir:*)",
|
||||
"Bash(wc:*)",
|
||||
"Bash(head:*)",
|
||||
"Bash(tail:*)",
|
||||
"Bash(sort:*)",
|
||||
"Bash(grep:*)",
|
||||
"Bash(tr:*)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(git commit:*)",
|
||||
"Bash(git status:*)",
|
||||
"Bash(git log:*)",
|
||||
"Bash(git diff:*)",
|
||||
"Bash(git tag:*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## 工作原理
|
||||
|
||||
> **已有代码?** 先运行 `/gsd:map-codebase`。它会生成并行代理分析你的技术栈、架构、约定和关注点。然后 `/gsd:new-project` 就了解你的代码库了 —— 问题聚焦在你正在**添加**什么,规划会自动加载你的模式。
|
||||
|
||||
### 1. 初始化项目
|
||||
|
||||
```
|
||||
/gsd:new-project
|
||||
```
|
||||
|
||||
一条命令,一个流程。系统:
|
||||
|
||||
1. **提问** —— 问到完全理解你的想法为止(目标、约束、技术偏好、边缘情况)
|
||||
2. **研究** —— 生成并行代理调查领域(可选但推荐)
|
||||
3. **需求** —— 提取哪些是 v1、v2 和范围外
|
||||
4. **路线图** —— 创建映射到需求的阶段
|
||||
|
||||
你批准路线图。现在准备好构建了。
|
||||
|
||||
**创建:** `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md`、`.planning/research/`
|
||||
|
||||
---
|
||||
|
||||
### 2. 讨论阶段
|
||||
|
||||
```
|
||||
/gsd:discuss-phase 1
|
||||
```
|
||||
|
||||
**这是你塑造实现方式的地方。**
|
||||
|
||||
你的路线图每个阶段有一两句话。这不足以按照**你**想象的方式构建东西。这一步在研究或规划之前捕获你的偏好。
|
||||
|
||||
系统分析阶段并根据正在构建的内容识别灰色区域:
|
||||
|
||||
- **视觉功能** → 布局、密度、交互、空状态
|
||||
- **API/CLI** → 响应格式、标志、错误处理、详细程度
|
||||
- **内容系统** → 结构、语气、深度、流程
|
||||
- **组织任务** → 分组标准、命名、重复项、例外
|
||||
|
||||
对于你选择的每个领域,它会问到让你满意为止。输出 —— `CONTEXT.md` —— 直接输入接下来的两个步骤:
|
||||
|
||||
1. **研究员读取它** —— 知道要调查什么模式("用户想要卡片布局" → 研究卡片组件库)
|
||||
2. **规划者读取它** —— 知道哪些决策已锁定("无限滚动已决定" → 规划包含滚动处理)
|
||||
|
||||
你在这里走得越深,系统构建的就越是你真正想要的。跳过它你会得到合理的默认值。使用它你会得到**你的**愿景。
|
||||
|
||||
**创建:** `{阶段号}-CONTEXT.md`
|
||||
|
||||
---
|
||||
|
||||
### 3. 规划阶段
|
||||
|
||||
```
|
||||
/gsd:plan-phase 1
|
||||
```
|
||||
|
||||
系统:
|
||||
|
||||
1. **研究** —— 调查如何实现这个阶段,由你的 CONTEXT.md 决策指导
|
||||
2. **规划** —— 创建 2-3 个带有 XML 结构的原子任务计划
|
||||
3. **验证** —— 根据需求检查计划,循环直到通过
|
||||
|
||||
每个计划足够小,可以在全新的上下文窗口中执行。没有退化,没有"我现在会更简洁"。
|
||||
|
||||
**创建:** `{阶段号}-RESEARCH.md`、`{阶段号}-{N}-PLAN.md`
|
||||
|
||||
---
|
||||
|
||||
### 4. 执行阶段
|
||||
|
||||
```
|
||||
/gsd:execute-phase 1
|
||||
```
|
||||
|
||||
系统:
|
||||
|
||||
1. **按波次运行计划** —— 可能的话并行,有依赖时顺序
|
||||
2. **每个计划全新上下文** —— 200k token 纯粹用于实现,零累积垃圾
|
||||
3. **每个任务提交** —— 每个任务都有自己的原子提交
|
||||
4. **根据目标验证** —— 检查代码库是否交付了阶段承诺的内容
|
||||
|
||||
离开,回来看到完成的工作和干净的 git 历史。
|
||||
|
||||
**波次执行工作原理:**
|
||||
|
||||
计划根据依赖关系分组到"波次"。在每个波次内,计划并行运行。波次顺序执行。
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 阶段执行 │
|
||||
├─────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 波次 1 (并行) 波次 2 (并行) 波次 3 │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ 计划 01 │ │ 计划 02 │ → │ 计划 03 │ │ 计划 04 │ → │ 计划 05 │ │
|
||||
│ │ │ │ │ │ │ │ │ │ │ │
|
||||
│ │ 用户 │ │ 产品 │ │ 订单 │ │ 购物车 │ │ 结账 │ │
|
||||
│ │ 模型 │ │ 模型 │ │ API │ │ API │ │ UI │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
||||
│ │ │ ↑ ↑ ↑ │
|
||||
│ └───────────┴──────────────┴───────────┘ │ │
|
||||
│ 依赖关系: 计划 03 需要计划 01 │ │
|
||||
│ 计划 04 需要计划 02 │ │
|
||||
│ 计划 05 需要计划 03 + 04 │ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**为什么波次重要:**
|
||||
- 独立计划 → 同一波次 → 并行运行
|
||||
- 依赖计划 → 后续波次 → 等待依赖
|
||||
- 文件冲突 → 顺序计划或同一计划
|
||||
|
||||
这就是为什么"垂直切片"(计划 01: 用户功能端到端)比"水平分层"(计划 01: 所有模型,计划 02: 所有 API)并行化更好。
|
||||
|
||||
**创建:** `{阶段号}-{N}-SUMMARY.md`、`{阶段号}-VERIFICATION.md`
|
||||
|
||||
---
|
||||
|
||||
### 5. 验证工作
|
||||
|
||||
```
|
||||
/gsd:verify-work 1
|
||||
```
|
||||
|
||||
**这是你确认它真的有效的地方。**
|
||||
|
||||
自动化验证检查代码存在和测试通过。但功能是否按你预期的方式**工作**?这是你使用它的机会。
|
||||
|
||||
系统:
|
||||
|
||||
1. **提取可测试交付物** —— 你现在应该能做什么
|
||||
2. **逐个引导你** —— "你能用邮箱登录吗?" 是/否,或描述有什么问题
|
||||
3. **自动诊断失败** —— 生成调试代理找根本原因
|
||||
4. **创建已验证的修复计划** —— 准备立即重新执行
|
||||
|
||||
如果一切通过,继续。如果有东西坏了,不用手动调试 —— 只需再次运行 `/gsd:execute-phase`,使用它创建的修复计划。
|
||||
|
||||
**创建:** `{阶段号}-UAT.md`,如果发现问题则创建修复计划
|
||||
|
||||
---
|
||||
|
||||
### 6. 循环 → 完成 → 下一个里程碑
|
||||
|
||||
```
|
||||
/gsd:discuss-phase 2
|
||||
/gsd:plan-phase 2
|
||||
/gsd:execute-phase 2
|
||||
/gsd:verify-work 2
|
||||
...
|
||||
/gsd:complete-milestone
|
||||
/gsd:new-milestone
|
||||
```
|
||||
|
||||
循环 **讨论 → 规划 → 执行 → 验证** 直到里程碑完成。
|
||||
|
||||
如果你想在讨论期间更快速地输入,使用 `/gsd:discuss-phase <n> --batch` 一次回答一组小问题,而不是一个一个来。
|
||||
|
||||
每个阶段都会获得你的输入(讨论)、适当的研究(规划)、干净的执行(执行)和人工验证(验证)。上下文保持新鲜。质量保持高水平。
|
||||
|
||||
当所有阶段完成后,`/gsd:complete-milestone` 归档里程碑并标记发布。
|
||||
|
||||
然后 `/gsd:new-milestone` 开始下一个版本 —— 与 `new-project` 相同的流程,但针对你现有的代码库。你描述接下来想构建什么,系统研究领域,你界定需求范围,它创建新的路线图。每个里程碑是一个干净的周期:定义 → 构建 → 发布。
|
||||
|
||||
---
|
||||
|
||||
### 快速模式
|
||||
|
||||
```
|
||||
/gsd:quick
|
||||
```
|
||||
|
||||
**用于不需要完整规划的临时任务。**
|
||||
|
||||
快速模式给你 GSD 保证(原子提交、状态跟踪)和更快的路径:
|
||||
|
||||
- **相同代理** —— 规划者 + 执行者,相同质量
|
||||
- **跳过可选步骤** —— 无研究、无计划检查器、无验证器
|
||||
- **独立跟踪** —— 存放在 `.planning/quick/`,不是阶段
|
||||
|
||||
用于:bug 修复、小功能、配置更改、一次性任务。
|
||||
|
||||
```
|
||||
/gsd:quick
|
||||
> 你想做什么?"在设置中添加深色模式切换"
|
||||
```
|
||||
|
||||
**创建:** `.planning/quick/001-add-dark-mode-toggle/PLAN.md`、`SUMMARY.md`
|
||||
|
||||
---
|
||||
|
||||
## 为什么有效
|
||||
|
||||
### 上下文工程
|
||||
|
||||
Claude Code 非常强大,**如果你**给它需要的上下文。大多数人没有。
|
||||
|
||||
GSD 为你处理:
|
||||
|
||||
| 文件 | 作用 |
|
||||
|------|------|
|
||||
| `PROJECT.md` | 项目愿景,始终加载 |
|
||||
| `research/` | 生态知识(技术栈、功能、架构、陷阱) |
|
||||
| `REQUIREMENTS.md` | 界定 v1/v2 需求及阶段可追溯性 |
|
||||
| `ROADMAP.md` | 你要去哪里,完成了什么 |
|
||||
| `STATE.md` | 决策、阻塞项、位置 —— 跨会话记忆 |
|
||||
| `PLAN.md` | 带有 XML 结构和验证步骤的原子任务 |
|
||||
| `SUMMARY.md` | 发生了什么,改了什么,提交到历史 |
|
||||
| `todos/` | 为后续工作捕获的想法和任务 |
|
||||
|
||||
基于 Claude 质量退化的位置设置大小限制。保持在限制内,获得一致的卓越。
|
||||
|
||||
### XML 提示格式
|
||||
|
||||
每个计划都是为 Claude 优化的结构化 XML:
|
||||
|
||||
```xml
|
||||
<task type="auto">
|
||||
<name>创建登录端点</name>
|
||||
<files>src/app/api/auth/login/route.ts</files>
|
||||
<action>
|
||||
使用 jose 处理 JWT(不用 jsonwebtoken - CommonJS 问题)。
|
||||
根据 users 表验证凭据。
|
||||
成功时返回 httpOnly cookie。
|
||||
</action>
|
||||
<verify>curl -X POST localhost:3000/api/auth/login 返回 200 + Set-Cookie</verify>
|
||||
<done>有效凭据返回 cookie,无效返回 401</done>
|
||||
</task>
|
||||
```
|
||||
|
||||
精确的指令。不猜测。内置验证。
|
||||
|
||||
### 多代理编排
|
||||
|
||||
每个阶段使用相同模式:轻量编排器生成专门代理,收集结果,路由到下一步。
|
||||
|
||||
| 阶段 | 编排器做 | 代理做 |
|
||||
|-------|------------------|-----------|
|
||||
| 研究 | 协调,呈现发现 | 4 个并行研究员调查技术栈、功能、架构、陷阱 |
|
||||
| 规划 | 验证,管理迭代 | 规划者创建计划,检查器验证,循环直到通过 |
|
||||
| 执行 | 分组为波次,跟踪进度 | 执行者并行实现,每个有全新 200k 上下文 |
|
||||
| 验证 | 呈现结果,路由下一步 | 验证器根据目标检查代码库,调试器诊断失败 |
|
||||
|
||||
编排器从不做重活。它生成代理,等待,整合结果。
|
||||
|
||||
**结果:** 你可以运行整个阶段 —— 深度研究、多个计划创建和验证、跨并行执行者编写数千行代码、根据目标自动化验证 —— 你的主上下文窗口保持在 30-40%。工作在全新的子代理上下文中完成。你的会话保持快速和响应。
|
||||
|
||||
### 原子 Git 提交
|
||||
|
||||
每个任务在完成后立即获得自己的提交:
|
||||
|
||||
```bash
|
||||
abc123f docs(08-02): 完成用户注册计划
|
||||
def456g feat(08-02): 添加邮箱确认流程
|
||||
hij789k feat(08-02): 实现密码哈希
|
||||
lmn012o feat(08-02): 创建注册端点
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> **好处:** Git bisect 找到确切的失败任务。每个任务独立可回滚。未来会话中 Claude 的清晰历史。AI 自动化工作流中更好的可观察性。
|
||||
|
||||
每个提交都是精确的、可追溯的、有意义的。
|
||||
|
||||
### 模块化设计
|
||||
|
||||
- 向当前里程碑添加阶段
|
||||
- 在阶段之间插入紧急工作
|
||||
- 完成里程碑并重新开始
|
||||
- 调整计划而不重建一切
|
||||
|
||||
你永远不会被锁定。系统会适应。
|
||||
|
||||
---
|
||||
|
||||
## 命令
|
||||
|
||||
### 核心工作流
|
||||
|
||||
| 命令 | 作用 |
|
||||
|---------|--------------|
|
||||
| `/gsd:new-project [--auto]` | 完整初始化:提问 → 研究 → 需求 → 路线图 |
|
||||
| `/gsd:discuss-phase [N] [--auto]` | 在规划前捕获实现决策 |
|
||||
| `/gsd:plan-phase [N] [--auto]` | 阶段的研究 + 规划 + 验证 |
|
||||
| `/gsd:execute-phase <N>` | 在并行波次中执行所有计划,完成后验证 |
|
||||
| `/gsd:verify-work [N]` | 手动用户验收测试 ¹ |
|
||||
| `/gsd:audit-milestone` | 验证里程碑达到了其完成定义 |
|
||||
| `/gsd:complete-milestone` | 归档里程碑,标记发布 |
|
||||
| `/gsd:new-milestone [name]` | 开始下一个版本:提问 → 研究 → 需求 → 路线图 |
|
||||
|
||||
### 导航
|
||||
|
||||
| 命令 | 作用 |
|
||||
|---------|--------------|
|
||||
| `/gsd:progress` | 我在哪?接下来做什么? |
|
||||
| `/gsd:help` | 显示所有命令和使用指南 |
|
||||
| `/gsd:update` | 更新 GSD 并预览变更日志 |
|
||||
| `/gsd:join-discord` | 加入 GSD Discord 社区 |
|
||||
|
||||
### 现有代码库
|
||||
|
||||
| 命令 | 作用 |
|
||||
|---------|--------------|
|
||||
| `/gsd:map-codebase` | 在 new-project 之前分析现有代码库 |
|
||||
|
||||
### 阶段管理
|
||||
|
||||
| 命令 | 作用 |
|
||||
|---------|--------------|
|
||||
| `/gsd:add-phase` | 向路线图追加阶段 |
|
||||
| `/gsd:insert-phase [N]` | 在阶段之间插入紧急工作 |
|
||||
| `/gsd:remove-phase [N]` | 删除未来阶段,重新编号 |
|
||||
| `/gsd:list-phase-assumptions [N]` | 规划前查看 Claude 的预期方法 |
|
||||
| `/gsd:plan-milestone-gaps` | 创建阶段以填补审计发现的差距 |
|
||||
|
||||
### 会话
|
||||
|
||||
| 命令 | 作用 |
|
||||
|---------|--------------|
|
||||
| `/gsd:pause-work` | 阶段中途停止时创建交接 |
|
||||
| `/gsd:resume-work` | 从上次会话恢复 |
|
||||
|
||||
### 工具
|
||||
|
||||
| 命令 | 作用 |
|
||||
|---------|--------------|
|
||||
| `/gsd:settings` | 配置模型配置文件和工作流代理 |
|
||||
| `/gsd:set-profile <profile>` | 切换模型配置文件(quality/balanced/budget) |
|
||||
| `/gsd:add-todo [desc]` | 捕获想法留待后用 |
|
||||
| `/gsd:check-todos` | 列出待处理事项 |
|
||||
| `/gsd:debug [desc]` | 带持久状态的系统化调试 |
|
||||
| `/gsd:quick [--full] [--discuss]` | 用 GSD 保证执行临时任务(`--full` 添加计划检查和验证,`--discuss` 先收集上下文) |
|
||||
| `/gsd:health [--repair]` | 验证 `.planning/` 目录完整性,用 `--repair` 自动修复 |
|
||||
|
||||
<sup>¹ 由 Reddit 用户 OracleGreyBeard 贡献</sup>
|
||||
|
||||
---
|
||||
|
||||
## 配置
|
||||
|
||||
GSD 在 `.planning/config.json` 中存储项目设置。在 `/gsd:new-project` 期间配置或稍后用 `/gsd:settings` 更新。完整配置模式、工作流开关、git 分支选项和每个代理的模型分解,请参阅[用户指南](USER-GUIDE.md#配置参考)。
|
||||
|
||||
### 核心设置
|
||||
|
||||
| 设置 | 选项 | 默认值 | 控制内容 |
|
||||
|---------|---------|---------|------------------|
|
||||
| `mode` | `yolo`, `interactive` | `interactive` | 自动批准 vs 每步确认 |
|
||||
| `granularity` | `coarse`, `standard`, `fine` | `standard` | 阶段粒度 —— 范围切分多细(阶段 × 计划) |
|
||||
|
||||
### 模型配置
|
||||
|
||||
控制每个代理使用哪个 Claude 模型。平衡质量和 token 消耗。
|
||||
|
||||
| 配置 | 规划 | 执行 | 验证 |
|
||||
|---------|----------|-----------|--------------|
|
||||
| `quality` | Opus | Opus | Sonnet |
|
||||
| `balanced`(默认) | Opus | Sonnet | Sonnet |
|
||||
| `budget` | Sonnet | Sonnet | Haiku |
|
||||
|
||||
切换配置:
|
||||
```
|
||||
/gsd:set-profile budget
|
||||
```
|
||||
|
||||
或通过 `/gsd:settings` 配置。
|
||||
|
||||
### 工作流代理
|
||||
|
||||
这些在规划/执行期间生成额外代理。它们提高质量但增加 token 和时间。
|
||||
|
||||
| 设置 | 默认值 | 作用 |
|
||||
|---------|---------|--------------|
|
||||
| `workflow.research` | `true` | 每个阶段规划前研究领域 |
|
||||
| `workflow.plan_check` | `true` | 执行前验证计划是否达到阶段目标 |
|
||||
| `workflow.verifier` | `true` | 执行后确认必须项已交付 |
|
||||
| `workflow.auto_advance` | `false` | 自动链式执行 讨论 → 规划 → 执行 |
|
||||
|
||||
使用 `/gsd:settings` 切换这些,或每次调用时覆盖:
|
||||
- `/gsd:plan-phase --skip-research`
|
||||
- `/gsd:plan-phase --skip-verify`
|
||||
|
||||
### 执行
|
||||
|
||||
| 设置 | 默认值 | 控制内容 |
|
||||
|---------|---------|------------------|
|
||||
| `parallelization.enabled` | `true` | 同时运行独立计划 |
|
||||
| `planning.commit_docs` | `true` | 在 git 中跟踪 `.planning/` |
|
||||
|
||||
### Git 分支
|
||||
|
||||
控制 GSD 在执行期间如何处理分支。
|
||||
|
||||
| 设置 | 选项 | 默认值 | 作用 |
|
||||
|---------|---------|---------|--------------|
|
||||
| `git.branching_strategy` | `none`, `phase`, `milestone` | `none` | 分支创建策略 |
|
||||
| `git.phase_branch_template` | 字符串 | `gsd/phase-{phase}-{slug}` | 阶段分支模板 |
|
||||
| `git.milestone_branch_template` | 字符串 | `gsd/{milestone}-{slug}` | 里程碑分支模板 |
|
||||
|
||||
**策略:**
|
||||
- **`none`** —— 提交到当前分支(默认 GSD 行为)
|
||||
- **`phase`** —— 每个阶段创建一个分支,阶段完成时合并
|
||||
- **`milestone`** —— 为整个里程碑创建一个分支,完成时合并
|
||||
|
||||
在里程碑完成时,GSD 提供 squash 合并(推荐)或带历史合并。
|
||||
|
||||
---
|
||||
|
||||
## 安全
|
||||
|
||||
### 保护敏感文件
|
||||
|
||||
GSD 的代码库映射和分析命令读取文件以了解你的项目。**保护包含密钥的文件**,将它们添加到 Claude Code 的拒绝列表:
|
||||
|
||||
1. 打开 Claude Code 设置(`.claude/settings.json` 或全局)
|
||||
2. 将敏感文件模式添加到拒绝列表:
|
||||
|
||||
```json
|
||||
{
|
||||
"permissions": {
|
||||
"deny": [
|
||||
"Read(.env)",
|
||||
"Read(.env.*)",
|
||||
"Read(**/secrets/*)",
|
||||
"Read(**/*credential*)",
|
||||
"Read(**/*.pem)",
|
||||
"Read(**/*.key)"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这完全阻止 Claude 读取这些文件,无论你运行什么命令。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> GSD 包含内置保护以防止提交密钥,但纵深防御是最佳实践。拒绝读取敏感文件作为第一道防线。
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
**安装后找不到命令?**
|
||||
- 重启运行时以重新加载命令/技能
|
||||
- 验证文件是否存在于 `~/.claude/commands/gsd/`(全局)或 `./.claude/commands/gsd/`(本地)
|
||||
- 对于 Codex,验证技能是否存在于 `~/.codex/skills/gsd-*/SKILL.md`(全局)或 `./.codex/skills/gsd-*/SKILL.md`(本地)
|
||||
|
||||
**命令没有按预期工作?**
|
||||
- 运行 `/gsd:help` 验证安装
|
||||
- 重新运行 `npx get-shit-done-cc` 重新安装
|
||||
|
||||
**更新到最新版本?**
|
||||
```bash
|
||||
npx get-shit-done-cc@latest
|
||||
```
|
||||
|
||||
**使用 Docker 或容器化环境?**
|
||||
|
||||
如果用波浪号路径(`~/.claude/...`)读取文件失败,在安装前设置 `CLAUDE_CONFIG_DIR`:
|
||||
```bash
|
||||
CLAUDE_CONFIG_DIR=/home/youruser/.claude npx get-shit-done-cc --global
|
||||
```
|
||||
这确保使用绝对路径而不是 `~`,后者在容器中可能无法正确展开。
|
||||
|
||||
### 卸载
|
||||
|
||||
完全删除 GSD:
|
||||
|
||||
```bash
|
||||
# 全局安装
|
||||
npx get-shit-done-cc --claude --global --uninstall
|
||||
npx get-shit-done-cc --opencode --global --uninstall
|
||||
npx get-shit-done-cc --codex --global --uninstall
|
||||
|
||||
# 本地安装(当前项目)
|
||||
npx get-shit-done-cc --claude --local --uninstall
|
||||
npx get-shit-done-cc --opencode --local --uninstall
|
||||
npx get-shit-done-cc --codex --local --uninstall
|
||||
```
|
||||
|
||||
这删除所有 GSD 命令、代理、钩子和设置,同时保留你的其他配置。
|
||||
|
||||
---
|
||||
|
||||
## 社区移植
|
||||
|
||||
OpenCode、Gemini CLI 和 Codex 现在通过 `npx get-shit-done-cc` 原生支持。
|
||||
|
||||
这些社区移植开创了多运行时支持:
|
||||
|
||||
| 项目 | 平台 | 描述 |
|
||||
|---------|----------|-------------|
|
||||
| [gsd-opencode](https://github.com/rokicool/gsd-opencode) | OpenCode | 原始 OpenCode 适配 |
|
||||
| gsd-gemini (已归档) | Gemini CLI | 由 uberfuzzy 开发的原始 Gemini 适配 |
|
||||
|
||||
---
|
||||
|
||||
## Star 历史
|
||||
|
||||
<a href="https://star-history.com/#glittercowboy/get-shit-done&Date">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=glittercowboy/get-shit-done&type=Date&theme=dark" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=glittercowboy/get-shit-done&type=Date" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=glittercowboy/get-shit-done&type=Date" />
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
---
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT 许可证。详见 [LICENSE](../LICENSE)。
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
**Claude Code 很强大。GSD 让它可靠。**
|
||||
|
||||
</div>
|
||||
492
docs/zh-CN/USER-GUIDE.md
Normal file
492
docs/zh-CN/USER-GUIDE.md
Normal file
@@ -0,0 +1,492 @@
|
||||
# GSD 用户指南
|
||||
|
||||
工作流、故障排除和配置的详细参考。快速入门设置请参阅 [README](README.md)。
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
- [工作流图解](#工作流图解)
|
||||
- [命令参考](#命令参考)
|
||||
- [配置参考](#配置参考)
|
||||
- [使用示例](#使用示例)
|
||||
- [故障排除](#故障排除)
|
||||
- [恢复快速参考](#恢复快速参考)
|
||||
|
||||
---
|
||||
|
||||
## 工作流图解
|
||||
|
||||
### 完整项目生命周期
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ 新建项目 │
|
||||
│ /gsd:new-project │
|
||||
│ 提问 -> 研究 -> 需求 -> 路线图 │
|
||||
└─────────────────────────┬────────────────────────┘
|
||||
│
|
||||
┌──────────────▼─────────────┐
|
||||
│ 每个阶段: │
|
||||
│ │
|
||||
│ ┌────────────────────┐ │
|
||||
│ │ /gsd:discuss-phase │ │ <- 锁定偏好
|
||||
│ └──────────┬─────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────▼─────────┐ │
|
||||
│ │ /gsd:plan-phase │ │ <- 研究 + 规划 + 验证
|
||||
│ └──────────┬─────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────▼─────────┐ │
|
||||
│ │ /gsd:execute-phase │ │ <- 并行执行
|
||||
│ └──────────┬─────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────▼─────────┐ │
|
||||
│ │ /gsd:verify-work │ │ <- 手动 UAT
|
||||
│ └──────────┬─────────┘ │
|
||||
│ │ │
|
||||
│ 下一阶段?────────────┘
|
||||
│ │ 否
|
||||
└─────────────┼──────────────┘
|
||||
│
|
||||
┌───────────────▼──────────────┐
|
||||
│ /gsd:audit-milestone │
|
||||
│ /gsd:complete-milestone │
|
||||
└───────────────┬──────────────┘
|
||||
│
|
||||
另一个里程碑?
|
||||
│ │
|
||||
是 否 -> 完成!
|
||||
│
|
||||
┌───────▼──────────────┐
|
||||
│ /gsd:new-milestone │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
### 规划代理协调
|
||||
|
||||
```
|
||||
/gsd:plan-phase N
|
||||
│
|
||||
├── 阶段研究员 (x4 并行)
|
||||
│ ├── 技术栈研究员
|
||||
│ ├── 功能研究员
|
||||
│ ├── 架构研究员
|
||||
│ └── 陷阱研究员
|
||||
│ │
|
||||
│ ┌──────▼──────┐
|
||||
│ │ RESEARCH.md │
|
||||
│ └──────┬──────┘
|
||||
│ │
|
||||
│ ┌──────▼──────┐
|
||||
│ │ 规划者 │ <- 读取 PROJECT.md, REQUIREMENTS.md,
|
||||
│ │ │ CONTEXT.md, RESEARCH.md
|
||||
│ └──────┬──────┘
|
||||
│ │
|
||||
│ ┌──────▼───────────┐ ┌────────┐
|
||||
│ │ 计划检查器 │────>│ 通过? │
|
||||
│ └──────────────────┘ └───┬────┘
|
||||
│ │
|
||||
│ 是 │ 否
|
||||
│ │ │ │
|
||||
│ │ └───┘ (循环,最多 3 次)
|
||||
│ │
|
||||
│ ┌─────▼──────┐
|
||||
│ │ PLAN 文件 │
|
||||
│ └────────────┘
|
||||
└── 完成
|
||||
```
|
||||
|
||||
### 验证架构 (Nyquist 层)
|
||||
|
||||
在 plan-phase 研究期间,GSD 现在在任何代码编写之前将自动化测试覆盖率映射到每个阶段需求。这确保当 Claude 的执行者提交任务时,反馈机制已经存在可以在几秒钟内验证它。
|
||||
|
||||
研究员检测你现有的测试基础设施,将每个需求映射到特定的测试命令,并识别在实现开始之前必须创建的任何测试脚手架(波次 0 任务)。
|
||||
|
||||
计划检查器将其强制作为第 8 个验证维度:缺少自动化验证命令的计划将不会被批准。
|
||||
|
||||
**输出:** `{阶段}-VALIDATION.md` —— 阶段的反馈契约。
|
||||
|
||||
**禁用:** 在 `/gsd:settings` 中设置 `workflow.nyquist_validation: false`,用于测试基础设施不是重点的快速原型阶段。
|
||||
|
||||
### 追溯验证 (`/gsd:validate-phase`)
|
||||
|
||||
对于在 Nyquist 验证存在之前执行的阶段,或只有传统测试套件的现有代码库,追溯审计并填补覆盖缺口:
|
||||
|
||||
```
|
||||
/gsd:validate-phase N
|
||||
|
|
||||
+-- 检测状态 (VALIDATION.md 存在? SUMMARY.md 存在?)
|
||||
|
|
||||
+-- 发现: 扫描实现,将需求映射到测试
|
||||
|
|
||||
+-- 分析缺口: 哪些需求缺少自动化验证?
|
||||
|
|
||||
+-- 呈现缺口计划供审批
|
||||
|
|
||||
+-- 生成审计器: 生成测试,运行,调试(最多 3 次尝试)
|
||||
|
|
||||
+-- 更新 VALIDATION.md
|
||||
|
|
||||
+-- COMPLIANT -> 所有需求都有自动化检查
|
||||
+-- PARTIAL -> 部分缺口升级为仅手动
|
||||
```
|
||||
|
||||
审计器从不修改实现代码 —— 只修改测试文件和 VALIDATION.md。如果测试发现实现 bug,它会标记为升级让你处理。
|
||||
|
||||
**何时使用:** 在启用了 Nyquist 之前规划的阶段执行后,或在 `/gsd:audit-milestone` 发现 Nyquist 合规缺口后。
|
||||
|
||||
### 执行波次协调
|
||||
|
||||
```
|
||||
/gsd:execute-phase N
|
||||
│
|
||||
├── 分析计划依赖
|
||||
│
|
||||
├── 波次 1 (独立计划):
|
||||
│ ├── 执行者 A (全新 200K 上下文) -> 提交
|
||||
│ └── 执行者 B (全新 200K 上下文) -> 提交
|
||||
│
|
||||
├── 波次 2 (依赖波次 1):
|
||||
│ └── 执行者 C (全新 200K 上下文) -> 提交
|
||||
│
|
||||
└── 验证器
|
||||
└── 根据阶段目标检查代码库
|
||||
│
|
||||
├── 通过 -> VERIFICATION.md (成功)
|
||||
└── 失败 -> 问题记录到 /gsd:verify-work
|
||||
```
|
||||
|
||||
### 现有代码库工作流
|
||||
|
||||
```
|
||||
/gsd:map-codebase
|
||||
│
|
||||
├── 技术栈映射器 -> codebase/STACK.md
|
||||
├── 架构映射器 -> codebase/ARCHITECTURE.md
|
||||
├── 约定映射器 -> codebase/CONVENTIONS.md
|
||||
└── 关注点映射器 -> codebase/CONCERNS.md
|
||||
│
|
||||
┌───────▼──────────┐
|
||||
│ /gsd:new-project │ <- 问题聚焦于你正在添加的内容
|
||||
└──────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 命令参考
|
||||
|
||||
### 核心工作流
|
||||
|
||||
| 命令 | 用途 | 何时使用 |
|
||||
|---------|---------|-------------|
|
||||
| `/gsd:new-project` | 完整项目初始化:提问、研究、需求、路线图 | 新项目开始时 |
|
||||
| `/gsd:new-project --auto @idea.md` | 从文档自动初始化 | 有现成的 PRD 或想法文档 |
|
||||
| `/gsd:discuss-phase [N]` | 捕获实现决策 | 规划前,塑造构建方式 |
|
||||
| `/gsd:plan-phase [N]` | 研究 + 规划 + 验证 | 执行阶段前 |
|
||||
| `/gsd:execute-phase <N>` | 在并行波次中执行所有计划 | 规划完成后 |
|
||||
| `/gsd:verify-work [N]` | 带自动诊断的手动 UAT | 执行完成后 |
|
||||
| `/gsd:audit-milestone` | 验证里程碑达到其完成定义 | 完成里程碑前 |
|
||||
| `/gsd:complete-milestone` | 归档里程碑,标记发布 | 所有阶段已验证 |
|
||||
| `/gsd:new-milestone [name]` | 开始下一个版本周期 | 完成里程碑后 |
|
||||
|
||||
### 导航
|
||||
|
||||
| 命令 | 用途 | 何时使用 |
|
||||
|---------|---------|-------------|
|
||||
| `/gsd:progress` | 显示状态和下一步 | 任何时候 -- "我在哪?" |
|
||||
| `/gsd:resume-work` | 从上次会话恢复完整上下文 | 开始新会话 |
|
||||
| `/gsd:pause-work` | 保存上下文交接 | 阶段中途停止 |
|
||||
| `/gsd:help` | 显示所有命令 | 快速参考 |
|
||||
| `/gsd:update` | 更新 GSD 并预览变更日志 | 检查新版本 |
|
||||
| `/gsd:join-discord` | 打开 Discord 社区邀请 | 问题或社区 |
|
||||
|
||||
### 阶段管理
|
||||
|
||||
| 命令 | 用途 | 何时使用 |
|
||||
|---------|---------|-------------|
|
||||
| `/gsd:add-phase` | 向路线图追加新阶段 | 初始规划后范围增长 |
|
||||
| `/gsd:insert-phase [N]` | 插入紧急工作(小数编号) | 里程碑中途紧急修复 |
|
||||
| `/gsd:remove-phase [N]` | 删除未来阶段并重新编号 | 移除某个功能 |
|
||||
| `/gsd:list-phase-assumptions [N]` | 预览 Claude 的预期方法 | 规划前,验证方向 |
|
||||
| `/gsd:plan-milestone-gaps` | 为审计缺口创建阶段 | 审计发现缺失项后 |
|
||||
| `/gsd:research-phase [N]` | 仅深度生态研究 | 复杂或不熟悉的领域 |
|
||||
|
||||
### 现有代码库和工具
|
||||
|
||||
| 命令 | 用途 | 何时使用 |
|
||||
|---------|---------|-------------|
|
||||
| `/gsd:map-codebase` | 分析现有代码库 | 在现有代码上运行 `/gsd:new-project` 之前 |
|
||||
| `/gsd:quick` | 带 GSD 保证的临时任务 | Bug 修复、小功能、配置更改 |
|
||||
| `/gsd:debug [desc]` | 带持久状态的系统化调试 | 出问题时 |
|
||||
| `/gsd:add-todo [desc]` | 捕获想法留待后用 | 会话期间想到什么 |
|
||||
| `/gsd:check-todos` | 列出待处理事项 | 查看捕获的想法 |
|
||||
| `/gsd:settings` | 配置工作流开关和模型配置 | 更改模型、切换代理 |
|
||||
| `/gsd:set-profile <profile>` | 快速切换配置 | 更改成本/质量权衡 |
|
||||
| `/gsd:reapply-patches` | 更新后恢复本地修改 | 如果你有本地编辑,在 `/gsd:update` 后 |
|
||||
|
||||
---
|
||||
|
||||
## 配置参考
|
||||
|
||||
GSD 在 `.planning/config.json` 中存储项目设置。在 `/gsd:new-project` 期间配置或稍后用 `/gsd:settings` 更新。
|
||||
|
||||
### 完整 config.json 模式
|
||||
|
||||
```json
|
||||
{
|
||||
"mode": "interactive",
|
||||
"granularity": "standard",
|
||||
"model_profile": "balanced",
|
||||
"planning": {
|
||||
"commit_docs": true,
|
||||
"search_gitignored": false
|
||||
},
|
||||
"workflow": {
|
||||
"research": true,
|
||||
"plan_check": true,
|
||||
"verifier": true,
|
||||
"nyquist_validation": true
|
||||
},
|
||||
"git": {
|
||||
"branching_strategy": "none",
|
||||
"phase_branch_template": "gsd/phase-{phase}-{slug}",
|
||||
"milestone_branch_template": "gsd/{milestone}-{slug}"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 核心设置
|
||||
|
||||
| 设置 | 选项 | 默认值 | 控制内容 |
|
||||
|---------|---------|---------|------------------|
|
||||
| `mode` | `interactive`, `yolo` | `interactive` | `yolo` 自动批准决策;`interactive` 每步确认 |
|
||||
| `granularity` | `coarse`, `standard`, `fine` | `standard` | 阶段粒度:范围切分多细(3-5、5-8 或 8-12 个阶段) |
|
||||
| `model_profile` | `quality`, `balanced`, `budget` | `balanced` | 每个代理的模型层级(见下表) |
|
||||
|
||||
### 规划设置
|
||||
|
||||
| 设置 | 选项 | 默认值 | 控制内容 |
|
||||
|---------|---------|---------|------------------|
|
||||
| `planning.commit_docs` | `true`, `false` | `true` | `.planning/` 文件是否提交到 git |
|
||||
| `planning.search_gitignored` | `true`, `false` | `false` | 在广泛搜索中添加 `--no-ignore` 以包含 `.planning/` |
|
||||
|
||||
> **注意:** 如果 `.planning/` 在 `.gitignore` 中,无论配置值如何,`commit_docs` 自动为 `false`。
|
||||
|
||||
### 工作流开关
|
||||
|
||||
| 设置 | 选项 | 默认值 | 控制内容 |
|
||||
|---------|---------|---------|------------------|
|
||||
| `workflow.research` | `true`, `false` | `true` | 规划前的领域调查 |
|
||||
| `workflow.plan_check` | `true`, `false` | `true` | 计划验证循环(最多 3 次迭代) |
|
||||
| `workflow.verifier` | `true`, `false` | `true` | 根据阶段目标的执行后验证 |
|
||||
| `workflow.nyquist_validation` | `true`, `false` | `true` | plan-phase 期间的验证架构研究;第 8 个计划检查维度 |
|
||||
|
||||
在熟悉的领域或需要节省 token 时禁用这些以加速阶段。
|
||||
|
||||
### Git 分支
|
||||
|
||||
| 设置 | 选项 | 默认值 | 控制内容 |
|
||||
|---------|---------|---------|------------------|
|
||||
| `git.branching_strategy` | `none`, `phase`, `milestone` | `none` | 何时以及如何创建分支 |
|
||||
| `git.phase_branch_template` | 模板字符串 | `gsd/phase-{phase}-{slug}` | 阶段策略的分支名 |
|
||||
| `git.milestone_branch_template` | 模板字符串 | `gsd/{milestone}-{slug}` | 里程碑策略的分支名 |
|
||||
|
||||
**分支策略说明:**
|
||||
|
||||
| 策略 | 创建分支 | 范围 | 适用于 |
|
||||
|----------|---------------|-------|----------|
|
||||
| `none` | 从不 | N/A | 独立开发、简单项目 |
|
||||
| `phase` | 每次 `execute-phase` | 每个阶段一个分支 | 每阶段代码审查、细粒度回滚 |
|
||||
| `milestone` | 第一次 `execute-phase` | 所有阶段共享一个分支 | 发布分支、每个版本一个 PR |
|
||||
|
||||
**模板变量:** `{phase}` = 零填充数字(如 "03"),`{slug}` = 小写连字符名称,`{milestone}` = 版本(如 "v1.0")。
|
||||
|
||||
### 模型配置(每个代理分解)
|
||||
|
||||
| 代理 | `quality` | `balanced` | `budget` |
|
||||
|-------|-----------|------------|----------|
|
||||
| gsd-planner | Opus | Opus | Sonnet |
|
||||
| gsd-roadmapper | Opus | Sonnet | Sonnet |
|
||||
| gsd-executor | Opus | Sonnet | Sonnet |
|
||||
| gsd-phase-researcher | Opus | Sonnet | Haiku |
|
||||
| gsd-project-researcher | Opus | Sonnet | Haiku |
|
||||
| gsd-research-synthesizer | Sonnet | Sonnet | Haiku |
|
||||
| gsd-debugger | Opus | Sonnet | Sonnet |
|
||||
| gsd-codebase-mapper | Sonnet | Haiku | Haiku |
|
||||
| gsd-verifier | Sonnet | Sonnet | Haiku |
|
||||
| gsd-plan-checker | Sonnet | Sonnet | Haiku |
|
||||
| gsd-integration-checker | Sonnet | Sonnet | Haiku |
|
||||
|
||||
**配置理念:**
|
||||
- **quality** —— 所有决策代理使用 Opus,只读验证使用 Sonnet。有配额可用且工作关键时使用。
|
||||
- **balanced** —— 仅规划(架构决策发生的地方)使用 Opus,其他全部使用 Sonnet。这是默认,有充分理由。
|
||||
- **budget** —— 编写代码的使用 Sonnet,研究和验证使用 Haiku。大量工作或不太关键的阶段使用。
|
||||
|
||||
---
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 新项目(完整周期)
|
||||
|
||||
```bash
|
||||
claude --dangerously-skip-permissions
|
||||
/gsd:new-project # 回答问题,配置,批准路线图
|
||||
/clear
|
||||
/gsd:discuss-phase 1 # 锁定你的偏好
|
||||
/gsd:plan-phase 1 # 研究 + 规划 + 验证
|
||||
/gsd:execute-phase 1 # 并行执行
|
||||
/gsd:verify-work 1 # 手动 UAT
|
||||
/clear
|
||||
/gsd:discuss-phase 2 # 对每个阶段重复
|
||||
...
|
||||
/gsd:audit-milestone # 检查所有内容已发布
|
||||
/gsd:complete-milestone # 归档,标记,完成
|
||||
```
|
||||
|
||||
### 从现有文档创建新项目
|
||||
|
||||
```bash
|
||||
/gsd:new-project --auto @prd.md # 从你的文档自动运行研究/需求/路线图
|
||||
/clear
|
||||
/gsd:discuss-phase 1 # 从这里开始正常流程
|
||||
```
|
||||
|
||||
### 现有代码库
|
||||
|
||||
```bash
|
||||
/gsd:map-codebase # 分析现有内容(并行代理)
|
||||
/gsd:new-project # 问题聚焦于你正在添加的内容
|
||||
# (从这里开始正常阶段工作流)
|
||||
```
|
||||
|
||||
### 快速 Bug 修复
|
||||
|
||||
```bash
|
||||
/gsd:quick
|
||||
> "修复移动端 Safari 上登录按钮无响应的问题"
|
||||
```
|
||||
|
||||
### 中断后恢复
|
||||
|
||||
```bash
|
||||
/gsd:progress # 查看你停在哪和接下来做什么
|
||||
# 或
|
||||
/gsd:resume-work # 从上次会话完整恢复上下文
|
||||
```
|
||||
|
||||
### 准备发布
|
||||
|
||||
```bash
|
||||
/gsd:audit-milestone # 检查需求覆盖率,检测存根
|
||||
/gsd:plan-milestone-gaps # 如果审计发现缺口,创建阶段来填补
|
||||
/gsd:complete-milestone # 归档,标记,完成
|
||||
```
|
||||
|
||||
### 速度与质量预设
|
||||
|
||||
| 场景 | 模式 | 粒度 | 配置 | 研究 | 计划检查 | 验证器 |
|
||||
|----------|------|-------|---------|----------|------------|----------|
|
||||
| 原型开发 | `yolo` | `coarse` | `budget` | 关 | 关 | 关 |
|
||||
| 正常开发 | `interactive` | `standard` | `balanced` | 开 | 开 | 开 |
|
||||
| 生产环境 | `interactive` | `fine` | `quality` | 开 | 开 | 开 |
|
||||
|
||||
### 里程碑中途范围变更
|
||||
|
||||
```bash
|
||||
/gsd:add-phase # 向路线图追加新阶段
|
||||
# 或
|
||||
/gsd:insert-phase 3 # 在阶段 3 和 4 之间插入紧急工作
|
||||
# 或
|
||||
/gsd:remove-phase 7 # 移除阶段 7 并重新编号
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### "项目已初始化"
|
||||
|
||||
你运行了 `/gsd:new-project` 但 `.planning/PROJECT.md` 已存在。这是安全检查。如果你想重新开始,先删除 `.planning/` 目录。
|
||||
|
||||
### 长会话期间上下文退化
|
||||
|
||||
在主要命令之间清除上下文窗口:Claude Code 中的 `/clear`。GSD 设计围绕全新上下文 —— 每个子代理获得干净的 200K 窗口。如果主会话质量下降,清除并使用 `/gsd:resume-work` 或 `/gsd:progress` 恢复状态。
|
||||
|
||||
### 计划看起来错误或不一致
|
||||
|
||||
在规划前运行 `/gsd:discuss-phase [N]`。大多数计划质量问题来自 Claude 做出了 `CONTEXT.md` 本可以防止的假设。你也可以运行 `/gsd:list-phase-assumptions [N]` 在提交计划前查看 Claude 打算做什么。
|
||||
|
||||
### 执行失败或产生存根
|
||||
|
||||
检查计划是否太雄心勃勃。计划最多应有 2-3 个任务。如果任务太大,它们超出了单个上下文窗口可以可靠产生的内容。用更小的范围重新规划。
|
||||
|
||||
### 忘记你在哪里
|
||||
|
||||
运行 `/gsd:progress`。它读取所有状态文件,准确告诉你位置和下一步。
|
||||
|
||||
### 执行后需要更改某些内容
|
||||
|
||||
不要重新运行 `/gsd:execute-phase`。使用 `/gsd:quick` 进行针对性修复,或用 `/gsd:verify-work` 通过 UAT 系统识别和修复问题。
|
||||
|
||||
### 模型成本太高
|
||||
|
||||
切换到 budget 配置:`/gsd:set-profile budget`。如果领域对你(或 Claude)熟悉,通过 `/gsd:settings` 禁用研究和计划检查代理。
|
||||
|
||||
### 处理敏感/私有项目
|
||||
|
||||
在 `/gsd:new-project` 期间或通过 `/gsd:settings` 设置 `commit_docs: false`。将 `.planning/` 添加到 `.gitignore`。规划工件保留在本地,从不接触 git。
|
||||
|
||||
### GSD 更新覆盖了我的本地更改
|
||||
|
||||
从 v1.17 开始,安装程序将本地修改的文件备份到 `gsd-local-patches/`。运行 `/gsd:reapply-patches` 将你的更改合并回来。
|
||||
|
||||
### 子代理似乎失败但工作已完成
|
||||
|
||||
存在 Claude Code 分类 bug 的已知解决方法。GSD 的编排器(execute-phase、quick)在报告失败前抽查实际输出。如果你看到失败消息但提交已创建,检查 `git log` —— 工作可能已成功。
|
||||
|
||||
---
|
||||
|
||||
## 恢复快速参考
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|---------|----------|
|
||||
| 丢失上下文 / 新会话 | `/gsd:resume-work` 或 `/gsd:progress` |
|
||||
| 阶段出错 | `git revert` 阶段提交,然后重新规划 |
|
||||
| 需要更改范围 | `/gsd:add-phase`、`/gsd:insert-phase` 或 `/gsd:remove-phase` |
|
||||
| 里程碑审计发现缺口 | `/gsd:plan-milestone-gaps` |
|
||||
| 出问题了 | `/gsd:debug "描述"` |
|
||||
| 快速针对性修复 | `/gsd:quick` |
|
||||
| 计划与你的愿景不符 | `/gsd:discuss-phase [N]` 然后重新规划 |
|
||||
| 成本过高 | `/gsd:set-profile budget` 和 `/gsd:settings` 关闭代理 |
|
||||
| 更新破坏了本地更改 | `/gsd:reapply-patches` |
|
||||
|
||||
---
|
||||
|
||||
## 项目文件结构
|
||||
|
||||
供参考,这是 GSD 在你的项目中创建的内容:
|
||||
|
||||
```
|
||||
.planning/
|
||||
PROJECT.md # 项目愿景和上下文(始终加载)
|
||||
REQUIREMENTS.md # 界定 v1/v2 需求及 ID
|
||||
ROADMAP.md # 带状态跟踪的阶段分解
|
||||
STATE.md # 决策、阻塞项、会话记忆
|
||||
config.json # 工作流配置
|
||||
MILESTONES.md # 已完成里程碑归档
|
||||
research/ # 来自 /gsd:new-project 的领域研究
|
||||
todos/
|
||||
pending/ # 等待处理的捕获想法
|
||||
done/ # 已完成的待办事项
|
||||
debug/ # 活跃调试会话
|
||||
resolved/ # 已归档的调试会话
|
||||
codebase/ # 现有代码库映射(来自 /gsd:map-codebase)
|
||||
phases/
|
||||
XX-phase-name/
|
||||
XX-YY-PLAN.md # 原子执行计划
|
||||
XX-YY-SUMMARY.md # 执行结果和决策
|
||||
CONTEXT.md # 你的实现偏好
|
||||
RESEARCH.md # 生态研究发现
|
||||
VERIFICATION.md # 执行后验证结果
|
||||
```
|
||||
450
docs/zh-CN/references/checkpoints.md
Normal file
450
docs/zh-CN/references/checkpoints.md
Normal file
@@ -0,0 +1,450 @@
|
||||
# 检查点
|
||||
|
||||
计划自主执行。检查点用于规范化需要人工验证或决策的交互点。
|
||||
|
||||
**核心原则:** Claude 用 CLI/API 自动化一切。检查点用于验证和决策,而非手动工作。
|
||||
|
||||
**黄金法则:**
|
||||
1. **如果 Claude 能运行,Claude 就运行** - 绝不让用户执行 CLI 命令、启动服务器或运行构建
|
||||
2. **Claude 设置验证环境** - 启动开发服务器、填充数据库、配置环境变量
|
||||
3. **用户只做需要人工判断的事** - 视觉检查、UX 评估、"这个感觉对吗?"
|
||||
4. **密钥来自用户,自动化来自 Claude** - 询问 API 密钥,然后 Claude 通过 CLI 使用它们
|
||||
5. **自动模式绕过验证/决策检查点** — 当 config 中 `workflow._auto_chain_active` 或 `workflow.auto_advance` 为 true 时:human-verify 自动批准,decision 自动选择第一个选项,human-action 仍会停止(认证门控无法自动化)
|
||||
|
||||
## 检查点类型
|
||||
|
||||
### checkpoint:human-verify(最常见 - 90%)
|
||||
|
||||
**何时使用:** Claude 完成自动化工作,人工确认其正常工作。
|
||||
|
||||
**用于:**
|
||||
- 视觉 UI 检查(布局、样式、响应式)
|
||||
- 交互流程(点击向导、测试用户流程)
|
||||
- 功能验证(功能按预期工作)
|
||||
- 音频/视频播放质量
|
||||
- 动画流畅度
|
||||
- 无障碍测试
|
||||
|
||||
**结构:**
|
||||
```xml
|
||||
<task type="checkpoint:human-verify" gate="blocking">
|
||||
<what-built>[Claude 自动化并部署/构建的内容]</what-built>
|
||||
<how-to-verify>
|
||||
[测试的确切步骤 - URL、命令、预期行为]
|
||||
</how-to-verify>
|
||||
<resume-signal>[如何继续 - "approved"、"yes" 或描述问题]</resume-signal>
|
||||
</task>
|
||||
```
|
||||
|
||||
**示例:UI 组件(展示关键模式:Claude 在检查点之前启动服务器)**
|
||||
```xml
|
||||
<task type="auto">
|
||||
<name>构建响应式仪表板布局</name>
|
||||
<files>src/components/Dashboard.tsx, src/app/dashboard/page.tsx</files>
|
||||
<action>创建带侧边栏、标题和内容区域的仪表板。使用 Tailwind 响应式类处理移动端。</action>
|
||||
<verify>npm run build 成功,无 TypeScript 错误</verify>
|
||||
<done>仪表板组件构建无错误</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>启动开发服务器用于验证</name>
|
||||
<action>在后台运行 `npm run dev`,等待 "ready" 消息,捕获端口</action>
|
||||
<verify>curl http://localhost:3000 返回 200</verify>
|
||||
<done>开发服务器运行于 http://localhost:3000</done>
|
||||
</task>
|
||||
|
||||
<task type="checkpoint:human-verify" gate="blocking">
|
||||
<what-built>响应式仪表板布局 - 开发服务器运行于 http://localhost:3000</what-built>
|
||||
<how-to-verify>
|
||||
访问 http://localhost:3000/dashboard 并验证:
|
||||
1. 桌面端 (>1024px): 左侧边栏,右侧内容,顶部标题
|
||||
2. 平板端 (768px): 侧边栏折叠为汉堡菜单
|
||||
3. 移动端 (375px): 单列布局,出现底部导航
|
||||
4. 任何尺寸无布局偏移或水平滚动
|
||||
</how-to-verify>
|
||||
<resume-signal>输入 "approved" 或描述布局问题</resume-signal>
|
||||
</task>
|
||||
```
|
||||
|
||||
### checkpoint:decision(9%)
|
||||
|
||||
**何时使用:** 人工必须做出影响实现方向的选择。
|
||||
|
||||
**用于:**
|
||||
- 技术选型(哪个认证提供商、哪个数据库)
|
||||
- 架构决策(monorepo 还是独立仓库)
|
||||
- 设计选择(配色方案、布局方式)
|
||||
- 功能优先级(构建哪个变体)
|
||||
- 数据模型决策(模式结构)
|
||||
|
||||
**结构:**
|
||||
```xml
|
||||
<task type="checkpoint:decision" gate="blocking">
|
||||
<decision>[正在决策的内容]</decision>
|
||||
<context>[为什么这个决策重要]</context>
|
||||
<options>
|
||||
<option id="option-a">
|
||||
<name>[选项名称]</name>
|
||||
<pros>[好处]</pros>
|
||||
<cons>[权衡]</cons>
|
||||
</option>
|
||||
<option id="option-b">
|
||||
<name>[选项名称]</name>
|
||||
<pros>[好处]</pros>
|
||||
<cons>[权衡]</cons>
|
||||
</option>
|
||||
</options>
|
||||
<resume-signal>[如何表明选择]</resume-signal>
|
||||
</task>
|
||||
```
|
||||
|
||||
**示例:认证提供商选择**
|
||||
```xml
|
||||
<task type="checkpoint:decision" gate="blocking">
|
||||
<decision>选择认证提供商</decision>
|
||||
<context>
|
||||
应用需要用户认证。三个可靠选项各有权衡。
|
||||
</context>
|
||||
<options>
|
||||
<option id="supabase">
|
||||
<name>Supabase Auth</name>
|
||||
<pros>与我们使用的 Supabase DB 内置集成,慷慨的免费额度,行级安全集成</pros>
|
||||
<cons>UI 定制性较差,绑定 Supabase 生态</cons>
|
||||
</option>
|
||||
<option id="clerk">
|
||||
<name>Clerk</name>
|
||||
<pros>精美的预构建 UI,最佳开发体验,优秀文档</pros>
|
||||
<cons>10k MAU 后付费,供应商锁定</cons>
|
||||
</option>
|
||||
<option id="nextauth">
|
||||
<name>NextAuth.js</name>
|
||||
<pros>免费,自托管,最大控制权,广泛采用</pros>
|
||||
<cons>更多设置工作,需自行管理安全更新,UI 需自己构建</cons>
|
||||
</option>
|
||||
</options>
|
||||
<resume-signal>选择:supabase、clerk 或 nextauth</resume-signal>
|
||||
</task>
|
||||
```
|
||||
|
||||
### checkpoint:human-action(1% - 罕见)
|
||||
|
||||
**何时使用:** 操作没有 CLI/API 且需要仅人工交互,或者 Claude 在自动化过程中遇到认证门控。
|
||||
|
||||
**仅用于:**
|
||||
- **认证门控** - Claude 尝试了 CLI/API 但需要凭证(这不是失败)
|
||||
- 邮箱验证链接(点击邮件)
|
||||
- 短信两步验证码(手机验证)
|
||||
- 人工账户审批(平台需要人工审核)
|
||||
- 信用卡 3D Secure 流程(基于 Web 的支付授权)
|
||||
- OAuth 应用审批(基于 Web 的审批)
|
||||
|
||||
**不要用于预定的手动工作:**
|
||||
- 部署(使用 CLI - 如需要则认证门控)
|
||||
- 创建 webhooks/数据库(使用 API/CLI - 如需要则认证门控)
|
||||
- 运行构建/测试(使用 Bash 工具)
|
||||
- 创建文件(使用 Write 工具)
|
||||
|
||||
**结构:**
|
||||
```xml
|
||||
<task type="checkpoint:human-action" gate="blocking">
|
||||
<action>[人工必须做什么 - Claude 已完成所有可自动化的]</action>
|
||||
<instructions>
|
||||
[Claude 已自动化的内容]
|
||||
[需要人工操作的一件事]
|
||||
</instructions>
|
||||
<verification>[Claude 之后可以检查的内容]</verification>
|
||||
<resume-signal>[如何继续]</resume-signal>
|
||||
</task>
|
||||
```
|
||||
|
||||
**示例:认证门控(动态检查点)**
|
||||
```xml
|
||||
<task type="auto">
|
||||
<name>部署到 Vercel</name>
|
||||
<files>.vercel/, vercel.json</files>
|
||||
<action>运行 `vercel --yes` 进行部署</action>
|
||||
<verify>vercel ls 显示部署,curl 返回 200</verify>
|
||||
</task>
|
||||
|
||||
<!-- 如果 vercel 返回 "Error: Not authenticated",Claude 即时创建检查点 -->
|
||||
|
||||
<task type="checkpoint:human-action" gate="blocking">
|
||||
<action>认证 Vercel CLI 以便我继续部署</action>
|
||||
<instructions>
|
||||
我尝试部署但收到认证错误。
|
||||
运行:vercel login
|
||||
这将打开你的浏览器 - 完成认证流程。
|
||||
</instructions>
|
||||
<verification>vercel whoami 返回你的账户邮箱</verification>
|
||||
<resume-signal>认证完成后输入 "done"</resume-signal>
|
||||
</task>
|
||||
|
||||
<!-- 认证后,Claude 重试部署 -->
|
||||
|
||||
<task type="auto">
|
||||
<name>重试 Vercel 部署</name>
|
||||
<action>运行 `vercel --yes`(已认证)</action>
|
||||
<verify>vercel ls 显示部署,curl 返回 200</verify>
|
||||
</task>
|
||||
```
|
||||
|
||||
**关键区别:** 认证门控是 Claude 遇到认证错误时动态创建的。不是预定的 — Claude 先自动化,只有在被阻止时才请求凭证。
|
||||
|
||||
## 执行协议
|
||||
|
||||
当 Claude 遇到 `type="checkpoint:*"` 时:
|
||||
|
||||
1. **立即停止** - 不继续下一个任务
|
||||
2. **清晰显示检查点** 使用下面的格式
|
||||
3. **等待用户响应** - 不幻想完成
|
||||
4. **如可能则验证** - 检查文件、运行测试、任何指定的内容
|
||||
5. **恢复执行** - 仅在确认后继续下一个任务
|
||||
|
||||
**对于 checkpoint:human-verify:**
|
||||
```
|
||||
╔═══════════════════════════════════════════════════════╗
|
||||
║ CHECKPOINT: 需要验证 ║
|
||||
╚═══════════════════════════════════════════════════════╝
|
||||
|
||||
进度: 5/8 任务完成
|
||||
任务: 响应式仪表板布局
|
||||
|
||||
已构建: /dashboard 的响应式仪表板
|
||||
|
||||
如何验证:
|
||||
1. 访问: http://localhost:3000/dashboard
|
||||
2. 桌面端 (>1024px): 侧边栏可见,内容填充剩余空间
|
||||
3. 平板端 (768px): 侧边栏折叠为图标
|
||||
4. 移动端 (375px): 侧边栏隐藏,出现汉堡菜单
|
||||
|
||||
────────────────────────────────────────────────────────
|
||||
→ 你的操作: 输入 "approved" 或描述问题
|
||||
────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
**对于 checkpoint:decision:**
|
||||
```
|
||||
╔═══════════════════════════════════════════════════════╗
|
||||
║ CHECKPOINT: 需要决策 ║
|
||||
╚═══════════════════════════════════════════════════════╝
|
||||
|
||||
进度: 2/6 任务完成
|
||||
任务: 选择认证提供商
|
||||
|
||||
决策: 我们应该使用哪个认证提供商?
|
||||
|
||||
上下文: 需要用户认证。三个选项各有权衡。
|
||||
|
||||
选项:
|
||||
1. supabase - 与我们的数据库内置集成,免费额度
|
||||
优点: 行级安全集成,慷慨的免费额度
|
||||
缺点: UI 定制性较差,生态锁定
|
||||
|
||||
2. clerk - 最佳 DX,10k 用户后付费
|
||||
优点: 精美的预构建 UI,优秀文档
|
||||
缺点: 供应商锁定,规模化时价格问题
|
||||
|
||||
3. nextauth - 自托管,最大控制权
|
||||
优点: 免费,无供应商锁定,广泛采用
|
||||
缺点: 更多设置工作,自行 DIY 安全更新
|
||||
|
||||
────────────────────────────────────────────────────────
|
||||
→ 你的操作: 选择 supabase、clerk 或 nextauth
|
||||
────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
## 认证门控
|
||||
|
||||
**认证门控 = Claude 尝试了 CLI/API,收到认证错误。** 不是失败 — 是需要人工输入来解除阻止的门控。
|
||||
|
||||
**模式:** Claude 尝试自动化 → 认证错误 → 创建 checkpoint:human-action → 用户认证 → Claude 重试 → 继续
|
||||
|
||||
**门控协议:**
|
||||
1. 认识到这不是失败 - 缺少认证是正常的
|
||||
2. 停止当前任务 - 不要反复重试
|
||||
3. 动态创建 checkpoint:human-action
|
||||
4. 提供确切的认证步骤
|
||||
5. 验证认证有效
|
||||
6. 重试原始任务
|
||||
7. 正常继续
|
||||
|
||||
**关键区别:**
|
||||
- 预定的检查点:"我需要你做 X"(错误 - Claude 应该自动化)
|
||||
- 认证门控:"我尝试自动化 X 但需要凭证"(正确 - 解除自动化阻止)
|
||||
|
||||
## 自动化参考
|
||||
|
||||
**规则:** 如果有 CLI/API,Claude 就做。绝不让人工执行可自动化的工作。
|
||||
|
||||
### 服务 CLI 参考
|
||||
|
||||
| 服务 | CLI/API | 关键命令 | 认证门控 |
|
||||
|------|---------|----------|----------|
|
||||
| Vercel | `vercel` | `--yes`, `env add`, `--prod`, `ls` | `vercel login` |
|
||||
| Railway | `railway` | `init`, `up`, `variables set` | `railway login` |
|
||||
| Fly | `fly` | `launch`, `deploy`, `secrets set` | `fly auth login` |
|
||||
| Stripe | `stripe` + API | `listen`, `trigger`, API 调用 | .env 中的 API key |
|
||||
| Supabase | `supabase` | `init`, `link`, `db push`, `gen types` | `supabase login` |
|
||||
| Upstash | `upstash` | `redis create`, `redis get` | `upstash auth login` |
|
||||
| PlanetScale | `pscale` | `database create`, `branch create` | `pscale auth login` |
|
||||
| GitHub | `gh` | `repo create`, `pr create`, `secret set` | `gh auth login` |
|
||||
| Node | `npm`/`pnpm` | `install`, `run build`, `test`, `run dev` | N/A |
|
||||
| Xcode | `xcodebuild` | `-project`, `-scheme`, `build`, `test` | N/A |
|
||||
| Convex | `npx convex` | `dev`, `deploy`, `env set`, `env get` | `npx convex login` |
|
||||
|
||||
### 环境变量自动化
|
||||
|
||||
**Env 文件:** 使用 Write/Edit 工具。绝不让用户手动创建 .env。
|
||||
|
||||
**通过 CLI 的仪表板环境变量:**
|
||||
|
||||
| 平台 | CLI 命令 | 示例 |
|
||||
|------|----------|------|
|
||||
| Convex | `npx convex env set` | `npx convex env set OPENAI_API_KEY sk-...` |
|
||||
| Vercel | `vercel env add` | `vercel env add STRIPE_KEY production` |
|
||||
| Railway | `railway variables set` | `railway variables set API_KEY=value` |
|
||||
| Fly | `fly secrets set` | `fly secrets set DATABASE_URL=...` |
|
||||
| Supabase | `supabase secrets set` | `supabase secrets set MY_SECRET=value` |
|
||||
|
||||
### 开发服务器自动化
|
||||
|
||||
| 框架 | 启动命令 | 就绪信号 | 默认 URL |
|
||||
|------|----------|----------|----------|
|
||||
| Next.js | `npm run dev` | "Ready in" 或 "started server" | http://localhost:3000 |
|
||||
| Vite | `npm run dev` | "ready in" | http://localhost:5173 |
|
||||
| Convex | `npx convex dev` | "Convex functions ready" | N/A(仅后端)|
|
||||
| Express | `npm start` | "listening on port" | http://localhost:3000 |
|
||||
| Django | `python manage.py runserver` | "Starting development server" | http://localhost:8000 |
|
||||
|
||||
**服务器生命周期:**
|
||||
```bash
|
||||
# 后台运行,捕获 PID
|
||||
npm run dev &
|
||||
DEV_SERVER_PID=$!
|
||||
|
||||
# 等待就绪(最多 30s)
|
||||
timeout 30 bash -c 'until curl -s localhost:3000 > /dev/null 2>&1; do sleep 1; done'
|
||||
```
|
||||
|
||||
**端口冲突:** 终止陈旧进程(`lsof -ti:3000 | xargs kill`)或使用备用端口(`--port 3001`)。
|
||||
|
||||
**服务器保持运行** 直到检查点结束。仅在计划完成、切换到生产环境或端口需要用于不同服务时终止。
|
||||
|
||||
### CLI 安装处理
|
||||
|
||||
| CLI | 自动安装? | 命令 |
|
||||
|-----|------------|------|
|
||||
| npm/pnpm/yarn | 否 - 询问用户 | 用户选择包管理器 |
|
||||
| vercel | 是 | `npm i -g vercel` |
|
||||
| gh (GitHub) | 是 | `brew install gh` (macOS) 或 `apt install gh` (Linux) |
|
||||
| stripe | 是 | `npm i -g stripe` |
|
||||
| supabase | 是 | `npm i -g supabase` |
|
||||
| convex | 否 - 使用 npx | `npx convex`(无需安装)|
|
||||
| fly | 是 | `brew install flyctl` 或 curl 安装器 |
|
||||
| railway | 是 | `npm i -g @railway/cli` |
|
||||
|
||||
**协议:** 尝试命令 → "command not found" → 可自动安装?→ 是:静默安装,重试 → 否:检查点请求用户安装。
|
||||
|
||||
## 检查点前自动化失败处理
|
||||
|
||||
| 失败 | 响应 |
|
||||
|------|------|
|
||||
| 服务器无法启动 | 检查错误,修复问题,重试(不进入检查点)|
|
||||
| 端口被占用 | 终止陈旧进程或使用备用端口 |
|
||||
| 缺少依赖 | 运行 `npm install`,重试 |
|
||||
| 构建错误 | 先修复错误(是 bug,不是检查点问题)|
|
||||
| 认证错误 | 创建认证门控检查点 |
|
||||
| 网络超时 | 带退避重试,如果持续则检查点 |
|
||||
|
||||
**绝不呈现验证环境损坏的检查点。** 如果 `curl localhost:3000` 失败,不要让用户"访问 localhost:3000"。
|
||||
|
||||
## 可自动化快速参考
|
||||
|
||||
| 操作 | 可自动化?| Claude 做?|
|
||||
|------|------------|------------|
|
||||
| 部署到 Vercel | 是 (`vercel`) | 是 |
|
||||
| 创建 Stripe webhook | 是 (API) | 是 |
|
||||
| 写入 .env 文件 | 是 (Write 工具) | 是 |
|
||||
| 创建 Upstash DB | 是 (`upstash`) | 是 |
|
||||
| 运行测试 | 是 (`npm test`) | 是 |
|
||||
| 启动开发服务器 | 是 (`npm run dev`) | 是 |
|
||||
| 添加环境变量到 Convex | 是 (`npx convex env set`) | 是 |
|
||||
| 添加环境变量到 Vercel | 是 (`vercel env add`) | 是 |
|
||||
| 填充数据库 | 是 (CLI/API) | 是 |
|
||||
| 点击邮件验证链接 | 否 | 否 |
|
||||
| 输入带 3DS 的信用卡 | 否 | 否 |
|
||||
| 在浏览器中完成 OAuth | 否 | 否 |
|
||||
| 视觉验证 UI 是否正确 | 否 | 否 |
|
||||
| 测试交互式用户流程 | 否 | 否 |
|
||||
|
||||
## 反模式
|
||||
|
||||
### ❌ 错误:让用户启动开发服务器
|
||||
```xml
|
||||
<task type="checkpoint:human-verify" gate="blocking">
|
||||
<what-built>仪表板组件</what-built>
|
||||
<how-to-verify>
|
||||
1. 运行: npm run dev
|
||||
2. 访问: http://localhost:3000/dashboard
|
||||
3. 检查布局是否正确
|
||||
</how-to-verify>
|
||||
</task>
|
||||
```
|
||||
**为什么错误:** Claude 可以运行 `npm run dev`。用户应该只访问 URL,不执行命令。
|
||||
|
||||
### ✅ 正确:Claude 启动服务器,用户访问
|
||||
```xml
|
||||
<task type="auto">
|
||||
<name>启动开发服务器</name>
|
||||
<action>在后台运行 `npm run dev`</action>
|
||||
<verify>curl localhost:3000 返回 200</verify>
|
||||
</task>
|
||||
|
||||
<task type="checkpoint:human-verify" gate="blocking">
|
||||
<what-built>http://localhost:3000/dashboard 的仪表板(服务器运行中)</what-built>
|
||||
<how-to-verify>
|
||||
访问 http://localhost:3000/dashboard 并验证:
|
||||
1. 布局匹配设计
|
||||
2. 无控制台错误
|
||||
</how-to-verify>
|
||||
</task>
|
||||
```
|
||||
|
||||
### ❌ 错误:让用户部署 / ✅ 正确:Claude 自动化
|
||||
```xml
|
||||
<!-- 错误:让用户通过仪表板部署 -->
|
||||
<task type="checkpoint:human-action" gate="blocking">
|
||||
<action>部署到 Vercel</action>
|
||||
<instructions>访问 vercel.com/new → 导入仓库 → 点击部署 → 复制 URL</instructions>
|
||||
</task>
|
||||
|
||||
<!-- 正确:Claude 部署,用户验证 -->
|
||||
<task type="auto">
|
||||
<name>部署到 Vercel</name>
|
||||
<action>运行 `vercel --yes`。捕获 URL。</action>
|
||||
<verify>vercel ls 显示部署,curl 返回 200</verify>
|
||||
</task>
|
||||
|
||||
<task type="checkpoint:human-verify">
|
||||
<what-built>已部署到 {url}</what-built>
|
||||
<how-to-verify>访问 {url},检查首页加载</how-to-verify>
|
||||
<resume-signal>输入 "approved"</resume-signal>
|
||||
</task>
|
||||
```
|
||||
|
||||
## 摘要
|
||||
|
||||
检查点规范化人工介入点用于验证和决策,而非手动工作。
|
||||
|
||||
**黄金法则:** 如果 Claude 能自动化它,Claude 就必须自动化它。
|
||||
|
||||
**检查点优先级:**
|
||||
1. **checkpoint:human-verify**(90%)- Claude 自动化一切,人工确认视觉/功能正确性
|
||||
2. **checkpoint:decision**(9%)- 人工做出架构/技术选择
|
||||
3. **checkpoint:human-action**(1%)- 真正无法避免的、没有 API/CLI 的手动步骤
|
||||
|
||||
**何时不用检查点:**
|
||||
- Claude 可以编程验证的事情(测试、构建)
|
||||
- 文件操作(Claude 可以读取文件)
|
||||
- 代码正确性(测试和静态分析)
|
||||
- 任何可通过 CLI/API 自动化的内容
|
||||
249
docs/zh-CN/references/continuation-format.md
Normal file
249
docs/zh-CN/references/continuation-format.md
Normal file
@@ -0,0 +1,249 @@
|
||||
# 续接格式
|
||||
|
||||
完成命令或工作流后展示下一步的标准格式。
|
||||
|
||||
## 核心结构
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**{标识符}: {名称}** — {单行描述}
|
||||
|
||||
`{可复制粘贴的命令}`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
|
||||
**也可选:**
|
||||
- `{备选项 1}` — 描述
|
||||
- `{备选项 2}` — 描述
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
## 格式规则
|
||||
|
||||
1. **始终展示它是什么** — 名称 + 描述,绝不仅仅是一个命令路径
|
||||
2. **从源文件拉取上下文** — ROADMAP.md 用于阶段,PLAN.md `<objective>` 用于计划
|
||||
3. **命令用内联代码** — 反引号,易于复制粘贴,渲染为可点击链接
|
||||
4. **`/clear` 说明** — 始终包含,保持简洁但解释原因
|
||||
5. **用"也可选"而非"其他选项"** — 听起来更像应用
|
||||
6. **视觉分隔符** — 上下用 `---` 使其突出
|
||||
|
||||
## 变体
|
||||
|
||||
### 执行下一个计划
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**02-03: 刷新令牌轮换** — 添加带滑动过期的 /api/auth/refresh
|
||||
|
||||
`/gsd:execute-phase 2`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
|
||||
**也可选:**
|
||||
- 执行前审查计划
|
||||
- `/gsd:list-phase-assumptions 2` — 检查假设
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
### 执行阶段中最后一个计划
|
||||
|
||||
添加注释说明这是最后一个计划以及接下来是什么:
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**02-03: 刷新令牌轮换** — 添加带滑动过期的 /api/auth/refresh
|
||||
<sub>阶段 2 的最后一个计划</sub>
|
||||
|
||||
`/gsd:execute-phase 2`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
|
||||
**完成后:**
|
||||
- 阶段 2 → 阶段 3 过渡
|
||||
- 下一步:**阶段 3: 核心功能** — 用户仪表板和设置
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
### 规划阶段
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**阶段 2: 认证** — 带刷新令牌的 JWT 登录流程
|
||||
|
||||
`/gsd:plan-phase 2`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
|
||||
**也可选:**
|
||||
- `/gsd:discuss-phase 2` — 先收集上下文
|
||||
- `/gsd:research-phase 2` — 调查未知项
|
||||
- 审查路线图
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
### 阶段完成,准备下一步
|
||||
|
||||
在下一步操作前显示完成状态:
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## ✓ 阶段 2 完成
|
||||
|
||||
3/3 计划已执行
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**阶段 3: 核心功能** — 用户仪表板、设置和数据导出
|
||||
|
||||
`/gsd:plan-phase 3`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
|
||||
**也可选:**
|
||||
- `/gsd:discuss-phase 3` — 先收集上下文
|
||||
- `/gsd:research-phase 3` — 调查未知项
|
||||
- 回顾阶段 2 构建的内容
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
### 多个同等选项
|
||||
|
||||
当没有明确的主要操作时:
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**阶段 3: 核心功能** — 用户仪表板、设置和数据导出
|
||||
|
||||
**直接规划:** `/gsd:plan-phase 3`
|
||||
|
||||
**先讨论上下文:** `/gsd:discuss-phase 3`
|
||||
|
||||
**研究未知项:** `/gsd:research-phase 3`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
### 里程碑完成
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## 🎉 里程碑 v1.0 完成
|
||||
|
||||
全部 4 个阶段已发布
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**开始 v1.1** — 提问 → 研究 → 需求 → 路线图
|
||||
|
||||
`/gsd:new-milestone`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
## 拉取上下文
|
||||
|
||||
### 用于阶段(从 ROADMAP.md):
|
||||
|
||||
```markdown
|
||||
### 阶段 2: 认证
|
||||
**目标**: 带刷新令牌的 JWT 登录流程
|
||||
```
|
||||
|
||||
提取:`**阶段 2: 认证** — 带刷新令牌的 JWT 登录流程`
|
||||
|
||||
### 用于计划(从 ROADMAP.md):
|
||||
|
||||
```markdown
|
||||
计划:
|
||||
- [ ] 02-03: 添加刷新令牌轮换
|
||||
```
|
||||
|
||||
或从 PLAN.md `<objective>`:
|
||||
|
||||
```xml
|
||||
<objective>
|
||||
添加带滑动过期窗口的刷新令牌轮换。
|
||||
|
||||
目的: 在不影响安全性的前提下延长会话生命周期。
|
||||
</objective>
|
||||
```
|
||||
|
||||
提取:`**02-03: 刷新令牌轮换** — 添加带滑动过期的 /api/auth/refresh`
|
||||
|
||||
## 反模式
|
||||
|
||||
### 不要:仅命令(无上下文)
|
||||
|
||||
```
|
||||
## 继续
|
||||
|
||||
运行 `/clear`,然后粘贴:
|
||||
/gsd:execute-phase 2
|
||||
```
|
||||
|
||||
用户不知道 02-03 是关于什么的。
|
||||
|
||||
### 不要:缺少 /clear 说明
|
||||
|
||||
```
|
||||
`/gsd:plan-phase 3`
|
||||
|
||||
先运行 /clear。
|
||||
```
|
||||
|
||||
没有解释原因。用户可能跳过。
|
||||
|
||||
### 不要:"其他选项" 措辞
|
||||
|
||||
```
|
||||
其他选项:
|
||||
- 审查路线图
|
||||
```
|
||||
|
||||
听起来像是事后补充。用"也可选:"替代。
|
||||
|
||||
### 不要:用围栏代码块展示命令
|
||||
|
||||
```
|
||||
```
|
||||
/gsd:plan-phase 3
|
||||
```
|
||||
```
|
||||
|
||||
模板内的围栏代码块会造成嵌套歧义。用内联反引号替代。
|
||||
65
docs/zh-CN/references/decimal-phase-calculation.md
Normal file
65
docs/zh-CN/references/decimal-phase-calculation.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# 小数阶段计算
|
||||
|
||||
为紧急插入计算下一个小数阶段编号。
|
||||
|
||||
## 使用 gsd-tools
|
||||
|
||||
```bash
|
||||
# 获取阶段 6 之后的下一个小数阶段
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-decimal 6
|
||||
```
|
||||
|
||||
输出:
|
||||
```json
|
||||
{
|
||||
"found": true,
|
||||
"base_phase": "06",
|
||||
"next": "06.1",
|
||||
"existing": []
|
||||
}
|
||||
```
|
||||
|
||||
已有小数时:
|
||||
```json
|
||||
{
|
||||
"found": true,
|
||||
"base_phase": "06",
|
||||
"next": "06.3",
|
||||
"existing": ["06.1", "06.2"]
|
||||
}
|
||||
```
|
||||
|
||||
## 提取值
|
||||
|
||||
```bash
|
||||
DECIMAL_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-decimal "${AFTER_PHASE}")
|
||||
DECIMAL_PHASE=$(printf '%s\n' "$DECIMAL_INFO" | jq -r '.next')
|
||||
BASE_PHASE=$(printf '%s\n' "$DECIMAL_INFO" | jq -r '.base_phase')
|
||||
```
|
||||
|
||||
或使用 --raw 标志:
|
||||
```bash
|
||||
DECIMAL_PHASE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-decimal "${AFTER_PHASE}" --raw)
|
||||
# 返回: 06.1
|
||||
```
|
||||
|
||||
## 示例
|
||||
|
||||
| 已有阶段 | 下一个阶段 |
|
||||
|----------|------------|
|
||||
| 仅 06 | 06.1 |
|
||||
| 06, 06.1 | 06.2 |
|
||||
| 06, 06.1, 06.2 | 06.3 |
|
||||
| 06, 06.1, 06.3(有空缺)| 06.4 |
|
||||
|
||||
## 目录命名
|
||||
|
||||
小数阶段目录使用完整的小数编号:
|
||||
|
||||
```bash
|
||||
SLUG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" generate-slug "$DESCRIPTION" --raw)
|
||||
PHASE_DIR=".planning/phases/${DECIMAL_PHASE}-${SLUG}"
|
||||
mkdir -p "$PHASE_DIR"
|
||||
```
|
||||
|
||||
示例:`.planning/phases/06.1-fix-critical-auth-bug/`
|
||||
248
docs/zh-CN/references/git-integration.md
Normal file
248
docs/zh-CN/references/git-integration.md
Normal file
@@ -0,0 +1,248 @@
|
||||
<overview>
|
||||
GSD 框架的 Git 集成。
|
||||
</overview>
|
||||
|
||||
<core_principle>
|
||||
|
||||
**提交结果,而非过程。**
|
||||
|
||||
git 日志应该读起来像是发布内容的变更日志,而不是规划活动的日记。
|
||||
</core_principle>
|
||||
|
||||
<commit_points>
|
||||
|
||||
| 事件 | 提交? | 原因 |
|
||||
| ----------------------- | ------- | ------------------------------------------------ |
|
||||
| BRIEF + ROADMAP 创建 | 是 | 项目初始化 |
|
||||
| PLAN.md 创建 | 否 | 中间产物 - 与计划完成一起提交 |
|
||||
| RESEARCH.md 创建 | 否 | 中间产物 |
|
||||
| DISCOVERY.md 创建 | 否 | 中间产物 |
|
||||
| **任务完成** | 是 | 原子工作单元(每个任务 1 个提交) |
|
||||
| **计划完成** | 是 | 元数据提交(SUMMARY + STATE + ROADMAP) |
|
||||
| 交接创建 | 是 | WIP 状态保留 |
|
||||
|
||||
</commit_points>
|
||||
|
||||
<git_check>
|
||||
|
||||
```bash
|
||||
[ -d .git ] && echo "GIT_EXISTS" || echo "NO_GIT"
|
||||
```
|
||||
|
||||
如果 NO_GIT:静默运行 `git init`。GSD 项目总是有自己的仓库。
|
||||
</git_check>
|
||||
|
||||
<commit_formats>
|
||||
|
||||
<format name="initialization">
|
||||
## 项目初始化(brief + roadmap 一起)
|
||||
|
||||
```
|
||||
docs: initialize [project-name] ([N] phases)
|
||||
|
||||
[PROJECT.md 中的一句话描述]
|
||||
|
||||
Phases:
|
||||
1. [phase-name]: [goal]
|
||||
2. [phase-name]: [goal]
|
||||
3. [phase-name]: [goal]
|
||||
```
|
||||
|
||||
提交内容:
|
||||
|
||||
```bash
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: initialize [project-name] ([N] phases)" --files .planning/
|
||||
```
|
||||
|
||||
</format>
|
||||
|
||||
<format name="task-completion">
|
||||
## 任务完成(计划执行期间)
|
||||
|
||||
每个任务在完成后立即获得自己的提交。
|
||||
|
||||
```
|
||||
{type}({phase}-{plan}): {task-name}
|
||||
|
||||
- [关键变更 1]
|
||||
- [关键变更 2]
|
||||
- [关键变更 3]
|
||||
```
|
||||
|
||||
**提交类型:**
|
||||
- `feat` - 新功能/功能
|
||||
- `fix` - Bug 修复
|
||||
- `test` - 仅测试(TDD RED 阶段)
|
||||
- `refactor` - 代码清理(TDD REFACTOR 阶段)
|
||||
- `perf` - 性能改进
|
||||
- `chore` - 依赖、配置、工具
|
||||
|
||||
**示例:**
|
||||
|
||||
```bash
|
||||
# 标准任务
|
||||
git add src/api/auth.ts src/types/user.ts
|
||||
git commit -m "feat(08-02): create user registration endpoint
|
||||
|
||||
- POST /auth/register validates email and password
|
||||
- Checks for duplicate users
|
||||
- Returns JWT token on success
|
||||
"
|
||||
|
||||
# TDD 任务 - RED 阶段
|
||||
git add src/__tests__/jwt.test.ts
|
||||
git commit -m "test(07-02): add failing test for JWT generation
|
||||
|
||||
- Tests token contains user ID claim
|
||||
- Tests token expires in 1 hour
|
||||
- Tests signature verification
|
||||
"
|
||||
|
||||
# TDD 任务 - GREEN 阶段
|
||||
git add src/utils/jwt.ts
|
||||
git commit -m "feat(07-02): implement JWT generation
|
||||
|
||||
- Uses jose library for signing
|
||||
- Includes user ID and expiry claims
|
||||
- Signs with HS256 algorithm
|
||||
"
|
||||
```
|
||||
|
||||
</format>
|
||||
|
||||
<format name="plan-completion">
|
||||
## 计划完成(所有任务完成后)
|
||||
|
||||
所有任务提交后,最后一个元数据提交捕获计划完成。
|
||||
|
||||
```
|
||||
docs({phase}-{plan}): complete [plan-name] plan
|
||||
|
||||
Tasks completed: [N]/[N]
|
||||
- [Task 1 name]
|
||||
- [Task 2 name]
|
||||
- [Task 3 name]
|
||||
|
||||
SUMMARY: .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md
|
||||
```
|
||||
|
||||
提交内容:
|
||||
|
||||
```bash
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-PLAN.md .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md
|
||||
```
|
||||
|
||||
**注意:** 代码文件不包含 - 已按任务提交。
|
||||
|
||||
</format>
|
||||
|
||||
<format name="handoff">
|
||||
## 交接(WIP)
|
||||
|
||||
```
|
||||
wip: [phase-name] paused at task [X]/[Y]
|
||||
|
||||
Current: [task name]
|
||||
[如果阻塞:] Blocked: [reason]
|
||||
```
|
||||
|
||||
提交内容:
|
||||
|
||||
```bash
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/
|
||||
```
|
||||
|
||||
</format>
|
||||
</commit_formats>
|
||||
|
||||
<example_log>
|
||||
|
||||
**旧方法(每个计划提交):**
|
||||
```
|
||||
a7f2d1 feat(checkout): Stripe payments with webhook verification
|
||||
3e9c4b feat(products): catalog with search, filters, and pagination
|
||||
8a1b2c feat(auth): JWT with refresh rotation using jose
|
||||
5c3d7e feat(foundation): Next.js 15 + Prisma + Tailwind scaffold
|
||||
2f4a8d docs: initialize ecommerce-app (5 phases)
|
||||
```
|
||||
|
||||
**新方法(每个任务提交):**
|
||||
```
|
||||
# Phase 04 - Checkout
|
||||
1a2b3c docs(04-01): complete checkout flow plan
|
||||
4d5e6f feat(04-01): add webhook signature verification
|
||||
7g8h9i feat(04-01): implement payment session creation
|
||||
0j1k2l feat(04-01): create checkout page component
|
||||
|
||||
# Phase 03 - Products
|
||||
3m4n5o docs(03-02): complete product listing plan
|
||||
6p7q8r feat(03-02): add pagination controls
|
||||
9s0t1u feat(03-02): implement search and filters
|
||||
2v3w4x feat(03-01): create product catalog schema
|
||||
|
||||
# Phase 02 - Auth
|
||||
5y6z7a docs(02-02): complete token refresh plan
|
||||
8b9c0d feat(02-02): implement refresh token rotation
|
||||
1e2f3g test(02-02): add failing test for token refresh
|
||||
4h5i6j docs(02-01): complete JWT setup plan
|
||||
7k8l9m feat(02-01): add JWT generation and validation
|
||||
0n1o2p chore(02-01): install jose library
|
||||
|
||||
# Phase 01 - Foundation
|
||||
3q4r5s docs(01-01): complete scaffold plan
|
||||
6t7u8v feat(01-01): configure Tailwind and globals
|
||||
9w0x1y feat(01-01): set up Prisma with database
|
||||
2z3a4b feat(01-01): create Next.js 15 project
|
||||
|
||||
# Initialization
|
||||
5c6d7e docs: initialize ecommerce-app (5 phases)
|
||||
```
|
||||
|
||||
每个计划产生 2-4 个提交(任务 + 元数据)。清晰、细粒度、可 bisect。
|
||||
|
||||
</example_log>
|
||||
|
||||
<anti_patterns>
|
||||
|
||||
**仍不要提交(中间产物):**
|
||||
- PLAN.md 创建(与计划完成一起提交)
|
||||
- RESEARCH.md(中间产物)
|
||||
- DISCOVERY.md(中间产物)
|
||||
- 小的规划调整
|
||||
- "Fixed typo in roadmap"
|
||||
|
||||
**要提交(结果):**
|
||||
- 每个任务完成(feat/fix/test/refactor)
|
||||
- 计划完成元数据(docs)
|
||||
- 项目初始化(docs)
|
||||
|
||||
**关键原则:** 提交可工作的代码和已发布的结果,而非规划过程。
|
||||
|
||||
</anti_patterns>
|
||||
|
||||
<commit_strategy_rationale>
|
||||
|
||||
## 为什么使用每任务提交?
|
||||
|
||||
**AI 上下文工程:**
|
||||
- Git 历史成为未来 Claude 会话的主要上下文源
|
||||
- `git log --grep="{phase}-{plan}"` 显示计划的所有工作
|
||||
- `git diff <hash>^..<hash>` 显示每个任务的确切变更
|
||||
- 减少对解析 SUMMARY.md 的依赖 = 更多上下文用于实际工作
|
||||
|
||||
**失败恢复:**
|
||||
- 任务 1 已提交 ✅,任务 2 失败 ❌
|
||||
- 下次会话中的 Claude:看到任务 1 完成,可以重试任务 2
|
||||
- 可以 `git reset --hard` 到最后一个成功的任务
|
||||
|
||||
**调试:**
|
||||
- `git bisect` 找到确切的失败任务,而不仅仅是失败计划
|
||||
- `git blame` 将行追溯到特定任务上下文
|
||||
- 每个提交独立可回滚
|
||||
|
||||
**可观察性:**
|
||||
- 独立开发者 + Claude 工作流受益于细粒度归因
|
||||
- 原子提交是 git 最佳实践
|
||||
- 当消费者是 Claude 而非人类时,"提交噪音"无关紧要
|
||||
|
||||
</commit_strategy_rationale>
|
||||
38
docs/zh-CN/references/git-planning-commit.md
Normal file
38
docs/zh-CN/references/git-planning-commit.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# Git 规划提交
|
||||
|
||||
使用 gsd-tools CLI 提交规划工件,它会自动检查 `commit_docs` 配置和 gitignore 状态。
|
||||
|
||||
## 通过 CLI 提交
|
||||
|
||||
始终使用 `gsd-tools.cjs commit` 处理 `.planning/` 文件 — 它会自动处理 `commit_docs` 和 gitignore 检查:
|
||||
|
||||
```bash
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({scope}): {description}" --files .planning/STATE.md .planning/ROADMAP.md
|
||||
```
|
||||
|
||||
如果 `commit_docs` 为 `false` 或 `.planning/` 被 gitignore,CLI 会返回 `skipped`(带原因)。无需手动条件检查。
|
||||
|
||||
## 修改上次提交
|
||||
|
||||
将 `.planning/` 文件变更合并到上次提交:
|
||||
|
||||
```bash
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "" --files .planning/codebase/*.md --amend
|
||||
```
|
||||
|
||||
## 提交消息模式
|
||||
|
||||
| 命令 | 范围 | 示例 |
|
||||
|------|------|------|
|
||||
| plan-phase | phase | `docs(phase-03): create authentication plans` |
|
||||
| execute-phase | phase | `docs(phase-03): complete authentication phase` |
|
||||
| new-milestone | milestone | `docs: start milestone v1.1` |
|
||||
| remove-phase | chore | `chore: remove phase 17 (dashboard)` |
|
||||
| insert-phase | phase | `docs: insert phase 16.1 (critical fix)` |
|
||||
| add-phase | phase | `docs: add phase 07 (settings page)` |
|
||||
|
||||
## 何时跳过
|
||||
|
||||
- config 中 `commit_docs: false`
|
||||
- `.planning/` 被 gitignore
|
||||
- 无变更可提交(用 `git status --porcelain .planning/` 检查)
|
||||
34
docs/zh-CN/references/model-profile-resolution.md
Normal file
34
docs/zh-CN/references/model-profile-resolution.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# 模型配置解析
|
||||
|
||||
在编排开始时解析一次模型配置,然后在所有 Task 生成时使用。
|
||||
|
||||
## 解析模式
|
||||
|
||||
```bash
|
||||
MODEL_PROFILE=$(cat .planning/config.json 2>/dev/null | grep -o '"model_profile"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "balanced")
|
||||
```
|
||||
|
||||
默认值:未设置或缺少 config 时为 `balanced`。
|
||||
|
||||
## 查找表
|
||||
|
||||
@~/.claude/get-shit-done/references/model-profiles.md
|
||||
|
||||
在表中查找已解析配置对应的代理。将 model 参数传递给 Task 调用:
|
||||
|
||||
```
|
||||
Task(
|
||||
prompt="...",
|
||||
subagent_type="gsd-planner",
|
||||
model="{resolved_model}" # "inherit"、"sonnet" 或 "haiku"
|
||||
)
|
||||
```
|
||||
|
||||
**注意:** Opus 级代理解析为 `"inherit"`(而非 `"opus"`)。这会使代理使用父会话的模型,避免与可能阻止特定 opus 版本的组织策略冲突。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 在编排开始时解析一次
|
||||
2. 存储 profile 值
|
||||
3. 生成时在表中查找每个代理的模型
|
||||
4. 将 model 参数传递给每个 Task 调用(值:`"inherit"`、`"sonnet"`、`"haiku"`)
|
||||
93
docs/zh-CN/references/model-profiles.md
Normal file
93
docs/zh-CN/references/model-profiles.md
Normal file
@@ -0,0 +1,93 @@
|
||||
# 模型配置
|
||||
|
||||
模型配置控制每个 GSD 代理使用哪个 Claude 模型。这允许平衡质量和 token 消耗。
|
||||
|
||||
## 配置定义
|
||||
|
||||
| 代理 | `quality` | `balanced` | `budget` |
|
||||
|-------|-----------|------------|----------|
|
||||
| gsd-planner | opus | opus | sonnet |
|
||||
| gsd-roadmapper | opus | sonnet | sonnet |
|
||||
| gsd-executor | opus | sonnet | sonnet |
|
||||
| gsd-phase-researcher | opus | sonnet | haiku |
|
||||
| gsd-project-researcher | opus | sonnet | haiku |
|
||||
| gsd-research-synthesizer | sonnet | sonnet | haiku |
|
||||
| gsd-debugger | opus | sonnet | sonnet |
|
||||
| gsd-codebase-mapper | sonnet | haiku | haiku |
|
||||
| gsd-verifier | sonnet | sonnet | haiku |
|
||||
| gsd-plan-checker | sonnet | sonnet | haiku |
|
||||
| gsd-integration-checker | sonnet | sonnet | haiku |
|
||||
| gsd-nyquist-auditor | sonnet | sonnet | haiku |
|
||||
|
||||
## 配置理念
|
||||
|
||||
**quality** - 最大推理能力
|
||||
- 所有决策代理使用 Opus
|
||||
- 只读验证使用 Sonnet
|
||||
- 适用场景:有配额可用、关键架构工作
|
||||
|
||||
**balanced**(默认)- 智能分配
|
||||
- 仅规划(架构决策发生的地方)使用 Opus
|
||||
- 执行和研究使用 Sonnet(遵循明确指令)
|
||||
- 验证使用 Sonnet(需要推理,不仅仅是模式匹配)
|
||||
- 适用场景:正常开发、质量与成本的良好平衡
|
||||
|
||||
**budget** - 最小化 Opus 使用
|
||||
- 编写代码的使用 Sonnet
|
||||
- 研究和验证使用 Haiku
|
||||
- 适用场景:节省配额、大量工作、不太关键的阶段
|
||||
|
||||
## 解析逻辑
|
||||
|
||||
编排器在生成代理前解析模型:
|
||||
|
||||
```
|
||||
1. 读取 .planning/config.json
|
||||
2. 检查 model_overrides 是否有代理特定覆盖
|
||||
3. 如果没有覆盖,在配置表中查找代理
|
||||
4. 将 model 参数传递给 Task 调用
|
||||
```
|
||||
|
||||
## 单代理覆盖
|
||||
|
||||
覆盖特定代理而不更改整个配置:
|
||||
|
||||
```json
|
||||
{
|
||||
"model_profile": "balanced",
|
||||
"model_overrides": {
|
||||
"gsd-executor": "opus",
|
||||
"gsd-planner": "haiku"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
覆盖优先于配置。有效值:`opus`、`sonnet`、`haiku`。
|
||||
|
||||
## 切换配置
|
||||
|
||||
运行时:`/gsd:set-profile <profile>`
|
||||
|
||||
项目默认值:在 `.planning/config.json` 中设置:
|
||||
```json
|
||||
{
|
||||
"model_profile": "balanced"
|
||||
}
|
||||
```
|
||||
|
||||
## 设计理由
|
||||
|
||||
**为什么 gsd-planner 使用 Opus?**
|
||||
规划涉及架构决策、目标分解和任务设计。这是模型质量影响最大的地方。
|
||||
|
||||
**为什么 gsd-executor 使用 Sonnet?**
|
||||
执行者遵循明确的 PLAN.md 指令。计划已包含推理;执行只是实现。
|
||||
|
||||
**为什么 balanced 中验证器使用 Sonnet(而非 Haiku)?**
|
||||
验证需要目标回溯推理 —— 检查代码是否**交付**了阶段承诺的内容,而不仅仅是模式匹配。Sonnet 处理得很好;Haiku 可能会遗漏细微的差距。
|
||||
|
||||
**为什么 gsd-codebase-mapper 使用 Haiku?**
|
||||
只读探索和模式提取。不需要推理,只需从文件内容输出结构化结果。
|
||||
|
||||
**为什么用 `inherit` 而不是直接传递 `opus`?**
|
||||
Claude Code 的 `"opus"` 别名映射到特定模型版本。组织可能阻止旧版 opus 而允许新版。GSD 为 opus 级代理返回 `"inherit"`,使其使用用户在会话中配置的任何 opus 版本。这避免了版本冲突和静默回退到 Sonnet。
|
||||
61
docs/zh-CN/references/phase-argument-parsing.md
Normal file
61
docs/zh-CN/references/phase-argument-parsing.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# 阶段参数解析
|
||||
|
||||
为操作阶段的命令解析和规范化阶段参数。
|
||||
|
||||
## 提取
|
||||
|
||||
从 `$ARGUMENTS` 中:
|
||||
- 提取阶段编号(第一个数字参数)
|
||||
- 提取标志(以 `--` 为前缀)
|
||||
- 剩余文本为描述(用于 insert/add 命令)
|
||||
|
||||
## 使用 gsd-tools
|
||||
|
||||
`find-phase` 命令一步完成规范化和验证:
|
||||
|
||||
```bash
|
||||
PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PHASE}")
|
||||
```
|
||||
|
||||
返回 JSON 包含:
|
||||
- `found`: true/false
|
||||
- `directory`: 阶段目录的完整路径
|
||||
- `phase_number`: 规范化的编号(如 "06"、"06.1")
|
||||
- `phase_name`: 名称部分(如 "foundation")
|
||||
- `plans`: PLAN.md 文件数组
|
||||
- `summaries`: SUMMARY.md 文件数组
|
||||
|
||||
## 手动规范化(遗留)
|
||||
|
||||
将整数阶段补零到 2 位。保留小数后缀。
|
||||
|
||||
```bash
|
||||
# 规范化阶段编号
|
||||
if [[ "$PHASE" =~ ^[0-9]+$ ]]; then
|
||||
# 整数: 8 → 08
|
||||
PHASE=$(printf "%02d" "$PHASE")
|
||||
elif [[ "$PHASE" =~ ^([0-9]+)\.([0-9]+)$ ]]; then
|
||||
# 小数: 2.1 → 02.1
|
||||
PHASE=$(printf "%02d.%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}")
|
||||
fi
|
||||
```
|
||||
|
||||
## 验证
|
||||
|
||||
使用 `roadmap get-phase` 验证阶段存在:
|
||||
|
||||
```bash
|
||||
PHASE_CHECK=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${PHASE}")
|
||||
if [ "$(printf '%s\n' "$PHASE_CHECK" | jq -r '.found')" = "false" ]; then
|
||||
echo "ERROR: Phase ${PHASE} not found in roadmap"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
## 目录查找
|
||||
|
||||
使用 `find-phase` 进行目录查找:
|
||||
|
||||
```bash
|
||||
PHASE_DIR=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PHASE}" --raw)
|
||||
```
|
||||
200
docs/zh-CN/references/planning-config.md
Normal file
200
docs/zh-CN/references/planning-config.md
Normal file
@@ -0,0 +1,200 @@
|
||||
<planning_config>
|
||||
|
||||
`.planning/` 目录行为的配置选项。
|
||||
|
||||
<config_schema>
|
||||
```json
|
||||
"planning": {
|
||||
"commit_docs": true,
|
||||
"search_gitignored": false
|
||||
},
|
||||
"git": {
|
||||
"branching_strategy": "none",
|
||||
"phase_branch_template": "gsd/phase-{phase}-{slug}",
|
||||
"milestone_branch_template": "gsd/{milestone}-{slug}"
|
||||
}
|
||||
```
|
||||
|
||||
| 选项 | 默认值 | 描述 |
|
||||
|--------|---------|-------------|
|
||||
| `commit_docs` | `true` | 是否将规划工件提交到 git |
|
||||
| `search_gitignored` | `false` | 在广泛 rg 搜索中添加 `--no-ignore` |
|
||||
| `git.branching_strategy` | `"none"` | Git 分支策略:`"none"`、`"phase"` 或 `"milestone"` |
|
||||
| `git.phase_branch_template` | `"gsd/phase-{phase}-{slug}"` | 阶段策略的分支模板 |
|
||||
| `git.milestone_branch_template` | `"gsd/{milestone}-{slug}"` | 里程碑策略的分支模板 |
|
||||
</config_schema>
|
||||
|
||||
<commit_docs_behavior>
|
||||
|
||||
**当 `commit_docs: true`(默认):**
|
||||
- 规划文件正常提交
|
||||
- SUMMARY.md、STATE.md、ROADMAP.md 在 git 中跟踪
|
||||
- 规划决策的完整历史保留
|
||||
|
||||
**当 `commit_docs: false`:**
|
||||
- 跳过 `.planning/` 文件的所有 `git add`/`git commit`
|
||||
- 用户必须将 `.planning/` 添加到 `.gitignore`
|
||||
- 适用于:OSS 贡献、客户项目、保持规划私有
|
||||
|
||||
**使用 gsd-tools.cjs(推荐):**
|
||||
|
||||
```bash
|
||||
# 提交时自动检查 commit_docs + gitignore:
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: update state" --files .planning/STATE.md
|
||||
|
||||
# 通过 state load 加载配置(返回 JSON):
|
||||
INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
|
||||
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
||||
# commit_docs 在 JSON 输出中可用
|
||||
|
||||
# 或使用包含 commit_docs 的 init 命令:
|
||||
INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1")
|
||||
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
||||
# commit_docs 包含在所有 init 命令输出中
|
||||
```
|
||||
|
||||
**自动检测:** 如果 `.planning/` 被 gitignore,无论 config.json 如何,`commit_docs` 自动为 `false`。这防止用户在 `.gitignore` 中有 `.planning/` 时出现 git 错误。
|
||||
|
||||
**通过 CLI 提交(自动处理检查):**
|
||||
|
||||
```bash
|
||||
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: update state" --files .planning/STATE.md
|
||||
```
|
||||
|
||||
CLI 在内部检查 `commit_docs` 配置和 gitignore 状态 —— 无需手动条件判断。
|
||||
|
||||
</commit_docs_behavior>
|
||||
|
||||
<search_behavior>
|
||||
|
||||
**当 `search_gitignored: false`(默认):**
|
||||
- 标准 rg 行为(尊重 .gitignore)
|
||||
- 直接路径搜索有效:`rg "pattern" .planning/` 找到文件
|
||||
- 广泛搜索跳过 gitignored:`rg "pattern"` 跳过 `.planning/`
|
||||
|
||||
**当 `search_gitignored: true`:**
|
||||
- 在应该包含 `.planning/` 的广泛 rg 搜索中添加 `--no-ignore`
|
||||
- 仅在搜索整个仓库并期望 `.planning/` 匹配时需要
|
||||
|
||||
**注意:** 大多数 GSD 操作使用直接文件读取或显式路径,无论 gitignore 状态如何都有效。
|
||||
|
||||
</search_behavior>
|
||||
|
||||
<setup_uncommitted_mode>
|
||||
|
||||
使用未提交模式:
|
||||
|
||||
1. **设置配置:**
|
||||
```json
|
||||
"planning": {
|
||||
"commit_docs": false,
|
||||
"search_gitignored": true
|
||||
}
|
||||
```
|
||||
|
||||
2. **添加到 .gitignore:**
|
||||
```
|
||||
.planning/
|
||||
```
|
||||
|
||||
3. **已存在的跟踪文件:** 如果 `.planning/` 之前被跟踪:
|
||||
```bash
|
||||
git rm -r --cached .planning/
|
||||
git commit -m "chore: stop tracking planning docs"
|
||||
```
|
||||
|
||||
4. **分支合并:** 当使用 `branching_strategy: phase` 或 `milestone` 时,`complete-milestone` 工作流在 `commit_docs: false` 时自动从暂存区移除 `.planning/` 文件,然后才进行合并提交。
|
||||
|
||||
</setup_uncommitted_mode>
|
||||
|
||||
<branching_strategy_behavior>
|
||||
|
||||
**分支策略:**
|
||||
|
||||
| 策略 | 创建分支时机 | 分支范围 | 合并点 |
|
||||
|----------|---------------------|--------------|-------------|
|
||||
| `none` | 从不 | N/A | N/A |
|
||||
| `phase` | `execute-phase` 开始时 | 单个阶段 | 阶段后用户手动合并 |
|
||||
| `milestone` | 里程碑第一个 `execute-phase` | 整个里程碑 | `complete-milestone` 时 |
|
||||
|
||||
**当 `git.branching_strategy: "none"`(默认):**
|
||||
- 所有工作提交到当前分支
|
||||
- 标准 GSD 行为
|
||||
|
||||
**当 `git.branching_strategy: "phase"`:**
|
||||
- `execute-phase` 在执行前创建/切换到分支
|
||||
- 分支名来自 `phase_branch_template`(如 `gsd/phase-03-authentication`)
|
||||
- 所有计划提交到该分支
|
||||
- 阶段完成后用户手动合并分支
|
||||
- `complete-milestone` 提供合并所有阶段分支的选项
|
||||
|
||||
**当 `git.branching_strategy: "milestone"`:**
|
||||
- 里程碑的第一个 `execute-phase` 创建里程碑分支
|
||||
- 分支名来自 `milestone_branch_template`(如 `gsd/v1.0-mvp`)
|
||||
- 里程碑中所有阶段提交到同一分支
|
||||
- `complete-milestone` 提供将里程碑分支合并到 main 的选项
|
||||
|
||||
**模板变量:**
|
||||
|
||||
| 变量 | 可用于 | 描述 |
|
||||
|----------|--------------|-------------|
|
||||
| `{phase}` | phase_branch_template | 零填充阶段号(如 "03") |
|
||||
| `{slug}` | 两者 | 小写、连字符名称 |
|
||||
| `{milestone}` | milestone_branch_template | 里程碑版本(如 "v1.0") |
|
||||
|
||||
**检查配置:**
|
||||
|
||||
使用 `init execute-phase` 返回所有配置为 JSON:
|
||||
```bash
|
||||
INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1")
|
||||
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
||||
# JSON 输出包含:branching_strategy, phase_branch_template, milestone_branch_template
|
||||
```
|
||||
|
||||
或使用 `state load` 获取配置值:
|
||||
```bash
|
||||
INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
|
||||
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
||||
# 从 JSON 解析 branching_strategy, phase_branch_template, milestone_branch_template
|
||||
```
|
||||
|
||||
**分支创建:**
|
||||
|
||||
```bash
|
||||
# 阶段策略
|
||||
if [ "$BRANCHING_STRATEGY" = "phase" ]; then
|
||||
PHASE_SLUG=$(echo "$PHASE_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
|
||||
BRANCH_NAME=$(echo "$PHASE_BRANCH_TEMPLATE" | sed "s/{phase}/$PADDED_PHASE/g" | sed "s/{slug}/$PHASE_SLUG/g")
|
||||
git checkout -b "$BRANCH_NAME" 2>/dev/null || git checkout "$BRANCH_NAME"
|
||||
fi
|
||||
|
||||
# 里程碑策略
|
||||
if [ "$BRANCHING_STRATEGY" = "milestone" ]; then
|
||||
MILESTONE_SLUG=$(echo "$MILESTONE_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
|
||||
BRANCH_NAME=$(echo "$MILESTONE_BRANCH_TEMPLATE" | sed "s/{milestone}/$MILESTONE_VERSION/g" | sed "s/{slug}/$MILESTONE_SLUG/g")
|
||||
git checkout -b "$BRANCH_NAME" 2>/dev/null || git checkout "$BRANCH_NAME"
|
||||
fi
|
||||
```
|
||||
|
||||
**complete-milestone 时的合并选项:**
|
||||
|
||||
| 选项 | Git 命令 | 结果 |
|
||||
|--------|-------------|--------|
|
||||
| Squash 合并(推荐) | `git merge --squash` | 每个分支单个干净提交 |
|
||||
| 带历史合并 | `git merge --no-ff` | 保留所有单独提交 |
|
||||
| 不合并直接删除 | `git branch -D` | 丢弃分支工作 |
|
||||
| 保留分支 | (无) | 后续手动处理 |
|
||||
|
||||
推荐 Squash 合并 —— 保持 main 分支历史干净,同时在分支中保留完整开发历史(直到删除)。
|
||||
|
||||
**使用场景:**
|
||||
|
||||
| 策略 | 最适合 |
|
||||
|----------|----------|
|
||||
| `none` | 独立开发、简单项目 |
|
||||
| `phase` | 每阶段代码审查、细粒度回滚、团队协作 |
|
||||
| `milestone` | 发布分支、预发布环境、每个版本一个 PR |
|
||||
|
||||
</branching_strategy_behavior>
|
||||
|
||||
</planning_config>
|
||||
142
docs/zh-CN/references/questioning.md
Normal file
142
docs/zh-CN/references/questioning.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# 提问指南
|
||||
|
||||
项目初始化是梦想提取,而非需求收集。你在帮助用户发现和表达他们想构建的内容。这不是合同谈判 —— 是协作思考。
|
||||
|
||||
## 理念
|
||||
|
||||
**你是思考伙伴,不是面试官。**
|
||||
|
||||
用户通常有一个模糊的想法。你的工作是帮助他们将其锐化。问一些让他们思考"哦,我没想到那个"或"是的,这正是我的意思"的问题。
|
||||
|
||||
不要审问。协作。不要照本宣科。顺藤摸瓜。
|
||||
|
||||
## 目标
|
||||
|
||||
到提问结束时,你需要足够的清晰度来编写下游阶段可执行的 PROJECT.md:
|
||||
|
||||
- **研究** 需要:研究什么领域、用户已知什么、存在哪些未知
|
||||
- **需求** 需要:足够清晰的愿景来界定 v1 功能
|
||||
- **路线图** 需要:足够清晰的愿景来分解为阶段、"完成"是什么样子
|
||||
- **plan-phase** 需要:可分解为任务的具体需求、实现选择的上下文
|
||||
- **execute-phase** 需要:可验证的成功标准、需求背后的"为什么"
|
||||
|
||||
模糊的 PROJECT.md 会让每个下游阶段都在猜测。成本会叠加。
|
||||
|
||||
## 如何提问
|
||||
|
||||
**开放开始。** 让他们倾倒心理模型。不要用结构打断。
|
||||
|
||||
**跟随能量。** 无论他们强调什么,深入那个。什么让他们兴奋?什么问题引发了这一切?
|
||||
|
||||
**挑战模糊。** 绝不接受模糊回答。"好"意味着什么?"用户"指谁?"简单"是怎么简单?
|
||||
|
||||
**让抽象具体。**"带我走一遍使用这个。""那实际看起来是什么样?"
|
||||
|
||||
**澄清歧义。**"你说 Z 时,是指 A 还是 B?""你提到了 X —— 跟我多说说。"
|
||||
|
||||
**知道何时停止。** 当你理解他们想要什么、为什么想要、给谁用、完成是什么样 —— 提议继续。
|
||||
|
||||
## 问题类型
|
||||
|
||||
以此作为灵感,不是清单。选择与话题相关的。
|
||||
|
||||
**动机 —— 为什么存在:**
|
||||
- "什么引发了这一切?"
|
||||
- "你今天在做什么会被这个替代?"
|
||||
- "如果这个存在,你会做什么?"
|
||||
|
||||
**具体性 —— 它实际是什么:**
|
||||
- "带我走一遍使用这个"
|
||||
- "你说 X —— 那实际看起来是什么样?"
|
||||
- "给我一个例子"
|
||||
|
||||
**澄清 —— 他们什么意思:**
|
||||
- "你说 Z 时,是指 A 还是 B?"
|
||||
- "你提到了 X —— 跟我多说说那个"
|
||||
|
||||
**成功 —— 你怎么知道它在工作:**
|
||||
- "你怎么知道这个在工作?"
|
||||
- "完成是什么样子?"
|
||||
|
||||
## 使用 AskUserQuestion
|
||||
|
||||
用 AskUserQuestion 帮助用户思考,通过呈现具体的选项供他们反应。
|
||||
|
||||
**好选项:**
|
||||
- 他们可能意思的解读
|
||||
- 确认或否认的具体例子
|
||||
- 揭示优先级的具体选择
|
||||
|
||||
**坏选项:**
|
||||
- 泛泛的类别("技术"、"业务"、"其他")
|
||||
- 预设答案的引导性选项
|
||||
- 选项太多(2-4 个理想)
|
||||
- 超过 12 个字符的标题(硬限制 —— 验证会拒绝)
|
||||
|
||||
**示例 —— 模糊回答:**
|
||||
用户说"它应该快"
|
||||
|
||||
- header: "快"
|
||||
- question: "快是指?"
|
||||
- options: ["亚秒响应", "处理大数据集", "快速构建", "让我解释"]
|
||||
|
||||
**示例 —— 跟随话题:**
|
||||
用户提到"对当前工具感到沮丧"
|
||||
|
||||
- header: "沮丧"
|
||||
- question: "具体什么让你沮丧?"
|
||||
- options: ["点击太多", "缺少功能", "不可靠", "让我解释"]
|
||||
|
||||
**给用户的提示 —— 修改选项:**
|
||||
想要稍微修改某个选项版本的用户可以选择"Other"并通过编号引用选项:`#1 但仅用于指关节` 或 `#2 禁用分页`。这避免重新输入完整选项文本。
|
||||
|
||||
## 自由格式规则
|
||||
|
||||
**当用户想自由解释时,停止使用 AskUserQuestion。**
|
||||
|
||||
如果用户选择"Other"且他们的回应表明他们想用自己的话描述(如"让我描述一下"、"我来解释"、"别的"、或任何非选择/修改现有选项的开放式回复),你必须:
|
||||
|
||||
1. **用纯文本问你的追问** — 不通过 AskUserQuestion
|
||||
2. **等待他们在正常提示符下输入**
|
||||
3. **仅在处理他们的自由格式回应后恢复 AskUserQuestion**
|
||||
|
||||
同样适用于如果你包含一个表明自由格式的选项(如"让我解释"或"详细描述")且用户选择了它。
|
||||
|
||||
**错误:** 用户说"让我描述一下" → AskUserQuestion("什么功能?", ["功能 A", "功能 B", "详细描述"])
|
||||
**正确:** 用户说"让我描述一下" → "请讲 —— 你在想什么?"
|
||||
|
||||
## 上下文清单
|
||||
|
||||
以此作为**背景清单**,而非对话结构。进行时在脑中检查这些。如果还有缺口,自然地穿插问题。
|
||||
|
||||
- [ ] 他们在构建什么(足够具体可以向陌生人解释)
|
||||
- [ ] 为什么它需要存在(驱动它的问题或渴望)
|
||||
- [ ] 给谁用的(即使只是他们自己)
|
||||
- [ ] "完成"是什么样子(可观察的结果)
|
||||
|
||||
四件事。如果他们主动提供更多,捕获它。
|
||||
|
||||
## 决策门控
|
||||
|
||||
当你能写出清晰的 PROJECT.md 时,提议继续:
|
||||
|
||||
- header: "准备好了?"
|
||||
- question: "我想我理解你想要什么了。准备创建 PROJECT.md 吗?"
|
||||
- options:
|
||||
- "创建 PROJECT.md" — 让我们继续
|
||||
- "继续探索" — 我想分享更多 / 再问我
|
||||
|
||||
如果"继续探索" —— 问他们想添加什么或识别缺口并自然探查。
|
||||
|
||||
循环直到选择"创建 PROJECT.md"。
|
||||
|
||||
## 反模式
|
||||
|
||||
- **走清单** — 不管他们说什么都按领域走
|
||||
- **套话问题** — "你的核心价值是什么?""什么超出范围?"不管上下文
|
||||
- **企业腔** — "你的成功标准是什么?""你的利益相关者是谁?"
|
||||
- **审问** — 不基于回答构建就连续发问
|
||||
- **急于求成** — 最小化问题以开始"实际工作"
|
||||
- **浅层接受** — 不探查就接受模糊回答
|
||||
- **过早约束** — 还不理解想法就问技术栈
|
||||
- **用户技能** — 绝不问用户的技术经验。Claude 来构建。
|
||||
263
docs/zh-CN/references/tdd.md
Normal file
263
docs/zh-CN/references/tdd.md
Normal file
@@ -0,0 +1,263 @@
|
||||
<overview>
|
||||
TDD 关乎设计质量,而非覆盖率指标。红-绿-重构循环迫使你在实现前思考行为,从而产生更清晰的接口和更可测试的代码。
|
||||
|
||||
**原则:** 如果在编写 `fn` 之前能用 `expect(fn(input)).toBe(output)` 描述行为,TDD 会改善结果。
|
||||
|
||||
**关键洞察:** TDD 工作本质上比标准任务更重 —— 它需要 2-3 个执行周期(RED → GREEN → REFACTOR),每个周期都涉及文件读取、测试运行和可能的调试。TDD 功能获得专门的计划,以确保整个周期内有完整的上下文可用。
|
||||
</overview>
|
||||
|
||||
<when_to_use_tdd>
|
||||
## 何时 TDD 提高质量
|
||||
|
||||
**TDD 候选(创建 TDD 计划):**
|
||||
- 有明确输入/输出的业务逻辑
|
||||
- 有请求/响应契约的 API 端点
|
||||
- 数据转换、解析、格式化
|
||||
- 验证规则和约束
|
||||
- 有可测试行为的算法
|
||||
- 状态机和工作流
|
||||
- 有清晰规格的工具函数
|
||||
|
||||
**跳过 TDD(使用带 `type="auto"` 任务的标准计划):**
|
||||
- UI 布局、样式、视觉组件
|
||||
- 配置更改
|
||||
- 连接现有组件的胶水代码
|
||||
- 一次性脚本和迁移
|
||||
- 无业务逻辑的简单 CRUD
|
||||
- 探索性原型
|
||||
|
||||
**启发式:** 能在编写 `fn` 之前写 `expect(fn(input)).toBe(output)` 吗?
|
||||
→ 能:创建 TDD 计划
|
||||
→ 不能:使用标准计划,事后添加测试(如需要)
|
||||
</when_to_use_tdd>
|
||||
|
||||
<tdd_plan_structure>
|
||||
## TDD 计划结构
|
||||
|
||||
每个 TDD 计划通过完整的 RED-GREEN-REFACTOR 循环实现**一个功能**。
|
||||
|
||||
```markdown
|
||||
---
|
||||
phase: XX-name
|
||||
plan: NN
|
||||
type: tdd
|
||||
---
|
||||
|
||||
<objective>
|
||||
[什么功能以及为什么]
|
||||
Purpose: [该功能 TDD 的设计收益]
|
||||
Output: [可工作的、已测试的功能]
|
||||
</objective>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/ROADMAP.md
|
||||
@relevant/source/files.ts
|
||||
</context>
|
||||
|
||||
<feature>
|
||||
<name>[功能名称]</name>
|
||||
<files>[源文件, 测试文件]</files>
|
||||
<behavior>
|
||||
[可测试术语描述的预期行为]
|
||||
Cases: 输入 → 预期输出
|
||||
</behavior>
|
||||
<implementation>[测试通过后如何实现]</implementation>
|
||||
</feature>
|
||||
|
||||
<verification>
|
||||
[证明功能有效的测试命令]
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- 失败测试已编写并提交
|
||||
- 实现通过测试
|
||||
- 重构完成(如需要)
|
||||
- 所有 2-3 个提交都存在
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
完成后,创建包含以下内容的 SUMMARY.md:
|
||||
- RED: 编写了什么测试,为什么失败
|
||||
- GREEN: 什么实现让它通过
|
||||
- REFACTOR: 做了什么清理(如有)
|
||||
- Commits: 生成的提交列表
|
||||
</output>
|
||||
```
|
||||
|
||||
**每个 TDD 计划一个功能。** 如果功能足够简单可以批量处理,那就足够简单可以跳过 TDD —— 使用标准计划,事后添加测试。
|
||||
</tdd_plan_structure>
|
||||
|
||||
<execution_flow>
|
||||
## 红-绿-重构循环
|
||||
|
||||
**RED - 编写失败测试:**
|
||||
1. 按项目约定创建测试文件
|
||||
2. 编写描述预期行为的测试(来自 `<behavior>` 元素)
|
||||
3. 运行测试 - 必须**失败**
|
||||
4. 如果测试通过:功能已存在或测试有误。调查。
|
||||
5. 提交:`test({phase}-{plan}): add failing test for [feature]`
|
||||
|
||||
**GREEN - 实现使其通过:**
|
||||
1. 编写使测试通过的最小代码
|
||||
2. 不耍小聪明,不优化 - 只让它工作
|
||||
3. 运行测试 - 必须**通过**
|
||||
4. 提交:`feat({phase}-{plan}): implement [feature]`
|
||||
|
||||
**REFACTOR(如需要):**
|
||||
1. 如果存在明显的改进,清理实现
|
||||
2. 运行测试 - 必须**仍然通过**
|
||||
3. 仅在做出更改时提交:`refactor({phase}-{plan}): clean up [feature]`
|
||||
|
||||
**结果:** 每个 TDD 计划产生 2-3 个原子提交。
|
||||
</execution_flow>
|
||||
|
||||
<test_quality>
|
||||
## 好测试 vs 坏测试
|
||||
|
||||
**测试行为,而非实现:**
|
||||
- 好:"返回格式化的日期字符串"
|
||||
- 坏:"用正确参数调用 formatDate 辅助函数"
|
||||
- 测试应该能经受重构
|
||||
|
||||
**每个测试一个概念:**
|
||||
- 好:分别为有效输入、空输入、畸形输入编写测试
|
||||
- 坏:用多个断言检查所有边缘情况的单个测试
|
||||
|
||||
**描述性名称:**
|
||||
- 好:"should reject empty email"、"returns null for invalid ID"
|
||||
- 坏:"test1"、"handles error"、"works correctly"
|
||||
|
||||
**不包含实现细节:**
|
||||
- 好:测试公共 API、可观察行为
|
||||
- 坏:Mock 内部实现、测试私有方法、断言内部状态
|
||||
</test_quality>
|
||||
|
||||
<framework_setup>
|
||||
## 测试框架设置(如不存在)
|
||||
|
||||
当执行 TDD 计划但没有配置测试框架时,作为 RED 阶段的一部分进行设置:
|
||||
|
||||
**1. 检测项目类型:**
|
||||
```bash
|
||||
# JavaScript/TypeScript
|
||||
if [ -f package.json ]; then echo "node"; fi
|
||||
|
||||
# Python
|
||||
if [ -f requirements.txt ] || [ -f pyproject.toml ]; then echo "python"; fi
|
||||
|
||||
# Go
|
||||
if [ -f go.mod ]; then echo "go"; fi
|
||||
|
||||
# Rust
|
||||
if [ -f Cargo.toml ]; then echo "rust"; fi
|
||||
```
|
||||
|
||||
**2. 安装最小框架:**
|
||||
| 项目 | 框架 | 安装 |
|
||||
|---------|-----------|---------|
|
||||
| Node.js | Jest | `npm install -D jest @types/jest ts-jest` |
|
||||
| Node.js (Vite) | Vitest | `npm install -D vitest` |
|
||||
| Python | pytest | `pip install pytest` |
|
||||
| Go | testing | 内置 |
|
||||
| Rust | cargo test | 内置 |
|
||||
|
||||
**3. 按需创建配置:**
|
||||
- Jest: 带 ts-jest preset 的 `jest.config.js`
|
||||
- Vitest: 带测试全局变量的 `vitest.config.ts`
|
||||
- pytest: `pytest.ini` 或 `pyproject.toml` 部分
|
||||
|
||||
**4. 验证设置:**
|
||||
```bash
|
||||
# 运行空测试套件 - 应该以 0 个测试通过
|
||||
npm test # Node
|
||||
pytest # Python
|
||||
go test ./... # Go
|
||||
cargo test # Rust
|
||||
```
|
||||
|
||||
**5. 创建第一个测试文件:**
|
||||
遵循项目约定的测试位置:
|
||||
- 源文件旁边的 `*.test.ts` / `*.spec.ts`
|
||||
- `__tests__/` 目录
|
||||
- 根目录的 `tests/` 目录
|
||||
|
||||
框架设置是第一个 TDD 计划 RED 阶段的一次性成本。
|
||||
</framework_setup>
|
||||
|
||||
<error_handling>
|
||||
## 错误处理
|
||||
|
||||
**测试在 RED 阶段没有失败:**
|
||||
- 功能可能已存在 - 调查
|
||||
- 测试可能有误(没测试你以为的东西)
|
||||
- 前进前修复
|
||||
|
||||
**测试在 GREEN 阶段没有通过:**
|
||||
- 调试实现
|
||||
- 不要跳到重构
|
||||
- 持续迭代直到绿色
|
||||
|
||||
**测试在 REFACTOR 阶段失败:**
|
||||
- 撤销重构
|
||||
- 提交过早
|
||||
- 用更小的步骤重构
|
||||
|
||||
**不相关的测试失败:**
|
||||
- 停下来调查
|
||||
- 可能表明耦合问题
|
||||
- 前进前修复
|
||||
</error_handling>
|
||||
|
||||
<commit_pattern>
|
||||
## TDD 计划的提交模式
|
||||
|
||||
TDD 计划产生 2-3 个原子提交(每个阶段一个):
|
||||
|
||||
```
|
||||
test(08-02): add failing test for email validation
|
||||
|
||||
- Tests valid email formats accepted
|
||||
- Tests invalid formats rejected
|
||||
- Tests empty input handling
|
||||
|
||||
feat(08-02): implement email validation
|
||||
|
||||
- Regex pattern matches RFC 5322
|
||||
- Returns boolean for validity
|
||||
- Handles edge cases (empty, null)
|
||||
|
||||
refactor(08-02): extract regex to constant (optional)
|
||||
|
||||
- Moved pattern to EMAIL_REGEX constant
|
||||
- No behavior changes
|
||||
- Tests still pass
|
||||
```
|
||||
|
||||
**与标准计划对比:**
|
||||
- 标准计划:每个任务 1 个提交,每个计划 2-4 个提交
|
||||
- TDD 计划:单个功能 2-3 个提交
|
||||
|
||||
两者遵循相同格式:`{type}({phase}-{plan}): {description}`
|
||||
|
||||
**好处:**
|
||||
- 每个提交独立可回滚
|
||||
- Git bisect 在提交级别工作
|
||||
- 显示 TDD 纪律的清晰历史
|
||||
- 与整体提交策略一致
|
||||
</commit_pattern>
|
||||
|
||||
<context_budget>
|
||||
## 上下文预算
|
||||
|
||||
TDD 计划目标 **~40% 上下文使用率**(低于标准计划的 ~50%)。
|
||||
|
||||
为什么更低:
|
||||
- RED 阶段:编写测试、运行测试、可能调试为什么没有失败
|
||||
- GREEN 阶段:实现、运行测试、可能对失败进行迭代
|
||||
- REFACTOR 阶段:修改代码、运行测试、验证无回归
|
||||
|
||||
每个阶段涉及读取文件、运行命令、分析输出。来回往复本质上比线性任务执行更重。
|
||||
|
||||
单一功能聚焦确保整个周期保持完整质量。
|
||||
</context_budget>
|
||||
158
docs/zh-CN/references/ui-brand.md
Normal file
158
docs/zh-CN/references/ui-brand.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# UI 品牌规范
|
||||
|
||||
面向用户的 GSD 输出的视觉模式。编排器通过 @ 引用此文件。
|
||||
|
||||
## 阶段横幅
|
||||
|
||||
用于主要工作流过渡。
|
||||
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
GSD ► {阶段名称}
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
|
||||
**阶段名称(大写):**
|
||||
- `QUESTIONING`(提问)
|
||||
- `RESEARCHING`(研究)
|
||||
- `DEFINING REQUIREMENTS`(定义需求)
|
||||
- `CREATING ROADMAP`(创建路线图)
|
||||
- `PLANNING PHASE {N}`(规划阶段 {N})
|
||||
- `EXECUTING WAVE {N}`(执行波次 {N})
|
||||
- `VERIFYING`(验证)
|
||||
- `PHASE {N} COMPLETE ✓`(阶段 {N} 完成)
|
||||
- `MILESTONE COMPLETE 🎉`(里程碑完成)
|
||||
|
||||
---
|
||||
|
||||
## 检查点框
|
||||
|
||||
需要用户操作。62 字符宽度。
|
||||
|
||||
```
|
||||
╔══════════════════════════════════════════════════════════════╗
|
||||
║ CHECKPOINT: {类型} ║
|
||||
╚══════════════════════════════════════════════════════════════╝
|
||||
|
||||
{内容}
|
||||
|
||||
──────────────────────────────────────────────────────────────
|
||||
→ {操作提示}
|
||||
──────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
**类型:**
|
||||
- `CHECKPOINT: 需要验证` → `→ 输入 "approved" 或描述问题`
|
||||
- `CHECKPOINT: 需要决策` → `→ 选择: option-a / option-b`
|
||||
- `CHECKPOINT: 需要操作` → `→ 完成后输入 "done"`
|
||||
|
||||
---
|
||||
|
||||
## 状态符号
|
||||
|
||||
```
|
||||
✓ 完成 / 通过 / 已验证
|
||||
✗ 失败 / 缺失 / 阻塞
|
||||
◆ 进行中
|
||||
○ 待处理
|
||||
⚡ 自动批准
|
||||
⚠ 警告
|
||||
🎉 里程碑完成(仅在横幅中)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 进度显示
|
||||
|
||||
**阶段/里程碑级别:**
|
||||
```
|
||||
进度: ████████░░ 80%
|
||||
```
|
||||
|
||||
**任务级别:**
|
||||
```
|
||||
任务: 2/4 完成
|
||||
```
|
||||
|
||||
**计划级别:**
|
||||
```
|
||||
计划: 3/5 完成
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 生成指示器
|
||||
|
||||
```
|
||||
◆ 正在生成研究员...
|
||||
|
||||
◆ 并行生成 4 个研究员...
|
||||
→ 技术栈研究
|
||||
→ 功能研究
|
||||
→ 架构研究
|
||||
→ 陷阱研究
|
||||
|
||||
✓ 研究员完成: STACK.md 已写入
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 下一步区块
|
||||
|
||||
始终在主要完成后。
|
||||
|
||||
```
|
||||
───────────────────────────────────────────────────────────────
|
||||
|
||||
## ▶ 下一步
|
||||
|
||||
**{标识符}: {名称}** — {单行描述}
|
||||
|
||||
`{可复制粘贴的命令}`
|
||||
|
||||
<sub>`/clear` 优先 → 全新上下文窗口</sub>
|
||||
|
||||
───────────────────────────────────────────────────────────────
|
||||
|
||||
**也可选:**
|
||||
- `/gsd:alternative-1` — 描述
|
||||
- `/gsd:alternative-2` — 描述
|
||||
|
||||
───────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 错误框
|
||||
|
||||
```
|
||||
╔══════════════════════════════════════════════════════════════╗
|
||||
║ ERROR ║
|
||||
╚══════════════════════════════════════════════════════════════╝
|
||||
|
||||
{错误描述}
|
||||
|
||||
**修复方法:** {解决步骤}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 表格
|
||||
|
||||
```
|
||||
| 阶段 | 状态 | 计划 | 进度 |
|
||||
|------|------|------|------|
|
||||
| 1 | ✓ | 3/3 | 100% |
|
||||
| 2 | ◆ | 1/4 | 25% |
|
||||
| 3 | ○ | 0/2 | 0% |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 反模式
|
||||
|
||||
- 变化的框/横幅宽度
|
||||
- 混合横幅样式(`===`、`---`、`***`)
|
||||
- 横幅中缺少 `GSD ►` 前缀
|
||||
- 随机 emoji(`🚀`、`✨`、`💫`)
|
||||
- 完成后缺少下一步区块
|
||||
612
docs/zh-CN/references/verification-patterns.md
Normal file
612
docs/zh-CN/references/verification-patterns.md
Normal file
@@ -0,0 +1,612 @@
|
||||
# 验证模式
|
||||
|
||||
如何验证不同类型的工件是真实实现,而非存根或占位符。
|
||||
|
||||
<core_principle>
|
||||
**存在 ≠ 实现**
|
||||
|
||||
文件存在并不意味着功能有效。验证必须检查:
|
||||
1. **存在** - 文件在预期路径
|
||||
2. **实质性** - 内容是真实实现,非占位符
|
||||
3. **已连接** - 已连接到系统的其他部分
|
||||
4. **功能性** - 调用时实际工作
|
||||
|
||||
级别 1-3 可以编程检查。级别 4 通常需要人工验证。
|
||||
</core_principle>
|
||||
|
||||
<stub_detection>
|
||||
|
||||
## 通用存根模式
|
||||
|
||||
这些模式表明占位符代码,无论文件类型:
|
||||
|
||||
**基于注释的存根:**
|
||||
```bash
|
||||
# 存根注释的 Grep 模式
|
||||
grep -E "(TODO|FIXME|XXX|HACK|PLACEHOLDER)" "$file"
|
||||
grep -E "implement|add later|coming soon|will be" "$file" -i
|
||||
grep -E "// \.\.\.|/\* \.\.\. \*/|# \.\.\." "$file"
|
||||
```
|
||||
|
||||
**输出中的占位符文本:**
|
||||
```bash
|
||||
# UI 占位符模式
|
||||
grep -E "placeholder|lorem ipsum|coming soon|under construction" "$file" -i
|
||||
grep -E "sample|example|test data|dummy" "$file" -i
|
||||
grep -E "\[.*\]|<.*>|\{.*\}" "$file" # 模板括号未移除
|
||||
```
|
||||
|
||||
**空或琐碎实现:**
|
||||
```bash
|
||||
# 什么都不做的函数
|
||||
grep -E "return null|return undefined|return \{\}|return \[\]" "$file"
|
||||
grep -E "pass$|\.\.\.|\bnothing\b" "$file"
|
||||
grep -E "console\.(log|warn|error).*only" "$file" # 仅日志函数
|
||||
```
|
||||
|
||||
**预期动态但硬编码的值:**
|
||||
```bash
|
||||
# 硬编码 ID、计数或内容
|
||||
grep -E "id.*=.*['\"].*['\"]" "$file" # 硬编码字符串 ID
|
||||
grep -E "count.*=.*\d+|length.*=.*\d+" "$file" # 硬编码计数
|
||||
grep -E "\\\$\d+\.\d{2}|\d+ items" "$file" # 硬编码显示值
|
||||
```
|
||||
|
||||
</stub_detection>
|
||||
|
||||
<react_components>
|
||||
|
||||
## React/Next.js 组件
|
||||
|
||||
**存在检查:**
|
||||
```bash
|
||||
# 文件存在且导出组件
|
||||
[ -f "$component_path" ] && grep -E "export (default |)function|export const.*=.*\(" "$component_path"
|
||||
```
|
||||
|
||||
**实质性检查:**
|
||||
```bash
|
||||
# 返回实际 JSX,非占位符
|
||||
grep -E "return.*<" "$component_path" | grep -v "return.*null" | grep -v "placeholder" -i
|
||||
|
||||
# 有有意义的内容(不仅仅是包装 div)
|
||||
grep -E "<[A-Z][a-zA-Z]+|className=|onClick=|onChange=" "$component_path"
|
||||
|
||||
# 使用 props 或 state(非静态)
|
||||
grep -E "props\.|useState|useEffect|useContext|\{.*\}" "$component_path"
|
||||
```
|
||||
|
||||
**React 特有的存根模式:**
|
||||
```javascript
|
||||
// 危险信号 - 这些是存根:
|
||||
return <div>Component</div>
|
||||
return <div>Placeholder</div>
|
||||
return <div>{/* TODO */}</div>
|
||||
return <p>Coming soon</p>
|
||||
return null
|
||||
return <></>
|
||||
|
||||
// 也是存根 - 空处理器:
|
||||
onClick={() => {}}
|
||||
onChange={() => console.log('clicked')}
|
||||
onSubmit={(e) => e.preventDefault()} // 仅阻止默认,什么都不做
|
||||
```
|
||||
|
||||
**连接检查:**
|
||||
```bash
|
||||
# 组件导入它需要的东西
|
||||
grep -E "^import.*from" "$component_path"
|
||||
|
||||
# Props 实际被使用(不仅仅是接收)
|
||||
# 查找解构或 props.X 用法
|
||||
grep -E "\{ .* \}.*props|\bprops\.[a-zA-Z]+" "$component_path"
|
||||
|
||||
# API 调用存在(对于数据获取组件)
|
||||
grep -E "fetch\(|axios\.|useSWR|useQuery|getServerSideProps|getStaticProps" "$component_path"
|
||||
```
|
||||
|
||||
**功能验证(需要人工):**
|
||||
- 组件是否渲染可见内容?
|
||||
- 交互元素是否响应点击?
|
||||
- 数据是否加载并显示?
|
||||
- 错误状态是否适当显示?
|
||||
|
||||
</react_components>
|
||||
|
||||
<api_routes>
|
||||
|
||||
## API 路由(Next.js App Router / Express 等)
|
||||
|
||||
**存在检查:**
|
||||
```bash
|
||||
# 路由文件存在
|
||||
[ -f "$route_path" ]
|
||||
|
||||
# 导出 HTTP 方法处理器(Next.js App Router)
|
||||
grep -E "export (async )?(function|const) (GET|POST|PUT|PATCH|DELETE)" "$route_path"
|
||||
|
||||
# 或 Express 风格处理器
|
||||
grep -E "\.(get|post|put|patch|delete)\(" "$route_path"
|
||||
```
|
||||
|
||||
**实质性检查:**
|
||||
```bash
|
||||
# 有实际逻辑,不仅仅是 return 语句
|
||||
wc -l "$route_path" # 超过 10-15 行表明真实实现
|
||||
|
||||
# 与数据源交互
|
||||
grep -E "prisma\.|db\.|mongoose\.|sql|query|find|create|update|delete" "$route_path" -i
|
||||
|
||||
# 有错误处理
|
||||
grep -E "try|catch|throw|error|Error" "$route_path"
|
||||
|
||||
# 返回有意义的响应
|
||||
grep -E "Response\.json|res\.json|res\.send|return.*\{" "$route_path" | grep -v "message.*not implemented" -i
|
||||
```
|
||||
|
||||
**API 路由特有的存根模式:**
|
||||
```typescript
|
||||
// 危险信号 - 这些是存根:
|
||||
export async function POST() {
|
||||
return Response.json({ message: "Not implemented" })
|
||||
}
|
||||
|
||||
export async function GET() {
|
||||
return Response.json([]) // 空 array 无数据库查询
|
||||
}
|
||||
|
||||
export async function PUT() {
|
||||
return new Response() // 空响应
|
||||
}
|
||||
|
||||
// 仅控制台日志:
|
||||
export async function POST(req) {
|
||||
console.log(await req.json())
|
||||
return Response.json({ ok: true })
|
||||
}
|
||||
```
|
||||
|
||||
**连接检查:**
|
||||
```bash
|
||||
# 导入数据库/服务客户端
|
||||
grep -E "^import.*prisma|^import.*db|^import.*client" "$route_path"
|
||||
|
||||
# 实际使用请求体(对于 POST/PUT)
|
||||
grep -E "req\.json\(\)|req\.body|request\.json\(\)" "$route_path"
|
||||
|
||||
# 验证输入(不仅仅信任请求)
|
||||
grep -E "schema\.parse|validate|zod|yup|joi" "$route_path"
|
||||
```
|
||||
|
||||
**功能验证(人工或自动化):**
|
||||
- GET 是否从数据库返回真实数据?
|
||||
- POST 是否实际创建记录?
|
||||
- 错误响应是否有正确的状态码?
|
||||
- 认证检查是否实际执行?
|
||||
|
||||
</api_routes>
|
||||
|
||||
<database_schema>
|
||||
|
||||
## 数据库模式(Prisma / Drizzle / SQL)
|
||||
|
||||
**存在检查:**
|
||||
```bash
|
||||
# 模式文件存在
|
||||
[ -f "prisma/schema.prisma" ] || [ -f "drizzle/schema.ts" ] || [ -f "src/db/schema.sql" ]
|
||||
|
||||
# 模型/表已定义
|
||||
grep -E "^model $model_name|CREATE TABLE $table_name|export const $table_name" "$schema_path"
|
||||
```
|
||||
|
||||
**实质性检查:**
|
||||
```bash
|
||||
# 有预期字段(不仅仅是 id)
|
||||
grep -A 20 "model $model_name" "$schema_path" | grep -E "^\s+\w+\s+\w+"
|
||||
|
||||
# 有预期关系
|
||||
grep -E "@relation|REFERENCES|FOREIGN KEY" "$schema_path"
|
||||
|
||||
# 有适当的字段类型(不全是 String)
|
||||
grep -A 20 "model $model_name" "$schema_path" | grep -E "Int|DateTime|Boolean|Float|Decimal|Json"
|
||||
```
|
||||
|
||||
**模式特有的存根模式:**
|
||||
```prisma
|
||||
// 危险信号 - 这些是存根:
|
||||
model User {
|
||||
id String @id
|
||||
// TODO: add fields
|
||||
}
|
||||
|
||||
model Message {
|
||||
id String @id
|
||||
content String // 只有一个真实字段
|
||||
}
|
||||
|
||||
// 缺少关键字段:
|
||||
model Order {
|
||||
id String @id
|
||||
// 缺少: userId, items, total, status, createdAt
|
||||
}
|
||||
```
|
||||
|
||||
**连接检查:**
|
||||
```bash
|
||||
# 迁移存在且已应用
|
||||
ls prisma/migrations/ 2>/dev/null | wc -l # 应该 > 0
|
||||
npx prisma migrate status 2>/dev/null | grep -v "pending"
|
||||
|
||||
# 客户端已生成
|
||||
[ -d "node_modules/.prisma/client" ]
|
||||
```
|
||||
|
||||
**功能验证:**
|
||||
```bash
|
||||
# 可以查询表(自动化)
|
||||
npx prisma db execute --stdin <<< "SELECT COUNT(*) FROM $table_name"
|
||||
```
|
||||
|
||||
</database_schema>
|
||||
|
||||
<hooks_utilities>
|
||||
|
||||
## 自定义 Hooks 和工具
|
||||
|
||||
**存在检查:**
|
||||
```bash
|
||||
# 文件存在且导出函数
|
||||
[ -f "$hook_path" ] && grep -E "export (default )?(function|const)" "$hook_path"
|
||||
```
|
||||
|
||||
**实质性检查:**
|
||||
```bash
|
||||
# Hook 使用 React hooks(对于自定义 hooks)
|
||||
grep -E "useState|useEffect|useCallback|useMemo|useRef|useContext" "$hook_path"
|
||||
|
||||
# 有有意义的返回值
|
||||
grep -E "return \{|return \[" "$hook_path"
|
||||
|
||||
# 超过琐碎长度
|
||||
[ $(wc -l < "$hook_path") -gt 10 ]
|
||||
```
|
||||
|
||||
**Hooks 特有的存根模式:**
|
||||
```typescript
|
||||
// 危险信号 - 这些是存根:
|
||||
export function useAuth() {
|
||||
return { user: null, login: () => {}, logout: () => {} }
|
||||
}
|
||||
|
||||
export function useCart() {
|
||||
const [items, setItems] = useState([])
|
||||
return { items, addItem: () => console.log('add'), removeItem: () => {} }
|
||||
}
|
||||
|
||||
// 硬编码返回:
|
||||
export function useUser() {
|
||||
return { name: "Test User", email: "test@example.com" }
|
||||
}
|
||||
```
|
||||
|
||||
**连接检查:**
|
||||
```bash
|
||||
# Hook 实际在某处被导入
|
||||
grep -r "import.*$hook_name" src/ --include="*.tsx" --include="*.ts" | grep -v "$hook_path"
|
||||
|
||||
# Hook 实际被调用
|
||||
grep -r "$hook_name()" src/ --include="*.tsx" --include="*.ts" | grep -v "$hook_path"
|
||||
```
|
||||
|
||||
</hooks_utilities>
|
||||
|
||||
<environment_config>
|
||||
|
||||
## 环境变量和配置
|
||||
|
||||
**存在检查:**
|
||||
```bash
|
||||
# .env 文件存在
|
||||
[ -f ".env" ] || [ -f ".env.local" ]
|
||||
|
||||
# 必需变量已定义
|
||||
grep -E "^$VAR_NAME=" .env .env.local 2>/dev/null
|
||||
```
|
||||
|
||||
**实质性检查:**
|
||||
```bash
|
||||
# 变量有实际值(非占位符)
|
||||
grep -E "^$VAR_NAME=.+" .env .env.local 2>/dev/null | grep -v "your-.*-here|xxx|placeholder|TODO" -i
|
||||
|
||||
# 值对类型看起来有效:
|
||||
# - URL 应以 http 开头
|
||||
# - 密钥应足够长
|
||||
# - 布尔值应为 true/false
|
||||
```
|
||||
|
||||
**环境变量特有的存根模式:**
|
||||
```bash
|
||||
# 危险信号 - 这些是存根:
|
||||
DATABASE_URL=your-database-url-here
|
||||
STRIPE_SECRET_KEY=sk_test_xxx
|
||||
API_KEY=placeholder
|
||||
NEXT_PUBLIC_API_URL=http://localhost:3000 # 生产环境仍指向 localhost
|
||||
```
|
||||
|
||||
**连接检查:**
|
||||
```bash
|
||||
# 变量实际在代码中使用
|
||||
grep -r "process\.env\.$VAR_NAME|env\.$VAR_NAME" src/ --include="*.ts" --include="*.tsx"
|
||||
|
||||
# 变量在验证模式中(如果使用 zod 等验证 env)
|
||||
grep -E "$VAR_NAME" src/env.ts src/env.mjs 2>/dev/null
|
||||
```
|
||||
|
||||
</environment_config>
|
||||
|
||||
<wiring_verification>
|
||||
|
||||
## 连接验证模式
|
||||
|
||||
连接验证检查组件是否实际通信。这是大多数存根隐藏的地方。
|
||||
|
||||
### 模式:组件 → API
|
||||
|
||||
**检查:** 组件是否实际调用 API?
|
||||
|
||||
```bash
|
||||
# 查找 fetch/axios 调用
|
||||
grep -E "fetch\(['\"].*$api_path|axios\.(get|post).*$api_path" "$component_path"
|
||||
|
||||
# 验证未被注释掉
|
||||
grep -E "fetch\(|axios\." "$component_path" | grep -v "^.*//.*fetch"
|
||||
|
||||
# 检查响应被使用
|
||||
grep -E "await.*fetch|\.then\(|setData|setState" "$component_path"
|
||||
```
|
||||
|
||||
**危险信号:**
|
||||
```typescript
|
||||
// Fetch 存在但响应被忽略:
|
||||
fetch('/api/messages') // 无 await,无 .then,无赋值
|
||||
|
||||
// Fetch 在注释中:
|
||||
// fetch('/api/messages').then(r => r.json()).then(setMessages)
|
||||
|
||||
// Fetch 到错误的端点:
|
||||
fetch('/api/message') // 拼写错误 - 应该是 /api/messages
|
||||
```
|
||||
|
||||
### 模式:API → 数据库
|
||||
|
||||
**检查:** API 路由是否实际查询数据库?
|
||||
|
||||
```bash
|
||||
# 查找数据库调用
|
||||
grep -E "prisma\.$model|db\.query|Model\.find" "$route_path"
|
||||
|
||||
# 验证被 await
|
||||
grep -E "await.*prisma|await.*db\." "$route_path"
|
||||
|
||||
# 检查结果被返回
|
||||
grep -E "return.*json.*data|res\.json.*result" "$route_path"
|
||||
```
|
||||
|
||||
**危险信号:**
|
||||
```typescript
|
||||
// 查询存在但结果未返回:
|
||||
await prisma.message.findMany()
|
||||
return Response.json({ ok: true }) // 返回静态值,非查询结果
|
||||
|
||||
// 查询未被 await:
|
||||
const messages = prisma.message.findMany() // 缺少 await
|
||||
return Response.json(messages) // 返回 Promise,非数据
|
||||
```
|
||||
|
||||
### 模式:表单 → 处理器
|
||||
|
||||
**检查:** 表单提交是否实际做些什么?
|
||||
|
||||
```bash
|
||||
# 查找 onSubmit 处理器
|
||||
grep -E "onSubmit=\{|handleSubmit" "$component_path"
|
||||
|
||||
# 检查处理器有内容
|
||||
grep -A 10 "onSubmit.*=" "$component_path" | grep -E "fetch|axios|mutate|dispatch"
|
||||
|
||||
# 验证不仅仅是 preventDefault
|
||||
grep -A 5 "onSubmit" "$component_path" | grep -v "only.*preventDefault" -i
|
||||
```
|
||||
|
||||
**危险信号:**
|
||||
```typescript
|
||||
// 处理器仅阻止默认:
|
||||
onSubmit={(e) => e.preventDefault()}
|
||||
|
||||
// 处理器仅日志:
|
||||
const handleSubmit = (data) => {
|
||||
console.log(data)
|
||||
}
|
||||
|
||||
// 处理器为空:
|
||||
onSubmit={() => {}}
|
||||
```
|
||||
|
||||
### 模式:状态 → 渲染
|
||||
|
||||
**检查:** 组件是否渲染状态,而非硬编码内容?
|
||||
|
||||
```bash
|
||||
# 查找 JSX 中的状态使用
|
||||
grep -E "\{.*messages.*\}|\{.*data.*\}|\{.*items.*\}" "$component_path"
|
||||
|
||||
# 检查状态的 map/render
|
||||
grep -E "\.map\(|\.filter\(|\.reduce\(" "$component_path"
|
||||
|
||||
# 验证动态内容
|
||||
grep -E "\{[a-zA-Z_]+\." "$component_path" # 变量插值
|
||||
```
|
||||
|
||||
**危险信号:**
|
||||
```tsx
|
||||
// 硬编码而非状态:
|
||||
return <div>
|
||||
<p>Message 1</p>
|
||||
<p>Message 2</p>
|
||||
</div>
|
||||
|
||||
// 状态存在但未渲染:
|
||||
const [messages, setMessages] = useState([])
|
||||
return <div>No messages</div> // 总是显示 "no messages"
|
||||
|
||||
// 渲染错误的状态:
|
||||
const [messages, setMessages] = useState([])
|
||||
return <div>{otherData.map(...)}</div> // 使用不同数据
|
||||
```
|
||||
|
||||
</wiring_verification>
|
||||
|
||||
<verification_checklist>
|
||||
|
||||
## 快速验证清单
|
||||
|
||||
对于每种工件类型,运行此清单:
|
||||
|
||||
### 组件清单
|
||||
- [ ] 文件存在于预期路径
|
||||
- [ ] 导出函数/const 组件
|
||||
- [ ] 返回 JSX(非 null/空)
|
||||
- [ ] 渲染中无占位符文本
|
||||
- [ ] 使用 props 或 state(非静态)
|
||||
- [ ] 事件处理器有真实实现
|
||||
- [ ] 导入正确解析
|
||||
- [ ] 在应用某处被使用
|
||||
|
||||
### API 路由清单
|
||||
- [ ] 文件存在于预期路径
|
||||
- [ ] 导出 HTTP 方法处理器
|
||||
- [ ] 处理器超过 5 行
|
||||
- [ ] 查询数据库或服务
|
||||
- [ ] 返回有意义的响应(非空/占位符)
|
||||
- [ ] 有错误处理
|
||||
- [ ] 验证输入
|
||||
- [ ] 从前端调用
|
||||
|
||||
### 模式清单
|
||||
- [ ] 模型/表已定义
|
||||
- [ ] 有所有预期字段
|
||||
- [ ] 字段有适当类型
|
||||
- [ ] 如需要关系已定义
|
||||
- [ ] 迁移存在且已应用
|
||||
- [ ] 客户端已生成
|
||||
|
||||
### Hook/工具清单
|
||||
- [ ] 文件存在于预期路径
|
||||
- [ ] 导出函数
|
||||
- [ ] 有有意义的实现(非空返回)
|
||||
- [ ] 在应用某处被使用
|
||||
- [ ] 返回值被消费
|
||||
|
||||
### 连接清单
|
||||
- [ ] 组件 → API: fetch/axios 调用存在且使用响应
|
||||
- [ ] API → 数据库: 查询存在且结果返回
|
||||
- [ ] 表单 → 处理器: onSubmit 调用 API/mutation
|
||||
- [ ] 状态 → 渲染: 状态变量出现在 JSX 中
|
||||
|
||||
</verification_checklist>
|
||||
|
||||
<automated_verification_script>
|
||||
|
||||
## 自动化验证方法
|
||||
|
||||
对于验证子代理,使用此模式:
|
||||
|
||||
```bash
|
||||
# 1. 检查存在
|
||||
check_exists() {
|
||||
[ -f "$1" ] && echo "EXISTS: $1" || echo "MISSING: $1"
|
||||
}
|
||||
|
||||
# 2. 检查存根模式
|
||||
check_stubs() {
|
||||
local file="$1"
|
||||
local stubs=$(grep -c -E "TODO|FIXME|placeholder|not implemented" "$file" 2>/dev/null || echo 0)
|
||||
[ "$stubs" -gt 0 ] && echo "STUB_PATTERNS: $stubs in $file"
|
||||
}
|
||||
|
||||
# 3. 检查连接(组件调用 API)
|
||||
check_wiring() {
|
||||
local component="$1"
|
||||
local api_path="$2"
|
||||
grep -q "$api_path" "$component" && echo "WIRED: $component → $api_path" || echo "NOT_WIRED: $component → $api_path"
|
||||
}
|
||||
|
||||
# 4. 检查实质性(超过 N 行,有预期模式)
|
||||
check_substantive() {
|
||||
local file="$1"
|
||||
local min_lines="$2"
|
||||
local pattern="$3"
|
||||
local lines=$(wc -l < "$file" 2>/dev/null || echo 0)
|
||||
local has_pattern=$(grep -c -E "$pattern" "$file" 2>/dev/null || echo 0)
|
||||
[ "$lines" -ge "$min_lines" ] && [ "$has_pattern" -gt 0 ] && echo "SUBSTANTIVE: $file" || echo "THIN: $file ($lines lines, $has_pattern matches)"
|
||||
}
|
||||
```
|
||||
|
||||
对每个必须有工件运行这些检查。汇总结果到 VERIFICATION.md。
|
||||
|
||||
</automated_verification_script>
|
||||
|
||||
<human_verification_triggers>
|
||||
|
||||
## 何时需要人工验证
|
||||
|
||||
有些事情无法编程验证。标记这些需要人工测试:
|
||||
|
||||
**始终人工:**
|
||||
- 视觉外观(看起来对吗?)
|
||||
- 用户流程完成(能实际做那件事吗?)
|
||||
- 实时行为(WebSocket、SSE)
|
||||
- 外部服务集成(Stripe、邮件发送)
|
||||
- 错误消息清晰度(消息有帮助吗?)
|
||||
- 性能感觉(感觉快吗?)
|
||||
|
||||
**如不确定则人工:**
|
||||
- grep 无法追踪的复杂连接
|
||||
- 依赖状态的动态行为
|
||||
- 边缘情况和错误状态
|
||||
- 移动端响应式
|
||||
- 无障碍性
|
||||
|
||||
**人工验证请求格式:**
|
||||
```markdown
|
||||
## 需要人工验证
|
||||
|
||||
### 1. 聊天消息发送
|
||||
**测试:** 输入消息并点击发送
|
||||
**预期:** 消息出现在列表中,输入框清空
|
||||
**检查:** 刷新后消息是否持久?
|
||||
|
||||
### 2. 错误处理
|
||||
**测试:** 断开网络,尝试发送
|
||||
**预期:** 错误消息出现,消息未丢失
|
||||
**检查:** 重连后能重试吗?
|
||||
```
|
||||
|
||||
</human_verification_triggers>
|
||||
|
||||
<checkpoint_automation_reference>
|
||||
|
||||
## 检查点前自动化
|
||||
|
||||
关于自动化优先的检查点模式、服务器生命周期管理、CLI 安装处理和错误恢复协议,请参阅:
|
||||
|
||||
**@~/.claude/get-shit-done/references/checkpoints.md** → `<automation_reference>` 部分
|
||||
|
||||
关键原则:
|
||||
- Claude 在呈现检查点**之前**设置验证环境
|
||||
- 用户从不运行 CLI 命令(仅访问 URL)
|
||||
- 服务器生命周期:检查点前启动、处理端口冲突、持续运行
|
||||
- CLI 安装:安全处自动安装,否则检查点让用户选择
|
||||
- 错误处理:检查点前修复损坏环境,绝不呈现有失败设置的检查点
|
||||
|
||||
</checkpoint_automation_reference>
|
||||
Reference in New Issue
Block a user