@modus-ai/modus 0.2.7 → 0.2.9

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.
@@ -0,0 +1,386 @@
1
+ ---
2
+ name: modus-cr
3
+ description: Use this skill when executing /modus:cr command to perform standalone code review backed by design documents (design.md / plan.md). Runs a two-phase review — (1) document-code consistency check (speckit.analyze style) and (2) code quality CR (modus-reviewer style) — then outputs a cr-report.md compatible with the harness HANDOFF format. Optionally creates TAPD Bug units for P1/P2 issues. Trigger on /modus:cr command or when user wants to review code changes against a design document.
4
+ allowed-tools: Read, Write, Glob, Bash
5
+ disable: false
6
+ ---
7
+
8
+ # modus-cr(独立代码评审)
9
+
10
+ **触发条件:** 用户运行 `/modus:cr --doc <文档路径>` 时使用此 Skill。
11
+
12
+ ## 职责
13
+
14
+ 独立代码评审入口,不依赖 harness 流程。接受技术方案文档(design.md / plan.md)和可选的 PRD,对当前代码变更进行两阶段评审:
15
+
16
+ 1. **一致性检查**(来源:speckit.analyze):文档需求 vs 代码实现的覆盖率矩阵,识别「缺失实现」「超出范围」「任务完成率」
17
+ 2. **代码质量 CR**(来源:modus-reviewer 独立版本):架构/事务/安全/性能/业务规则,P1/P2/P3 分级
18
+
19
+ 产出物 `cr-report.md` 与 harness 内部 cr-report.md 格式完全兼容,可复用 TAPD Bug 创建逻辑。
20
+
21
+ ---
22
+
23
+ ## 参数解析(优先执行)
24
+
25
+ **首先**检测用户输入中的参数标志:
26
+
27
+ ```
28
+ --help → 输出帮助文档,结束执行
29
+ --doc X → DOC_PATHS=X(支持多路径,空格分隔)
30
+ --diff X → DIFF_TARGET=X(指定评审代码范围)
31
+ --story X → STORY_URL=X(从 TAPD 加载 PRD)
32
+ --quick → QUICK_MODE=true(跳过一致性检查)
33
+ ```
34
+
35
+ **必要参数校验:**
36
+ - 若无 `--doc` 且非 `--quick` 模式:提示「`--doc` 是必填参数。若无设计文档请使用 `--quick` 模式」
37
+ - `--quick` 模式可以不提供 `--doc`,但需提供 `--diff` 或存在 git 变更
38
+
39
+ ---
40
+
41
+ ## 执行流程
42
+
43
+ ### Step 0:加载参考文档(contextFiles)
44
+
45
+ > **来源:opsx:apply contextFiles** — 先读完所有上下文,再执行评审
46
+
47
+ **按以下顺序依次读取(类 opsx:apply):**
48
+
49
+ 1. `--doc` 指定的每个文档路径(design.md / plan.md / tasks.md / PRD):
50
+ - 若路径不存在,输出警告并继续(不阻塞)
51
+ - 若路径是目录,自动在目录内查找:`design.md` > `plan.md`,以及同级 `tasks.md`
52
+ 2. 若有 `--story`,调用 TAPD MCP(`tapd_mcp_http`)读取 Story 描述作为 PRD 补充
53
+ 3. `modus/config.yaml`:读取 `constitution`(`hard_rules`、`tech_stack`、`key_patterns`)
54
+ 4. `modus/knowledge-catalog.md`:识别相关业务域,加载对应 `modus/knowledge/biz-{domain}/SKILL.md`(仅 hash 检查,不更新)
55
+
56
+ **输出上下文加载摘要:**
57
+
58
+ ```
59
+ 📚 上下文加载完成
60
+ 参考文档:{doc_path1}、{doc_path2}({功能名称})
61
+ TAPD PRD:{story_url 或「未指定」}
62
+ 业务域:{domain1}, {domain2}
63
+ 代码约束:{constitution.hard_rules 摘要(前 3 条)}
64
+ ```
65
+
66
+ ---
67
+
68
+ ### Step 1:获取代码变更范围
69
+
70
+ **获取变更文件列表(按优先级):**
71
+
72
+ ```
73
+ 情形 A:--diff 指定了文件/目录
74
+ → 读取指定路径的文件(若是目录则 Glob 扫描其中的源码文件)
75
+
76
+ 情形 B:默认模式(无 --diff)
77
+ → 执行:git diff HEAD --name-only
78
+ → 获取所有变更文件列表
79
+
80
+ 情形 C:无 git,且无 --diff
81
+ → Glob 扫描主要源码目录(src/、app/、lib/ 等),取最近修改文件
82
+ → 输出警告:⚠️ 未检测到 git 仓库,使用文件修改时间作为变更范围参考
83
+ ```
84
+
85
+ **过滤规则(自动排除):**
86
+ - `*.lock`、`*.sum`、`node_modules/`、`.git/`、`dist/`、`target/`、`build/`
87
+ - 测试数据文件(`*.json` in test fixtures,`*.sql` in resources)
88
+
89
+ **输出变更范围摘要:**
90
+
91
+ ```
92
+ 📝 代码变更范围
93
+ 变更文件:{N} 个(已过滤 {M} 个非源码文件)
94
+ 主要变更:
95
+ {文件路径1}({新增/修改/删除})
96
+ {文件路径2}({新增/修改/删除})
97
+ ...(超过 10 个时折叠)
98
+ ```
99
+
100
+ ---
101
+
102
+ ### Step 2:一致性检查(speckit.analyze 风格,只读)
103
+
104
+ > **来源:speckit.analyze** — 禁止修改任何文件;`--quick` 时跳过此步
105
+
106
+ **Phase 2-1:需求覆盖率矩阵**
107
+
108
+ 从参考文档中提取需求点列表:
109
+ - 从 `design.md` 第 3 节「影响范围」和第 4 节「API 契约草稿」提取具体需求
110
+ - 从 `plan.md` 的「实现 Todos」提取任务项
111
+ - 若有 `tasks.md`,提取所有 `T{ID}` 任务条目
112
+ - 若有 TAPD PRD,提取「验收标准」或「功能描述」中的需求点
113
+
114
+ 对每个需求点,检查代码变更中是否有对应实现(基于文件名、类名、方法名关键词匹配):
115
+
116
+ | 需求点 | 状态 | 代码位置 |
117
+ |--------|------|---------|
118
+ | {需求描述} | ✅ 已覆盖 | `{文件路径}:{行号}` |
119
+ | {需求描述} | ❌ 缺失实现 | — |
120
+ | (代码变更中有实现但文档无对应需求) | ⚠️ 超出范围 | `{文件路径}` |
121
+
122
+ **覆盖率计算:**
123
+ ```
124
+ consistency_score = 已覆盖需求数 / 总需求数 × 100%
125
+ ```
126
+
127
+ **Phase 2-2:tasks.md 完成率(若存在)**
128
+
129
+ 统计 tasks.md 中 `- [x]` vs `- [ ]` 的比例,输出任务完成情况。
130
+
131
+ **Phase 2-3:一致性问题分级**
132
+
133
+ | 问题类型 | 严重度 | 说明 |
134
+ |----------|--------|------|
135
+ | 核心功能缺失(P1/P2 需求未实现) | HIGH | 对应 CR P1 |
136
+ | 接口契约变更未实现 | HIGH | 对应 CR P1 |
137
+ | 次要需求缺失(P3 任务未完成) | MEDIUM | 对应 CR P2 |
138
+ | 超出范围的代码变更 | MEDIUM | 注意:可能合理(如重构优化),仅提示 |
139
+ | 文档需求模糊无法验证 | LOW | 仅记录 |
140
+
141
+ **输出一致性检查报告(内联展示,不落盘):**
142
+
143
+ ```
144
+ 📊 一致性检查结果
145
+ 需求覆盖率:{N}/{total}({score}%)
146
+ 任务完成率:{M}/{tasks}(若存在 tasks.md)
147
+
148
+ ❌ 缺失实现(HIGH):
149
+ - {需求点 1}(对应 design.md § {节号})
150
+ - {需求点 2}
151
+
152
+ ⚠️ 超出范围的变更(MEDIUM):
153
+ - {文件路径}(建议确认是否属于本次需求范围)
154
+
155
+ ✅ 已覆盖:{N} 个需求点
156
+ ```
157
+
158
+ ---
159
+
160
+ ### Step 3:代码质量 CR(modus-reviewer 独立版本)
161
+
162
+ > **来源:modus-reviewer** — 评审维度与 harness 内部保持一致;P1/P2/P3 分级规则相同
163
+
164
+ 对 Step 1 获取的每个变更文件,依次执行以下维度的代码审查:
165
+
166
+ #### 维度 1:需求符合性(仅在有 --doc 时执行)
167
+
168
+ 将 Step 2 的一致性检查结果转化为 CR 问题:
169
+ - 核心功能缺失 → P1 问题
170
+ - 次要需求缺失 → P2 问题
171
+
172
+ #### 维度 2:代码质量
173
+
174
+ **命名规范:**
175
+ - 类名、方法名、变量名是否语义清晰
176
+ - 是否遵循业务 Skill 中的命名约定(`[guideline]` 标签)
177
+
178
+ **架构规范:**
179
+ - 文件放置位置是否正确(包结构/目录层次)
180
+ - 是否存在跨层调用(如 Controller 直接调 Mapper)
181
+ - 职责分离是否清晰(业务逻辑是否在正确的层)
182
+
183
+ **事务与并发:**
184
+ - `@Transactional` 是否在正确位置(Manager 层,避免同类内部调用失效)
185
+ - 是否存在事务嵌套或传播问题
186
+ - 分布式锁使用是否正确(加锁范围、锁粒度、释放时机)
187
+
188
+ **防御性编程:**
189
+ - 关键参数是否有非空校验(`@NotNull`、`Assert.notNull`)
190
+ - 数据库结果是否处理了 null/empty 情况
191
+ - 集合操作前是否判空(`CollectionUtils.isEmpty`)
192
+
193
+ **异常处理:**
194
+ - 是否使用项目统一异常类(从 constitution/business Skill 获取规范)
195
+ - 是否存在异常吞咽(`catch (Exception e) {}`)
196
+ - 关键操作是否有完整日志(入参/出参/异常信息)
197
+
198
+ **金额处理:**
199
+ - 金额字段类型是否符合 `constitution.hard_rules` 规范
200
+ - 若 hard_rules 未明确,默认检查是否使用 BigDecimal,并在报告中标注「未找到金额规范配置,使用默认规则」
201
+
202
+ #### 维度 3:安全(多租户隔离)
203
+
204
+ - `tenantId` 是否来自 `UserContext`(而非 request 参数)
205
+ - Facade/Controller 层是否有权限校验(`@UserAuthorization`)
206
+ - 日志中是否有敏感信息泄露(银行卡号、身份证、手机号明文)
207
+ - 是否存在 SQL 拼接风险(`${}` 而非 `#{}`)
208
+
209
+ #### 维度 4:性能
210
+
211
+ - 是否存在 N+1 查询(循环内数据库调用)
212
+ - 批量操作是否缺少 batch 方法(逐条 insert 替代 batchInsert)
213
+ - 大数据量查询是否缺少分页保护
214
+ - 列表接口是否有最大条数限制
215
+
216
+ #### 维度 5:业务规则(来自 Skill)
217
+
218
+ 从已加载业务域 Skill 的 `[pitfall]` 和 `[guideline]` 标签中,检查代码变更是否违反已知规则:
219
+ - 每个相关 `[pitfall]` 检查代码中是否有对应的保护措施
220
+ - 每个相关 `[guideline]` 检查代码是否遵循约定
221
+
222
+ ---
223
+
224
+ ### Step 4:生成 cr-report.md
225
+
226
+ **确定产出路径:**
227
+
228
+ ```
229
+ modus/cr/{YYYYMMDD}-{feature-name}/cr-report.md
230
+
231
+ feature-name 来源(按优先级):
232
+ 1. --doc 文档的目录名(如 modus/plans/batch-export/ → batch-export)
233
+ 2. --story URL 中的 story ID
234
+ 3. git branch 名称中的 feature 部分
235
+ 4. 默认:cr-{YYYYMMDD}
236
+ ```
237
+
238
+ **cr-report.md 格式(与 harness 完全兼容):**
239
+
240
+ ```markdown
241
+ ---
242
+ schema_version: "1.2"
243
+ agent: "cr-standalone"
244
+ run_id: "{YYYYMMDD}-{feature-name}"
245
+ source_docs:
246
+ - "{doc_path1}"
247
+ - "{doc_path2}"
248
+ story_id: "{story-id 或空字符串}"
249
+ domains: ["{domain1}", "{domain2}"]
250
+ consistency_score: "{N}/{total}"
251
+ gate_status: "{passed|failed}"
252
+ artifact_status: "complete"
253
+ issues:
254
+ - level: "P1"
255
+ code: "P1-01"
256
+ agent: "cr-standalone"
257
+ location: "{文件名}:{行号}"
258
+ summary: "{一句话问题摘要}"
259
+ suggestion: "{修复建议}"
260
+ category: "{consistency|quality|security|performance|business-rule}"
261
+ - level: "P2"
262
+ code: "P2-01"
263
+ agent: "cr-standalone"
264
+ location: "{文件名}:{行号}"
265
+ summary: "{一句话问题摘要}"
266
+ suggestion: "{修复建议}"
267
+ category: "{category}"
268
+ skill_refs:
269
+ - "modus-biz-{domain}@{version}"
270
+ ---
271
+
272
+ # 代码评审报告(独立模式)
273
+
274
+ ## 评审摘要
275
+ - 评审时间: {YYYY-MM-DD HH:mm}
276
+ - 参考文档:{doc_paths}
277
+ - 代码变更:{N} 个文件
278
+ - 需求覆盖率:{consistency_score}({quick_mode 时:「--quick 模式,已跳过一致性检查」})
279
+ - P1 问题: {N} 个 | P2 问题: {N} 个 | P3 建议: {N} 个
280
+ - **合入结论: {✅ 可合入 / ❌ 需修复后重审}**
281
+
282
+ ## 一致性检查(需求覆盖率矩阵)
283
+
284
+ | 需求点 | 状态 | 代码位置 |
285
+ |--------|------|---------|
286
+ | {需求描述} | ✅ 已覆盖 | `{文件路径}:{行号}` |
287
+ | {需求描述} | ❌ 缺失实现 | — |
288
+ | {代码变更描述} | ⚠️ 超出范围 | `{文件路径}` |
289
+
290
+ (--quick 模式时此节显示「已跳过(--quick 模式)」)
291
+
292
+ ## P1 问题(必须修复)
293
+
294
+ ### [P1-01] {问题标题}
295
+ - **位置:** `{文件名}:{行号}`
296
+ - **类别:** {consistency | quality | security | performance | business-rule}
297
+ - **问题描述:** {详细说明问题是什么,为什么有问题}
298
+ - **代码片段:**
299
+ ```{language}
300
+ // 有问题的代码
301
+ ```
302
+ - **修复方案:**
303
+ ```{language}
304
+ // 正确的代码
305
+ ```
306
+
307
+ ## P2 问题(必须修复)
308
+ ...(与 P1 格式相同)
309
+
310
+ ## P3 建议(建议修复)
311
+ ...(格式同上,可精简描述)
312
+
313
+ ## 正向确认
314
+ - ✅ {正确的做法,鼓励延续的好实践}
315
+
316
+ ## 下一步
317
+ {如有 P1/P2 → "需修复以下问题后重新评审,建议运行 /modus:vibe 修复"}
318
+ {如无 P1/P2 → "通过评审,可直接合入代码"}
319
+ ```
320
+
321
+ **HANDOFF 块填写规则(与 harness cr-report.md 相同):**
322
+ - `gate_status`:无 P1/P2 → `passed`;有 P1/P2 → `failed`
323
+ - `issues`:仅列 P1/P2(P3 不阻塞);无 P1/P2 时写空列表 `issues: []`
324
+ - 新增字段:`consistency_score`(一致性检查覆盖率)、`category`(问题来源类别)
325
+
326
+ ---
327
+
328
+ ### Step 5(可选):创建 TAPD Bug 单
329
+
330
+ > **前置条件:** `modus/config.yaml` 中 `tapdProjectId` 非空,且 TAPD MCP(`tapd_mcp_http`)可用。
331
+
332
+ > **协调说明:** 如果 workspace 中已安装独立的 `tapd-bug-creator` Skill,**优先使用外部 Skill** 创建 Bug 单,本节逻辑作为降级兜底。
333
+
334
+ 满足前置条件时,对 P1/P2 问题自动创建 TAPD Bug 单:
335
+
336
+ - Bug 标题:`[Modus CR] {问题标题}`
337
+ - 关联 Story:若有 `--story`,填入对应 Story ID
338
+ - 描述:包含代码位置(`location` 字段)、问题代码片段、修复方案(`suggestion` 字段)
339
+ - 严重程度:P1 → 严重,P2 → 一般
340
+ - 优先级:P1 → 高,P2 → 中
341
+
342
+ 创建完成后将 Bug ID 写入 cr-report.md 末尾的 `tapd_bugs` 列表:
343
+
344
+ ```markdown
345
+ ## TAPD Bug 单
346
+ | CR 问题 | Bug ID | 链接 |
347
+ |---------|--------|------|
348
+ | P1-01 {标题} | {bugId} | {tapd_url} |
349
+ ```
350
+
351
+ ---
352
+
353
+ ## 产出物目录结构
354
+
355
+ ```
356
+ modus/
357
+ └── cr/
358
+ └── {YYYYMMDD}-{feature-name}/
359
+ └── cr-report.md ← 评审报告(HANDOFF 格式)
360
+ ```
361
+
362
+ ---
363
+
364
+ ## 问题分级规则
365
+
366
+ | 级别 | 定义 | 处理 |
367
+ |------|------|------|
368
+ | **P1(严重)** | 核心功能缺失、数据安全漏洞、会导致生产故障的 Bug、多租户数据泄露 | 必须修复,`gate_status: failed` |
369
+ | **P2(高风险)** | 架构规范违反、事务/并发问题、安全隐患、性能高风险、次要需求缺失 | 必须修复,`gate_status: failed` |
370
+ | **P3(建议)** | 代码质量改进、命名优化、日志完善、低风险性能建议 | 建议修复,不阻塞合入 |
371
+
372
+ **性能问题分级映射(来自 modus-reviewer 规则):**
373
+
374
+ | 原始级别 | CR 级别 | 触发条件 |
375
+ |----------|---------|---------|
376
+ | 高风险 | P2(或 P1) | 影响 SLA 则升为 P1 |
377
+ | 中风险 | P3 | 建议优化 |
378
+ | 低风险 | P3 | 建议优化 |
379
+
380
+ **安全问题分级映射:**
381
+
382
+ | 原始级别 | CR 级别 |
383
+ |----------|---------|
384
+ | 严重 | P1 |
385
+ | 高风险 | P2 |
386
+ | 低风险 | P3 |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: modus-harness
3
- description: Use this skill when executing /modus:harness command to run the full dual-loop multi-agent Harness from requirements analysis to deployment. Acts as the orchestrator coordinating SubAgents 00-07. Trigger on /modus:harness command or when user provides a TAPD Story URL and wants automated end-to-end delivery.
3
+ description: Use this skill when executing /modus:harness command to run the full dual-loop multi-agent Harness from requirements analysis to deployment. Acts as the orchestrator coordinating SubAgents 00-07. Trigger on /modus:harness command or when user provides a TAPD Story URL and wants automated end-to-end delivery. Also handles --from-plan relay (skip SA01+SA02, read plan.md as dev input) and --show-progress (write events.jsonl).
4
4
  allowed-tools: Read, Write, Glob, Bash, Task
