@modus-ai/modus 0.2.4 → 0.2.6

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 (75) hide show
  1. package/README.md +100 -42
  2. package/dist/cli/index.js +2 -2
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/commands/config.d.ts.map +1 -1
  5. package/dist/commands/config.js +9 -8
  6. package/dist/commands/config.js.map +1 -1
  7. package/dist/commands/global.js +1 -1
  8. package/dist/commands/global.js.map +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +37 -7
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/status.js +2 -2
  13. package/dist/generators/claude.d.ts.map +1 -1
  14. package/dist/generators/claude.js +1 -37
  15. package/dist/generators/claude.js.map +1 -1
  16. package/dist/generators/codebuddy.d.ts.map +1 -1
  17. package/dist/generators/codebuddy.js +3 -1
  18. package/dist/generators/codebuddy.js.map +1 -1
  19. package/dist/generators/codex.d.ts +10 -0
  20. package/dist/generators/codex.d.ts.map +1 -0
  21. package/dist/generators/codex.js +178 -0
  22. package/dist/generators/codex.js.map +1 -0
  23. package/dist/generators/copilot.d.ts.map +1 -1
  24. package/dist/generators/copilot.js +0 -1
  25. package/dist/generators/copilot.js.map +1 -1
  26. package/dist/generators/cursor.d.ts.map +1 -1
  27. package/dist/generators/cursor.js +36 -7
  28. package/dist/generators/cursor.js.map +1 -1
  29. package/dist/generators/custom.d.ts +55 -0
  30. package/dist/generators/custom.d.ts.map +1 -0
  31. package/dist/generators/custom.js +166 -0
  32. package/dist/generators/custom.js.map +1 -0
  33. package/dist/generators/index.d.ts +1 -0
  34. package/dist/generators/index.d.ts.map +1 -1
  35. package/dist/generators/index.js +10 -0
  36. package/dist/generators/index.js.map +1 -1
  37. package/dist/utils/config.d.ts +38 -1
  38. package/dist/utils/config.d.ts.map +1 -1
  39. package/dist/utils/config.js +10 -2
  40. package/dist/utils/config.js.map +1 -1
  41. package/dist/utils/file-system.d.ts.map +1 -1
  42. package/dist/utils/file-system.js +2 -1
  43. package/dist/utils/file-system.js.map +1 -1
  44. package/package.json +1 -1
  45. package/schemas/harness-schema.yaml +178 -53
  46. package/schemas/knowledge-schema.yaml +111 -1
  47. package/templates/agents/modus-analyst.md +1 -1
  48. package/templates/behavior-guard.md +165 -0
  49. package/templates/commands/auto.md +61 -25
  50. package/templates/commands/commit.md +63 -0
  51. package/templates/commands/harness.md +97 -30
  52. package/templates/commands/init.md +43 -10
  53. package/templates/commands/modus.md +55 -28
  54. package/templates/commands/plan.md +60 -18
  55. package/templates/commands/spec.md +69 -25
  56. package/templates/commands/upgrade.md +54 -0
  57. package/templates/commands/vibe.md +56 -6
  58. package/templates/knowledge-catalog.md +74 -32
  59. package/templates/skills/modus-agents/analyst/SKILL.md +18 -3
  60. package/templates/skills/modus-agents/deployer/SKILL.md +114 -62
  61. package/templates/skills/modus-agents/designer/SKILL.md +104 -92
  62. package/templates/skills/modus-agents/developer/SKILL.md +107 -66
  63. package/templates/skills/modus-agents/perf-auditor/SKILL.md +98 -61
  64. package/templates/skills/modus-agents/reviewer/SKILL.md +61 -11
  65. package/templates/skills/modus-agents/security-auditor/SKILL.md +111 -67
  66. package/templates/skills/modus-agents/skill-creator/SKILL.md +30 -12
  67. package/templates/skills/modus-agents/tester/SKILL.md +100 -54
  68. package/templates/skills/modus-auto/SKILL.md +581 -109
  69. package/templates/skills/modus-design-brief/SKILL.md +45 -19
  70. package/templates/skills/modus-harness/SKILL.md +150 -85
  71. package/templates/skills/modus-init/SKILL.md +1145 -319
  72. package/templates/skills/modus-plan/SKILL.md +125 -48
  73. package/templates/skills/modus-platform/SKILL.md +271 -0
  74. package/templates/skills/modus-spec/SKILL.md +175 -331
  75. package/templates/skills/modus-vibe/SKILL.md +256 -55
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: modus-plan
3
- description: Use this skill when executing /modus:plan command to generate a single structured plan.md backed by up-to-date business Skills. Trigger on /modus:plan command or when user wants to plan a feature with full business context. Loads Skill domains first, falls back to platform rules + source scan, then asks exactly 3 targeted questions before generating the plan. Ends with a Build confirmation loop where user can iterate on plan.md before executing code generation.
3
+ description: Use this skill when executing /modus:plan command to generate a single structured plan.md backed by up-to-date business Skills. Trigger on /modus:plan command or when user wants to plan a feature with full business context. Loads Skill domains first, falls back to platform rules + source scan, then asks 0-3 targeted questions (no padding — only ask when truly needed) before generating the plan. Ends with a Build confirmation loop where user can iterate on plan.md before executing code generation.
4
4
  allowed-tools: Read, Write, Glob, Bash
