@house365/comate 0.10.3 → 1.0.2-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +104 -64
  3. package/bin/cli.mjs +197 -190
  4. package/bin/doctor.mjs +29 -41
  5. package/bin/init-run.mjs +310 -368
  6. package/bin/init.mjs +53 -71
  7. package/bin/postinstall.mjs +56 -56
  8. package/docs/CHANGELOG-fix-simplification.md +145 -0
  9. package/docs/COMATE_BETA.md +90 -0
  10. package/docs/COMATE_MANUAL.md +239 -665
  11. package/docs/superpowers/plans/2026-10-14-review-fixes.md +48 -0
  12. package/docs/superpowers/plans/2026-10-14-workflow-quality.md +48 -0
  13. package/package.json +54 -55
  14. package/skills/comate/SKILL.md +42 -325
  15. package/skills/comate/reference/archive.md +50 -0
  16. package/skills/comate/reference/build.md +67 -0
  17. package/skills/comate/reference/fix.md +150 -0
  18. package/skills/comate/reference/open.md +162 -0
  19. package/skills/comate/reference/verify.md +123 -0
  20. package/skills/comate/scaffold/comate/README.md +18 -0
  21. package/skills/{comate-gate/scaffold/docs → comate/scaffold/comate}/architecture/README.md +5 -6
  22. package/skills/comate/scaffold/comate/comate/config.json +10 -0
  23. package/skills/comate/scaffold/comate/knowledge-base/README.md +42 -0
  24. package/skills/{comate-gate/scaffold/docs → comate/scaffold/comate}/knowledge-base/integrations/_TEMPLATE/README.md +2 -2
  25. package/skills/{comate-gate/scaffold/docs → comate/scaffold/comate}/knowledge-base/integrations/_TEMPLATE/api-snapshot.md +47 -47
  26. package/skills/{comate-gate/scaffold/docs → comate/scaffold/comate}/knowledge-base/requirements/_templates/PRD.md +4 -4
  27. package/skills/comate/scripts/comate.mjs +147 -0
  28. package/skills/comate/scripts/lib/acceptance.mjs +112 -0
  29. package/skills/comate/scripts/lib/brief.mjs +50 -0
  30. package/skills/comate/scripts/lib/checks.mjs +178 -0
  31. package/skills/comate/scripts/lib/cmd-archive.mjs +152 -0
  32. package/skills/comate/scripts/lib/cmd-decide.mjs +116 -0
  33. package/skills/comate/scripts/lib/cmd-init.mjs +75 -0
  34. package/skills/comate/scripts/lib/cmd-loop.mjs +273 -0
  35. package/skills/comate/scripts/lib/cmd-open.mjs +161 -0
  36. package/skills/comate/scripts/lib/cmd-status.mjs +121 -0
  37. package/skills/comate/scripts/lib/common.mjs +85 -0
  38. package/skills/comate/scripts/lib/docs.mjs +45 -0
  39. package/skills/comate/scripts/lib/finish.mjs +108 -0
  40. package/skills/comate/scripts/lib/git.mjs +112 -0
  41. package/skills/comate/scripts/lib/md.mjs +85 -0
  42. package/skills/comate/scripts/lib/next.mjs +217 -0
  43. package/skills/comate/scripts/lib/paths.mjs +96 -0
  44. package/skills/comate/scripts/lib/render.mjs +46 -0
  45. package/skills/comate/scripts/lib/spec.mjs +106 -0
  46. package/skills/comate/scripts/lib/state.mjs +128 -0
  47. package/skills/comate/scripts/lib/tasks.mjs +53 -0
  48. package/skills/comate/scripts/lib/templates.mjs +58 -0
  49. package/skills/comate/scripts/lib/util.mjs +108 -0
  50. package/skills/comate-kb-integration/SKILL.md +128 -128
  51. package/skills/comate-kb-integration/scripts/fetch_rendered_doc.py +84 -84
  52. package/bin/cleanup-duplicate-superpowers.mjs +0 -119
  53. package/docs/COMATE_BEGINNER_GUIDE.md +0 -188
  54. package/docs/COMATE_INIT_DIRECTORY_GUIDE.md +0 -201
  55. package/docs/superpowers/plans/2026-09-13-fast-workflow.md +0 -62
  56. package/skills/comate/reference/decision-points.md +0 -103
  57. package/skills/comate/reference/dirty-worktree.md +0 -58
  58. package/skills/comate/reference/prerequisites.md +0 -89
  59. package/skills/comate/scripts/comate-lib.sh +0 -559
  60. package/skills/comate/scripts/comate.sh +0 -2147
  61. package/skills/comate/tests/comate.bats +0 -1019
  62. package/skills/comate/tests/run.sh +0 -101
  63. package/skills/comate-archive/SKILL.md +0 -63
  64. package/skills/comate-build/SKILL.md +0 -278
  65. package/skills/comate-design/SKILL.md +0 -178
  66. package/skills/comate-fix/SKILL.md +0 -195
  67. package/skills/comate-gate/SKILL.md +0 -319
  68. package/skills/comate-gate/scaffold/docs/README.md +0 -36
  69. package/skills/comate-gate/scaffold/docs/knowledge-base/README.md +0 -47
  70. package/skills/comate-grill/SKILL.md +0 -185
  71. package/skills/comate-open/SKILL.md +0 -240
  72. package/skills/comate-verify/SKILL.md +0 -212
  73. /package/skills/{comate-gate/scaffold/docs → comate/scaffold/comate}/knowledge-base/integrations/README.md +0 -0
@@ -1,713 +1,287 @@
1
- # comate - 操作手册
1
+ # comate 1.0 操作手册
2
2
 
3
- > SDD (规约驱动开发) 的 AI 开发编排器
4
- > 版本:schema_version 1,五阶段工作流
5
- > 最后更新:2026-08-17
3
+ comate 是规约驱动开发(SDD)编排器:每个变更先写规约、确认后实现,实现由独立 verifier 逐项验收,通过后归档进主规格。
6
4
 
7
- ---
5
+ **核心流程**:open(澄清需求、写 brief + spec)→ build ⇄ verify(失败自动回修)→ archive(写入主 spec、归档、收尾)
8
6
 
9
- ## 目录
7
+ **技术栈**:一个 `/comate` skill + 一个 Node.js 状态机(`skills/comate/scripts/comate.mjs`,Node ≥ 20,零依赖)。
10
8
 
11
- - 1. 概述与核心概念
12
- - 2. 安装与前置条件
13
- - 3. 快速开始
14
- - 4. 命令参考:/comate 主命令
15
- - 5. 阶段详解:open / design / build / verify / archive
16
- - 6. 预设路径:fix(bug + 调整两种模式)
17
- - 7. 状态文件:.comate.yaml
18
- - 8. 决策阻塞点
19
- - 9. 关键协议
20
- - 10. CLI 命令参考(comate.sh)
21
- - 11. 故障排除
22
- - 12. 文件结构
9
+ ## 1. 命令
23
10
 
