@house365/comate 0.9.2 → 0.9.4

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.
package/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ <div align="center">
2
+ <img src="comate.png" alt="comate" width="600">
3
+ </div>
4
+
1
5
  # comate
2
6
 
3
7
  **SDD (规约驱动开发)** 的 AI 开发编排器。
package/bin/init.mjs CHANGED
@@ -149,26 +149,21 @@ function openSpecState() {
149
149
  return { status: atLeast(version, MIN_OPENSPEC) ? 'ready' : 'outdated', version };
150
150
  }
151
151
 
152
- // Two install shapes to detect:
153
- // skills CLI — flattens obra/superpowers into one dir per skill, so nothing
154
- // is literally named "superpowers"; using-superpowers is the
155
- // entry skill and the stable marker.
156
- // Claude Code — installs it as a plugin under plugins/{cache,data}/.
152
+ // Only detect skills CLI installation (flattens obra/superpowers into one dir
153
+ // per skill). Claude Code plugin cache (plugins/{cache,data}/) is not a real
154
+ // user-level install and should not count.
157
155
  const SUPERPOWERS_MARKERS = [
158
156
  ['using-superpowers'],
159
157
  ['brainstorming'],
160
- ['superpowers'],
161
- ['superpowers-claude-plugins-official'],
162
- ['cache', 'claude-plugins-official', 'superpowers'],
163
158
  ];
164
159
 
165
160
  function superpowersInstalled(scope) {
166
161
  const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
167
162
  const roots =
168
163
  scope === 'global'
169
- ? ['.agents/skills', '.claude/skills', '.claude/plugins', '.config/skills', '.cursor/skills']
164
+ ? ['.agents/skills', '.claude/skills', '.config/skills', '.cursor/skills']
170
165
  .map((r) => join(home, r))
171
- : ['.agents/skills', '.claude/skills', '.claude/plugins', '.cursor/skills', '.codex/skills'];
166
+ : ['.agents/skills', '.claude/skills', '.cursor/skills', '.codex/skills'];
172
167
  return roots.some((root) => SUPERPOWERS_MARKERS.some((m) => existsSync(join(root, ...m))));
173
168
  }
174
169
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@house365/comate",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "comate —— SDD (规约驱动开发) 的 AI 开发编排器(Agent Skills)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -29,7 +29,13 @@
29
29
  - 推荐规则只能用于在问题里说明建议,不能代替用户拍板。
30
30
  - 其他无歧义的阶段流转、以及经判定属"自动处理"的节点,必须自动进行,不得中途退出,也不得为其伪造一次用户确认。
31
31
 
32
- ## 七个决策点
32
+ ## 决策阻塞点清单
33
+
34
+ 以下是 comate 全流程中**核心决策点**的规范定义。各阶段 SKILL 用一行引用本文件的某一条,而不重复叙述规则,避免措辞漂移。
35
+
36
+ **本清单不穷举所有决策场景**——仅列出跨阶段、高频、影响流转的关键决策点。各 skill 内还有局部决策(如命名确认、dirty worktree 归因、PRD 选择等),由该 skill 自行定义并遵循本文首节的三类框架。
37
+
38
+ ## 核心决策点(跨阶段 / 流转关键)
33
39
 
34
40
  1. **开题产物审视确认**(open)
35
41
  proposal/design/tasks 三件套完成且内容完整后,**先按来源分类,再决定是否阻塞**(对齐本文件首节三类框架):
@@ -66,6 +72,26 @@
66
72
  实施中发现需要重新设计或拆分新 change 时暂停。判定基准:以 tasks.md 初始任务总数为准,新增任务超过总数一半(50% 阈值)即视为超范围,请用户决定是否拆分。中等规模(接口变更、新增组件)确认后加载 `superpowers:brainstorming` 更新设计;大规模(全新 capability)确认后用 `/comate-open` 拆独立 change。
67
73
  引用:`comate-build` Step 4。
68
74
 
