- 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>
450 lines
18 KiB
Markdown
450 lines
18 KiB
Markdown
# 检查点
|
||
|
||
计划自主执行。检查点用于规范化需要人工验证或决策的交互点。
|
||
|
||
**核心原则:** 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 自动化的内容 |