24
- ---
25
-
26
- ## 1. 概述与核心概念
27
-
28
- comate 是一个 **Specification-Driven Development (SDD,规约驱动开发)** 的 AI 开发编排器,通过五阶段工作流确保每个变更都有完整的规约与设计。底层集成 **OpenSpec**(提案、规约生命周期、归档)和 **Superpowers**(技术设计、规划、执行、收尾),并提供 PRD 门禁、决策澄清、知识库对接等编排能力。
29
- ### 1.1 核心原则
30
-
31
- **头脑风暴是强制性的。每个变更都必须经过深度设计(fix 预设除外)。**
32
-
33
- ### 1.2 五阶段流程
34
-
35
- ```
36
- [原始 PRD] -> /comate-gate -┐ (阶段 0:门禁 + 拆分)
37
- v
38
- /comate
39
- auto-detect
40
- /comate-open -> /comate-design -> /comate-build -> /comate-verify -> /comate-archive
41
- (OpenSpec) (Superpowers) (Superpowers) (两者) (OpenSpec)
42
- ```
43
-
44
- 流程链:(gate ->) open -> design -> build -> verify -> archive
45
-
46
- **阶段 0(可选,PRD 门禁与拆分)**:需求来自一份**原始 PRD**时,先过 `/comate-gate`:审阅 PRD 质量、百分制评分、建阻断台账,门禁通过前禁止建任何 change;通过后按依赖/整体性/独立性/规模把 PRD 拆成 1 或 N 个 change(粒度由用户定),逐个交给 `/comate-open`。门禁状态钉在 PRD 同级 `PRD-<NNN>.gate.yaml`(如 `PRD-001.gate.yaml`,机器真相源),评审报告为 `PRD-<NNN>-REVIEW.md`(如 `PRD-001-REVIEW.md`,人类可读)。PRD 通过门禁后被改会因哈希漂移自动失效(stale),需重跑 gate。需求来自对话时无需此阶段。
47
-
48
- 单次 `/comate` 调用从检测到的阶段开始,当退出条件满足时推进到下一阶段。智能体会自动推进后续阶段,但必须在决策阻塞点暂停,直到收到用户确认。
49
-
50
- ### 1.3 预设快捷方式
51
-
52
- - **fix**:快速小改动 —— 跳过头脑风暴(及完整计划),走 open -> build -> verify -> archive。覆盖两种模式,调用时判定:
53
- - **bug 模式**:修复已有功能的错误行为。含根因消除检查,commit 前缀 `fix:`,升级阈值 3 文件
54
- - **调整模式**:非 Bug 的局部优化(文本、配置、文档、提示词)。跳过根因检查,commit 前缀 `chore:`,升级阈值 5 文件
55
-
56
- ### 1.3.1 工具 skill
57
-
58
- - **grill**(`/comate-grill`):决策点穷追式澄清。对计划/设计/PRD 的模糊点做深度优先遍历,逐个决策点给推荐答案并等用户确认,直到歧义清零。不是阶段,是跨阶段可复用的工具。comate-gate 在阻断问题 > 3 或有依赖链时会提供「深度澄清」选项自动调用它;用户也可 `/comate-grill <话题>` 直接挑战自己的计划草稿。算法内化自社区 grill-me pattern,避免外部依赖漂移。
59
- - **kb-integration**(`/comate-kb-integration`):第三方对接档案生成。从官方文档 URL 抓取,按 `docs/knowledge-base/integrations/_TEMPLATE/` 规范产出 `<service-id>/README.md`(长期维护的对接档案)+ `api-snapshot.md`(我方用到的接口字段摘录),并在根索引 README.md 追加一行。是知识库 integrations scaffold(comate init 铺入)的配套建档工具,只摘我方用得到的接口/字段、密钥只记位置不写值。遇 JS 动态渲染的 SPA 文档站(WebFetch 抓到空壳)自动降级 `scripts/fetch_rendered_doc.py`(Playwright 无头渲染,需 `pip install playwright && playwright install chromium`)。
60
-
61
- ### 1.4 命令快速参考
62
-
63
- | 命令 | 阶段 | 归属 | 产出物 |
64
- |---------|-------|-------|-----------|
65
- | `/comate-gate` | 0. PRD 门禁与拆分 | Claude | `<PRD>.gate.yaml`, 评审报告, N 个 change |
66
- | `/comate-open` | 1. 启动 | OpenSpec | proposal.md, design.md, tasks.md |
67
- | `/comate-design` | 2. 深度设计 | Superpowers | 设计文档, delta spec |
68
- | `/comate-build` | 3. 规划与构建 | Superpowers | 实现计划, 代码提交 |
69
- | `/comate-verify` | 4. 验证与收尾 | 两者 | 验证报告, 分支处理 |
70
- | `/comate-archive` | 5. 归档 | OpenSpec | delta->main spec 同步, 设计文档标注, 归档 |
71
- | `/comate-fix` | 预设 | 两者 | 快速小改动:bug 修复 + 非 bug 调整(跳过头脑风暴) |
72
- | `/comate-grill` | 工具 | Claude | 决策台账(逐决策点澄清,附推荐 + 用户答案) |
73
- | `/comate-kb-integration` | 工具 | Claude | 第三方对接档案(从官方文档 URL 生成 integrations 目录档案 + 索引行) |
74
-
75
- 此外,终端命令 `comate usage` 查看当前项目的 token 用量与估算成本(见 §2.7)。
76
-
77
- ---
78
-
79
- ## 2. 安装与前置条件
80
-
81
- ```bash
82
- npm install -g @house365/comate
83
- cd your-project && comate init
84
- ```
85
-
86
- `init` 会装好下面 2.2–2.4 的全部内容,并铺出 `docs/` 知识库骨架(2.5)。本节余下部分用于排查:init 报某项失败时,对照确认要装什么、怎么自查。
87
-
88
- ### 2.1 运行环境
89
-
90
- | 依赖 | 要求 | 检查方式 |
91
- |------------|-------------|-------|
92
- | bash | >= 3.2 | `bash --version` |
93
- | git | 任意现代版本 | `git --version` |
94
- | sha256 | `sha256sum` 或 `shasum`(至少一个) | `command -v sha256sum shasum` |
95
- | LF 换行符 | 所有 `.sh` 文件必须使用 LF | `bash comate/scripts/comate.sh doctor` |
96
-
97
- ### 2.2 OpenSpec(WHAT 侧)
98
-
99
- 处理提案/规约生命周期/归档。comate 的 open 和 archive 阶段依赖它。
11
+ agent 通过 `node "$COMATE" <command> --json` 调用;人可以用全局的 `comate status` / `comate doctor`(转发到同一个脚本)。
100
12
 
101
13
  ```bash
102
- npm install -g @fission-ai/openspec@latest
103
- # --tools 必填:openspec 靠探测已有 agent 配置目录决定写哪些 tool 文件,
104
- # 干净项目里探测不到会直接报 No tools detected 退出
105
- cd <project-root> && openspec init . --tools none
106
- openspec list --json # 验证安装
14
+ status [<name>] 当前位置 + 下一步(只读)
15
+ new <name> [--mode full|fix] [--source <file>]... [--base <branch>]
16
+ open <name> --prepare 校验 brief/spec,抽取验收项,生成确认摘要
17
+ open <name> --confirm --expect <v>:confirm 用户确认后进入 build
18
+ rename <name> <new> 仅 open 阶段
19
+ spec remove|restore <name> <capability> 登记 / 取消删除一个主能力
20
+ handoff <name> --input <json> --expect <v>:<step> 提交候选实现,脚本跑检查命令
21
+ handoff <name> --recheck --expect <v>:checking 检查被中断时重跑
22
+ verify <name> --result <json> | --error "<原因>" | --unavailable --expect <v>:await-verifier
23
+ probe <name> [--remove <dir>] 反向验证用的临时 worktree(系统临时目录)
24
+ decide <name> --expect <v>:<step>
25
+ --accept --finish keep|merge|pr|push
26
+ | --revise-implementation --note "<要改什么>"
27
+ | --revise-requirements [--note "<原因>"]
28
+ | --resolve --note "<补充信息>"
29
+ | --upgrade fix 转 full
30
+ archive <name> [--dry-run]
31
+ doctor [--repair] 健康检查;--repair 清理临时文件与残留 worktree
32
+ import-specs [--dry-run] openspec/specs → comate/comate/specs
107
33
  ```
108
34
 
109
- comate 使用以下 OpenSpec 能力(以技能形式调用):`openspec-explore`、`openspec-new-change`、`openspec-propose`、`openspec-verify-change`。请确认这些技能在你的平台技能目录中可用。
35
+ 退出码:`0` 成功 · `1` 被守卫拦截(输出里带最新 next 和修复方法)· `2` 用法错误 · `3` 环境缺失(非 git 仓库、未 init)· `4` 状态损坏。
110
36
 
111
- ### 2.3 Superpowers(HOW 侧)
37
+ ## 命令说明
112
38
 
113
- 处理技术设计/规划/执行/收尾。comate 的 design、build 和 verify 阶段依赖它。
39
+ ### 只读命令
114
40
 
115
- `comate init` 已用 `skills add obra/superpowers -g` 装到用户级。手动补装同理。确认以下技能可加载:
41
+ - **status [name]**:查看当前状态和下一步。无参数时列出所有进行中的 change;有多个时提示选择。
42
+ - **doctor [--repair]**:健康检查。`--repair` 清理临时文件与残留 worktree。
116
43
 
117
- - `superpowers:brainstorming`
118
- - `superpowers:writing-plans`
119
- - `superpowers:subagent-driven-development`
120
- - `superpowers:executing-plans`
121
- - `superpowers:using-git-worktrees`
122
- - `superpowers:finishing-a-development-branch`
44
+ ### 初始化
123
45
 
124
- **如果任何 Superpowers 步骤不可用,对应阶段必须停止并提示安装。不得用普通对话替代。**
46
+ - **new <name> [--mode full|fix] [--source <file>]... [--base <branch>]**
47
+ - 创建新 change,默认 full 模式
48
+ - `--mode fix`:小修模式(bug 修复、小调整),brief 三章、免确认
49
+ - `--source <file>`:需求来自文件时钉住哈希,brief 会带「来源覆盖」表
50
+ - `--base <branch>`:指定基础分支(默认当前分支)
51
+ - 在 protected_branches 上会自动切到 `comate/<name>` 分支
125
52
 
126
- ### 2.4 comate 本身
53
+ ### open 阶段
127
54
 
128
- comate 以 npm 包分发(`npm install -g @house365/comate`),`comate init` 通过 skills CLI 装到用户级 `~/.agents/skills`,一次装完所有项目共用,支持 Claude Code、Codex、Cursor 等 70+ agent。
55
+ - **open <name> --prepare**:校验 brief/spec,抽取验收项 A1…An,生成确认摘要
56
+ - **open <name> --confirm --expect <v>:confirm**:用户确认后进入 build
57
+ - **rename <name> <new>**:重命名 change(仅 open 阶段)
58
+ - **spec remove|restore <name> <capability>**:登记/取消删除一个主能力
129
59
 
130
- ### 2.5 docs/ 知识库骨架(阶段 0 用)
60
+ ### build 阶段
131
61
 
132
- `comate init` 会在项目里铺出 `docs/` 骨架,供 `/comate-gate` 读写 PRD:
62
+ - **handoff <name> --input <json> --expect <v>:<step>**
63
+ - 提交候选实现,脚本跑检查命令
64
+ - `<json>` 包含:summary、addressed(验收 ID 列表)、manual_checks、known_limits
65
+ - **handoff <name> --recheck --expect <v>:checking**:检查被中断时重跑
133
66
 
