@modus-ai/modus 0.3.0 → 0.3.1
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/package.json +1 -1
- package/templates/commands/harness.md +2 -0
- package/templates/commands/plan.md +6 -4
- package/templates/commands/spec.md +7 -5
- package/templates/paths-v4.md +2 -0
- package/templates/skills/modus-harness/SKILL.md +1 -0
- package/templates/skills/modus-plan/SKILL.md +58 -7
- package/templates/skills/modus-spec/SKILL.md +60 -3
- package/templates/template/api-chain.md +69 -0
package/package.json
CHANGED
|
@@ -105,6 +105,8 @@ modus/artifacts/{story_id}/
|
|
|
105
105
|
│ ├── cr-report.md ← SubAgent 06 (modus-reviewer),含 HANDOFF.issues
|
|
106
106
|
│ ├── deploy-status.md ← SubAgent 07 (modus-deployer)
|
|
107
107
|
│ └── .harness-state.yaml ← 状态机
|
|
108
|
+
├── scenarios/
|
|
109
|
+
│ └── api-chain.md ← 场景化接口调用链(Step 1 创建目录,harness 完整流程后内容最丰富)
|
|
108
110
|
└── archive/ ← 上线后人工触发,输出 summary.md 与 key-scenarios/
|
|
109
111
|
```
|
|
110
112
|
|
|
@@ -86,10 +86,12 @@
|
|
|
86
86
|
```
|
|
87
87
|
modus/artifacts/{story_id}/
|
|
88
88
|
├── design/design.md — --design 模式产出
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
├── code/
|
|
90
|
+
│ ├── plan.md — 标准模式产出
|
|
91
|
+
│ ├── .modus-state.yaml — 状态机,支持断点续跑
|
|
92
|
+
│ └── spec/ — (如后续接 /modus:spec)
|
|
93
|
+
└── scenarios/
|
|
94
|
+
└── api-chain.md — 场景化接口调用链(Step 8 生成,供测试团队消费)
|
|
93
95
|
```
|
|
94
96
|
|
|
95
97
|
**独立模式(不含 --story):**
|
|
@@ -68,11 +68,13 @@ Feature: 批量审批订单
|
|
|
68
68
|
```
|
|
69
69
|
modus/artifacts/{story_id}/
|
|
70
70
|
├── design/design.md
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
├── code/
|
|
72
|
+
│ ├── spec/ — delta specs(ADDED/MODIFIED/REMOVED)
|
|
73
|
+
│ ├── spec-proposal.md — 意图与范围
|
|
74
|
+
│ ├── tasks.md — 实现清单(追踪到 Scenario)
|
|
75
|
+
│ └── testcases.md — QA 用例(--testcase 时生成)
|
|
76
|
+
└── scenarios/
|
|
77
|
+
└── api-chain.md — 场景化接口调用链(Step 8 生成,供测试团队消费)
|
|
76
78
|
```
|
|
77
79
|
|
|
78
80
|
**独立模式(不含 --story):**
|
package/templates/paths-v4.md
CHANGED
|
@@ -73,6 +73,8 @@ last_updated: "2026-05-22"
|
|
|
73
73
|
│ ├── vibe-log.md # 编码日志
|
|
74
74
|
│ ├── cr-report.md # CR 报告
|
|
75
75
|
│ └── .harness-state.yaml # Harness 状态机
|
|
76
|
+
├── scenarios/ # 场景化接口调用链(plan/spec 生成)
|
|
77
|
+
│ └── api-chain.md # 业务场景描述 + 接口调用链(供测试团队消费)
|
|
76
78
|
└── archive/ # 上线验收后人工触发归档
|
|
77
79
|
├── summary.md # 精简版人阅读摘要
|
|
78
80
|
└── key-scenarios/ # 关键场景快照(供后续迭代检索)
|
|
@@ -144,6 +144,7 @@ B. 强制继续(无业务上下文,风险较高)
|
|
|
144
144
|
**解析 Story ID + 初始化状态追踪:**
|
|
145
145
|
- 从 TAPD URL 提取 Story ID(格式:`tapd.cn/{project}/stories/view/{id}`)
|
|
146
146
|
- 创建工作目录:`modus/artifacts/{story_id}/code/`
|
|
147
|
+
- 创建场景目录:`modus/artifacts/{story_id}/scenarios/`
|
|
147
148
|
|
|
148
149
|
**`.harness-state.yaml` 断点续跑机制(优先级高于 HANDOFF 块探测):**
|
|
149
150
|
|
|
@@ -49,7 +49,7 @@ disable: false
|
|
|
49
49
|
|
|
50
50
|
检测到 --design?
|
|
51
51
|
是 → 执行 Step 0→Step 1→Step 2→Step 3→Step 4→Step 5→Step 6→Design Mode Step 7(生成 design.md + tasks.md 后暂停)
|
|
52
|
-
否 → 执行标准流程(Step 0 → Step
|
|
52
|
+
否 → 执行标准流程(Step 0 → Step 11)
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
---
|
|
@@ -389,7 +389,7 @@ created: {ISO8601时间戳}
|
|
|
389
389
|
|
|
390
390
|
### Step 7(Design Mode 分支):多 Artifact 设计文档生成 ⏸️ 【人工审批节点】
|
|
391
391
|
|
|
392
|
-
> **仅在 DESIGN_MODE=true 时执行此分支,替代标准 Step
|
|
392
|
+
> **仅在 DESIGN_MODE=true 时执行此分支,替代标准 Step 9(Build 循环)。**
|
|
393
393
|
> 参考:speckit.plan 三阶段 + opsx:propose DAG 状态机
|
|
394
394
|
|
|
395
395
|
---
|
|
@@ -614,7 +614,58 @@ MEDIUM(建议):
|
|
|
614
614
|
|
|
615
615
|
---
|
|
616
616
|
|
|
617
|
-
### Step 8
|
|
617
|
+
### Step 8:生成场景化接口调用链(api-chain.md)
|
|
618
|
+
|
|
619
|
+
> **触发条件:** 仅在 story 模式下执行(`STORY_ID` 已设置,即通过 `--story` 或 `/modus:auto` 传入)。
|
|
620
|
+
> 独立模式(`modus/plans/{name}/`)**跳过此步骤**。
|
|
621
|
+
|
|
622
|
+
**目标:** 将本次规划涉及的接口抽取为场景化调用链文档,供测试团队直接进行用例设计。
|
|
623
|
+
|
|
624
|
+
#### 8-1:确定内容来源(按优先级)
|
|
625
|
+
|
|
626
|
+
```
|
|
627
|
+
优先级 1(--design 模式):读取 modus/artifacts/{story_id}/design/design.md
|
|
628
|
+
→ 提取 §3.1 对外暴露接口(接口名/路径/入参/出参)
|
|
629
|
+
→ 提取 §3.2 调用下游接口(下游服务/路径/超时)
|
|
630
|
+
|
|
631
|
+
优先级 2(标准模式,无 design.md):读取 modus/knowledge_base/domain/{d}/code/apis.md
|
|
632
|
+
→ 提取本次 plan.md 涉及域的接口定义
|
|
633
|
+
|
|
634
|
+
优先级 3(兜底):扫描 plan.md 的「实现 Todos」接口层任务
|
|
635
|
+
→ 提取含接口路径关键词的任务条目(如 POST /api/、GET /api/)
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
#### 8-2:生成 api-chain.md
|
|
639
|
+
|
|
640
|
+
参照 `modus/template/api-chain.md` 模板,按以下规则生成内容:
|
|
641
|
+
|
|
642
|
+
- **每个对外接口对应 1 个 Scenario**(Happy Path)
|
|
643
|
+
- **复杂度 ≥ medium 时**,额外生成边界/异常 Scenario(参数超限、权限不足、并发防重)
|
|
644
|
+
- **Given/When/Then** 从 plan.md 的业务背景 + 接口功能描述中提炼
|
|
645
|
+
- **接口调用链表格** 中填写完整 HTTP 路径、关键请求参数、预期状态码 + 错误码
|
|
646
|
+
|
|
647
|
+
**写入路径:** `modus/artifacts/{story_id}/scenarios/api-chain.md`
|
|
648
|
+
|
|
649
|
+
若目录不存在,自动创建 `scenarios/`。
|
|
650
|
+
|
|
651
|
+
#### 8-3:完成输出
|
|
652
|
+
|
|
653
|
+
```
|
|
654
|
+
✅ api-chain.md 已生成:modus/artifacts/{story_id}/scenarios/api-chain.md
|
|
655
|
+
共 {N} 个 Scenario(Happy Path: {M} | 异常: {K})
|
|
656
|
+
来源:{design.md §3 | apis.md | plan.md tasks}
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
若无任何可提取的接口信息(如纯重构类任务),输出以下提示并跳过:
|
|
660
|
+
|
|
661
|
+
```
|
|
662
|
+
ℹ️ 未检测到明确的接口变更,跳过 api-chain.md 生成。
|
|
663
|
+
如需手动补充,可参考模板:modus/template/api-chain.md
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
### Step 9:Build 确认循环 ⏸️ 【人工审批节点】
|
|
618
669
|
|
|
619
670
|
plan.md 生成后,展示结果并进入确认循环:
|
|
620
671
|
|
|
@@ -671,7 +722,7 @@ plan.md 生成后,展示结果并进入确认循环:
|
|
|
671
722
|
|
|
672
723
|
---
|
|
673
724
|
|
|
674
|
-
### Step
|
|
725
|
+
### Step 10:后置 Skill 更新(知识回写,用户确认后执行)
|
|
675
726
|
|
|
676
727
|
规划阶段完成后,先扫描 `plan.md` 中可能值得沉淀的新知识,向用户展示并**请求确认**后再写回:
|
|
677
728
|
|
|
@@ -696,13 +747,13 @@ plan.md 生成后,展示结果并进入确认循环:
|
|
|
696
747
|
|
|
697
748
|
**`usage_count` 更新时机(plan 模式):**
|
|
698
749
|
|
|
699
|
-
用户在 Build 确认循环中回复「Build/开始/执行」后(即 Step
|
|
750
|
+
用户在 Build 确认循环中回复「Build/开始/执行」后(即 Step 9 Build 触发时),对本次 plan 涉及的每个业务域执行 `usage_count += 1`,并同步更新对应 Skill 的 frontmatter。此操作在 Step 9 Build 触发内执行,不依赖后续 vibe session 的完成。
|
|
700
751
|
|
|
701
752
|
> **设计理由(Karpathy Surgical Changes):** 用户请求的是"生成规划文档",不是"更新 Skill 文件"。自动写回会在用户不知情的情况下修改多个知识文件,违反"Touch only what you must"。用户确认机制既保留了知识闭环能力,又把文件修改的控制权还给用户。
|
|
702
753
|
|
|
703
754
|
---
|
|
704
755
|
|
|
705
|
-
### Step
|
|
756
|
+
### Step 11:多平台 Skill 同步(后置)
|
|
706
757
|
|
|
707
758
|
知识回写完成后,对所有本次**更新或新建**的业务 Skill 执行多平台同步。
|
|
708
759
|
|
|
@@ -967,5 +1018,5 @@ for each Phase(按顺序):
|
|
|
967
1018
|
────────────────────────────────────────────────
|
|
968
1019
|
```
|
|
969
1020
|
|
|
970
|
-
**后置知识回写(与标准 plan Step
|
|
1021
|
+
**后置知识回写(与标准 plan Step 10 相同逻辑):**
|
|
971
1022
|
扫描编码过程中新发现的 pitfall/decision,询问用户是否写回 Skill(不强制)。
|
|
@@ -211,7 +211,64 @@ supported_platforms:
|
|
|
211
211
|
|
|
212
212
|
---
|
|
213
213
|
|
|
214
|
-
### Step 8
|
|
214
|
+
### Step 8:生成场景化接口调用链(api-chain.md)
|
|
215
|
+
|
|
216
|
+
> **触发条件:** 仅在 story 模式下执行(`STORY_ID` 已设置)。
|
|
217
|
+
> 独立模式(`modus/changes/{name}/`)**跳过此步骤**。
|
|
218
|
+
|
|
219
|
+
**目标:** 将本次规格涉及的 Gherkin 场景转换为面向测试团队的接口调用链文档。
|
|
220
|
+
|
|
221
|
+
#### 8-1:确定内容来源(按优先级)
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
优先级 1:读取 modus/artifacts/{story_id}/code/spec/*.feature.md
|
|
225
|
+
→ 提取每个 Scenario 的 When 子句(接口调用动作)
|
|
226
|
+
→ 将 Gherkin 步骤转换为调用链表格(When → 接口路径 + 参数)
|
|
227
|
+
|
|
228
|
+
优先级 2:读取 modus/artifacts/{story_id}/design/design.md(若存在)
|
|
229
|
+
→ 用 §3.1/§3.2 接口合同补充完整 HTTP 路径、请求参数、响应格式
|
|
230
|
+
|
|
231
|
+
优先级 3:读取 modus/artifacts/{story_id}/pid/prd.md(若存在)
|
|
232
|
+
→ 从验收标准 AC 的 Given/When/Then 中补充业务背景
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
#### 8-2:生成或追加 api-chain.md
|
|
236
|
+
|
|
237
|
+
**检测文件是否已存在:**
|
|
238
|
+
|
|
239
|
+
- **不存在**(首次,如只跑了 spec 未跑 plan):参照 `modus/template/api-chain.md` 模板完整生成
|
|
240
|
+
- **已存在**(先跑了 plan 已生成):追加新 Scenario 块,**不覆盖已有内容**,在文件末尾追加:
|
|
241
|
+
|
|
242
|
+
```markdown
|
|
243
|
+
---
|
|
244
|
+
<!-- 以下 Scenario 由 /modus:spec 生成,追加于 {YYYY-MM-DD} -->
|
|
245
|
+
|
|
246
|
+
## Scenario N: {来自 spec 的场景标题}
|
|
247
|
+
...
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**写入路径:** `modus/artifacts/{story_id}/scenarios/api-chain.md`
|
|
251
|
+
|
|
252
|
+
若目录不存在,自动创建 `scenarios/`。
|
|
253
|
+
|
|
254
|
+
#### 8-3:完成输出
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
✅ api-chain.md 已生成/更新:modus/artifacts/{story_id}/scenarios/api-chain.md
|
|
258
|
+
共 {N} 个 Scenario(来自 spec: {M} | 已有 plan 场景: {K})
|
|
259
|
+
来源:{spec/*.feature.md | design.md §3 | prd.md AC}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
若无任何 Gherkin When 子句含接口调用动作,输出以下提示并跳过:
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
ℹ️ 未检测到明确的接口调用场景,跳过 api-chain.md 生成。
|
|
266
|
+
如需手动补充,可参考模板:modus/template/api-chain.md
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### Step 9:归档确认 ⏸️ 【人工审批节点】
|
|
215
272
|
|
|
216
273
|
文档生成后,展示结果并等待用户决定:
|
|
217
274
|
|
|
@@ -243,7 +300,7 @@ supported_platforms:
|
|
|
243
300
|
|
|
244
301
|
---
|
|
245
302
|
|
|
246
|
-
### Step
|
|
303
|
+
### Step 10:后置 Skill 知识写回(归档后执行)
|
|
247
304
|
|
|
248
305
|
从 proposal.md + design-brief.md 中提取可沉淀的知识,**请求用户确认后**写回 Skill(调用 `modus-skill-creator` 模式 C):
|
|
249
306
|
|
|
@@ -256,7 +313,7 @@ supported_platforms:
|
|
|
256
313
|
|
|
257
314
|
---
|
|
258
315
|
|
|
259
|
-
### Step
|
|
316
|
+
### Step 11:多平台 Skill 同步(后置)
|
|
260
317
|
|
|
261
318
|
与 `modus-plan` Step 10 相同逻辑,对本次更新/新建的业务 Skill 执行多平台同步(根据 `modus/config.yaml` 的 `platforms` 字段)。
|
|
262
319
|
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# API 调用链 — {业务场景名}
|
|
2
|
+
|
|
3
|
+
> **来源**:{plan.md | spec/{feature}.feature.md}
|
|
4
|
+
> **关联域**:{domain}
|
|
5
|
+
> **Story**:{story_id}
|
|
6
|
+
> **生成时间**:{YYYY-MM-DD}
|
|
7
|
+
> **说明**:本文件由 `/modus:plan` 或 `/modus:spec` 自动生成,供测试团队进行场景化用例设计。
|
|
8
|
+
>
|
|
9
|
+
> - Happy Path 场景:验证主业务流程正常执行
|
|
10
|
+
> - 边界/异常场景:验证参数校验、权限、并发等防御性逻辑
|
|
11
|
+
> - 每个 Scenario 包含:业务描述(Given/When/Then)+ 接口调用链(步骤表格)+ 测试数据
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Scenario 1: {场景标题}(Happy Path)
|
|
16
|
+
|
|
17
|
+
**Given** {前置条件,如:用户已登录,tenantId=xxx,待处理记录 N 条}
|
|
18
|
+
**When** {触发动作,如:调用 POST /api/v1/{resource}/xxx 接口}
|
|
19
|
+
**Then** {预期结果,如:返回 200,记录状态更新为 approved,审批日志写入}
|
|
20
|
+
|
|
21
|
+
### 接口调用链
|
|
22
|
+
|
|
23
|
+
| 步骤 | 接口 | 请求参数 | 预期返回 | 备注 |
|
|
24
|
+
|------|------|---------|---------|------|
|
|
25
|
+
| 1 | `POST /api/v1/...` | `{"key": "value"}` | `200 {"code":0}` | 主入口 |
|
|
26
|
+
| 2 | `GET /api/v1/.../status` | `id={id}` | `200 {"status":"xxx"}` | 验证状态流转 |
|
|
27
|
+
|
|
28
|
+
### 测试数据
|
|
29
|
+
|
|
30
|
+
- **前置数据**:{如:tenantId=1001, userId=2001, recordId=3001}
|
|
31
|
+
- **清理数据**:{如:删除 recordId=3001 的记录}
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Scenario 2: {场景标题}(边界/异常)
|
|
36
|
+
|
|
37
|
+
**Given** {前置条件,如:请求参数超过上限}
|
|
38
|
+
**When** {触发动作}
|
|
39
|
+
**Then** {预期结果,如:返回 400,错误码 ERROR_BATCH_LIMIT_EXCEEDED}
|
|
40
|
+
|
|
41
|
+
### 接口调用链
|
|
42
|
+
|
|
43
|
+
| 步骤 | 接口 | 请求参数 | 预期返回 | 备注 |
|
|
44
|
+
|------|------|---------|---------|------|
|
|
45
|
+
| 1 | `POST /api/v1/...` | `{"ids": [...超限数量...]}` | `400 {"code":"ERROR_XXX"}` | 参数校验 |
|
|
46
|
+
|
|
47
|
+
### 测试数据
|
|
48
|
+
|
|
49
|
+
- **前置数据**:{...}
|
|
50
|
+
- **清理数据**:{无需清理}
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Scenario 3: {场景标题}(权限/并发)
|
|
55
|
+
|
|
56
|
+
**Given** {前置条件,如:无操作权限的用户 / 并发提交同一任务}
|
|
57
|
+
**When** {触发动作}
|
|
58
|
+
**Then** {预期结果,如:返回 403 / 分布式锁触发,返回 409}
|
|
59
|
+
|
|
60
|
+
### 接口调用链
|
|
61
|
+
|
|
62
|
+
| 步骤 | 接口 | 请求参数 | 预期返回 | 备注 |
|
|
63
|
+
|------|------|---------|---------|------|
|
|
64
|
+
| 1 | `POST /api/v1/...` | `{...}` | `403 {"code":"NO_PERMISSION"}` | 权限校验 |
|
|
65
|
+
|
|
66
|
+
### 测试数据
|
|
67
|
+
|
|
68
|
+
- **前置数据**:{...}
|
|
69
|
+
- **清理数据**:{...}
|