5
5
  disable: false
6
6
  ---
@@ -61,6 +61,67 @@ Orchestrator 每步只需读 HANDOFF 块(≤ 20 行),而非整份 MD 文
61
61
 
62
62
  ---
63
63
 
64
+ ## 参数解析(优先执行,Step 1 之前)
65
+
66
+ **首先**检测用户输入中的参数标志,设置后续行为开关:
67
+
68
+ ```
69
+ --help → 输出帮助文档,结束执行
70
+ --from-plan X → FROM_PLAN_MODE=true,PLAN_NAME=X(进入 from-plan 接力路径,见下方)
71
+ --show-progress → SHOW_PROGRESS=true(每个关键节点写入 events.jsonl)
72
+ --domain X → FORCED_DOMAINS=X(逗号分隔,跳过域确认交互)
73
+ --skip X → SKIP_AGENTS=X(逗号分隔的 SubAgent ID)
74
+ --loop1-only → LOOP1_ONLY=true
75
+ --resume → RESUME=true
76
+ --dry-run → DRY_RUN=true
77
+ --force → FORCE=true(跳过人工确认,Codex 平台自动开启)
78
+ --no-deploy → NO_DEPLOY=true
79
+ --max-loop2 N → MAX_LOOP2=N(默认 3)
80
+ --verbose → VERBOSE=true
81
+ --project X → PROJECT=X
82
+ ```
83
+
84
+ **FROM_PLAN 接力路径(--from-plan 时,替代 Step 2 的标准澄清流程):**
85
+
86
+ ```
87
+ Step P1:读取 plan.md
88
+ 路径:modus/plans/{PLAN_NAME}/plan.md
89
+ 读取 HANDOFF frontmatter 验证:
90
+ → design_mode = true 且 status ∈ {approved, continued}
91
+ → 若 status = pending_review:
92
+ 提示「plan 尚未批准(status=pending_review),请先完成技术评审后再 --continue」
93
+ 输出「如需强制继续,运行:/modus:harness --from-plan {name} --force」
94
+ 若 FORCE=false:结束执行
95
+ 提取关键内容:
96
+ → domains:传给知识注入(SA00)
97
+ → story_id:用于工作目录路径(若 plan.md 有 story_id)
98
+ → 「实现 Todos」章节 → 作为 SA03 的代码开发计划(替代 01-analysis + 02-design Sprint 拆分)
99
+ → 「技术方案评审 → 推荐方案」→ 作为 SA03 的架构决策参考
100
+ → 「已知风险」→ 传递给 SA07 代码评审作为审查重点
101
+ → continue_token:记录到工作目录 .harness-state.yaml
102
+
103
+ Step P2:初始化工作目录
104
+ 若 plan.md 含 story_id:工作目录 = modus/stories/{story_id}/harness/
105
+ 若无 story_id:工作目录 = modus/plans/{PLAN_NAME}/harness/
106
+
107
+ Step P3:输出接力摘要
108
+ 🚀 从 plan --from-plan 接力启动
109
+ plan:modus/plans/{PLAN_NAME}/plan.md
110
+ continue_token:{token}
111
+ 跳过:SA01(需求分析)+ SA02(设计方案)
112
+ 直接执行:SA00(知识注入)→ SA03(代码开发)→ SA04/05/06(并行审计)→ SA07(评审)→ SA08(部署)
113
+
114
+ Step P4:设置 SKIP_AGENTS = ["01", "02"](强制跳过 SA01 + SA02)
115
+ 并将 plan.md 的「实现 Todos」封装为 FROM_PLAN_CONTEXT,注入 SA03 执行时的任务描述
116
+
117
+ 写入进度事件(若 SHOW_PROGRESS=true):
118
+ {"ts":"...","type":"plan_relay","plan_name":"{PLAN_NAME}","continue_token":"{token}","skipped_stages":["01-analysis","02-design"]}
119
+
120
+ 完成后进入标准 Step 1(项目宪法 + 前置检查),跳过 Step 2(澄清意图)。
121
+ ```
122
+
123
+ ---
124
+
64
125
  ## 执行流程