134
- ```
135
- docs/
136
- ├── README.md # docs 目录说明
137
- ├── architecture/README.md # 架构规范占位(契约事实源,需项目自建)
138
- └── knowledge-base/
139
- ├── README.md # PRD → comate 流程说明 + 命名约定
140
- ├── requirements/_templates/PRD.md # PRD 模板
141
- └── integrations/_TEMPLATE/ # 第三方对接档案模板(README + api-snapshot)
142
- ```
67
+ ### verify 阶段
143
68
 
144
- - 路径与 `comate-lib.sh` 硬编码的 `comate_kb_root=docs/knowledge-base` 对齐,PRD 放 `requirements/<YYYYMMDD-功能名>/` 下。
145
- - **幂等且不覆盖**:逐文件跳过已存在的,重跑 `comate init` 不动你已改过的 docs。
146
- - `architecture/` 只给占位 README(架构内容项目专属),是 PRD 门禁「契约对齐」的事实源,需按项目实际补齐。
147
- - PRD 是需求入口,具体实现约束由 change 的 proposal/design/tasks 承接。
69
+ - **verify <name> --result <json> --expect <v>:await-verifier**
70
+ - verifier 提交验收结果
71
+ - `<json>` 必须包含:token、candidate、acceptance(逐项结论)、reverse_checks、risks、summary
72
+ - **verify <name> --error "<原因>" --expect <v>:await-verifier**
73
+ - verifier 崩溃/超时时报告,脚本重签 token 再派新的(≤2 次)
74
+ - **verify <name> --unavailable --expect <v>:await-verifier**
75
+ - 平台无子 agent 时降级(必须有自动测试)
76
+ - **probe <name>**:创建反向验证用的临时 worktree,返回路径
77
+ - **probe <name> --remove <dir>**:删除临时 worktree
148
78
 
149
- ### 2.6 comate 本身的技能布局
79
+ ### 决策点
150
80
 
151
- 采用扁平布局——每个 phase 是顶层技能目录,而非 `comate/<phase>/` 嵌套。部分 agent(含 Claude Code)只发现顶层目录,扁平是共同可用的最小公倍数:
81
+ - **decide <name> --expect <v>:<step> <action>**
82
+ - `--accept --finish keep|merge|pr|push`:接受结果并选择收尾方式
83
+ - `--revise-implementation --note "<要改什么>"`:回 build 修改实现
84
+ - `--revise-requirements [--note "<原因>"]`:需求要变,回 open 重新确认
85
+ - `--resolve --note "<补充信息>"`:补充信息解除 blocked 状态
86
+ - `--upgrade`:fix 升级为 full
152
87
 
153
- ```
154
- skills/
155
- |-- comate/ # 主入口 + 共享资源
156
- | |-- SKILL.md
157
- | |-- reference/
158
- | | |-- dirty-worktree.md
159
- | | |-- decision-points.md
160
- | | |-- prerequisites.md
161
- | |-- scripts/
162
- | | |-- comate-lib.sh # 库函数
163
- | | |-- comate.sh # 调度器 + 状态机(单一入口)
164
- | |-- tests/
165
- |-- comate-open/SKILL.md # 阶段 1:启动
166
- |-- comate-design/SKILL.md # 阶段 2:深度设计
167
- |-- comate-build/SKILL.md # 阶段 3:规划与构建
168
- |-- comate-verify/SKILL.md # 阶段 4:验证与收尾
169
- |-- comate-archive/SKILL.md # 阶段 5:归档
170
- |-- comate-fix/SKILL.md # 预设:快速小改动(bug + 调整)
171
- ```
88
+ ### 归档
172
89
 
173
- 一键健康检查:`bash comate/scripts/comate.sh doctor`
90
+ - **archive <name> [--dry-run]**
91
+ - 写入主 spec、移目录、提交、执行收尾
92
+ - `--dry-run`:只做预检,列出将执行的步骤
93
+ - 中断后重跑会按证据从断点继续
174
94
 
175
- ---
95
+ ### 迁移
176
96
 
177
- ### 2.7 Token 用量:`comate usage`
97
+ - **import-specs [--dry-run]**:将 `openspec/specs/` 的主规格复制到 `comate/comate/specs/`
178
98
 
