@modus-ai/modus 0.1.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 (58) hide show
  1. package/README.md +121 -0
  2. package/bin/modus.js +2 -0
  3. package/dist/cli/index.d.ts +2 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +39 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/commands/config.d.ts +2 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +66 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/init.d.ts +2 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +89 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/update.d.ts +2 -0
  16. package/dist/commands/update.d.ts.map +1 -0
  17. package/dist/commands/update.js +19 -0
  18. package/dist/commands/update.js.map +1 -0
  19. package/dist/generators/codebuddy.d.ts +3 -0
  20. package/dist/generators/codebuddy.d.ts.map +1 -0
  21. package/dist/generators/codebuddy.js +77 -0
  22. package/dist/generators/codebuddy.js.map +1 -0
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +4 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/utils/config.d.ts +13 -0
  28. package/dist/utils/config.d.ts.map +1 -0
  29. package/dist/utils/config.js +25 -0
  30. package/dist/utils/config.js.map +1 -0
  31. package/dist/utils/file-system.d.ts +11 -0
  32. package/dist/utils/file-system.d.ts.map +1 -0
  33. package/dist/utils/file-system.js +41 -0
  34. package/dist/utils/file-system.js.map +1 -0
  35. package/package.json +55 -0
  36. package/schemas/harness-schema.yaml +91 -0
  37. package/schemas/knowledge-schema.yaml +174 -0
  38. package/schemas/plan-schema.yaml +42 -0
  39. package/schemas/spec-schema.yaml +64 -0
  40. package/templates/commands/harness.md +46 -0
  41. package/templates/commands/init.md +16 -0
  42. package/templates/commands/plan.md +28 -0
  43. package/templates/commands/spec.md +37 -0
  44. package/templates/commands/vibe.md +18 -0
  45. package/templates/knowledge-catalog.md +26 -0
  46. package/templates/skills/modus-harness/SKILL.md +247 -0
  47. package/templates/skills/modus-harness-agents/00-skills-builder/SKILL.md +293 -0
  48. package/templates/skills/modus-harness-agents/01-analysis/SKILL.md +135 -0
  49. package/templates/skills/modus-harness-agents/02-dev/SKILL.md +102 -0
  50. package/templates/skills/modus-harness-agents/03-test/SKILL.md +84 -0
  51. package/templates/skills/modus-harness-agents/04-perf/SKILL.md +109 -0
  52. package/templates/skills/modus-harness-agents/05-security/SKILL.md +116 -0
  53. package/templates/skills/modus-harness-agents/06-review/SKILL.md +123 -0
  54. package/templates/skills/modus-harness-agents/07-deploy/SKILL.md +101 -0
  55. package/templates/skills/modus-init/SKILL.md +227 -0
  56. package/templates/skills/modus-plan/SKILL.md +246 -0
  57. package/templates/skills/modus-spec/SKILL.md +255 -0
  58. package/templates/skills/modus-vibe/SKILL.md +150 -0