5
5
  disable: false
6
6
  ---
@@ -11,7 +11,7 @@ disable: false
11
11
 
12
12
  ## 职责
13
13
 
14
- 功能规划入口。通过**两层知识检索**获取业务上下文,先评估需求复杂度自动分级(simple/medium/complex),再基于加载的知识向用户提出恰好 3 个精准澄清问题,最终生成单一 `plan.md` 规划文档。文档生成后进入 Build 确认循环,用户可反复修改直至满意后触发代码执行,并将本次规划中的新知识回写到 Skill(后置更新)。
14
+ 功能规划入口。通过**两层知识检索**获取业务上下文,先评估需求复杂度自动分级(simple/medium/complex),再基于加载的知识向用户提出 0–3 个精准澄清问题(按需提问,禁止凑数),最终生成单一 `plan.md` 规划文档。文档生成后进入 Build 确认循环,用户可反复修改直至满意后触发代码执行,并将本次规划中的新知识回写到 Skill(后置更新)。
15
15
 
16
16
  ---
17
17
 
@@ -67,6 +67,15 @@ disable: false
67
67
 
68
68
  ### Step 3:复杂度评估与自动分级
69
69
 
70
+ **AUTO_MODE 快速检测(Step 3 执行前):**
71
+
72
+ 若 prompt 末尾包含 `[AUTO_MODE: questions_confirmed]` 标记(由 `/modus:auto` 自动注入),则:
73
+ - 跳过 Step 6 的精准澄清问题(已在 auto 流程中确认,无需重复提问)
74
+ - 直接使用标记后附带的「已确认的关键信息」作为澄清答案
75
+ - 在输出中注明:`[已从 /modus:auto 继承确认信息,跳过澄清阶段]`
76
+
77
+ 若未包含此标记,正常执行以下评估流程:
78
+
70
79
  域确认后,快速评估需求复杂度并输出分级建议:
71
80
 
72
81
  **评估维度:**
@@ -117,21 +126,28 @@ disable: false
117
126
 
118
127
  #### 4-1:读取 Skill frontmatter(轻量操作,仅读前 20 行)
119
128
 
120
- 读取 `.codebuddy/skills/modus-biz-{domain}/SKILL.md` 的 YAML frontmatter,提取:
129
+ 读取 `modus/knowledge/biz-{domain}/SKILL.md` 的 YAML frontmatter,提取:
121
130
  - `last_hash`:上次记录的 key_files 内容摘要
122
131
  - `key_files`:关键源文件列表
123
132
 
124
- 若 Skill 不存在,跳到 4-4(新建)。
133
+ 若 Skill 不存在(包括 modus/knowledge/ 目录下不存在),跳到 4-4(新建)。
134
+
135
+ > **注意**:`.codebuddy/skills/modus-biz-{domain}/SKILL.md` 自 v3.2 起已降级为引用桩,不含实际内容,请勿从此路径读取。
125
136
 
126
137
  #### 4-2:计算当前 key_files 的 hash
127
138
 
128
- 使用 Bash 对 `key_files` 列出的文件内容做 SHA-1 摘要:
139
+ 使用 Bash 对 `key_files` 列出的文件内容做 SHA-1 摘要(**必须使用 modus-init 区块 B 规定的标准算法**):
129
140
 
130
141
  ```bash
131
- # 对每个文件计算 sha1,排序后再做一次 sha1(顺序无关)
132
- shasum -a 1 {file1} {file2} ... | awk '{print $1}' | sort | shasum -a 1 | awk '{print $1}'
142
+ # 标准全局 hash 计算命令(与 modus-init 生成时的算法完全一致)
143
+ # 对每个文件单独计算 SHA-1,按文件路径排序后拼接,再整体 hash
144
+ for f in $(echo "{key_files}" | tr ' ' '\n' | sort); do
145
+ echo "$(shasum -a 1 "$f" | awk '{print $1}'):$f"
146
+ done | shasum -a 1 | awk '{print $1}'
133
147
  ```