75
+ ## 其他决策场景(局部 / 特定 skill)
76
+
77
+ 以下决策点由特定 skill 自行定义,同样遵循本文首节的三类框架,但不属于跨阶段核心流转:
78
+
79
+ ### Gate 阶段(comate-gate)
80
+ - **PRD 命名规范确认**:PRD 不符合命名规范时,AskUserQuestion 确认改名或拒绝
81
+ - **PRD 未定稿处理**:PRD 标记 draft/WIP 时,确认是否继续评审
82
+ - **阻断问题处理策略**:`blocking_open > 0` 时选择:先补 PRD / 授权带 TBD 继续 / 深度澄清 / 暂停
83
+ - **拆分粒度与映射**(决策点 6 已列入核心):功能项 → change 的映射由用户确认
84
+
85
+ ### Open 阶段(comate-open)
86
+ - **继续已有 change / 新建**:顶层探测到活跃 change 时,确认继续还是新建
87
+ - **Change 命名确认**:必须用用户指定或经 AskUserQuestion 确认的名称,不得自动生成
88
+
89
+ ### Build 阶段(comate-build)
90
+ - **Dirty worktree 归因**:脏工作树按 `dirty-worktree.md` 协议分类后,不属于当前 change 或来源不确定时需要用户裁定:并入 / 拆分 / 保留 / 丢弃
91
+
92
+ ### Verify 阶段(comate-verify)
93
+ - 已列入核心决策点 4、5
94
+
69
95
  ## Red Flags — 出现这些念头就停下来检查
70
96
 
71
97
  | Agent 的念头 | 实际风险 |
@@ -449,6 +449,7 @@ GATE_FIELD_ORDER=(
449
449
  blocking_open
450
450
  review_report
451
451
  spawned_changes
452
+ changes_map
452
453
  gated_at
453
454
  created_at
454
455
  )
@@ -978,7 +978,8 @@ guard() {
978
978
  _guard_check "Design Doc declares technical-design role" _g_design_doc_role
979
979
  _guard_check "Design Doc declares canonical_spec: openspec" _g_design_doc_canonical
980
980
  else
981
- [ "$GUARD_JSON" -eq 0 ] && log_warn " [WARN] no design_doc recorded"
981
+ # Design Doc is required for full workflow moving to build
982
+ _guard_check "Design Doc recorded (design_doc field)" false
982
983
  fi
983
984
  ;;
984
985
  build)
@@ -1381,6 +1382,7 @@ score: null
1381
1382
  blocking_open: null
1382
1383
  review_report: $report
1383
1384
  spawned_changes: null
1385
+ changes_map: null
1384
1386
  gated_at: null
1385
1387
  created_at: $(today)
1386
1388
  EOF
@@ -138,13 +138,15 @@ Fix 为**一次性连续执行**。调用后在自有步骤间自动推进,但
138
138
  | 需新增 capability | 超出局部优化 |
139
139
  | 需 delta spec | 影响已有规格 |
140
140
 
141
- **必须使用 AskUserQuestion 工具暂停确认升级**。用户确认后**先更新 workflow** 再走完整流程:
141
+ **必须使用 AskUserQuestion 工具暂停确认升级**。用户确认后**先回退到 open 阶段并更新 workflow**,再走完整流程:
142
142
 
143
143
  ```bash
144
+ bash "$COMATE" state <name> set phase open
144
145
  bash "$COMATE" state <name> set workflow full
146
+ bash "$COMATE" state <name> transition open-complete
145
147
  ```
146
148
 
147
- 然后**立即加载 `comate-design` skill** 补 Design Doc。用户不确认则停止 fix 并报告超出适用范围。
149
+ 此时 phase 已转换到 `design`(因为 workflow 是 full),然后**立即加载 `comate-design` skill** 补 Design Doc。用户不确认则停止 fix 并报告超出适用范围。
148
150
 
149
151
  ## 退出条件
150
152
 
@@ -191,7 +191,18 @@ bash "$COMATE" gate <prd> set blocking_open <未关闭阻断数>
191
191
  - 是一功能项一 change 还是合并;
192
192
  - 各 change 命名(默认取主功能项名,用户可改)。
193
193
 
194
- **映射确认前不得建任何 change。** 确认后用 **TodoWrite** 把每个待建 change 建成任务项。
194
+ **映射确认前不得建任何 change。** 确认后:
195
+
196
+ 1. **立即持久化映射到 gate.yaml**,使其成为机器可验证事实:
197
+
198
+ ```bash
199
+ # changes_map 格式:changeA:功能项1,2,3;changeB:功能项4,5
200
+ bash "$COMATE" gate <prd> set changes_map "changeA:功能项1,2,3;changeB:功能项4,5"
201
+ ```
202
+
203
+ 2. 用 **TaskCreate** 把每个待建 change 建成任务项。
204
+
205
+ 3. 多 change 时,在 PRD 同目录建 `CHANGES-MAP.md` 作为人类可读备份,内容与 `changes_map` 字段一致。
195
206
 