65
126
 
66
127
  ### Step 1:项目宪法 + 前置检查
@@ -158,11 +219,20 @@ last_updated: "{ISO 8601 时间戳}"
158
219
 
159
220
  将 Skill 内容(已加载的完整 SKILL.md)和 constitution.hard_rules 一起传递给 SubAgent 01 作为背景知识。
160
221
 
222
+ **FROM_PLAN_MODE 特殊处理:**
223
+
224
+ 若 FROM_PLAN_MODE=true,在输出启动摘要时补充 plan 上下文说明:
225
+
161
226
  ```
162
- [Harness Orchestrator 启动]
163
- Story: {id} | 工作目录: modus/stories/{id}/harness/
164
- 知识注入: order[verified→已更新] | payment[proven→已读取] | user[新建 draft]
165
- Constitution: {N} 条硬性规则已加载
227
+ [Harness Orchestrator 启动 — plan 接力模式]
228
+ plan:modus/plans/{PLAN_NAME}/plan.md(continue_token: {token})
229
+ 工作目录: {工作目录}
230
+ 跳过: SA01(需求分析)→ SA02(设计方案)
231
+ 知识注入: {domains}[...] | Constitution: {N} 条硬性规则已加载
232
+
233
+ 📋 SA03 将读取 plan.md 中的「实现 Todos」作为代码开发输入:
234
+ {plan.md 中 Todos 章节前 3 条预览}
235
+ ...(共 N 条 Todo)
166
236
  ```