134
148
 
149
+ > 注意:禁止使用「内容拼接整体 hash」或「仅 hash 值排序 hash」的替代算法,否则与 init 写入的 last_hash 不匹配,导致每次都误判为 stale。
150
+
135
151
  - 若某个 `key_files` 中的文件不存在(可能已被重命名/删除),视为「已变化」,强制更新
136
152
  - 若 `key_files` 为空或缺失,视为「已变化」,强制更新
137
153
 
@@ -170,15 +186,28 @@ shasum -a 1 {file1} {file2} ... | awk '{print $1}' | sort | shasum -a 1 | awk '{
170
186
  maturity: draft → verified(本次引用后满足晋升条件)
171
187
  ```
172
188
 
173
- 若有未初始化的域,调用模式 A 新建 Skill(`last_hash` 留空,`key_files` 由 AI 填写)。
189
+ 若有未初始化的域,调用模式 A 新建 Skill(`last_hash` 留空,`key_files` 由 AI 填写);新建完成后将新域纳入本次可用 Skill 集合,继续执行。
174
190
 
175
- **若所有域均已初始化且 Skill 加载成功,直接进入 Step 6,跳过 Step 5。**
191
+ **Step 4 执行完后的分支判断:**
192
+
193
+ ```
194
+ 情形 A:所有域均已初始化(含本轮新建)且 Skill 全部加载成功
195
+ → 直接进入 Step 6,跳过 Step 5
196
+
197
+ 情形 B:knowledge-catalog.md 不存在
198
+ → 进入 Step 5(平台知识兜底扫描)
199
+
200
+ 情形 C:部分域已初始化、部分域未初始化(混合状态)
201
+ → 对未初始化的域调用模式 A 新建后,加入到当前 Skill 集合
202
+ → 新建失败(如目录为空,无代码可扫描)时,对该域仅输出警告,继续处理已有域
203
+ → 完成处理后进入 Step 6(不触发 Step 5,已有 catalog 作为索引)
204
+ ```
176
205
 
177
206
  ---
178
207
 
179
208
  ### Step 5:平台知识兜底扫描(仅在 Step 4 无命中时执行)
180
209
 
181
- 当 `knowledge-catalog.md` 不存在,或当前需求涉及的域全部未初始化时,切换到平台知识扫描模式:
210
+ 当 `knowledge-catalog.md` **不存在**时,切换到平台知识扫描模式作为兜底。注意:若 catalog 存在但部分域未初始化,属于情形 C,由 Step 4 内处理,不触发 Step 5:
182
211
 
183
212
  **按已启用平台依次扫描规则文件:**
184
213
 
@@ -203,26 +232,35 @@ shasum -a 1 {file1} {file2} ... | awk '{print $1}' | sort | shasum -a 1 | awk '{
203
232
 
204
233
  ---
205
234
 
206
- ### Step 6:精准 3 问(AskUserQuestion)
235
+ ### Step 6:精准澄清问(AskUserQuestion)
236
+
237
+ 基于 Step 4 或 Step 5 已加载的知识内容,向用户提出**必要的**澄清问题。
207
238
 
208
- 基于 Step 4 Step 5 已加载的知识内容,向用户提出**恰好 3 个**澄清问题。
239
+ **核心原则:只问真正有歧义或有高风险的点。需求足够清晰时可以只问 1 个(甚至 0 个),不要为了凑数制造问题。上限 3 个,超过 3 个未澄清点说明需求本身需要重新定义。**
209
240
 
210
- **生成规则(按优先级排序,必须输出恰好 3 个):**
241
+ **必须提问的条件(满足任一即问):**
211
242
 
212
- 1. **P1 — Skill pitfall 关联问题**(最高优先级)
213
- 若加载内容中有与当前需求相关的 `[pitfall]`,必问。
243
+ 1. **P1 — Skill pitfall 关联问题**(命中即必问,不可省略)
244
+ 若加载内容中有与当前需求相关的 `[pitfall]`,必须确认用户是否已知晓并有对策。
214
245
  示例:`Skill 中记录了「并发创建订单需加分布式锁」的坑,本次改动是否涉及并发写入场景?`
215
- 若有多个相关 pitfall,选取与本次需求匹配度最高的 1 个。
246
+ 若有多个相关 pitfall,选取与本次需求匹配度最高的 1 个提问。
216
247
 
217
- 2. **P2 — 范围/边界问题**
218
- 影响规划深度的不确定点(跨域边界、兼容性要求、数据量级)。
219
- 示例:`这次改动是否需要向后兼容旧的导出格式,还是可以直接替换?`
248
+ 2. **P2 — 影响规划深度的不确定点**(有真实歧义才问)
249
+ 存在跨域边界不明确、兼容性要求未说明、数据量级未知等会影响技术选型的不确定点。
250
+ 示例:`这次改动是否需要向后兼容旧的导出格式?`
251
+ **若需求描述已足够清晰(单域、单功能、无歧义词),跳过此条。**
220
252
 
221
- 3. **P3 — 优先级/约束问题**
222
- 时间窗口、技术选型偏好、外部依赖。
223
- 示例:`功能是否有明确的上线时间节点?这会影响 Sprint 拆分方式。`
253
+ 3. **P3 — 影响 Sprint 拆分的外部约束**(有明确上线压力才问)
254
+ 功能有明确时间节点、或涉及外部系统联调依赖时才问。
255
+ 示例:`功能是否有明确的上线时间节点?`
256
+ **若用户未提及时间约束且复杂度为 simple,跳过此条。**
224
257
 
225
- **若 pitfall 不存在**,P1 改为「核心目标澄清」:本次改动的最高优先级目标是什么?
258
+ **若上述三条均无命中 直接跳过提问,输出:**
259
+ ```
260
+ 需求清晰,无需额外确认。开始生成 plan.md。
261
+ ```
262
+
263
+ > **设计理由(Karpathy Think Before Coding):** "恰好 3 个问题"是一种伪精确——它让 Agent 在只有 1 个真实歧义时制造 2 个无意义问题,或在需求清晰时也强制打断用户。真正的 Think Before Coding 是:发现真实的歧义才问,没有歧义就直接开工。
226
264
 
227
265
  等待用户回答后,输出意图确认摘要:
228
266
 
@@ -242,8 +280,17 @@ shasum -a 1 {file1} {file2} ... | awk '{print $1}' | sort | shasum -a 1 | awk '{
242
280
 
243
281
  基于已加载的知识和用户确认的意图,生成单一规划文档到 `modus/plans/{name}/plan.md`。
244
282
 
245
- **确定 plan 名称:**
246
- - 从用户 prompt 提取关键词,生成 kebab-case 名称(如 `add-batch-approve`)
283
+ **确定产出路径(Story 模式 vs 独立模式):**
284
+
285
+ ```
286
+ 情形 A:来自 /modus:auto(context_bundle 含 story_id)
287
+ 产出路径:modus/stories/{story-id}/plan.md
288
+
289
+ 情形 B:用户直接运行 /modus:plan(无 story_id)
290
+ 产出路径:modus/plans/{name}/plan.md
291
+ plan 名称:从用户 prompt 提取关键词,生成 kebab-case(如 add-batch-approve)
292
+ ```
293
+
247
294
  - 如果目录已存在,提示用户确认
248
295
 
249
296
  **写入状态文件:**
@@ -321,15 +368,35 @@ plan.md 生成后,展示结果并进入确认循环:
321
368
 
322
369
  **循环逻辑:**
323
370
  - 用户提出修改意见 → 更新 `plan.md` → 重新输出上述确认提示(循环,无次数限制)
324
- - 用户回复「Build」/「开始」/「执行」→ 退出循环,以 `plan.md` 中的 Todos 为输入,启动 `/modus:vibe` 执行代码生成
371
+ - 用户回复「Build」/「开始」/「执行」→ 退出循环,按下方「Build 触发后」的规定启动 `/modus:vibe`
325
372
  - 用户回复「归档」/「稍后」→ 走归档流程,不启动代码生成
326
373
 
327
374
  **Build 触发后:**
328
- ```
329
- 🚀 开始执行 plan.md 中的 Todos,启动 /modus:vibe...
330
- 读取: modus/plans/{name}/plan.md
331
- 执行范围: {Todos 列表}
332
- ```
375
+
376
+ 以下是 modus-plan modus-vibe 的**标准上下文传递协议**:
377
+
378
+ 1. 输出 Build 启动提示(让用户感知上下文已传递):
379
+ ```
380
+ 🚀 开始执行 plan.md 中的 Todos,启动 /modus:vibe...
381
+ 规划文件: modus/plans/{name}/plan.md
382
+ 执行范围: {Todos 列表}
383
+ 传递标记: [FROM_PLAN: modus/plans/{name}/plan.md]
384
+ ```
385
+
386
+ 2. 以如下格式构造 vibe 的输入 prompt(在 **当前上下文中**直接继续执行,不需要用户重新输入命令):
387
+ ```
388
+ 按照 [FROM_PLAN: modus/plans/{name}/plan.md] 中的 Todos 逐项实现:
389
+
390
+ {plan.md 中「实现 Todos」章节的完整内容}
391
+
392
+ 已加载的业务上下文:{Step 4 已加载的 Skill 域列表}
393
+ 项目硬性约束:{constitution.hard_rules}
394
+ ```
395
+
396
+ 3. modus-vibe Step 0 检测到 `[FROM_PLAN:...]` 标记时:
397
+ - 自动读取指定 plan.md 文件作为任务上下文(跳过用户 prompt 解析阶段)
398
+ - 将 plan.md 的「已知风险」章节注入 Step 6 Design Brief 的「禁止事项」
399
+ - 将 plan.md 的「关键约束」章节作为 constitution 补充(低于 constitution.hard_rules 优先级)
333
400
 
334
401
  **归档流程(用户选择归档时):**
335
402
  1. 将目录移动到 `modus/plans/archive/{YYYY-MM-DD}-{name}/`
@@ -338,24 +405,34 @@ plan.md 生成后,展示结果并进入确认循环:
338
405
 
339
406
  ---
340
407
 
341
- ### Step 9:后置 Skill 更新(知识回写)
408
+ ### Step 9:后置 Skill 更新(知识回写,用户确认后执行)
342
409
 
343
- 无论用户选择 Build 还是归档,规划阶段完成后即执行后置知识回写(模式 C):
410
+ 规划阶段完成后,先扫描 `plan.md` 中可能值得沉淀的新知识,向用户展示并**请求确认**后再写回:
344
411
 
345
- 1. 从 `plan.md` 的「方案选项对比」中提取技术决策:
346
- - 每个有选型依据的决策 → `[decision]` 写入 `modus-tech-wiki`(跨项目)或对应业务 Skill(域特有)
347
- 2. 从「已知风险」章节中提取**本次新发现的**风险(非来自现有 Skill 的已有记录):
348
- - 新发现的风险 → `[pitfall]` 追加到对应业务 Skill
349
- 3. 从「实现 Todos」中提取具体的编码模式或约束 → `[guideline]`
350
- 4. 更新 `modus/knowledge-catalog.md` 的 `last_referenced` 和 maturity
351
- 5. 输出更新摘要:
352
- ```
353
- 📚 知识已回写到 Skill:
354
- - [decision] tech-wiki:批量审批走 MQ 异步
355
- - [guideline] order 域:批量操作上限 50 条,防止内存溢出
356
- - [pitfall] order 域:MQ 消费者需保证幂等性
357
- maturity 变化: modus-biz-order draft→verified
358
- ```
412
+ **扫描内容:**
413
+ 1. 从「方案选项对比」提取技术决策候选 `[decision]`
414
+ 2. 从「已知风险」提取**本次新发现的**风险(非来自现有 Skill 的已有记录)→ 候选 `[pitfall]`
415
+ 3. 从「实现 Todos」提取具体编码约束 候选 `[guideline]`
416
+
417
+ **若发现可沉淀内容,向用户展示并确认:**
418
+ ```
419
+ 📚 发现 {N} 条可沉淀到 Skill 的新知识,是否写入?[Y/n]
420
+ · [decision] tech-wiki:批量审批走 MQ 异步(来自方案对比)
421
+ · [pitfall] order 域:MQ 消费者需保证幂等性(本次新发现)
422
+ · [guideline] order 域:批量操作上限 50 条(来自 Todos 约束)
423
+ 跳过不影响本次规划,可在下次 /modus:init 时统一归档。
424
+ ```
425
+
426
+ **用户确认后**执行写回(模式 C),输出摘要。
427
+ **用户跳过**则仅更新 `knowledge-catalog.md` 的 `last_referenced`(不修改 Skill 内容)。
428
+
429
+ **若无可沉淀内容 → 静默跳过,仅更新 `last_referenced`。**
430
+
431
+ **`usage_count` 更新时机(plan 模式):**
432
+
433
+ 用户在 Build 确认循环中回复「Build/开始/执行」后(即 Step 8 Build 触发时),对本次 plan 涉及的每个业务域执行 `usage_count += 1`,并同步更新对应 Skill 的 frontmatter。此操作在 Step 8 Build 触发内执行,不依赖后续 vibe session 的完成。
434
+
435
+ > **设计理由(Karpathy Surgical Changes):** 用户请求的是"生成规划文档",不是"更新 Skill 文件"。自动写回会在用户不知情的情况下修改多个知识文件,违反"Touch only what you must"。用户确认机制既保留了知识闭环能力,又把文件修改的控制权还给用户。
359
436
 
360
437
  ---
361
438
 
@@ -367,7 +444,7 @@ plan.md 生成后,展示结果并进入确认循环:
367
444
 
368
445
  1. 读取 `modus/config.yaml` 的 `platforms` 字段
369
446
  2. 对受影响的每个业务域(Step 4 前置更新 / 新建的域),按以下规则同步:
370
- - **CodeBuddy** → 源文件即 `.codebuddy/skills/modus-biz-{domain}/SKILL.md`(已更新,无需额外操作)
447
+ - **CodeBuddy** → 同步更新 `.codebuddy/skills/modus-biz-{domain}/SKILL.md` 引用桩的摘要行(权威源已在 `modus/knowledge/biz-{domain}/SKILL.md` 中更新)
371
448
  - **Claude** → 写入 `.claude/agents/modus-biz-{domain}.md`(覆盖旧版本)
372
449
  - **Cursor** → 写入 `.cursor/rules/modus-biz-{domain}.mdc`(带 frontmatter,覆盖旧版本)
373
450
  - **Copilot** → 在 `.github/copilot-instructions.md` 中替换对应域的标记段落
@@ -0,0 +1,271 @@
1
+ ---
2
+ name: modus-platform
3
+ description: >
4
+ Use this skill when executing /modus:platform command for AI platform adapter management.
5
+ Supports adding new platform adapters via online research (-add), listing registered platforms (-list),
6
+ and removing platform adapters (-remove). When adding a platform, the AI researches the target
7
+ platform's rules/commands/skills loading mechanism online and generates a platform.yaml descriptor,
8
+ which the modus CLI then uses to generate adapter files. This is how Cursor, Claude, CodeBuddy
9
+ support was originally built — each platform was analyzed and formalized into a generator.
10
+ Trigger on: /modus:platform, add platform adapter, 添加平台适配, 新增平台, platform -add,
11
+ platform -list, platform -remove, 注册新平台, 扩展平台支持, 适配新 AI 工具.
12
+ allowed-tools: Read, Write, Glob, Bash, WebSearch, WebFetch
13
+ disable: false
14
+ ---
15
+
16
+ # modus-platform(AI 平台适配管理)
17
+
18
+ **触发条件:** 用户运行 `/modus:platform [-add|-list|-remove]` 时使用此 Skill。
19
+
20
+ ---
21
+
22
+ ## 职责
23
+
24
+ 管理 Modus 对 AI 编码工具平台的适配。每个平台用一个 `platform.yaml` 描述符注册,
25
+ `modus update` 时自动生成对应的 framework 适配文件,`/modus:init` 时自动同步业务域 biz skill。
26
+
27
+ **已内置平台**(无需 `-add`):
28
+
29
+ | 平台 | 生成器 | 输出位置 |
30
+ |------|--------|---------|
31
+ | codebuddy | codebuddy.ts | `.codebuddy/` |
32
+ | claude | claude.ts | `.claude/` + `CLAUDE.md` |
33
+ | cursor | cursor.ts | `.cursor/rules/` |
34
+ | copilot | copilot.ts | `.github/copilot-instructions.md` |
35
+ | codex | codex.ts | `AGENTS.md` |
36
+
37
+ **自定义平台**(通过 `-add` 添加):由 `modus/platforms/{name}/platform.yaml` + `custom.ts` 通用生成器驱动。
38
+
39
+ ---
40
+
41
+ ## 参数说明
42
+
43
+ ```
44
+ /modus:platform -add <platform-name> [--docs <url>] [--force]
45
+ /modus:platform -list
46
+ /modus:platform -remove <platform-name>
47
+
48
+ -add <name> 添加新平台适配(联网搜索平台规则,生成 platform.yaml)
49
+ -list 列出所有已注册平台(内置 + 自定义)
50
+ -remove <name> 移除自定义平台(删除 platform.yaml 及生成的适配文件)
51
+ --docs <url> 提供平台官方文档 URL,优先从此处提取信息
52
+ --force 强制覆盖已存在的 platform.yaml
53
+ ```
54
+
55
+ ---
56
+
57
+ ## 执行流程
58
+
59
+ ### 参数解析(优先执行)
60
+
61
+ ```
62
+ -list → 跳到「-list 流程」
63
+ -remove → 跳到「-remove 流程」
64
+ -add → 执行「-add 流程」(主流程)
65
+ 无参数 → 输出帮助信息,列出已注册平台
66
+ ```
67
+
68
+ ---
69
+
70
+ ## -add 流程:添加新平台适配
71
+
72
+ ### Step 1:前置检查
73
+
74
+ ```
75
+ ① 检查 modus/platforms/{name}/platform.yaml 是否已存在
76
+ → 若存在且未传 --force:提示已注册,建议 -remove 后重新添加或加 --force
77
+ → 若存在且 --force:继续(将覆盖)
78
+
79
+ ② 检查是否为已内置平台(codebuddy/claude/cursor/copilot/codex)
80
+ → 若是:提示「该平台已内置支持,无需 -add」,结束执行
81
+ ```
82
+
83
+ ### Step 2:联网研究平台规范(核心步骤)
84
+
85
+ > **这一步对标当时分析 Cursor 平台的过程**——Agent 自主搜集信息,而非用户手动填写。
86
+
87
+ 优先读取 `--docs <url>`(若提供),否则联网搜索:
88
+
89
+ ```
90
+ 搜索词(按优先级):
91
+ 1. "{platform-name} AI coding rules directory"
92
+ 2. "{platform-name} slash commands configuration"
93
+ 3. "{platform-name} context files agent instructions"
94
+ 4. "{platform-name} SKILL.md OR rules.md OR instructions.md"
95
+ ```
96
+
97
+ **需要回答的平台能力问题清单:**
98
+
99
+ ```
100
+ □ Q1: 上下文规则如何加载?
101
+ → 专用目录(如 .cursor/rules/)?单文件(如 AGENTS.md)?系统提示注入?
102
+ → outputDir 和 fileExtension
103
+
104
+ □ Q2: 是否支持多文件 Skill 分散加载?
105
+ → 渐进式(progressive)/ 全量合并(flat)/ 不支持(none)
106
+ → capabilities.skillsLoading
107
+
108
+ □ Q3: 命令如何触发?
109
+ → /slash 命令?自然语言关键词?配置文件定义?
110
+ → capabilities.commandsTrigger
111
+
112
+ □ Q4: 是否有原生多文件规则机制(类似 .cursor/rules/)?
113
+ → capabilities.nativeRules
114
+
115
+ □ Q5: 是否支持 Sub-Agent / 并行 Task?
116
+ → capabilities.subAgents
117
+
118
+ □ Q6: 业务域 biz skill 应该放在哪里?
119
+ → bizSkill.outputPath 模板(含 {domain} 占位符)
120
+ → bizSkill.wrapper(文件头部格式)
121
+ ```
122
+
123
+ **输出分析摘要:**
124
+
125
+ ```
126
+ === 平台分析:{platform-name} ===
127
+ 上下文加载:{结论}
128
+ 多文件规则:{支持/不支持}
129
+ 命令触发:{slash/natural/file}
130
+ Sub-Agent:{是/否}
131
+ 信息来源:{URL 或「搜索推断」}
132
+ 置信度:{高/中/低}
133
+ ```
134
+
135
+ ### Step 3:生成 platform.yaml
136
+
137
+ 在 `modus/platforms/{name}/platform.yaml` 写入:
138
+
139
+ ```yaml
140
+ # {label} — Modus 平台适配描述符
141
+ # 由 /modus:platform -add 自动生成,可手动调整后运行 modus update 重新生成适配文件
142
+ name: {name}
143
+ label: {label}
144
+ outputDir: {outputDir}
145
+ fileExtension: {fileExtension}
146
+ capabilities:
147
+ skillsLoading: {progressive|flat|none}
148
+ subAgents: {true|false}
149
+ commandsTrigger: {slash|natural|file}
150
+ nativeRules: {true|false}
151
+ bizSkill:
152
+ enabled: {true|false}
153
+ outputPath: "{outputDir}/modus-biz-{domain}.{fileExtension}"
154
+ wrapper: |
155
+ # {domain} Business Domain Rules
156
+ <!-- Source: modus/knowledge/biz-{domain}/SKILL.md -->
157
+ {content}
158
+ constitutionTemplate: |
159
+ # Modus Project Rules — {label}
160
+ {hardRules}
161
+ commandsTemplate: |
162
+ # Modus Commands — {label}
163
+ {commands}
164
+ ```
165
+
166
+ ### Step 4:更新 modus/config.yaml
167
+
168
+ 在 `customPlatforms` 字段追加平台名(幂等):
169
+
170
+ ```yaml
171
+ customPlatforms:
172
+ - {name}
173
+ ```
174
+
175
+ ### Step 5:生成 framework 适配文件
176
+
177
+ 提示用户运行 `modus update` 触发 `custom.ts` 生成器,或直接调用(若有权限):
178
+
179
+ ```
180
+ → 在 {outputDir}/ 生成:
181
+ modus-constitution.{ext} — 项目宪法(hard_rules)
182
+ modus-commands.{ext} — 命令索引
183
+ modus-init.{ext} — init Skill(若 skillsLoading != none)
184
+ modus-vibe.{ext} — vibe Skill
185
+ modus-plan.{ext} — plan Skill
186
+ modus-spec.{ext} — spec Skill
187
+ modus-auto.{ext} — auto Skill
188
+ modus-harness.{ext} — harness Skill
189
+ ```
190
+
191
+ ### Step 6:验收报告
192
+
193
+ ```
194
+ ✅ 平台适配完成:{label}
195
+
196
+ 已生成文件:
197
+ modus/platforms/{name}/platform.yaml ← 描述符(可手动调整)
198
+ {outputDir}/modus-constitution.{ext}
199
+ {outputDir}/modus-commands.{ext}
200
+ ... (共 N 个文件)
201
+
202
+ 后续 biz skill 同步:
203
+ 每次运行 /modus:init 时,modus-biz-* 内容会自动同步到:
204
+ {bizSkill.outputPath}
205
+
206
+ 验证方式:
207
+ 1. 在 {platform-name} 中打开本项目
208
+ 2. 输入 /modus:vibe 或相应触发词
209
+ 3. 确认 AI 能识别业务域知识
210
+
211
+ 已知限制:
212
+ {根据 capabilities 分析,列出与内置平台的差异,如「不支持 Sub-Agent,harness 降级单步执行」}
213
+ ```
214
+
215
+ ---
216
+
217
+ ## -list 流程:列出已注册平台
218
+
219
+ ```
220
+ === 已注册平台 ===
221
+
222
+ 内置平台:
223
+ ✓ codebuddy (.codebuddy/)
224
+ ✓ claude (.claude/ + CLAUDE.md)
225
+ ✓ cursor (.cursor/rules/)
226
+ ✓ copilot (.github/copilot-instructions.md)
227
+ ✓ codex (AGENTS.md)
228
+
229
+ 自定义平台(modus/platforms/*/platform.yaml):
230
+ ✓ windsurf (.windsurf/rules/) [2026-05-18]
231
+ ✓ aider (.aider/) [2026-05-10]
232
+
233
+ 当前启用(modus/config.yaml platforms 字段):
234
+ codebuddy, claude, cursor, codex, windsurf
235
+ ```
236
+
237
+ 若无自定义平台:
238
+ ```
239
+ 暂无自定义平台。使用 /modus:platform -add <name> 添加。
240
+ ```
241
+
242
+ ---
243
+
244
+ ## -remove 流程:移除自定义平台
245
+
246
+ ```
247
+ Step 1: 确认 modus/platforms/{name}/platform.yaml 存在
248
+ Step 2: 读取 outputDir 配置,确认生成文件列表
249
+ Step 3: 展示将被删除的文件(预览)
250
+ Step 4: 用户确认(--force 时跳过)
251
+ Step 5: 删除 modus/platforms/{name}/ 目录
252
+ Step 6: 删除 {outputDir}/modus-*.{ext} 文件(仅删 modus 生成的,不影响用户文件)
253
+ Step 7: 从 modus/config.yaml customPlatforms 移除该平台名
254
+ Step 8: 输出完成报告
255
+ ```
256
+
257
+ ---
258
+
259
+ ## 已知平台特性参考(内置知识)
260
+
261
+ | 平台 | rules 目录 | Skill 加载 | 命令触发 | Sub-Agent |
262
+ |------|-----------|-----------|---------|-----------|
263
+ | Cursor | `.cursor/rules/` (.mdc) | progressive | /slash | 否(单 Agent) |
264
+ | Claude Code | `.claude/` | flat (agents) | /slash | 是 |
265
+ | CodeBuddy | `.codebuddy/skills/` | progressive | /slash | 是 |
266
+ | GitHub Copilot | `.github/copilot-instructions.md` | flat (单文件) | 自然语言 | 否 |
267
+ | Codex / OpenCode | `AGENTS.md` | flat (单文件) | 自然语言 | 否 |
268
+ | Windsurf (Cascade) | `.windsurfrules` | flat (单文件) | /slash | 否 |
269
+ | Aider | `.aider.conf.yml` | flat (配置) | CLI flags | 否 |
270
+
271
+ > 上表为已知信息,`-add` 时会通过联网搜索验证最新规范。