196
207
  ### 5. 通过门禁
197
208
 
@@ -223,8 +234,6 @@ bash "$COMATE" gate <prd> spawned <change-name>
223
234
 
224
235
  若门禁是 `passed-with-tbd`,在该 change 的 proposal/design 受影响处标 **「⚠ 待确认」** 并引用评审报告。
225
236
 
226
- 多 change 时,在 PRD 同目录建 `CHANGES-MAP.md` 记录「功能项 → change」映射,便于回溯。
227
-
228
237
  ### 7. 收尾
229
238
 
230
239
  展示:
@@ -15,7 +15,28 @@ description: "comate 阶段 1:开题。用 /comate-open 调用。通过 OpenSp
15
15
 
16
16
  **立即执行:** 使用 Skill 工具加载 `openspec-explore` 技能。禁止跳过。加载后按其指引自由探索问题空间。
17
17
 
18
- ### 2. 创建 Change 结构 + 初始化状态
18
+ ### 2. PRD 门禁前置守卫(从 PRD 建 change 时必须先通过)
19
+
20
+ 若本 change **来自一份原始 PRD**(用户经 `/comate-gate` 拆分而来,或直接指定了来源 PRD),**在创建 change 结构之前**必须先过门禁守卫:
21
+
22
+ ```bash
23
+ COMATE="${COMATE:-$(for r in . ./.agents/skills ./.claude/skills ./.cursor/skills ./.codex/skills "$HOME"/.agents/skills "$HOME"/.claude/skills "$HOME"/.config/skills "$HOME"/.cursor/skills "$HOME"/.codex/skills "$HOME"/.gemini/skills; do
24
+ [ -d "$r" ] && find "$r" -maxdepth 6 -path '*/comate/scripts/comate.sh' -type f -print -quit 2>/dev/null
25
+ done | head -1)}"
26
+ if [ -z "$COMATE" ]; then
27
+ echo "ERROR: comate.sh 未找到,请确认 comate skill 已安装。" >&2
28
+ return 1 2>/dev/null || exit 1
29
+ fi
30
+
31
+ bash "$COMATE" gate <prd路径> check
32
+ ```
33
+
34
+ - **PASS(exit 0)**:`<PRD>.gate.yaml` 存在、`gate_status ∈ {passed, passed-with-tbd}`、且 PRD 哈希未漂移。继续下一步创建 change。
35
+ - **BLOCK(exit 1)**:门禁不存在 / 未通过 / PRD 通过后被改(stale)。**不得创建 change**,停止并提示用户先跑 `/comate-gate` 对该 PRD 过门禁。
36
+
37
+ 需求**来自对话**(非 PRD)时跳过本步——门禁只约束「PRD → change」这条路径。
38
+
39
+ ### 3. 创建 Change 结构 + 初始化状态
19
40
 
20
41
  **立即执行:** 使用 Skill 工具加载 `openspec-new-change` 技能。若用户意图未明确、需先形成建议,改为加载 `openspec-propose`。禁止跳过。
21
42
 
@@ -42,10 +63,9 @@ if [ -z "$COMATE" ]; then
42
63
  return 1 2>/dev/null || exit 1
43
64
  fi
44
65
 
45
- bash "$COMATE" state <name> init full
46
66
  ```
47
67
 
48
- ### 2b. 判定需求来源(源文件追踪)
68
+ ### 3b. 判定需求来源(源文件追踪)
49
69
 
50
70
  `state init` 默认写入 `source_kind: conversation`、`source_manifest: null`(需求由对话产生)。
51
71
 
@@ -59,24 +79,17 @@ bash "$COMATE" sources <name> track docs/knowledge-base/<path>.md --note "<可
59
79
  - 仅 `docs/knowledge-base/` 范围内的文件可追踪;范围外文件会被跳过并提示,`source_kind` 保持 `conversation`,不影响流程。
60
80
  - 边追踪边产生:若开题时为对话来源、设计中途才拿到知识库文档,后续任意阶段补 `sources <name> track` 即可,无需回到 open。
61
81
 
62
- ### 2c. PRD 门禁前置守卫(从 PRD 建 change 时必须通过)
63
-
64
- 若本 change **来自一份原始 PRD**(用户经 `/comate-gate` 拆分而来,或直接指定了来源 PRD),在创建 change 结构**之前**必须先过门禁守卫:
65
-
66
- ```bash
67
- bash "$COMATE" gate <prd路径> check
68
- ```
82
+ ### 3c. PRD 扇出记录(从 PRD 建 change 时必须登记)
69
83
 
70
- - **PASS(exit 0)**:`<PRD>.gate.yaml` 存在、`gate_status ∈ {passed, passed-with-tbd}`、且 PRD 哈希未漂移。继续建 change。
71
- - **BLOCK(exit 1)**:门禁不存在 / 未通过 / PRD 通过后被改(stale)。**不得创建 change**,停止并提示用户先跑 `/comate-gate` 对该 PRD 过门禁。
72
-
73
- 建成后把该 change 记回门禁:
84
+ 若本 change 来自 PRD,在创建完成后把该 change 记回门禁:
74
85
 
75
86
  ```bash