167
237
 
168
238
  ---
@@ -313,17 +383,27 @@ feat: {业务摘要}
313
383
 
314
384
  ## 调度 CoT(每次行动前循环执行)
315
385
 
316
- 1. 扫描 `modus/stories/{story-id}/harness/` 目录,列出已有 HANDOFF frontmatter
386
+ 1. 扫描工作目录,列出已有 HANDOFF frontmatter
317
387
  2. 只需读各文件的 HANDOFF frontmatter(≤ 20 行),对照串行顺序确定当前阶段
318
388
  3. 检查当前阶段的 Gate 条件是否满足(优先读 HANDOFF,必要时读全文)。**每个 Gate 仅在对应 SubAgent 完成后单独执行,互相独立,不同时触发**:
319
- - Gate A0:**当 SubAgent 01 写入 `01-analysis.md` 后**,检查该文件 HANDOFF 块的 `gate_status` 字段,确保 = "passed"(需求分析质量门,独立于 Gate A0.5
320
- - Gate A0.5:**当 SubAgent 02 写入 `02-design-brief.md` 后**,检查 `gate_status ∈ {passed, warning}`;`failed` 时重入 SubAgent 02,最多 2
389
+ - Gate A0:**当 SubAgent 01 写入 `01-analysis.md` 后**,检查该文件 HANDOFF 块的 `gate_status` 字段,确保 = "passed"(需求分析质量门,独立于 Gate A0.5)。**FROM_PLAN_MODE 时跳过此 Gate**(SA01 已跳过)
390
+ - Gate A0.5:**当 SubAgent 02 写入 `02-design-brief.md` 后**,检查 `gate_status ∈ {passed, warning}`;`failed` 时重入 SubAgent 02,最多 2 次。**FROM_PLAN_MODE 时跳过此 Gate**(SA02 已跳过)
321
391
  - Gate A:执行 `constitution.build_command`(如 `mvn clean compile -q -DskipTests`),检查 exit code = 0;失败时重入 SubAgent 03,最多 3 次
322
392
  - Gate B:扫描 harness/ 目录,检查 `04-test-report.md`、`05-perf-report.md`、`06-security-report.md` 的 HANDOFF `artifact_status` 均为 `complete`;各报告 `gate_status ≠ "failed"`;06(安全审计)有严重/高危则强制拦截;超时(30 分钟)上报用户
323
393
  - Gate C:读 `cr-report.md` HANDOFF,检查 `issues` 数组为空或全为 P3;有 P1/P2 时从 `issues[].affected_sprint` 定位受影响 Sprint,触发 Loop 2 精准重入 SubAgent 03
324
394
  4. Gate 通过 → 调用下一个 SubAgent 的 Skill(传递 constitution + 相关 Skill 内容)
325
- - 调用 SubAgent 03 时,必须同时传入 `02-design-brief.md` 内容
395
+ - 调用 SubAgent 03 时:
396
+ - **标准模式**:必须同时传入 `02-design-brief.md` 内容
397
+ - **FROM_PLAN_MODE**:传入 plan.md 的「实现 Todos」+ 「推荐方案」作为等价输入,代替 02-design-brief.md
326
398
  5. Gate 失败 → 按规则处理(重入/上报)
327
399
  6. 输出本轮进度卡片
328
400
  7. 若 SubAgent 08 完成且 `08-deploy-status.md` HANDOFF `artifact_status = complete` → 触发 ARCHIVE 知识提取(SubAgent 00 模式 D),进入 Step 4
329
- 8. 等待 SubAgent 写入产出物,重复步骤 1
401
+ 8. **进度事件写入(SHOW_PROGRESS=true 时,在步骤 4/5/7 后各执行一次):**
402
+ 向 `modus/sessions/events.jsonl` 追加事件(JSON Lines 格式,见 `modus/docs/protocol.md §七`):
403
+ - SubAgent 开始执行前:写入 `stage_start` 事件
404
+ - SubAgent 完成后:写入 `stage_done` 事件
405
+ - Gate 检查完成后:写入 `gate` 事件
406
+ - Gate A 编译检查后:写入 `compile` 事件
407
+ - Loop 2 触发时:写入 `loop2_start` 事件
408
+ - 全流程完成时:写入 `harness_done` 事件
409
+ 9. 等待 SubAgent 写入产出物,重复步骤 1