179
- 终端命令,查看**当前项目**的 token 消耗与估算成本。封装 [ccusage](https://github.com/ryoppippi/ccusage)——它作为 comate 的依赖随包安装,`comate doctor` 会检测其可用性(缺失时回退 `npx ccusage@latest`)。
99
+ ## 2. next(下一步指令)
180
100
 
181
- ```bash
182
- comate usage # 本项目按会话(session)统计(默认)
183
- comate usage daily # 本项目按天
184
- comate usage --global # 全部项目,不做项目隔离
185
- comate usage codex daily # 单看某个 agent
186
- comate usage --json -s 2026-08-01 # 其余参数原样透传给 ccusage
187
- ```
188
-
189
- **项目隔离原理**:ccusage 默认全局聚合、无项目过滤。comate 在临时目录里为当前项目重建一个 scoped 配置根,用 `CLAUDE_CONFIG_DIR` + `CODEX_HOME` 指过去,命令结束即清理:
190
-
191
- - **Claude Code**:数据本就按 `~/.claude/projects/<编码 cwd>/` 分目录,硬链接本项目那一个目录的 `*.jsonl` 进 scoped 根。
192
- - **Codex**:数据按日期平铺(`~/.codex/sessions/YYYY/MM/DD/`),项目路径藏在每个文件的 `session_meta.cwd`,故按 `cwd` 过滤后硬链接命中的文件。
193
-
194
- 用硬链接而非目录 symlink/junction:Windows 下 ccusage 的文件扫描不遍历 symlink/junction 目录,硬链接则表现为真实文件。硬链接跨盘失败时回退复制。两个 agent 的 scoped 根都会设,未命中的 agent 报 0 而非泄漏全局数据。
195
-
196
- **边界**:粒度到项目/会话级,不做 open/design/build 阶段级归因(需在状态机流转处打时间戳,属后续增强)。
101
+ 每条命令执行完都输出一个 `next` 对象,告诉 agent 当前状态和下一步该做什么。
197
102
 
198
- ---
103
+ ### 核心字段
199
104
 
200
- ## 3. 快速开始
201
-
202
- ### 3.1 基本用法
105
+ | 字段 | 含义 |
106
+ |---|---|
107
+ | `disposition` | 决定 agent 如何响应:<br>• `continue` — 读 reference(首次),完成工作,执行 command<br>• `await-user` — 转述 message,用 alternatives 让用户选<br>• `blocked` — 处理 message 列出的问题,重跑 status<br>• `done` — 流程结束,报告结果 |
108
+ | `action` | 当前动作标识(write-brief / build / dispatch-verifier / accept / archive 等) |
109
+ | `reference` | agent 该读的文档路径(只在首次进入该阶段时读) |
110
+ | `message` | 人话说明当前状态和下一步 |
111
+ | `command` | 要执行的命令数组(`$COMATE` 会替换成脚本绝对路径) |
112
+ | `alternatives` | `await-user` 时的互斥选项列表,每项包含 label 和 command |
113
+ | `version` / `step` | 乐观锁版本号,用于 `--expect <version>:<step>` 防止并发冲突 |
114
+ | `dispatch` | 派发给下游的任务包(确认摘要 / build 上下文 / verifier 派发) |
115
+ | `template` | 要填写的 JSON 结构模板 |
116
+
117
+ ### disposition 决策表
118
+
119
+ | disposition | agent 动作 |
120
+ |---|---|
121
+ | `continue` | 1. 如果是本阶段第一次,读 `reference` 文档<br>2. 完成 `message` 描述的工作<br>3. 执行 `command`(占位符 `<…>` 换成实际值) |
122
+ | `await-user` | 1. 向用户转述 `message`(accept 时需列出 risks)<br>2. 用 AskUserQuestion 把 `alternatives` 作为选项<br>3. 用户选哪个就执行哪个的 `command` |
123
+ | `blocked` | 1. 处理 `message` 或 `warnings` 列出的问题<br>2. 处理完后重跑 `status` 获取最新 next |
124
+ | `done` | 向用户报告最终结果,流程结束 |
125
+
126
+ ### 版本控制与冲突检测
127
+
128
+ - **`--expect` 参数**:用户决策类命令(decide)和 handoff 必须带 `--expect <version>:<step>`
129
+ - **版本来源**:只能用最新 next 里的 version 和 step,不要自己拼接
130
+ - **冲突拒绝**:脚本写状态前会校验版本,不匹配就拒绝(退出码 1)并返回最新 next
131
+ - **作用**:防止基于过期状态操作(如用户在另一处改了文档,agent 还在用旧版本 handoff)
132
+
133
+ ## 3. 状态机
134
+
135
+ comate 状态机管理整个开发流程,状态存储在 `state.json` 中,由脚本原子写入(写前复核 version)。
136
+
137
+ ### 节点与转换
138
+
139
+ | 节点 | phase / step | 如何离开 | 说明 |
140
+ |---|---|---|---|
141
+ | **Drafting** | open / drafting | `open --prepare` | 起草 brief 和 spec(fix 模式直接进 Building) |
142
+ | **AwaitConfirm** | open / confirm | `open --confirm` | 等待用户确认验收项和范围 |
143
+ | **Building** | build / building | `handoff` | 首轮实现 |
144
+ | **Repairing** | build / repairing | `handoff` | 验收失败后的修复轮 |
145
+ | **Checking** | verify / checking | 自动 | 脚本执行检查命令,通过进 AwaitVerifier,失败回 Repairing/Stuck |
146
+ | **AwaitVerifier** | verify / await-verifier | `verify --result/error/unavailable` | 等待独立 verifier 提交验收结果 |
147
+ | **AwaitAccept** | verify / accept | `decide --accept/revise-*` | 验收全通过,等待用户接受并选收尾方式 |
148
+ | **Stuck** | verify / stuck | `decide --revise-*` | 失败达上限或连续 3 轮无进展 |
149
+ | **Blocked** | verify / blocked | `decide --resolve` | 验收被阻塞(缺外部信息) |
150
+ | **Degraded** | verify / degraded | `decide --accept` | 降级验收(无独立 verifier,只有自动测试) |
151
+ | **ArchiveReady** | archive / ready | `archive` | 准备归档 |
152
+ | **Done** | archive / done | — | 流程完成 |
153
+
154
+ ### 关键机制
155
+
156
+ **进展判断**
157
+ - 本轮未通过的验收项是上轮的严格子集 = 有进展
158
+ - 连续 2 轮无进展时,next 提示换思路
159
+ - 连续 3 轮无进展或失败达 `max_verify_failures`(默认 5)→ Stuck
160
+
161
+ **候选锁定**
162
+ - handoff 时实现必须已提交,HEAD 的 commit sha 即候选 ID
163
+ - 验收期间 HEAD 变化 → 结果作废,计一次失败,回 Repairing
164
+
165
+ **文档冻结**
166
+ - 确认后,brief、spec、登记的删除、源文件都记录哈希
167
+ - 后续阶段发现改动 → 拒绝,必须 `decide --revise-requirements` 回 open 重新确认
168
+
169
+ **工作区要求**
170
+ - handoff、verify 和 archive 时,change 目录外必须干净(无未提交改动)
171
+ - 保证验收的是实际提交的实现,不含临时改动
172
+
173
+ ## 4. 产物与验收
174
+
175
+ ### change 目录结构
203
176
 
204
177
  ```
205
- /comate add pagination to user management page
206
- /comate fix login page password mask not showing after input
207
- /comate change button text from 'Submit' to 'Confirm'
178
+ comate/comate/changes/<name>/
179
+ state.json 唯一真相源,只由脚本写(原子替换,写前复核 version)
180
+ brief.md agent 写:目标、范围、非目标、验收示例、约束与不变量、决定、待决问题
181
+ specs/<cap>/spec.md agent 写:归档后的完整行为(Requirement + Scenario WHEN/THEN)
182
+ verification.md 脚本从 state.json 生成,记录每轮验收结果
208
183
  ```
209
184
 
210
- ### 3.2 自动检测逻辑
211
-
212
- 当 `/comate` 被调用时,智能体按以下顺序检测当前阶段:
213
-
214
- **步骤 0:活动变更发现 + 意图检测**
215
-
216
- 1. 先检测预设:如果 fix 条件匹配(bug 修复或非 bug 小调整),直接调用 `/comate-fix`。
217
- 2. 无预设匹配:运行 `openspec list --json` 获取所有活动变更。
218
-
219
- | 活动变更 | 用户输入 | 行为 |
220
- |---------------|------------|------|
221
- | 无 | 非预设输入 | 调用 `/comate-open` |
222
- | 恰好 1 个 | `/comate <描述>` | 询问:继续此变更还是创建新变更 |
223
- | 多个 | `/comate <描述>` | 询问:继续现有还是创建新变更;如继续,列出供选择 |
224
- | 恰好 1 个 | `/comate` 无描述 | 自动选择,进入步骤 1 |
225
- | 多个 | `/comate` 无描述 | 列出变更供用户选择 |
226
-
227
- > 当用户选择"创建新变更"时,必须调用 `/comate-open`。不要直接调用 `/opsx:new`。`/comate-open` 执行双重初始化:OpenSpec 产出物(通过内部 `/opsx:new`)+ `.comate.yaml` 状态文件。
228
-
229
- **步骤 1:读取 `.comate.yaml` 状态元数据**
230
-
231
- 优先读取 `openspec/changes/<name>/.comate.yaml`。当不可用时,回退到 `openspec status --change "<name>" --json`、`tasks.md`、`docs/superpowers/` 文件检查。
232
-
233
- **步骤 2:阶段判定**(按顺序检查,首次匹配即生效)
234
-
235
- 1. `archived: true` 或变更已在归档中 -> 流程完成
236
- 2. `verify_result: pass` 且 `archived` 不为 `true` -> 调用 `/comate-archive`
237
- 3. `verify_result: fail` -> 验证失败决策阻塞点(决策点 4)
238
- 4. `phase: verify` -> 调用 `/comate-verify`。`tasks.md` 全部勾选不能单独触发 verify;从 verify-fail 回到 build 后必须按 build 路由继续修复。
239
- 5. `phase: build` 或有设计文档但计划/执行不完整 -> 按工作流路由
240
- 6. `phase: design` 或有变更但无设计文档 -> 调用 `/comate-design`
241
- 7. `phase: open` 或有活动变更但 `.comate.yaml` 缺失 -> 调用 `/comate-open`
242
- 8. 无活动变更 -> 调用 `/comate-open`
243
-
244
- ### 3.3 预设升级条件
245
-
246
- **fix(bug 模式)-> full**(任意匹配即触发升级):变更 >= 3 个文件 / 架构变更(新模块、新接口、新依赖)/ 数据库 schema 变更 / 新增公共 API / 范围超出单一功能模块。
247
-
248
- **fix(调整模式)-> full**(任意匹配即触发升级):变更 >= 5 个文件 / 跨模块协调 / 需要 >= 5 个新测试用例 / 配置项新增/删除(非值变更)/ 需新增能力 / 需 delta spec。
249
-
250
- ### 3.4 错误处理快速参考
251
-
252
- | 场景 | 处理方式 |
253
- |----------|----------|
254
- | `openspec list --json` 失败 | 检查 openspec 安装,提示 `openspec init . --tools none` |
255
- | 子技能不可用 | 停止流程,提示运行 `comate init` 补装 |
256
- | `.comate.yaml` 损坏或缺失 | 以文件状态为真相源,用 `state set` 修复后继续 |
257
- | 构建/测试失败 | 回到 build 阶段修复,不要进入 verify |
258
- | 变更目录结构不完整 | 按 comate-open 产出物要求补全缺失文件 |
259
-
260
- ---
261
- ## 4. 命令参考:/comate 主命令
262
-
263
- ### 4.1 自动检测与连续执行
264
-
265
- 单次 `/comate` 调用从检测到的阶段开始,当退出条件满足时推进到下一阶段。智能体会自动推进后续阶段,但必须在决策阻塞点暂停,直到收到用户确认。自动推进仅适用于非决策型流程转换。
266
-
267
- ### 4.2 断点恢复规则
268
-
269
- - 每次上下文恢复时,重新运行步骤 0 和步骤 1。不要信任对话历史来进行阶段检测。
270
- - 当存在活动变更且工作树有未提交更改时,遵循 `comate/reference/dirty-worktree.md` 协议。
271
- - 如果 `phase: build`,检查 `build_mode` 和 `isolation` 是否已设置;如有任一未设置,返回 `/comate-build` 完成;如两者均已设置,读取 tasks.md 找下一个未完成的任务。
272
- - 如果 `phase: verify` 且 `verify_result: fail`,进入验证失败决策点(决策点 4)。
273
- - 如果 `phase: open` 但 proposal/design/tasks 已完成,运行 `bash $COMATE guard <name> open --apply` 修复状态,然后继续检测。
274
- - 如果 `phase: archive`,只调用 `/comate-archive`。成功归档后,变更移至 archive 目录。不要对旧的活动目录运行 guard。
275
-
276
- ### 4.3 脚本位置(单一入口)
277
-
278
- comate 收敛到一个调度器:`comate/scripts/comate.sh`。技能只需定位此脚本并缓存到 `$COMATE`:
279
-
280
- ```bash
281
- COMATE="${COMATE:-$(for r in . ./.claude/skills "$HOME"/.claude/skills "$HOME"/.config/skills "$HOME"/.cursor/skills; do
282
- [ -d "$r" ] && find "$r" -maxdepth 6 -path '*/comate/scripts/comate.sh' -type f -print -quit 2>/dev/null
283
- done | head -1)}"
284
- if [ -z "$COMATE" ]; then
285
- echo "ERROR: comate.sh 未找到,请确认 comate skill 已安装。" >&2
286
- return 1 2>/dev/null || exit 1
287
- fi
185
+ ### 验收项来源
186
+
187
+ 验收项(A1、A2…)从以下来源抽取:
188
+
189
+ 1. **brief.md 的「验收示例」章节**:每个列表项(`- `)算一项
190
+ 2. **spec.md 的 Scenario**:每个 `### Scenario:` 算一项
191
+ 3. **被删除的 Scenario**:每个从现有主 spec 删除的 Scenario 算一项,verifier 必须确认行为已移除或按迁移规则处理
192
+
193
+ 抽取规则:
194
+ - brief 按出现顺序编号:A1、A2…
195
+ - spec 按文件路径字典序 + 章节顺序编号,接在 brief 之后
196
+ - 修改已有能力时,与主 spec 完全一致的 Scenario 标为 `regression`(已有测试须通过),其余标 `changed`(逐项细验)
197
+
198
+ ### 主规格写入
199
+
200
+ 归档时每个能力按以下三种操作之一写入 `comate/comate/specs/`:
201
+
202
+ | 操作 | 条件 | 行为 |
203
+ |---|---|---|
204
+ | `create` | 主 spec 不存在 | 直接写入 |
205
+ | `replace` | 主 spec 存在且哈希等于确认时的基线 | 覆盖写入 |
206
+ | `remove` | 显式通过 `spec remove` 登记 | 删除主 spec 文件 |
207
+
208
+ **不做 delta 合并**:归档的 spec 是完整行为,不是增量。如果基线不符(别的 change 先改了同一能力),拒绝归档,要求:
209
+ 1. rebase 当前分支
210
+ 2. 重读最新主 spec
211
+ 3. 修改本 change 的 spec
212
+ 4. `decide --revise-requirements` 重新确认
213
+
214
+ ## 5. 配置 `comate/comate/config.json`
215
+
216
+ | 字段 | 默认值 | 说明 |
217
+ |---|---|---|
218
+ | `build_command` | `null` | 构建命令。字符串、命令对象或它们组成的数组;`null` 自动探测(npm / Maven / Cargo / Go);`"none"` 表示确实没有 |
219
+ | `verify_command` | `null` | 验收检查命令。同上。命令对象为 `{ "cmd": "<命令>", "kind": "test" \| "check" }`。handoff 需要配置、探测成功或显式写 `"none"`;降级验收另需成功执行的 test 类型检查 |
220
+ | `check_timeout_seconds` | `900` | 单条检查命令的超时时间(秒) |
221
+ | `max_verify_failures` | `5` | 验收失败次数上限,到达后转 Stuck 状态 |
222
+ | `finish` | `"ask"` | 收尾模式。`"ask"` 每次都停下问用户;`"auto"` 全部通过且无 risks 时自动归档 |
223
+ | `auto_finish_action` | `null` | `finish: auto` 时的收尾方式。`null` 或 `"keep"` 只本地归档;`"merge"` / `"push"` / `"pr"` 需显式配置 |
224
+ | `protected_branches` | `["main","master"]` | 受保护分支列表。`new` 在这些分支上执行时自动切到 `comate/<name>` 分支 |
225
+
226
+ **配置示例**
227
+
228
+ ```json
229
+ {
230
+ "build_command": "npm run build",
231
+ "verify_command": "npm test",
232
+ "check_timeout_seconds": 600,
233
+ "max_verify_failures": 3,
234
+ "finish": "auto",
235
+ "auto_finish_action": "keep",
236
+ "protected_branches": ["main", "master", "develop"]
237
+ }
288
238
  ```
289
239
 
290
- 然后全程复用 `$COMATE`:
291
-
292
- ```bash
293
- bash "$COMATE" state <name> init <full|fix> # 初始化 .comate.yaml
294
- bash "$COMATE" state <name> transition <event> # 执行状态转换
295
- bash "$COMATE" state <name> check <phase> [--json] # 检查阶段进入条件
296
- bash "$COMATE" state <name> recover <phase> # 从文件状态推断修复 .comate.yaml
297
- bash "$COMATE" state <name> scale # 评估变更规模
298
- bash "$COMATE" state <name> validate # 验证 .comate.yaml 完整性
299
- bash "$COMATE" guard <name> <phase> [--apply] [--json] # 阶段门禁
300
- bash "$COMATE" handoff <name> <design|build> --write [--full] # 生成交接包
301
- bash "$COMATE" archive <name> [--dry-run] # 执行归档
302
- bash "$COMATE" status
303
- bash "$COMATE" doctor
304
- ```
305
-
306
- `guard --apply` 在检查通过后委托给 `state transition`。退出码约定:`0` 通过 / `1` 验证阻塞 / `2` 用法错误 / `3` 环境缺失 / `4` 状态文件损坏。
307
-
308
- ---
309
-
310
- ## 5. 阶段详解
311
-
312
- ### 5.1 阶段 1:启动(/comate-open)
313
-
314
- **归属**:OpenSpec
315
- **触发条件**:无活动变更,或用户明确要求新变更
316
- **产出物**:proposal.md, design.md, tasks.md, `.comate.yaml`
317
-
318
- **步骤**:
319
-
320
- 1. **理解意图**:如果提供了用户描述则遵循;否则通过 2-3 轮对话澄清,建立意图、功能边界和验收标准。
321
- 2. **探索现有能力**:调用 `openspec-explore` 探索现有能力和规约状态。
322
- 3. **创建变更目录**:调用 `openspec-new-change`(内部 `/opsx:new`)生成 proposal.md、design.md、tasks.md 骨架,**并立即写入 `.comate.yaml`**。
323
- 4. **提案审核**:调用 `openspec-propose` 充实 proposal、design、tasks。
324
- 5. **产出物审核(决策点 1,按来源分类)**:proposal/design/tasks 完成且内容全面后先按来源分类——**PRD 扇出且范围与 gate 映射一致**时属自动处理,完整性检查通过即自动流转并报告承接情况,不再暂停;**对话来源**或 **PRD 扇出但范围有偏差**时暂停等待用户确认或调整请求。详见 `comate/reference/decision-points.md` 第 1 条。
325
- 6. **退出**:用户确认后,运行 `bash $COMATE guard <name> open --apply` 进行验证并自动推进到 design。
326
-
327
- ### 5.2 阶段 2:深度设计(/comate-design)
328
-
329
- **归属**:Superpowers
330
- **触发条件**:活动变更已存在(proposal/design/tasks 已完成),但尚无设计文档
331
- **产出物**:设计文档(`docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md`)、delta spec
332
-
333
- **步骤**:
334
-
335
- 1. **加载输入**:读取 proposal.md、design.md、tasks.md、delta spec(如存在)。从 `.comate.yaml` 获取交接上下文(如有)。
336
- 2. **头脑风暴(强制)**:调用 `superpowers:brainstorming` 产出技术方案。在头脑风暴之前不要创建最终设计文档。
337
- 3. **方案确认(决策点 2)**:头脑风暴产出技术方案后,暂停让用户确认方案方法、关键权衡、测试策略、Spec Patch。在确认之前不要创建设计文档、写 `design_doc`、运行设计 guard 或进入 build。
338
- 4. **创建设计文档**:确认后,在 `docs/superpowers/specs/` 下创建设计文档。
339
- 5. **更新 delta spec**:如果头脑风暴产出了 spec 变更,同步到 delta spec。
340
- 6. **写入交接包**:运行 `bash $COMATE handoff <name> design --write`
341
- 7. **退出**:运行 `bash $COMATE guard <name> design --apply`,通过后自动推进到 build。
342
-
343
- ### 5.3 阶段 3:规划与构建(/comate-build)
344
-
345
- **归属**:Superpowers
346
- **触发条件**:设计文档已创建,但计划/执行不完整
347
- **产出物**:实现计划(`docs/superpowers/plans/YYYY-MM-DD-<feature>.md`)、代码提交
348
-
349
- **步骤**:
350
-
351
- 1. **加载输入**:读取设计文档、delta spec、tasks.md、交接包(如有)。
352
- 2. **生成实现计划**:调用 `superpowers:writing-plans` 将设计文档转换为可执行的任务和步骤。将修正同步到 tasks.md。
353
- 3. **构建模式选择(决策点 3)**:执行前,一次性询问工作空间隔离方式(branch/worktree)和执行模式(subagent-driven-development/executing-plans)。在一次交互中获取两个选择。
354
- 4. **规模评估**:运行 `bash $COMATE state <name> scale` 评估变更规模并写入 `verify_mode`。
355
- 5. **执行实现**:按选定模式执行。构建过程中,delta spec 可能随任务进展被修改。
356
- 6. **范围扩展(决策点 7)**:如果实现过程揭示需要重新设计或拆分为新变更,暂停。判定标准:基于初始 tasks.md 任务数,新增任务超过总数一半(50% 阈值)视为超出范围。询问用户是否拆分。
357
- 7. **写入交接包**:运行 `bash $COMATE handoff <name> build --write`
358
- 8. **退出**:运行 `bash $COMATE guard <name> build --apply`,通过后自动推进到 verify。
359
-
360
- ### 5.4 阶段 4:验证与收尾(/comate-verify)
361
-
362
- **归属**:两者
363
- **触发条件**:代码已提交,所有 tasks.md 任务已完成
364
- **产出物**:验证报告、分支处理
365
-
366
- **步骤**:
240
+ **自动探测规则**
367
241
 
368
- 1. **进入验证与分类**:检查脏工作树,运行 guard,运行构建/测试命令。将失败分类为 SPEC、REGRESSION、COVERAGE、SECURITY、STYLE、OTHER。
369
- 2. **验证失败决策(决策点 4)**:验证失败时,暂停让用户决定:全部修复 / 逐项处理 / 接受偏差。包括 Spec 漂移处理(设计文档与 delta spec 冲突)。CRITICAL 级别的失败必须修复。仅在用户选择修复后才执行 `state transition <name> verify-fail` 并返回 build。
370
- 3. **验证通过**:全部通过或用户接受偏差后,写入 `verify_result: pass`,将验证报告路径写入 `verification_report`。
371
- 4. **分支收尾(决策点 5)**:调用 `superpowers:finishing-a-development-branch`。暂停让用户选择:本地合并 / 推送为 PR / 保留分支 / 丢弃工作。前三项完成后写 `branch_status: handled`;丢弃写 `branch_status: discarded` 并停止,不得验证通过或归档。
372
- 5. **退出**:运行 `bash $COMATE guard <name> verify --apply`,通过后自动推进到 archive。
242
+ 当 `build_command` 或 `verify_command` 为 `null` 时,脚本按以下顺序探测:
373
243
 
374
- ### 5.5 阶段 5:归档(/comate-archive)
244
+ 1. **npm**:存在 `package.json` 且有 `scripts.build` / `scripts.test`
245
+ 2. **Maven**:存在 `pom.xml` → `mvn package` / `mvn test`
246
+ 3. **Cargo**:存在 `Cargo.toml` → `cargo build` / `cargo test`
247
+ 4. **Go**:存在 `go.mod` → `go build ./...` / `go test ./...`
375
248
 
376
- **归属**:OpenSpec
377
- **触发条件**:验证已通过,分支已处理
378
- **产出物**:delta->main spec 同步、设计文档标注、变更移至归档
249
+ 确实没有构建或测试命令时,显式配置为 `"none"`,否则 handoff 会被拦截。
379
250
 
380
- **路径迁移**:change 目录从 `openspec/changes/<name>/` 移到 `openspec/changes/archive/YYYY-MM-DD-<name>/`。归档脚本会同步修正失效引用:
381
- - 归档后 `.comate.yaml` 中随目录移动的自指字段(`source_manifest` / `handoff_context` / `impl_context`)重写为归档路径,确保 `sources <name> check/list` 对归档 change 仍可用;
382
- - 设计文档 / plan 正文中指向旧 `openspec/changes/<name>/` 的引用重写为归档路径,并在 frontmatter 留 `archived-with` 面包屑;
383
- - `design_doc` / `plan` 字段本身指向 `docs/superpowers/`,该目录不移动,保持不变。
251
+ 降级验收会识别 Node `--test`、Jest、Vitest、Mocha、AVA、pytest、Maven/Cargo/Go 测试入口,并展开引用的 npm 脚本及生命周期钩子。未知自定义测试需显式配置,例如 `"verify_command": { "cmd": "node tools/run-tests.js", "kind": "test" }`。纯编译、语法检查、只列举/跳过测试或掩盖失败的已知命令即使声明为 test,也不能作为降级依据;编译后实际运行测试的命令链仍可识别为测试。
384
252
 
385
- **步骤**:
253
+ npm 支持普通 `test` / `run` / `run-script`、完整脚本名、常见静默参数及嵌套脚本。无法解析的 npm 调用和跨包的 `--prefix` / `--workspace` / `-w` 形式不能支持降级,须使用独立 verifier。降级命令链使用 `&&` 保留失败退出码;独立管道、分号或单个 `&` 分隔的命令链不作为测试依据。命令分类不是通用 shell 解释器,也不证明自定义脚本的断言质量。
386
254
 
387
- 1. **加载输入**:读取 delta spec、设计文档、tasks.md、验证报告。
388
- 2. **同步 spec**:对每个 delta spec 能力,调用 `openspec-verify-change`,通过后合并到 main spec。
389
- 3. **更新设计文档**:在设计文档末尾追加实现摘要(实际实现差异、关键决策、验证结果)。
390
- 4. **执行归档**:运行 `bash $COMATE archive <name> --dry-run` 预览,如无问题则运行正式归档。
391
- 5. **退出**:运行 `bash $COMATE guard <name> archive --apply`,通过后变更移至 archive 目录。
255
+ 确认时保存命令类型和引用的 npm 脚本定义,降级时与候选执行计划及当前计划比较。空计划也参与比较;计划变化或旧状态缺少完整计划时,需要 `decide --revise-requirements` 重新确认,或使用独立 verifier。允许修改实现和测试源码,但命令声明不能替代逐项行为证据。
392
256
 
393
- ---
394
- ## 6. 预设路径:fix
257
+ ## 6. 故障排除
395
258
 
396
- ### 6.1 概述
259
+ | 现象 | 原因 | 处理方法 |
260
+ |---|---|---|
261
+ | `status` 显示 `resolve-drift` | 确认后的文档或源文件被改动 | • 误改:`git checkout -- <文件>` 还原<br>• 需求要变:`decide --revise-requirements` 回 open |
262
+ | handoff 被拦「未提交改动」 | 实现代码或测试未提交 | 提交实现和测试后重新 handoff(change 目录内的 state.json 除外) |
263
+ | handoff 被拦「addressed 未覆盖验收项」 | handoff 没有列出本轮要求覆盖的验收 ID | 在 handoff JSON 的 `addressed` 中补齐 ID;修复轮至少覆盖上一轮未通过项 |
264
+ | handoff 被拦「没有配置 verify_command」 | config.json 缺测试命令配置 | • 有测试:在 config.json 写 `"verify_command": "<命令>"`<br>• 确实没有:写 `"verify_command": "none"` |
265
+ | verify 被拦「token 不匹配」 | 结果来自旧的派发 | 用最新 next 的 dispatch.token 重新派 verifier |
266
+ | verify 被拦「工作区不干净」 | handoff 后有未提交的改动 | 提交或清理未提交的改动(verifier 必须只读主工作区) |
267
+ | verify 被拦「HEAD 变了」 | 验收期间又提交了代码 | 结果作废,重新 handoff。避免在验收期间修改代码 |
268
+ | archive 被拦「基线不符」 | 主 spec 在确认后被别的 change 改过 | 1. rebase 当前分支<br>2. 重读最新主 spec<br>3. 修改本 change 的 spec<br>4. `decide --revise-requirements` 重新确认 |
269
+ | archive 被拦「验收后又提交了」 | 验收通过后改了 change 目录外的代码 | `decide --revise-implementation` 重新验收 |
270
+ | archive 中途失败 | 写主 spec、移目录、提交或收尾某步失败 | 修复失败原因后重跑 `archive <name>`,脚本按证据从断点继续 |
271
+ | 收尾失败(merge/push/pr) | 无 origin、无 gh、目标 worktree 不干净、冲突 | • next 为 `retry-finish`:按提示处理后重跑 `archive`<br>• 放弃该收尾:执行 alternatives 里的「改为保留分支」 |
272
+ | 退出码 4(状态损坏) | state.json 格式错误或字段缺失 | 1. 运行 `comate doctor` 查看详情<br>2. 从 git 历史恢复:`git checkout -- <state.json 路径>`<br>3. 不要手动编辑 state.json 字段 |
273
+ | 发现 0.x 的 `.comate.yaml` | 旧版 change 残留 | 用 comate 0.10.x 完成旧 change;主规格用 `comate import-specs` 迁移 |
397
274
 
398
- **适用场景**:快速小改动,跳过头脑风暴(及完整计划)。覆盖两种模式,调用时判定「是不是 bug」。
399
- **流程**:open -> build -> verify -> archive
275
+ ### 常见陷阱
400
276
 
401
- | 模式 | 触发 | 独有步骤 | commit 前缀 | 升级阈值 |
402
- |------|------|----------|-------------|----------|
403
- | **bug 模式** | 修复已有功能的错误行为 | 根因消除检查 | `fix:` | 改动 **3+ 文件** |
404
- | **调整模式** | 非 bug 的局部优化(文案/配置/文档/prompt) | 无 | `chore:` | 改动 **5+ 文件** |
405
-
406
- ### 6.2 触发条件(两种模式共通,全部必须满足)
407
-
408
- - 不新增 capability
409
- - 不涉及接口变更或架构调整
410
- - 改动范围可预估(bug 模式通常 ≤ 2 文件;调整模式通常 ≤ 3 tasks、≤ 4 文件)
411
-
412
- ### 6.3 升级条件(fix -> full)
413
-
414
- **bug 模式**(任意匹配即触发升级):
415
-
416
- | 条件 | 说明 |
417
- |------|------|
418
- | 改动 **3+ 文件** | 超出单点修复 |
419
- | 架构变更 | 新模块、新接口、新依赖 |
420
- | 数据库 schema 变更 | 结构性调整 |
421
- | 引入新 public API | 修复产生新对外接口 |
422
- | 范围超出单一函数/模块 | 需多处协调 |
423
-
424
- **调整模式**(任意匹配即触发升级):
425
-
426
- | 条件 | 说明 |
427
- |------|------|
428
- | 改动 **5+ 文件** | 超出小改动 |
429
- | 多模块协调 | 跨组件协调 |
430
- | 需新增 **5+** 测试用例 | 复杂度上升 |
431
- | 配置项增删 | 非值修改的配置变更 |
432
- | 需新增 capability | 超出局部优化 |
433
- | 需 delta spec | 影响已有规格 |
434
-
435
- 提问前写 `phase_step: fix.upgrade-awaiting`。用户确认后执行 `state transition <name> fix-upgrade`,原子清理 fix 默认值并进入 design。
436
-
437
- ---
438
-
439
- ## 7. 状态文件:.comate.yaml
440
-
441
- 状态文件是扁平的 `key: value` 子集(无嵌套/列表/多行)。完整字段模板见 `comate/scripts/comate-lib.sh` 中的 `FIELD_ORDER`。
442
-
443
- **关键字段**:
444
-
445
- | 字段 | 含义 |
446
- |-------|---------|
447
- | `schema_version` | 状态文件格式版本(当前:1) |
448
- | `workflow` | `full` / `fix` |
449
- | `phase` | `open` / `design` / `build` / `verify` / `archive` |
450
- | `phase_step` / `phase_step_data` | 当前阶段内的恢复标记和附加数据;阶段转换时自动清空 |
451
- | `build_mode` | `subagent-driven-development` / `executing-plans` / `direct` |
452
- | `isolation` | `branch` / `worktree`(必须在 build->verify 之前设置) |
453
- | `verify_mode` | `light` / `full`(由规模评估写入) |
454
- | `verify_result` | `pending` / `pass` / `fail` |
455
- | `verification_report` | 验证报告路径,在 verify-pass 前必须指向真实文件 |
456
- | `branch_status` | `pending` / `handled` / `discarded` |
457
- | `handoff_context` / `handoff_hash` | 设计交接包路径 + 源文件 sha256 |
458
- | `impl_context` / `impl_hash` | 构建交接包路径 + plan+tasks sha256 |
459
- | `direct_override` | 对于使用 `direct` 的 full 流程必须显式为 `true` |
460
- | `base_ref` / `base_branch` | 初始化时记录的 HEAD + 检测到的默认分支 |
461
- | `source_kind` / `source_manifest` | 需求来源类型(`conversation` / `file`)+ 知识库源文件清单路径(防漂移) |
462
- | `build_command` / `verify_command` | 可选,项目构建/验证命令 |
463
-
464
- **状态机硬约束(guard + state transition 双重执行)**:
465
- - `build -> verify`:`isolation` 必须为 `branch` 或 `worktree`
466
- - `build -> verify`:`build_mode` 必须已设置
467
- - `build_mode: direct` 默认仅用于 fix;full 流程需要 `direct_override: true`
468
- - `verify -> archive`:`verification_report` 指向真实文件,`branch_status: handled`,`impl_hash` 与当前 plan+tasks 匹配
469
-
470
- ---
471
-
472
- ## 8. 决策阻塞点
473
-
474
- **通用规则**:决策点是阻塞点。到达时,当前 `/comate` 调用必须停止并使用 AskUserQuestion 工具等待用户选择。只有在用户做出明确选择后,才能写入相应状态字段并继续执行。
475
-
476
- - 文本输出不能替代基于工具的等待
477
- - 不要用推荐规则、默认值或历史偏好替代用户确认
478
- - 其他无歧义的阶段转换必须自动推进
479
-
480
- ### 七大决策点
481
-
482
- **1. 启动产出物审核**(open):proposal/design/tasks 完成且内容全面后,暂停等待用户确认或调整请求。
483
-
484
- **2. 设计方案确认**(design/头脑风暴):头脑风暴产出技术方案后,暂停让用户确认方案方法、关键权衡、测试策略、Spec Patch。在确认之前不要创建设计文档、写 design_doc、运行设计 guard 或进入 build。
485
-
486
- **3. 构建模式选择**(build):执行前,一次性询问工作空间隔离方式(branch/worktree)和执行模式(subagent-driven-development/executing-plans)。在一次交互中获取两个选择。
487
-
488
- **4. 验证失败决策**(verify):验证失败时,暂停让用户决定:全部修复 / 逐项处理 / 接受偏差。包括 Spec 漂移处理(设计文档与 delta spec 冲突)。CRITICAL 级别的失败必须修复。仅在用户选择修复后才执行 `state transition <name> verify-fail` 并返回 build。
489
-
490
- **5. 分支收尾选择**(verify/收尾开发分支):暂停让用户选择:本地合并 / 推送为 PR / 保留分支 / 丢弃工作。前三项成功后写 `handled`;丢弃写 `discarded` 并终止当前流程。
491
-
492
- **6. 预设升级确认**(fix -> full):当升级条件满足时,先写 `fix.upgrade-awaiting` 再暂停确认。确认后执行 `state transition <name> fix-upgrade`,由脚本清理 fix 默认构建选项并进入 design。
493
-
494
- **7. 构建范围扩展**(build):如果实现过程揭示需要重新设计或拆分为新变更,暂停。判定标准:基于初始 tasks.md 任务数,新增任务超过总数一半(50% 阈值)视为超出范围。询问用户是否拆分。中等规模(接口变更、新组件):确认后加载 `superpowers:brainstorming` 更新设计。大规模(新能力):确认后使用 `/comate-open` 创建独立变更。
495
-
496
- ### 红线警示
497
-
498
- | 智能体想法 | 实际风险 |
499
- |--------------|---------|
500
- | "用户大概会同意这个方案" | 绝不替用户决定 - 使用 AskUserQuestion |
501
- | "这只是个小改动,不需要确认" | 决策点没有规模豁免 - 阻塞点必须等待 |
502
- | "用户上次选了 A,这次也选 A" | 历史偏好不能替代当前确认 |
503
- | "我已经解释了计划,用户没反对" | 不反对 != 同意 - 必须通过工具获取明确选择 |
504
- | "都做到这一步了,应该没问题" | 验证未通过 != 通过 - 检查 verify_result |
505
-
506
- ---
507
-
508
- ## 9. 关键协议
509
-
510
- ### 9.1 脏工作树协议
511
-
512
- **规范路径**:`comate/reference/dirty-worktree.md`
513
-
514
- 所有涉及代码变更的 comate 子技能共享此协议。当智能体恢复上下文或继续执行时,必须按此协议处理未提交的工作树变更。
515
-
516
- **核心规则**:
517
- - 用户可能不会说明他们改了什么。只要存在脏工作树(包括 git status 中的 `??` 文件),就假定变更可能来自用户或混合来源。
518
- - 脏工作树仅代表代码事实;它不会自动推进 `.comate.yaml` 的 `phase` 或勾选 `tasks.md`。
519
-
520
- **归属分类**:
521
-
522
- 1. **属于当前变更**:文件和内容与当前变更目标/tasks.md/plan/delta spec 匹配。纳入当前任务,不要重复做相同的工作。
523
- 2. **不属于当前变更**:文件或内容与当前目标无关。暂停并询问用户:合并到当前变更、拆分为新变更、保持现状,或明确授权丢弃。
524
- 3. **来源不确定**:无法从 diff 和文档确定归属。暂停并向用户报告文件列表和判定依据。不要推进阶段。
525
-
526
- **常见处理模式**:
527
- - 已实现但 tasks.md 未勾选:先验证实现(运行构建和测试),通过后勾选任务。不要仅因为任务未勾选就重做。
528
- - 隐含的计划或范围已变化:按当前子技能的升级、增量更新或回滚规则处理。
529
- - open/design 阶段的代码变更:先按协议归属。不要将代码变更视为已完成实现并推进到 verify。
530
-
531
- **禁止事项**:
532
- - 在未理解脏 diff 来源的情况下,不要覆盖、回滚、格式化重写或忽略用户变更
533
- - 在脏 diff 未得到解释的情况下,不要判定验证通过
534
-
535
- ### 9.2 最佳实践
536
-
537
- 1. 头脑风暴是强制性的(fix 除外)
538
- 2. Delta spec 是活文档,构建期间可修改,归档时同步
539
- 3. 交接包由脚本生成(`handoff`),guard 验证来源/hash/mode
540
- 4. tasks.md 实时同步,每完成一个任务就勾选并提交
541
- 5. 仅在验证通过后归档
542
- 6. 预设有其边界;条件满足时及时升级到 full
543
-
544
- ---
545
- ## 10. CLI 命令参考(comate.sh)
546
-
547
- `comate.sh` 是 comate 状态机和工具的单一入口。所有子命令:`bash comate/scripts/comate.sh <子命令>`
548
-
549
- ### state - 状态机操作
550
-
551
- | 命令 | 描述 |
552
- |---------|-------------|
553
- | `state <name> init <full|fix>` | 初始化 `.comate.yaml` |
554
- | `state <name> set <key> <value>` | 设置单个状态字段 |
555
- | `state <name> get <key>` | 读取单个状态字段 |
556
- | `state <name> transition <event>` | 执行状态转换 |
557
- | `dependency <name> archived` | 严格检查指定 change 已归档且状态为 `archived: true` |
558
- | `state <name> check <phase> [--json]` | 检查阶段进入条件 |
559
- | `state <name> recover <phase>` | 从文件状态推断并修复 `.comate.yaml` |
560
- | `state <name> scale` | 评估变更规模并写入 `verify_mode` |
561
- | `state <name> validate` | 验证 `.comate.yaml` 完整性 |
562
-
563
- ### guard - 阶段门禁
564
-
565
- | 命令 | 描述 |
566
- |---------|-------------|
567
- | `guard <name> <phase> [--apply] [--json]` | 检查阶段退出条件。`--apply` 在通过时自动执行转换。 |
568
-
569
- ### handoff - 交接包
570
-
571
- | 命令 | 描述 |
572
- |---------|-------------|
573
- | `handoff <name> design --write [--full]` | 生成设计交接包 |
574
- | `handoff <name> build --write [--full]` | 生成构建交接包(包含 plan+tasks sha256) |
575
-
576
- ### sources - 源文件追踪
577
-
578
- 仅追踪 `docs/knowledge-base/` 范围内的文件,钉住每个文件当时的 sha256 与 commit ref,支持双向排查。
579
-
580
- | 命令 | 描述 |
581
- |---------|-------------|
582
- | `sources <name> track <file...> [--note <text>]` | 追踪知识库源文件;成功后 `source_kind` 改为 `file`,越界文件跳过 |
583
- | `sources <name> check` | 漂移检查(`conversation` 跳过);退出码 0=未漂移 / 1=漂移 / 4=manifest 损坏 |
584
- | `sources <name> list` | 打印源文件清单(路径/sha256/ref/note) |
585
- | `sources find <file>` | 反查:列出引用该文件的全部 change |
586
-
587
- 清单文件位于 `openspec/changes/<name>/.comate/sources.manifest`,随 change 进版本库、随归档保留。design 与 build 阶段 guard 会复算知识库文件哈希、与清单比对,漂移则阻塞。
588
-
589
- ### gate - PRD 门禁(阶段 0)
590
-
591
- 对**原始 PRD** 做质量门禁,通过前禁止从该 PRD 建 change。状态钉在 PRD 同级 `PRD-<NNN>.gate.yaml`(如 `PRD-001.gate.yaml`,独立于 change 的 `.comate.yaml`),评审报告为 `PRD-<NNN>-REVIEW.md`(如 `PRD-001-REVIEW.md`)。由 `/comate-gate` 驱动。
592
-
593
- | 命令 | 描述 |
594
- |---------|-------------|
595
- | `gate <prd> review` | 建/刷新 gate.yaml,钉当前 PRD sha256,回显评审报告路径。PRD 变了则状态重置为 `reviewing` |
596
- | `gate <prd> set <field> <value>` | 写字段:`score` / `blocking_open` / `gate_status` 等 |
597
- | `gate <prd> pass [--tbd]` | 校验评分、拆分映射和报告。普通 pass 要求 `blocking_open=0`;`--tbd` 要求至少一个经用户接受的未解决阻断项 |
598
- | `gate <prd> spawned <change>` | 校验 change 属于确认映射、gate 未 stale、open 骨架与 PRD 源追踪完整后,记录据此 PRD 扇出的 change(逗号拼接,幂等) |
599
- | `gate <prd> fanout-status [--json]` | 对比 `changes_map` 与 `spawned_changes`,输出 expected/spawned/complete/missing/invalid,用于多 change 中断恢复与完整性校验 |
600
- | `gate <prd> status [--json]` | 查状态;哈希漂移时自动判 `stale`(不改文件) |
601
- | `gate <prd> check` | comate-open 建 change 前的前置守卫。PASS 要求 gate 存在、状态 ∈ {passed, passed-with-tbd}、哈希未漂移;否则退出码 1 阻塞 |
602
-
603
- `gate_status` 取值:`reviewing`(审阅中)/ `blocked`(有未关闭阻断项)/ `passed`(阻断清零,可扇出)/ `passed-with-tbd`(用户授权带 TBD,change 需标 ⚠)/ `stale`(PRD 通过后被改,须重过门禁)。退出码契约同 guard:0 通过 / 1 阻塞 / 2 用法 / 3 环境 / 4 状态损坏。
604
-
605
- ### archive - 归档
606
-
607
- | 命令 | 描述 |
608
- |---------|-------------|
609
- | `archive <name> [--dry-run]` | 执行归档。`--dry-run` 用于预览。 |
610
-
611
- ### 诊断
612
-
613
- | 命令 | 描述 |
614
- |---------|-------------|
615
- | `status` | 列出所有活动变更及其当前阶段 |
616
- | `doctor` | 环境健康检查(bash/git/sha256/LF/openspec/superpowers 等) |
617
-
618
- ### 退出码约定
619
-
620
- | 码值 | 含义 |
621
- |------|---------|
622
- | 0 | 通过 |
623
- | 1 | 验证阻塞 |
624
- | 2 | 用法错误 |
625
- | 3 | 环境缺失 |
626
- | 4 | 状态文件损坏 |
627
-
628
- ---
629
-
630
- ## 11. 故障排除
631
-
632
- ### 11.1 快速诊断
633
-
634
- ```bash
635
- bash comate/scripts/comate.sh doctor # 环境健康检查
636
- bash comate/scripts/comate.sh status # 所有活动变更状态
637
- ```
638
-
639
- ### 11.2 常见问题
640
-
641
- | 症状 | 可能原因 | 解决方案 |
642
- |---------|-------------|----------|
643
- | `/comate` 无法检测阶段 | `.comate.yaml` 缺失或损坏 | `bash "" state <name> recover <phase>` |
644
- | Guard 持续报告 isolation/build_mode 未设置 | 断点恢复时未填写 | 返回 build 阶段完成设置 |
645
- | 验证失败后无法推进 | verify_result: fail | 用户先选择修复方案,智能体执行 `state transition <name> verify-fail` 后返回 build |
646
- | 变更目录结构不完整 | 流程中断 | 按 comate-open 产出物要求补全 |
647
- | `openspec list --json` 失败 | openspec 未安装或未初始化 | 运行 `comate init`,或 `openspec init . --tools none` |
648
- | 子技能不可用 | Superpowers 未安装 | 运行 `comate init` 补装 |
649
- | bash 版本过低 | bash < 3.2 | Windows:Git Bash/WSL;macOS 自带 Bash 3.2 可直接使用 |
650
- | .sh 文件包含 CRLF | git 配置问题 | 仓库有 `.gitattributes` 强制 `eol=lf`;如已损坏,使用 `dos2unix` |
651
- | 脏工作树无法推进 | 未遵循 dirty-worktree 协议 | 按协议归属,暂停并询问用户 |
652
-
653
- ### 11.3 状态修复流程
654
-
655
- 1. 以文件状态为真相源:检查 proposal.md / design.md / tasks.md / delta spec / 设计文档 / 代码提交的实际状态。
656
- 2. 运行 `bash "" state <name> recover <phase>` 从文件状态修复 `.comate.yaml`。
657
- 3. 运行 `bash "" guard <name> <phase> --apply` 验证并自动推进。
658
-
659
- ---
660
-
661
- ## 12. 文件结构
662
-
663
- ### 12.1 技能布局
664
-
665
- ```
666
- skills/
667
- |-- comate/ # 主入口 + 共享资源
668
- | |-- SKILL.md # /comate:检测与分发
669
- | |-- COMATE_MANUAL.md # 本手册
670
- | |-- reference/
671
- | | |-- decision-points.md # 决策阻塞点(单一真相源)
672
- | | |-- dirty-worktree.md # 脏工作树协议
673
- | | |-- prerequisites.md # 前置条件检查清单
674
- | |-- scripts/
675
- | | |-- comate.sh # 调度器 + 状态机(单一入口)
676
- | | |-- comate-lib.sh # 库函数
677
- | |-- tests/
678
- | |-- comate.bats
679
- | |-- run.sh
680
- |-- comate-open/SKILL.md # 阶段 1:启动
681
- |-- comate-design/SKILL.md # 阶段 2:深度设计
682
- |-- comate-build/SKILL.md # 阶段 3:规划与构建
683
- |-- comate-verify/SKILL.md # 阶段 4:验证与收尾
684
- |-- comate-archive/SKILL.md # 阶段 5:归档
685
- |-- comate-fix/SKILL.md # 预设:快速小改动(bug + 调整)
686
- ```
687
-
688
- ### 12.2 运行时产出物
689
-
690
- ```
691
- openspec/ # OpenSpec - WHAT
692
- |-- changes/<name>/
693
- | |-- .comate.yaml # comate 状态机真相源
694
- | |-- proposal.md / design.md / tasks.md
695
- | |-- specs/<capability>/spec.md # Delta 能力规约
696
- | |-- .comate/handoff/ # 脚本生成的阶段交接包
697
- | |-- .comate/sources.manifest # 知识库源文件清单(source_kind=file 时)
698
- |-- specs/<capability>/spec.md # 主规约(归档时由 delta 覆写)
699
-
700
- docs/ # 文档与知识库
701
- |-- knowledge-base/<...>.md # 可追踪的需求源文档(source_kind=file)
702
-
703
- docs/superpowers/ # Superpowers - HOW
704
- |-- specs/YYYY-MM-DD-<topic>-design.md # 设计文档
705
- |-- plans/YYYY-MM-DD-<feature>.md # 实现计划
706
- |-- reports/ # 验证报告
707
- ```
277
+ **不要在验收期间改代码**
278
+ - ❌ 错误:handoff 后发现问题,在主工作区直接改
279
+ - ✅ 正确:等验收结果,失败会自动回 build,在回修轮里改
708
280
 
709
- ---
281
+ **不要跳过确认**
282
+ - ❌ 错误:open --prepare 后直接改代码
283
+ - ✅ 正确:等用户确认或自己执行 open --confirm,进入 Building 后再写代码
710
284
 
711
- > 本手册汇编自所有 comate SKILL.md 源文件和 reference/ 文档,供日常参考。
712
- > 规范权威仍以源文件为准:每个阶段的 SKILL.md 是执行规约,reference/ 定义协议,comate.sh 是代码实现。
713
- > 若本手册与源文件冲突,以源文件为准。
285
+ **不要手动编辑 state.json**
286
+ - ❌ 错误:state.json 里有奇怪的字段,直接删掉
287
+ - ✅ 正确:运行 `doctor` 诊断,或从 git 历史恢复