76
87
  bash "$COMATE" gate <prd路径> spawned <name>
77
88
  ```
78
89
 
79
- 需求**来自对话**(非 PRD)时跳过本步——门禁只约束「PRD → change」这条路径。通常本 skill 由 `/comate-gate` 调用并已备妥门禁;用户绕过 gate 直接建 change 时,本守卫是最后一道硬闸门。
90
+ 此步将 change 名称追加到 `<PRD>.gate.yaml` 的 `spawned_changes` 列表,用于追溯 PRD → change 的完整扇出关系。
91
+
92
+ 需求**来自对话**时跳过本步。
80
93
 
81
94
  ### 3. 入口状态验证
82
95
 
@@ -96,15 +96,7 @@ git diff --stat "$BASE_REF"...HEAD
96
96
  - B:`state transition verify-fail` 然后调 `/comate-build` 由 Spec 增量更新规则更新
97
97
  - C:确认偏差可接受继续(归档时 design doc 标记 `superseded-by-main-spec`)
98
98
 
99
- ### 3. 收尾(决策阻塞点 5)
100
-
101
- **立即执行:** 使用 Skill 工具加载 `superpowers:finishing-a-development-branch`。不可用时停止并提示安装。
102
-
103
- 分支处理选项:本地合并 / 推送建 PR / 保持分支 / 丢弃。**必须使用 AskUserQuestion 工具暂停等待用户选择**。规则见 `comate/reference/decision-points.md` 第 5 条。仅在用户选择且操作完成后才写 `branch_status: handled`。
104
-
105
- 确认项:全部测试通过、无硬编码密钥或安全问题。
106
-
107
- ### 4. 记录验证证据
99
+ ### 3. 记录验证证据
108
100
 
109
101
  验证报告必须落盘并记录。不要手动设 `verify_result: pass`,通过 guard 自动流转。
110
102
 
@@ -121,9 +113,26 @@ bash "$COMATE" sources <name> list # 列出对照的文档路径/sha25
121
113
  mkdir -p docs/superpowers/reports
122
114
  # 写报告到 docs/superpowers/reports/YYYY-MM-DD-<name>-verify.md
123
115
  bash "$COMATE" state <name> set verification_report docs/superpowers/reports/YYYY-MM-DD-<name>-verify.md
116
+ ```
117
+
118
+ 确认项:全部测试通过、无硬编码密钥或安全问题。
119
+
120
+ ### 4. 分支收尾(决策阻塞点 5)
121
+
122
+ **在记录验证证据后**执行分支处理,确保即使丢弃工作也不影响状态持久化。
123
+
124
+ **立即执行:** 使用 Skill 工具加载 `superpowers:finishing-a-development-branch`。不可用时停止并提示安装。
125
+
126
+ 分支处理选项:本地合并 / 推送建 PR / 保持分支 / 丢弃工作。**必须使用 AskUserQuestion 工具暂停等待用户选择**。规则见 `comate/reference/decision-points.md` 第 5 条。
127
+
128
+ 操作完成后写入状态:
129
+
130
+ ```bash
124
131
  bash "$COMATE" state <name> set branch_status handled
125
132
  ```
126
133
 
134
+ **重要**:无论选择哪种收尾方式(包括"丢弃工作"),都必须在分支操作完成后才设置 `branch_status: handled`。这确保 guard 检查时状态已完整记录。
135
+
127
136
  ## 退出条件
128
137
 
129
138
  - 验证报告通过,分支已处理