@@ -0,0 +1,102 @@
1
+ # modus-harness-02-dev(代码开发 SubAgent)
2
+
3
+ **调用方:** Harness Orchestrator
4
+ **输入:** `01-analysis.md` + 相关业务 Skill
5
+ **产出物:** `modus/plans/active/{story-id}/02-sprint-contract.md` + 实际代码变更
6
+
7
+ ## 职责
8
+
9
+ 核心代码生成者。按照需求分析报告中的 Sprint 计划,逐层实现代码,每个 Sprint 完成后验证可构建,遵循项目已有的架构规范和编码风格。
10
+
11
+ ---
12
+
13
+ ## 执行流程
14
+
15
+ ### Step 1:读取上下文
16
+
17
+ 1. 读取 `01-analysis.md`,理解 Sprint 计划和技术影响范围
18
+ 2. 读取相关业务 Skill,了解项目规范(层次结构、命名约定、技术约束)
19
+ 3. 读取 `modus/config.yaml`,获取项目技术栈信息
20
+
21
+ ### Step 2:逐 Sprint 实现
22
+
23
+ 按 Sprint 计划顺序实现,每个 Sprint 遵循以下步骤:
24
+
25
+ **2a. 分析现有代码**
26
+ - 找到需要修改/新增的文件
27
+ - 理解现有代码风格和命名规范
28
+ - 识别可复用的工具类、基类、常量
29
+
30
+ **2b. 实现代码**
31
+ 遵循的通用原则:
32
+ - 命名遵循项目现有风格(从 Skill 或现有代码中获取规范)
33
+ - 新增文件放置到正确的包/目录层次
34
+ - 事务注解使用项目规范方式(避免同类内部调用失效)
35
+ - 分布式锁按项目已有模式使用
36
+ - 参数校验在接口层完成,服务层做业务校验
37
+ - 所有数据库操作必须在正确的事务边界内
38
+ - 金额字段使用 BigDecimal,避免浮点精度问题
39
+
40
+ **2c. Sprint 验证**
41
+ 每个 Sprint 完成后记录:
42
+ - 新增/修改的文件列表
43
+ - 关键实现决策(与 `01-analysis.md` 中建议有出入时说明原因)
44
+
45
+ ### Step 3:生成 Sprint Contract
46
+
47
+ 所有 Sprint 完成后,生成 `02-sprint-contract.md`。
48
+
49
+ ---
50
+
51
+ ## 产出物格式(02-sprint-contract.md)
52
+
53
+ ```markdown
54
+ # Sprint Contract
55
+
56
+ ## 执行摘要
57
+ - 完成 Sprint: {N} 个
58
+ - 新增文件: {N} 个
59
+ - 修改文件: {N} 个
60
+ - 实现时间: {YYYY-MM-DD HH:mm}
61
+
62
+ ## Sprint 执行记录
63
+
64
+ ### Sprint 1:{名称}
65
+ **状态:** ✅ 完成
66
+
67
+ **文件变更:**
68
+ - 新增: `{文件路径}` — {说明}
69
+ - 修改: `{文件路径}` — {变更内容}
70
+
71
+ **关键实现决策:**
72
+ - {决策说明}
73
+
74
+ ### Sprint 2:{名称}
75
+ ...
76
+
77
+ ## 已知风险/遗留问题
78
+ - {问题描述:如某个边界情况暂未处理}
79
+
80
+ ## 待 SubAgent 03/04/05 重点关注
81
+ - {代码评审重点关注点}
82
+ - {性能风险点提示}
83
+ - {安全风险点提示}
84
+ ```
85
+
86
+ ---
87
+
88
+ ## 编码规范
89
+
90
+ 遵循业务 Skill 中记录的项目规范。如果 Skill 中没有明确说明,参考以下通用原则:
91
+
92
+ - **分层架构:** Controller/Facade → Service/Manager → Mapper/DAO,跨层只能向下调用
93
+ - **事务:** `@Transactional` 只在最外层 Service/Manager 方法上,避免同类内部调用失效
94
+ - **异常处理:** 业务异常抛出项目统一的业务异常类,不吞掉异常
95
+ - **日志:** 关键业务入口和异常分支必须有日志,不打印敏感信息
96
+ - **注释:** 复杂逻辑和非直觉的业务规则需要注释说明
97
+
98
+ ## 禁止行为
99
+
100
+ - 不修改已有测试用例(留给 SubAgent 03)
101
+ - 不直接修改生产配置文件(留给 SubAgent 07)
102
+ - 发现可能有性能问题但超出当前 Sprint 范围时,在产出物中标注,不擅自重构
@@ -0,0 +1,84 @@
1
+ # modus-harness-03-test(代码测试 SubAgent)
2
+
3
+ **调用方:** Harness Orchestrator(与 04/05 并行启动)
4
+ **输入:** `02-sprint-contract.md` + 代码变更
5
+ **产出物:** `modus/plans/active/{story-id}/03-test-report.md` + 单元测试代码
6
+
7
+ ## 职责
8
+
9
+ 为本次代码变更生成单元测试,验证核心业务逻辑有测试覆盖,输出测试报告。
10
+
11
+ ---
12
+
13
+ ## 执行流程
14
+
15
+ ### Step 1:分析代码变更
16
+
17
+ 读取 `02-sprint-contract.md`,识别需要测试的关键方法:
18
+ - Service/Manager 层的核心业务方法
19
+ - 有复杂条件分支的逻辑
20
+ - `01-analysis.md` 中标注的验收标准对应的逻辑
21
+
22
+ ### Step 2:生成测试用例
23
+
24
+ 按照 **Happy Path → 边界条件 → 异常路径** 三段式结构设计测试:
25
+
26
+ **Happy Path(正常流程)**
27
+ - 主流程成功执行
28
+ - 返回值正确
29
+
30
+ **边界条件(Boundary)**
31
+ - null / 空值 / 空集合 / 零值
32
+ - 最小值 / 最大值
33
+ - 单条记录 / 批量记录
34
+
35
+ **异常路径(Exception)**
36
+ - 依赖服务调用失败
37
+ - 数据不存在
38
+ - 业务规则校验失败(如余额不足、状态不合法)
39
+ - 并发场景(如分布式锁被占用)
40
+
41
+ ### Step 3:编写测试代码
42
+
43
+ 遵循项目测试规范(从业务 Skill 或现有测试文件中提取),通用原则:
44
+ - 使用 Mock 隔离外部依赖(DB、RPC、MQ 等)
45
+ - 每个测试方法只测一个场景
46
+ - 测试方法命名清晰表达场景:`test_{methodName}_{scenario}_{expectedResult}`
47
+ - 断言明确,不只断言 "no exception"
48
+
49
+ ### Step 4:运行测试(如可执行环境允许)
50
+
51
+ 如果有可用的测试执行环境:
52
+ - 执行新增的测试用例
53
+ - 记录通过/失败状态
54
+
55
+ ---
56
+
57
+ ## 产出物格式(03-test-report.md)
58
+
59
+ ```markdown
60
+ # 测试报告
61
+
62
+ ## 测试覆盖摘要
63
+ - 新增测试用例: {N} 个
64
+ - 覆盖方法: {N} 个
65
+ - 通过: {N} | 失败: {N} | 跳过: {N}
66
+
67
+ ## 测试用例列表
68
+
69
+ ### {ClassName}Test
70
+ | 测试方法 | 场景 | 状态 |
71
+ |----------|------|------|
72
+ | test_createOrder_success | 正常创建订单 | ✅ |
73
+ | test_createOrder_insufficientBalance | 余额不足 | ✅ |
74
+ | test_createOrder_concurrentLock | 并发锁冲突 | ✅ |
75
+
76
+ ## 覆盖率分析
77
+ - 核心业务逻辑:{N}% 覆盖
78
+ - 未覆盖的分支:{描述原因}
79
+
80
+ ## 验收标准覆盖
81
+ | 验收场景 | 对应测试 | 状态 |
82
+ |----------|----------|------|
83
+ | {从 01-analysis.md 提取} | {测试方法名} | ✅/❌ |
84
+ ```
@@ -0,0 +1,109 @@
1
+ # modus-harness-04-perf(性能审计 SubAgent)
2
+
3
+ **调用方:** Harness Orchestrator(与 03/05 并行启动)
4
+ **输入:** `02-sprint-contract.md` + 代码变更
5
+ **产出物:** `modus/plans/active/{story-id}/04-perf-report.md`
6
+
7
+ ## 职责
8
+
9
+ 对代码变更进行静态性能审计,识别 N+1 查询、缺少批量操作、大数据量风险等,量化每个风险的影响,按高/中/低分级输出报告。
10
+
11
+ ---
12
+
13
+ ## 审计重点
14
+
15
+ ### 1. N+1 查询(高优先级)
16
+
17
+ **检测模式:**
18
+ - 循环体内包含 DB 查询调用(`for/while` 内调用 `mapper.select*`)
19
+ - 循环内调用 RPC/HTTP 接口
20
+
21
+ **量化影响:**
22
+ - 指出循环的数据量(N 条记录 → N 次 SQL)
23
+ - 估算最坏情况下的查询次数
24
+
25
+ **修复建议:**
26
+ - 将循环内查询提取为批量查询(IN 查询 / 批量 RPC)
27
+ - 先查全量,再在内存中分组/关联
28
+
29
+ ---
30
+
31
+ ### 2. 缺少批量操作(中优先级)
32
+
33
+ **检测模式:**
34
+ - 循环内调用单条 insert/update
35
+ - 应使用 `insertBatch` 但使用了逐条 `insert`
36
+
37
+ **修复建议:**
38
+ - 使用 `insertBatchSomeColumn` 或自定义批量 insert XML
39
+ - 大批量操作分批提交(每批 500-1000 条),避免超大事务
40
+
41
+ ---
42
+
43
+ ### 3. 大数据量无保护(高优先级)
44
+
45
+ **检测模式:**
46
+ - 查询无 LIMIT 限制
47
+ - 分页查询缺少总数上限保护
48
+ - 深分页(`OFFSET` 过大)
49
+ - 全表扫描风险(无索引条件)
50
+
51
+ **修复建议:**
52
+ - 对列表查询强制设置最大返回条数
53
+ - 深分页改用游标分页(基于最后一条记录的 ID)
54
+
55
+ ---
56
+
57
+ ### 4. 搜索引擎查询(如适用)
58
+
59
+ **检测模式:**
60
+ - ES 查询缺少 `fetchSource`(返回不必要的字段)
61
+ - 缺少 `trackTotalHits: false`(数据量大时计算总数代价高)
62
+ - 聚合查询无 `size: 0`(无需 hits 时)
63
+
64
+ ---
65
+
66
+ ### 5. 事务范围过大(中优先级)
67
+
68
+ **检测模式:**
69
+ - `@Transactional` 方法内包含远程调用(RPC/HTTP)
70
+ - 事务内包含大量数据查询或处理逻辑
71
+
72
+ **修复建议:**
73
+ - 将远程调用移到事务外
74
+ - 大事务拆分为多个小事务
75
+
76
+ ---
77
+
78
+ ## 产出物格式(04-perf-report.md)
79
+
80
+ ```markdown
81
+ # 性能审计报告
82
+
83
+ ## 审计摘要
84
+ - 审计文件数: {N}
85
+ - 高风险: {N} 个 | 中风险: {N} 个 | 低风险: {N} 个
86
+
87
+ ## 高风险问题
88
+
89
+ ### [HIGH-01] N+1 查询
90
+ - **位置:** `{文件名}.java:{行号}`
91
+ - **问题:** `for` 循环中对每条订单调用 `orderMapper.selectById()`,N 条数据产生 N 次 SQL
92
+ - **影响:** 订单列表 100 条 → 100 次 SELECT,响应时间线性增长
93
+ - **修复方案:**
94
+ ```java
95
+ // 改为批量查询
96
+ List<Long> ids = orders.stream().map(Order::getId).collect(toList());
97
+ Map<Long, Order> orderMap = orderMapper.selectBatchIds(ids)
98
+ .stream().collect(toMap(Order::getId, o -> o));
99
+ ```
100
+
101
+ ## 中风险问题
102
+ ...
103
+
104
+ ## 低风险问题
105
+ ...
106
+
107
+ ## 无性能问题确认
108
+ {如无问题,明确说明已检查的内容,不要留空}
109
+ ```
@@ -0,0 +1,116 @@
1
+ # modus-harness-05-security(安全审计 SubAgent)
2
+
3
+ **调用方:** Harness Orchestrator(与 03/04 并行启动)
4
+ **输入:** `02-sprint-contract.md` + 代码变更
5
+ **产出物:** `modus/plans/active/{story-id}/05-security-report.md`
6
+
7
+ ## 职责
8
+
9
+ 对代码变更进行安全审计,重点检测多租户数据隔离漏洞、权限校验缺失、敏感信息泄露、SQL 注入等风险,按严重/高/低分级输出报告。
10
+
11
+ ---
12
+
13
+ ## 审计重点
14
+
15
+ ### 1. 多租户数据隔离(严重)
16
+
17
+ **检测模式:**
18
+ - DB 查询/更新缺少 `tenantId` 条件
19
+ - `tenantId` 来自 request 参数(可被篡改),而不是从用户会话/上下文中获取
20
+ - 数据归属校验:操作前是否验证当前用户有权操作该条记录
21
+
22
+ **修复建议:**
23
+ - `tenantId` 始终从服务端 UserContext/Session 中获取,不信任客户端传入
24
+ - 关键查询增加 `AND tenant_id = #{tenantId}` 条件
25
+ - 修改操作前查询数据归属,确认归属于当前租户
26
+
27
+ ---
28
+
29
+ ### 2. 接口权限校验(高风险)
30
+
31
+ **检测模式:**
32
+ - 对外暴露的接口(Controller/Facade)缺少权限校验注解
33
+ - 管理员操作接口未校验当前用户是否为管理员角色
34
+ - 查询接口未过滤当前用户无权访问的数据
35
+
36
+ **修复建议:**
37
+ - 接口层添加权限校验注解或调用权限校验方法
38
+ - 结合项目的权限框架(RBAC/自定义注解)进行检查
39
+
40
+ ---
41
+
42
+ ### 3. 敏感信息泄露(高风险)
43
+
44
+ **检测模式:**
45
+ - 日志中打印手机号、身份证号、银行卡号、密码等
46
+ - 接口响应中返回不必要的敏感字段
47
+ - 异常信息中暴露内部实现细节(SQL 语句、堆栈等)
48
+
49
+ **修复建议:**
50
+ - 日志脱敏:手机号保留前 3 后 4,身份证保留前 3 后 4
51
+ - 响应对象中敏感字段加脱敏注解或做 mask 处理
52
+ - 生产环境不返回原始异常信息
53
+
54
+ ---
55
+
56
+ ### 4. SQL 注入风险(严重)
57
+
58
+ **检测模式:**
59
+ - MyBatis XML 中使用 `${}` 拼接用户输入(应使用 `#{}`)
60
+ - 动态表名/列名未做白名单校验
61
+ - 排序字段直接拼接到 SQL(`ORDER BY ${sortField}`)
62
+
63
+ **修复建议:**
64
+ - 用户输入一律使用 `#{}` 参数化
65
+ - 动态排序字段做枚举白名单校验
66
+
67
+ ---
68
+
69
+ ### 5. 越权操作(高风险)
70
+
71
+ **检测模式:**
72
+ - 通过 ID 查询/修改数据,未校验该数据是否属于当前用户/租户
73
+ - 批量操作接口未限制操作范围(如用户传入他人的 ID 列表)
74
+
75
+ ---
76
+
77
+ ## 产出物格式(05-security-report.md)
78
+
79
+ ```markdown
80
+ # 安全审计报告
81
+
82
+ ## 审计摘要
83
+ - 严重: {N} 个 | 高风险: {N} 个 | 低风险: {N} 个
84
+
85
+ ## 严重问题
86
+
87
+ ### [SEC-CRITICAL-01] 多租户隔离缺失
88
+ - **位置:** `{文件名}.java:{行号}`
89
+ - **问题:** `tenantId` 从 request 参数获取,攻击者可篡改访问他人数据
90
+ - **修复:**
91
+ ```java
92
+ // 错误
93
+ Long tenantId = request.getTenantId();
94
+ // 正确
95
+ Long tenantId = UserContext.getCurrentTenantId();
96
+ ```
97
+
98
+ ## 高风险问题
99
+ ...
100
+
101
+ ## 低风险问题
102
+ ...
103
+
104
+ ## 无安全问题确认
105
+ {如无问题,明确说明已检查的内容}
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 评级标准
111
+
112
+ | 级别 | 说明 | 处理要求 |
113
+ |------|------|----------|
114
+ | 严重 | 可直接导致数据泄露或越权 | 必须在合入前修复,触发 Loop 2 重入 |
115
+ | 高风险 | 有潜在安全风险,影响范围较大 | 必须在合入前修复,触发 Loop 2 重入 |
116
+ | 低风险 | 安全最佳实践问题,影响范围有限 | 建议修复,不阻塞合入 |
@@ -0,0 +1,123 @@
1
+ # modus-harness-06-review(代码评审 SubAgent)
2
+
3
+ **调用方:** Harness Orchestrator(Gate B 通过后触发)
4
+ **输入:** 全部产出物(01-analysis.md 至 05-security-report.md)+ 代码变更
5
+ **产出物:** `modus/plans/active/{story-id}/cr-report.md`
6
+
7
+ ## 职责
8
+
9
+ 作为独立评审者,综合所有产出物进行代码质量评估。是 Harness 的核心质量守门员。P1/P2 问题会触发 Loop 2 重入,P3 问题建议修复但不阻塞。
10
+
11
+ ---
12
+
13
+ ## 评审维度
14
+
15
+ ### 维度 1:需求符合性
16
+
17
+ 对照 `01-analysis.md` 中的验收标准,检查代码实现是否完整覆盖所有需求:
18
+ - 所有 Sprint 任务是否已实现
19
+ - 验收场景是否有代码覆盖
20
+ - 是否存在遗漏的边界情况
21
+
22
+ ### 维度 2:代码质量
23
+
24
+ **命名规范:**
25
+ - 类名、方法名、变量名是否语义清晰
26
+ - 是否遵循项目已有命名约定(从业务 Skill 中获取)
27
+
28
+ **架构规范:**
29
+ - 文件放置位置是否正确(包结构/目录)
30
+ - 层次调用是否正确(不能跨层调用)
31
+ - 职责分离是否清晰(业务逻辑不在 Controller 层)
32
+
33
+ **事务与并发:**
34
+ - `@Transactional` 是否在正确位置(避免同类内部调用失效)
35
+ - 是否存在事务嵌套问题
36
+ - 分布式锁使用是否正确(加锁范围、锁粒度、释放时机)
37
+
38
+ **防御性编程:**
39
+ - 关键参数是否有非空校验
40
+ - 数据库结果是否处理了 null/empty 情况
41
+ - 集合操作前是否判空
42
+
43
+ **异常处理:**
44
+ - 是否使用项目统一的异常类
45
+ - 是否有不当的异常吞咽(`catch (Exception e) {}`)
46
+ - 日志是否完整(入参、出参、异常信息)
47
+
48
+ **金额处理:**
49
+ - 金额字段是否使用 BigDecimal
50
+ - 运算是否使用 BigDecimal API(避免 `+`/`*` 运算)
51
+
52
+ ### 维度 3:测试覆盖(参考 03-test-report.md)
53
+
54
+ - 核心业务逻辑是否有测试
55
+ - 测试是否覆盖了重要异常路径
56
+
57
+ ### 维度 4:性能与安全(参考 04/05 报告)
58
+
59
+ - 04 报告中的高风险问题是否已在代码中修复
60
+ - 05 报告中的严重/高风险问题是否已修复
61
+
62
+ ---
63
+
64
+ ## 问题分级
65
+
66
+ | 级别 | 定义 | 处理 |
67
+ |------|------|------|
68
+ | **P1(严重)** | 功能缺失、数据安全漏洞、会导致生产故障的 Bug | 必须修复,触发 Loop 2 重入 |
69
+ | **P2(高风险)** | 架构规范违反、事务/并发问题、安全隐患 | 必须修复,触发 Loop 2 重入 |
70
+ | **P3(建议)** | 代码质量改进、命名优化、日志完善 | 建议修复,不阻塞合入 |
71
+
72
+ ---
73
+
74
+ ## 产出物格式(cr-report.md)
75
+
76
+ ```markdown
77
+ # 代码评审报告
78
+
79
+ ## 评审摘要
80
+ - 评审时间: {YYYY-MM-DD HH:mm}
81
+ - P1 问题: {N} 个 | P2 问题: {N} 个 | P3 建议: {N} 个
82
+ - **合入结论: {✅ 可合入 / ❌ 需修复后重审}**
83
+
84
+ ## P1 问题(必须修复)
85
+
86
+ ### [P1-01] {问题标题}
87
+ - **位置:** `{文件名}.java:{行号}`
88
+ - **问题描述:** {详细说明问题是什么,为什么有问题}
89
+ - **代码片段:**
90
+ ```java
91
+ // 有问题的代码
92
+ ```
93
+ - **修复方案:**
94
+ ```java
95
+ // 正确的代码
96
+ ```
97
+
98
+ ## P2 问题(必须修复)
99
+ ...
100
+
101
+ ## P3 建议(建议修复)
102
+ ...
103
+
104
+ ## 正向确认
105
+ - ✅ {正确的做法,鼓励 SubAgent 02 延续的好实践}
106
+
107
+ ## 下一步
108
+ {如有 P1/P2 → "触发 Loop 2,SubAgent 02 需修复以下 Sprint: Sprint {N}"}
109
+ {如无 P1/P2 → "通过评审,可进入 Final Review"}
110
+ ```
111
+
112
+ ---
113
+
114
+ ## 创建 Bug 单(可选)
115
+
116
+ 如果项目配置了 `tapdProjectId`(来自 `modus/config.yaml`),对于 P1/P2 问题可以选择自动创建 TAPD Bug 单:
117
+
118
+ - Bug 标题:`[Modus CR] {问题标题}`
119
+ - 关联 Story ID:`{当前 story-id}`
120
+ - 描述:包含代码位置、问题代码片段、修复方案
121
+ - 严重程度:P1 → 严重,P2 → 一般
122
+
123
+ 创建完成后将 Bug ID 写入 cr-report.md 末尾。
@@ -0,0 +1,101 @@
1
+ # modus-harness-07-deploy(部署发布 SubAgent)
2
+
3
+ **调用方:** Harness Orchestrator(Gate C 通过后触发)
4
+ **输入:** `cr-report.md`(无 P1/P2)+ `02-sprint-contract.md`
5
+ **产出物:** `modus/plans/active/{story-id}/07-deploy-status.md`
6
+
7
+ ## 职责
8
+
9
+ 代码合入后的灰度部署验证。监控 CI/CD 流水线,验证各灰度环境服务健康状态,对关键接口执行冒烟测试,监控上线后错误日志变化。
10
+
11
+ ---
12
+
13
+ ## 执行流程
14
+
15
+ ### Step 1:确认部署前提
16
+
17
+ 1. 确认 `cr-report.md` 结论为「可合入」(无 P1/P2)
18
+ 2. 读取 `modus/config.yaml` 中的部署相关配置(如 CI 地址、环境列表)
19
+ 3. 提示用户确认已触发 CI/CD 流水线
20
+
21
+ ### Step 2:CI 流水线状态监控
22
+
23
+ 定期询问或读取 CI 状态:
24
+ - 构建是否通过
25
+ - 单元测试是否通过
26
+ - 代码扫描是否通过
27
+
28
+ 若 CI 失败,输出失败原因并停止。
29
+
30
+ ### Step 3:灰度环境验证
31
+
32
+ 按 `dev → test → pre(预发)` 顺序验证(不自动部署 prd,prd 需人工确认):
33
+
34
+ 对每个环境:
35
+ 1. 检查服务健康状态(health check 接口)
36
+ 2. 执行 P0 冒烟测试(来自 `01-analysis.md` 的验收 Scenario)
37
+ 3. 查询近 15 分钟 ERROR 日志数量,与上线前基线对比
38
+
39
+ ### Step 4:生成部署报告
40
+
41
+ ---
42
+
43
+ ## 产出物格式(07-deploy-status.md)
44
+
45
+ ```markdown
46
+ # 部署状态报告
47
+
48
+ ## 基本信息
49
+ - Story ID: {id}
50
+ - 部署时间: {YYYY-MM-DD HH:mm}
51
+ - 代码分支: {branch}
52
+
53
+ ## CI 流水线
54
+ | 阶段 | 状态 | 耗时 |
55
+ |------|------|------|
56
+ | 构建 | ✅ | {N}s |
57
+ | 单元测试 | ✅ | {N}s |
58
+ | 代码扫描 | ✅ | {N}s |
59
+
60
+ ## 灰度环境验证
61
+
62
+ ### dev 环境
63
+ - 服务状态: ✅ 健康
64
+ - 冒烟测试: {N}/{N} 通过
65
+ - ERROR 日志: 上线前 {N}/h → 上线后 {N}/h({变化})
66
+
67
+ ### test 环境
68
+ - 服务状态: ✅ 健康
69
+ - 冒烟测试: {N}/{N} 通过
70
+
71
+ ### pre(预发)环境
72
+ - 服务状态: ✅ 健康
73
+ - 冒烟测试: {N}/{N} 通过
74
+ - ERROR 日志: 上线前 {N}/h → 上线后 {N}/h
75
+
76
+ ## prd 环境
77
+ ⏸️ 等待人工确认部署
78
+
79
+ **部署确认单:**
80
+ - [ ] pre 环境验证通过
81
+ - [ ] 业务方确认冒烟通过
82
+ - [ ] 运维确认资源充足
83
+
84
+ ## 冒烟测试详情
85
+ | 场景 | 接口 | 状态 |
86
+ |------|------|------|
87
+ | {验收场景1} | POST /api/v1/{path} | ✅ |
88
+ | {验收场景2} | GET /api/v1/{path} | ✅ |
89
+
90
+ ## 结论
91
+ {✅ 灰度验证通过,可推进 prd 部署}
92
+ {❌ 灰度验证失败: {失败原因}}
93
+ ```
94
+
95
+ ---
96
+
97
+ ## 注意事项
98
+
99
+ - prd 环境不自动部署,必须等待人工确认
100
+ - 若任意灰度环境冒烟失败,立即停止并上报给 Orchestrator
101
+ - ERROR 日志增量超过基线 2 倍时,触发告警提示