@modus-ai/modus 0.2.10 → 0.2.11

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 (35) hide show
  1. package/dist/commands/init.d.ts +2 -2
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +19 -3
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/generators/codebuddy.d.ts.map +1 -1
  6. package/dist/generators/codebuddy.js +10 -2
  7. package/dist/generators/codebuddy.js.map +1 -1
  8. package/dist/generators/continue.d.ts +16 -0
  9. package/dist/generators/continue.d.ts.map +1 -0
  10. package/dist/generators/continue.js +435 -0
  11. package/dist/generators/continue.js.map +1 -0
  12. package/dist/generators/cursor.d.ts.map +1 -1
  13. package/dist/generators/cursor.js +7 -1
  14. package/dist/generators/cursor.js.map +1 -1
  15. package/dist/generators/custom.d.ts.map +1 -1
  16. package/dist/generators/custom.js +8 -1
  17. package/dist/generators/custom.js.map +1 -1
  18. package/dist/generators/index.d.ts.map +1 -1
  19. package/dist/generators/index.js +4 -0
  20. package/dist/generators/index.js.map +1 -1
  21. package/dist/utils/config.d.ts +20 -1
  22. package/dist/utils/config.d.ts.map +1 -1
  23. package/dist/utils/config.js.map +1 -1
  24. package/dist/utils/file-system.d.ts +16 -0
  25. package/dist/utils/file-system.d.ts.map +1 -1
  26. package/dist/utils/file-system.js +40 -0
  27. package/dist/utils/file-system.js.map +1 -1
  28. package/package.json +1 -1
  29. package/templates/skills/modus-init/SKILL.md +274 -768
  30. package/templates/skills/modus-init/shared/frontmatter-spec.md +255 -0
  31. package/templates/skills/modus-init/shared/stack-detection.md +144 -0
  32. package/templates/skills/modus-init/shared/universal-skill-format.md +362 -0
  33. package/templates/skills/modus-init/strategies/fallback-init.md +150 -0
  34. package/templates/skills/modus-init/strategies/frontend-init.md +298 -0
  35. package/templates/skills/modus-init/strategies/java-init.md +278 -0
@@ -1,8 +1,17 @@
1
1
  ---
2
2
  name: modus-init
3
- description: Use this skill when executing /modus:init command (or /modus:init --help/--enhance/--migrate/--dry-run etc.) to scan the codebase, classify business domains, generate Business Skill files in modus/knowledge/, update knowledge-catalog.md, and sync to multi-platform adapters. Trigger on /modus:init or any of its parameter variants. (Modus v3.2)
3
+ description: Use this skill when executing /modus:init command (or /modus:init --help/--enhance/--migrate/--dry-run etc.) to scan the codebase, classify business domains, generate Business Skill files in modus/knowledge/, update knowledge-catalog.md, and sync to multi-platform adapters. Trigger on /modus:init or any of its parameter variants. (Modus v3.3 — Router + Strategy)
4
4
  allowed-tools: Read, Write, Glob, Bash
5
5
  disable: false
6
+ architecture: router-strategy # v3.3 起:本文件为 Router;具体扫描 + Skill 生成委派给 strategies/{stack}-init.md
7
+ strategy_files:
8
+ - strategies/java-init.md # Spring Boot / MyBatis 后端
9
+ - strategies/frontend-init.md # React / Vue / Next / Nuxt
10
+ - strategies/fallback-init.md # 通用 Glob 兜底(go / python / rust / backend-node / 未识别)
11
+ shared_files:
12
+ - shared/stack-detection.md # Step 0.5 栈检测规则
13
+ - shared/frontmatter-spec.md # 防腐字段规范(语言无关)
14
+ - shared/universal-skill-format.md # 17 节通用骨架(语言无关)
6
15
  supported_platforms:
7
16
  claude:
8
17
  status: full # 全功能支持:SubAgent 并行扫描、多轮访谈、Bash 工具可用
@@ -10,6 +19,9 @@ supported_platforms:
10
19
  codebuddy:
11
20
  status: full # 全功能支持
12
21
  notes: "推荐平台。与 Claude 能力对等,Skill 生成格式与 .codebuddy/ 目录结构完全兼容。"
22
+ continue:
23
+ status: full # 全功能支持(与 CodeBuddy 同级,腾讯音乐内部 AI Coding 平台)
24
+ notes: "与 CodeBuddy 能力对等;目录结构 .continue/ 完全镜像 .codebuddy/,Skills/Agents/Hooks 全部支持。"
13
25
  cursor:
14
26
  status: partial # 部分支持:无 SubAgent、无 Bash,Skill 以 .mdc 规则文件输出
15
27
  notes: "Cursor 不支持 SubAgent,init 流程退化为单 Agent 串行执行;Bash 工具不可用,目录扫描依赖 Glob/Read 工具。生成的 Skill 以 .cursor/rules/modus-biz-*.mdc 格式输出,不支持 v3/17节完整格式。"
@@ -111,13 +123,32 @@ Modus Init — 业务知识库初始化工具
111
123
 
112
124
  ## 本文件结构索引(Agent 必读)
113
125
 
114
- > 本文件共分三个区块,请根据当前任务按需加载,避免无效 token 消耗:
126
+ > **v3.3 架构变更**:本文件已重构为 **Router + Strategy** 模式。原 Step 5(5 轮扫描)和 Step 8(业务 Skill 17 节模板)已抽到独立文件,实现"对外只暴露一个 `/modus:init` 命令、对内按主语言栈分流"。
115
127
 
116
- | 区块 | 内容 | Agent 读取时机 | 典型使用场景 |
117
- |------|------|----------------|------------|
118
- | **区块 A:执行流程**(Step 0-14) | Agent 执行 `/modus:init` 时的完整步骤指令 | **每次执行 `/modus:init` 必须完整读取** | 全新初始化、重新初始化(模式 1-4)、补全新节 |
119
- | **区块 B:防腐机制总览** | 防腐字段说明、双级 hash 规则、活跃度感知衰减、status 全链路图、同步副本管理规约 | 执行 Step 8 生成 Skill 前必读;执行 `/modus:verify`、`/modus:refresh` 前必读 | hash 不一致处理、status 升降级、副本同步问题排查 |
120
- | **区块 C:Business Skill 标准格式**(v3/17节模板) | 多语言适配说明 + 生成每个业务 Skill 时的完整格式参考 | 执行 Step 8 时按需读取对应节的格式要求;辅助命令 `/modus:verify`、`/modus:refresh` 执行时读取 | 格式参考、节内容门槛检查、信号词归属判断 |
128
+ ### 文件分工
129
+
130
+ | 角色 | 文件 | 职责 |
131
+ |------|------|------|
132
+ | **Router**(本文件) | `templates/skills/modus-init/SKILL.md` | 参数解析、栈检测、迁移、平台同步、catalog 生成、完成回报——**栈无关的 14 步框架** |
133
+ | **Java Strategy** | `strategies/java-init.md` | Spring Boot / MyBatis 后端的 5 轮扫描 + Java 17 节填充 |
134
+ | **Frontend Strategy** | `strategies/frontend-init.md` | React / Vue / Next / Nuxt 的扫描 + 前端化 17 节填充(含 §3 React、§4 Vue、§5 通用前端) |
135
+ | **Fallback Strategy** | `strategies/fallback-init.md` | Go / Python / Rust / Node 后端 / 未识别项目的简化 6 节生成 |
136
+ | **Stack Detection** | `shared/stack-detection.md` | Step 0.5 栈检测的决策树和信号矩阵 |
137
+ | **Frontmatter Spec** | `shared/frontmatter-spec.md` | 防腐字段规范(语言无关)+ status 生命周期 + 衰减规则 |
138
+ | **Universal Skill Format** | `shared/universal-skill-format.md` | 17 节通用骨架(节号节名跨栈一致;节内填充按 stack 分流) |
139
+
140
+ ### 加载时机
141
+
142
+ | 区块/文件 | Agent 何时读取 | 典型场景 |
143
+ |-----------|----------------|---------|
144
+ | **本文件区块 A:执行流程**(Step 0-14) | 每次执行 `/modus:init` 必读 | 全新初始化、增量更新、迁移 |
145
+ | `shared/stack-detection.md` | Step 0.5 时读取 | 决定路由到哪个 strategy |
146
+ | `strategies/{stack}-init.md` | Step 5、Step 8 按检测出的 `primaryStack` 加载 | 5 轮扫描、生成业务 Skill |
147
+ | `shared/universal-skill-format.md` | Step 8 生成 Skill 时按需读取 | 17 节标准格式参考 |
148
+ | `shared/frontmatter-spec.md` | Step 8 生成 Skill 前必读;`/modus:verify`/`/modus:refresh` 必读 | 防腐字段填写、status 升降级 |
149
+ | **本文件区块 B:防腐机制总览** | hash 不一致排查、副本同步问题排查 | 与 `shared/frontmatter-spec.md` 互为补充(区块 B 含全链路图与同步副本规约) |
150
+
151
+ > 通用知识库原则:**节号、节名、知识标签三者跨栈完全一致**;只有节内填充按 `primaryStack` 分流。这保证跨栈 monorepo 项目的 catalog 可以统一索引。
121
152
 
122
153
  ---
123
154
  <!-- ============================================================ -->
@@ -161,11 +192,66 @@ Modus Init — 业务知识库初始化工具
161
192
  检测到 --enhance <domain> 或 --enhance-all?
162
193
  是 → 跳转到 Step 2(增量更新模式)
163
194
 
164
- 以上都无 → 执行标准全量初始化(Step 3 → Step 14)
195
+ 以上都无 → 执行标准全量初始化(Step 0.5 → Step 3 → Step 14)
165
196
  ```
166
197
 
167
198
  ---
168
199
 
200
+ ### Step 0.5:栈检测分流(v3.3 新增)★ Router 核心
201
+
202
+ > **执行时机**:`Step 0` 完成后、`Step 1`/`Step 3` 之前。`--help` / `--migrate` / `--enhance` 模式下跳过本步骤(这些模式不重新扫描代码)。
203
+
204
+ **目标**:探测项目主语言栈,将结果写入 `modus/config.yaml.primaryStack`,并决定 Step 5 / Step 8 加载哪个 strategy 文件。
205
+
206
+ #### 执行步骤
207
+
208
+ 1. **读取栈检测规则文档**:使用 Read 工具读取 `templates/skills/modus-init/shared/stack-detection.md`(即「栈检测规则」单一真相来源)
209
+
210
+ 2. **按文档定义的决策树检测项目根**,按以下优先级(第一个命中即停):
211
+ ```
212
+ pom.xml / build.gradle / build.gradle.kts → primaryStack=java
213
+ go.mod → primaryStack=go
214
+ pyproject.toml / requirements.txt → primaryStack=python
215
+ Cargo.toml → primaryStack=rust
216
+ package.json:
217
+ deps 含 @nestjs/core/express/fastify/koa → primaryStack=backend-node
218
+ deps 含 vue/@vue/cli/nuxt/nuxt3 → primaryStack=frontend-vue
219
+ deps 含 react/next/@remix-run/react → primaryStack=frontend-react
220
+ deps 都没 → primaryStack=frontend-other
221
+ 全部都没 → primaryStack=fallback
222
+ ```
223
+
224
+ 3. **多栈共存(混合 monorepo)处理**:
225
+ - 若同时检测到多栈(如 `pom.xml` + `package.json`):
226
+ - `--force` 模式:按优先级 `java > backend-node > frontend-* > go/python/rust > fallback` 自动选主栈
227
+ - 交互模式:按 `shared/stack-detection.md` §3.2 向用户展示选项,等待选择
228
+
229
+ 4. **写入 `modus/config.yaml.primaryStack`**:将检测结果持久化
230
+
231
+ 5. **路由声明(明确告知 Agent 后续 Step 加载哪个文件)**:
232
+ ```
233
+ primaryStack=java → Step 5/Step 8 加载 strategies/java-init.md
234
+ primaryStack=frontend-react → Step 5/Step 8 加载 strategies/frontend-init.md(§3 React 子流程)
235
+ primaryStack=frontend-vue → Step 5/Step 8 加载 strategies/frontend-init.md(§4 Vue 子流程)
236
+ primaryStack=frontend-other → Step 5/Step 8 加载 strategies/frontend-init.md(§5 通用前端)
237
+ 其他(go/python/rust/backend-node/fallback)→ 加载 strategies/fallback-init.md
238
+ ```
239
+
240
+ 6. **向用户展示路由结果**(`--force` 时仍输出但不等待确认):
241
+ ```
242
+ [Step 0.5 栈检测] ✓ 主栈:{primaryStack}
243
+ 检测信号:{命中的文件/字段}
244
+ 将使用:strategies/{stack}-init.md
245
+ 业务 Skill 格式:v3-{stack}
246
+ ```
247
+
248
+ #### 失败兜底
249
+
250
+ - 检测过程异常(如 `package.json` 损坏)→ `primaryStack=fallback`,警告但不中断流程
251
+ - 用户后续可通过编辑 `modus/config.yaml` 手动调整 `primaryStack` 后重跑 `/modus:init`
252
+
253
+ ---
254
+
169
255
  ### Step 1:迁移模式(--migrate)
170
256
 
171
257
  当用户运行 `/modus:init --migrate` 时执行此流程。
@@ -379,249 +465,96 @@ Step 2-7: 完成回报
379
465
 
380
466
  ---
381
467
 
382
- ### Step 5:项目扫描与业务分类(5 轮全量扫描)
383
-
384
- 启动一个「项目分析 SubAgent」,执行以下 **5 轮结构化扫描**(替代原有的简单目录读取):
468
+ ### Step 5:项目扫描与业务分类 ★ 委派给 strategy
385
469
 
386
- #### 扫描前置:读取 scanRules 配置
470
+ > **v3.3 路由模式**:本步骤的具体扫描逻辑已抽到独立 strategy 文件,根据 Step 0.5 检测到的 `primaryStack` 委派执行。Router 仅负责调度。
387
471
 
388
- 在开始轮次 1 前,读取 `modus/config.yaml` 中的 `scanRules` 字段(若存在),构建本次扫描的规则集:
472
+ #### 5.1 加载对应 strategy
389
473
 
390
- ```
391
- scanRules.include_extensions(用户配置)
392
- ||(合并)
393
- 默认后缀:[.java, .kt, .py, .ts, .tsx, .js, .go, .rs, .php, .rb, .swift, .scala]
474
+ 根据 `modus/config.yaml.primaryStack` 加载文件:
394
475
 
395
- scanRules.exclude_patterns(用户配置)
396
- ||(合并)
397
- 默认排除:[target/**, build/**, dist/**, node_modules/**, .idea/**, .vscode/**,
398
- generated/**, **/*Generated.java, *.lock, .git/**, .github/**]
399
- ||(合并)
400
- 项目根目录 .gitignore / .modus-ignore(若存在)
476
+ | primaryStack | 加载文件 | 扫描方式 |
477
+ |--------------|---------|---------|
478
+ | `java` | `templates/skills/modus-init/strategies/java-init.md` | 5 轮 Java 全量扫描(Maven Module / 包级清单 / 方法签名 / 跨域 RPC / 表所有权) |
479
+ | `frontend-react` | `templates/skills/modus-init/strategies/frontend-init.md`(§3 React 子流程) | 路由 + Page + Hook + API endpoint 5 轮扫描 |
480
+ | `frontend-vue` | `templates/skills/modus-init/strategies/frontend-init.md`(§4 Vue 子流程) | SFC 解析 + Composable + Pinia + API 5 轮扫描 |
481
+ | `frontend-other` | `templates/skills/modus-init/strategies/frontend-init.md`(§5 通用前端) | 简化 8 节生成 |
482
+ | `go` / `python` / `rust` / `backend-node` / `fallback` | `templates/skills/modus-init/strategies/fallback-init.md` | 按目录前缀分组的简化扫描 |
401
483
 
402
- 最终公式:扫描文件 = (include_extensions 匹配) - (exclude_patterns 排除)
403
- ```
484
+ #### 5.2 执行流程(统一框架)
404
485
 
405
- `scanRules` 不存在,使用全部默认值,不向用户提示。
406
- 若存在用户自定义规则,输出一行说明:`[读取自定义扫描规则:排除 N 个额外路径,包含 M 个扩展名]`
486
+ 无论加载哪个 strategy,执行步骤一致:
407
487
 
408
- #### 轮次 1:模块发现
409
-
410
- **进度输出(轮次开始时):**
411
- ```
412
- [1/5 模块发现] 扫描中...
413
- ```
488
+ 1. **使用 Read 工具读取**对应 strategy 文件
489
+ 2. **按 strategy 文档定义的"5 轮扫描"指令执行**(Java 是 Service/Mapper 语义,前端是 Hook/API 语义)
490
+ 3. **strategy 完成后,回到本 Router 继续执行**:5 轮扫描完成后的"域置信度评分矩阵"由 strategy 提供,Router 仅做汇总展示
414
491
 
415
- 递归枚举项目中所有构建单元:
416
- - Java/Kotlin:递归发现所有 Maven Module(`pom.xml`)或 Gradle 子项目(`settings.gradle`)
417
- - Python:发现所有包目录(含 `__init__.py` 或 `pyproject.toml`)
418
- - 前端:发现所有独立 Node Package(`package.json`)
492
+ #### 5.3 扫描前置:scanRules(栈无关,Router 处理)
419
493
 
420
- **进度输出(轮次完成时):**
421
- ```
422
- [1/5 模块发现] ✓ 发现 {N} 个构建模块 — {模块名1}, {模块名2}...
423
- ```
494
+ 在调用 strategy 前,先合并 `modus/config.yaml.scanRules` 与栈对应的默认值(默认值由 strategy 文档提供),构建本次扫描的规则集:
424
495
 
425
- **失败回退:** 若无法识别任何构建单元,输出:
426
496
  ```
427
- [1/5 模块发现] ⚠️ 未发现标准构建文件(pom.xml/package.json),将以目录结构为单位扫描。
497
+ 最终扫描文件 = (include_extensions 匹配) - (exclude_patterns 排除) - .gitignore - .modus-ignore
428
498
  ```
429
499
 
430
- 输出:模块列表(含模块名、路径、构建文件路径)
431
-
432
- #### 轮次 2:包级清单
433
-
434
- **进度输出(轮次开始时):**
500
+ 若 `scanRules` 不存在,使用 strategy 默认值,不向用户提示;若存在自定义,输出:
435
501
  ```
436
- [2/5 包级清单] 扫描中...({N} 个模块)
502
+ [读取自定义扫描规则:排除 N 个额外路径,包含 M 个扩展名]
437
503
  ```
438
504
 
439
- 对每个模块,逐包统计:
440
- - 文件数量
441
- - 类型分布(`Controller/Facade` / `Service/Manager` / `Mapper/DAO` / `Domain/Entity` / `Enum/Constant` / `DTO/VO` / `Exception/ErrorCode` / `MQ Consumer/Producer` / `XML Mapper` / `@Configuration`)
505
+ #### 5.4 进度输出(栈无关,Router 统一规范)
442
506
 
443
- **输出格式:按文件数从多到少排序,完整展示不截断:**
507
+ 无论哪个 strategy,必须按以下统一格式输出进度:
444
508
 
445
509
  ```
446
- 包级清单(共 {N} 个包):
447
-
448
- order(43个文件) Controller✓ Facade✓ 主要概念: 订单创建/支付/状态流转
449
- payment(31个文件) Controller✓ 主要概念: 支付发起/回调/退款
450
- user(28个文件) Controller✓ Facade✓ 主要概念: 用户注册/登录/权限
451
- inventory(12个文件) 主要概念: 库存管理
452
- diversion(3个文件) 主要概念: 流量分发(⚠️ 小包候选)
453
- singerfollower(2个文件) 主要概念: 关注关系(⚠️ 小包候选)
454
- ...(全量展示,不截断)
455
- ```
456
-
457
- **进度输出(轮次完成时):**
458
- ```
459
- [2/5 包级清单] ✓ 扫描 {N} 个文件,发现 {M} 个候选域(其中 {K} 个小包候选)
460
- ```
461
-
462
- #### 轮次 3:域语义分析(方法签名级)
463
-
464
- 按**三层递进**推断域归属,对非标准命名(如 `UserModuleV2Manager`、`BizOpportunityFacade`)也能准确识别:
465
-
466
- **层 A:包名语义词匹配**(快速初判)
467
- - 分析包名中的业务语义词(如 `order`、`pay`、`user`)
468
- - 若包名与已知业务词完全匹配,直接归入对应域(置信度 High)
469
-
470
- **层 B:公开方法签名分析**(语义细化)
471
- - 对 Service/Manager/Facade 类,提取所有 `public` 方法签名:
472
- - 方法名(提取语义动词 + 名词,如 `confirmOrder` → 操作=confirm,对象=Order)
473
- - 返回类型(List/PageResult/void → 推断是查询/写操作/事件)
474
- - 参数中的 DTO/Entity 名称(如 `CreateOrderRequest` → 明确归入 order 域)
475
- - 从方法语义词聚类推断域:同包内方法名含有同一业务名词 ≥ 3 个 → 确认域归属
476
-
477
- **输出格式(增强版,包含代表性方法签名):**
478
-
479
- ```
480
- 域识别结果(共 {N} 个域):
481
-
482
- order(订单域) [置信度 High]
483
- 核心方法:createOrder(CreateOrderReq) → OrderVO
484
- cancelOrder(Long orderId) → void
485
- getOrderDetail(Long orderId) → OrderDetailVO
486
- batchConfirmOrder(List<Long>) → BatchResultVO
487
- queryOrderPage(OrderPageQuery) → PageResult<OrderVO>
488
- → 关键文件:OrderService, OrderManager, OrderMapper
489
-
490
- payment(支付域) [置信度 Medium — 包名为 pay,方法含 payment/refund/callback]
491
- 核心方法:initPayment(PaymentInitReq) → PaymentVO
492
- handleCallback(PayCallbackReq) → void
493
- → 关键文件:PaymentService, PaymentMapper
494
- ```
510
+ [1/5 模块发现] 扫描中...
511
+ [1/5 模块发现] ✓ 发现 {N} 个构建模块 — {模块名1}, {模块名2}...
495
512
 
496
- **层 C:回退策略**(当 A/B 均无法确定时)
497
- - 若类名含有多个语义域的词(如 `OrderPaymentService`),标记为"待人工确认"的跨域类
498
- - 若整个包只有 1-2 个文件,标记为"⚠️ 小包候选,建议合并到相近域"
499
- - 输出候选归属列表,等待轮次 5 跨域依赖分析后再最终确认
513
+ [2/5 文件分类清单] 扫描中...({N} 个模块)
514
+ [2/5 文件分类清单] ✓ 扫描 {N} 个文件,发现 {M} 个候选域(其中 {K} 个小包候选)
500
515
 
501
- **进度输出(在轮次3开始处添加,在输出域清单后标注完成):**
502
- ```
503
- [3/5 域语义分析] 分析方法签名中...
504
- ...(域识别结果)...
516
+ [3/5 域语义分析] 分析中...
505
517
  [3/5 域语义分析] ✓ 确认 {N} 个域({M} 个待人工确认)
506
- ```
507
-
508
- #### 轮次 4:跨域依赖
509
-
510
- **进度输出:**
511
- ```
512
- [4/5 跨域依赖] 扫描 RPC / MQ 调用链...
513
- ```
514
-
515
- 扫描 RPC 调用、MQ Topic 订阅/发布,绘制域间依赖关系:
516
- - `@DubboReference` / `@FeignClient` — 识别跨域 RPC 依赖
517
- - `eventPublisher.publish()` / `kafkaTemplate.send()` / `rocketMQTemplate.send()` — 识别 MQ 发布
518
- - `@KafkaListener` / `@RocketMQMessageListener` — 识别 MQ 订阅
519
- - `@Autowired` 或构造注入了来自其他业务包的 Service — 识别 Spring 跨域注入
520
- - `ApplicationEventPublisher.publishEvent()` + `@EventListener` — 识别事件驱动隐式依赖
521
-
522
- #### 轮次 5:数据库表所有权图谱(新增)
523
-
524
- **进度输出:**
525
- ```
526
- [5/5 表所有权] 扫描 Mapper 文件...
527
- ```
528
-
529
- 扫描所有 XML Mapper 中的表名 + `@TableName` 注解,构建全局表归属地图:
530
518
 
531
- ```
532
- 扫描目标:
533
- - resources/**/mapper/*.xml 中所有 <select>/<insert>/<update>/<delete> 的 FROM/INTO/UPDATE 子句
534
- - @TableName("table_name") 注解(MyBatis-Plus)
535
-
536
- 输出:表所有权矩阵
537
- order_main → [order] ← 独占表(置信度+2)
538
- order_item → [order] ← 独占表
539
- payment_record → [payment] ← 独占表
540
- user_account → [user, payment] ← ⚠️ 共享表,存在隐式跨域耦合
541
- config_dict → [order, user, payment] ← 公共配置表(排除出所有权统计)
542
-
543
- 孤立表(无任何域 Mapper 访问):
544
- → 提示「发现 {N} 个无域归属的表,需人工决策归属:{表名列表}」
545
- ```
546
-
547
- **进度输出(5轮全部完成后):**
548
- ```
519
+ [4/5 跨域依赖] 扫描中...
549
520
  [4/5 跨域依赖] ✓ 绘制 {N} 条依赖关系
550
- [5/5 表所有权] ✓ 覆盖 {M} 张表,发现 {K} 个共享表
521
+
522
+ [5/5 资源所有权] 扫描中...
523
+ [5/5 资源所有权] ✓ 覆盖 {M} 个资源单元,发现 {K} 个共享资源
551
524
 
552
525
  扫描完成 ─────────────────────────────────────────────
553
- 确认域:{N} 个 | 待确认:{M} 个 | 孤立表:{K}
526
+ 确认域:{N} 个 | 待确认:{M} 个 | 共享资源:{K}
554
527
  下一步:展示域汇总,等待用户确认(Step 6)
555
528
  ──────────────────────────────────────────────────────
556
529
  ```
557
530
 
558
- #### 5 轮扫描完成后:域置信度评分矩阵
559
-
560
- 完成轮次 1-5 后,对每个候选域执行置信度评分(满分 10 分):
531
+ #### 5.5 失败兜底(Router 兜底,与 strategy 无关)
561
532
 
562
- > **执行时机说明**:置信度评分矩阵依赖全部 5 轮的扫描结果(尤其是轮次 4 的跨域依赖和轮次 5 的表所有权),必须在 5 轮全部完成后执行,而非轮次 3 结束后立即执行。
533
+ - strategy 文件读取失败 自动降级到 `fallback-init.md`,警告但不中断
534
+ - 扫描中途异常(如 OOM、token 超限)→ 按 strategy 中定义的"自动拆分"策略处理(详见 Step 8)
563
535
 
564
- | 评分维度 | 评分规则 | 说明 |
565
- |---------|---------|------|
566
- | ① 包名语义内聚度 | 高=2 / 中=1 / 低=0 | 包名与业务术语匹配度 |
567
- | ② 数据库表独占率 | >70%=2 / >40%=1 / <40%=0 | 独占表数 ÷ 总访问表数 |
568
- | ③ 对外入口完备性 | 有 Controller/Facade=2 / 仅内部=1 / 无入口=0 | 是否有对外暴露点 |
569
- | ④ 核心实体独立性 | 仅本域路径=2 / 跨域共享=1 / 无 Entity=0 | Domain/Entity 是否封装 |
570
- | ⑤ 事务边界清晰度 | 集中在本域 Service=2 / 跨域=1 / 无=0 | @Transactional 分布 |
536
+ #### 5.6 域置信度分级(统一规范)
571
537
 
572
- **置信度分级处理:**
538
+ 各 strategy 输出的置信度评分(0-10)按以下统一规则分级:
573
539
 
574
540
  ```
575
- ≥ 7 分 → [高置信度] 自动确认,在扫描结果中标 ✅
576
- 4-6 分 → [中置信度] 标 ⚠️,在展示时突出显示,请用户确认
577
- < 4 分 → [低置信度] 标 ❌,强制暂停等待用户决策,不允许直接进入 Step 4
541
+ ≥ 7 分 → 自动确认
542
+ 4-6 分 → ⚠️ 用户确认(展示置信度偏低原因)
543
+ < 4 分 → 强制暂停决策(必须人工选择处理方案:合并/拆分/重命名)
578
544
  ```
579
545
 
580
- ---
581
-
582
- **扫描结果展示(向用户展示):**
546
+ #### 5.7 扫描覆盖率报告(栈无关,Router 在 Step 5 末尾输出)
583
547
 
584
548
  ```
585
- 我识别到以下业务域,请确认(将生成到 modus/knowledge/):
586
-
587
- 1. biz-order(订单域)— 订单创建、状态流转、查询 [置信度: 9/10 ✅]
588
- 关键文件: OrderController, OrderService, OrderMapper, OrderDomain, OrderStatus(Enum)
589
- 独占表: order_main, order_item(共2个)
590
-
591
- 2. biz-payment(支付域)— 支付发起、回调、退款 [置信度: 8/10 ✅]
592
- 关键文件: PayFacade, PayManager, PayRecordMapper, PayStatus(Enum)
593
- 独占表: payment_record(共1个)
594
-
595
- 3. biz-user(用户域)— 用户注册、登录、权限 [置信度: 5/10 ⚠️ 请确认]
596
- 关键文件: UserController, UserService, AuthManager
597
- ⚠️ 该域未发现独立 Entity 类(得分偏低),请确认是否独立域?
598
-
599
- 4. biz-diversion(流量分发)— 流量路由 [置信度: 2/10 ❌ 需要决策]
600
- ❌ 低置信度:仅 2 个业务类,无 Controller/Facade,无独占表
601
- 建议选择:A) 合并至 user 域 B) 合并至 platform 域 C) 保持独立
602
-
603
- 域间依赖:order → payment(RPC),order → user(RPC),payment → notify(MQ)
604
- 共享表警告:user_account 被 user 和 payment 两个域访问,存在隐式耦合
605
-
606
- 是否确认以上分类?(❌ 低置信度域必须先处理)
607
- ```
608
-
609
- ---
610
-
611
- #### 扫描覆盖率报告(Step 2 末尾输出)
612
-
613
- ```
614
- 📊 扫描覆盖率报告
549
+ 📊 扫描覆盖率报告(基于 strategy: {primaryStack})
615
550
  已识别域:{N} 个
616
- 项目总文件:{total} 个(已排除 *Test.java 和 generated/ 目录)
551
+ 项目总文件:{total} 个(已排除 strategy 默认排除规则)
617
552
  已纳入域的文件:{covered} 个({percent}%)
618
553
 
619
554
  未纳入文件({uncovered} 个):
620
- 排除原因 → 测试类(*Test.java):{n}
621
- 排除原因 → 自动生成类(generated/、target/):{n} 个
555
+ 排除原因 → {strategy 定义的排除分类}
622
556
  排除原因 → 待确认归属:
623
- - src/main/java/com/example/util/DateUtils.java
624
- - src/main/java/com/example/common/PageHelper.java
557
+ - {文件路径列表,最多 5 个}
625
558
  (以上文件未归入任何域,需用户决策)
626
559
 
627
560
  如需将「待确认」文件归入某域,请回复:{文件路径} → {域名}
@@ -758,163 +691,143 @@ scanRules.exclude_patterns(用户配置)
758
691
 
759
692
  ---
760
693
 
761
- ### Step 8:生成业务 Skill(Layer 2)—— 并行执行
694
+ ### Step 8:生成业务 Skill(Layer 2)★ 委派给 strategy
762
695
 
763
- 用户确认后,**同时**为每个业务域启动独立的「Skills Builder SubAgent」(`modus-skill-creator` Skill,模式 A),并行生成所有业务 Skill 文件。各域之间完全独立,无需等待彼此完成。
696
+ > **v3.3 路由模式**:Step 8 的具体扫描逻辑、文件分批策略、节内填充语义,已抽到独立 strategy 文件。Router 仅负责调度、并行编排、跨域回写。
764
697
 
765
- **目标路径(v3.1):** `modus/knowledge/biz-{domain}/SKILL.md`
698
+ #### 8.1 加载对应 strategy
766
699
 
767
- **并行调度规则:**
700
+ 按 Step 0.5 已写入的 `modus/config.yaml.primaryStack` 加载:
768
701
 
769
- ```
770
- 用户确认域列表后,立即并行启动 N 个 SubAgent:
702
+ | primaryStack | 加载的 strategy 文件 |
703
+ |--------------|---------------------|
704
+ | `java` | `strategies/java-init.md`(含 10 类 Java 文件三批扫描) |
705
+ | `frontend-react` / `frontend-vue` / `frontend-other` | `strategies/frontend-init.md`(前端 9 类文件 + Hook/API 协作骨架) |
706
+ | 其他 | `strategies/fallback-init.md`(简化 6 节生成) |
707
+
708
+ #### 8.2 并行调度规则(栈无关,Router 负责)
709
+
710
+ 用户在 Step 6 确认域列表后,立即并行启动 N 个 SubAgent:
771
711
 
772
- SubAgent-1 (biz-order域) ──► 扫描订单全量文件(含Enum/MQ/Config等全10类)──► 生成 modus/knowledge/biz-order/SKILL.md
773
- SubAgent-2 (biz-payment域) ──► 扫描支付全量文件(含Enum/MQ/Config等全10类)──► 生成 modus/knowledge/biz-payment/SKILL.md
774
- SubAgent-3 (biz-user域) ──► 扫描用户全量文件(含Enum/MQ/Config等全10类)──► 生成 modus/knowledge/biz-user/SKILL.md
712
+ ```
713
+ SubAgent-1 (biz-{domain1}) ──► 加载 strategy ──► 全量扫描 ──► 生成 modus/knowledge/biz-{domain1}/SKILL.md
714
+ SubAgent-2 (biz-{domain2}) ──► 加载 strategy ──► 全量扫描 ──► 生成 modus/knowledge/biz-{domain2}/SKILL.md
715
+ SubAgent-3 (biz-{domain3}) ──► 加载 strategy ──► 全量扫描 ──► 生成 modus/knowledge/biz-{domain3}/SKILL.md
775
716
  │ │
776
717
  └──────────────────── 所有 SubAgent 完成 ─────────────────────────────┘
777
718
 
778
719
  主流程执行跨域依赖分析(Section 10 回写)
779
720
 
780
- 进入 Step 6(串行)
721
+ 进入 Step 9(多平台同步)
781
722
  ```
782
723
 
783
- **每个 SubAgent 的任务(模式 A 标准流程):**
724
+ SubAgent 能力的平台(如 Cursor)退化为单 Agent 串行执行。
784
725
 
785
- 1. 接收域名称 + **全量文件路径列表**(来自 Step 5 轮次 2/3 的分析结果,含所有 10 类文件)
786
- 2. 按优先级分三批扫描(**无文件数量上限,全量覆盖**):
787
- - **第一批(核心知识,必须完整扫描)**
788
- - ① Controller/Facade → API 契约、权限注解
789
- - ② Service/Manager → 业务规则、事务边界
790
- - ③ Domain/Entity → 核心字段、业务方法
791
- - ⑥ Enum/Constant → 完整枚举值和业务含义
792
- - **第二批(细节知识,全量扫描)**
793
- - ④ Mapper/DAO → 数据操作模式
794
- - ⑤ XML Mapper → 关键 SQL(JOIN/子查询/复杂条件)
795
- - ⑦ DTO/VO/Request/Response → 字段约束、校验规则
796
- - **第三批(扩展知识,按 git 最近修改时间排序,优先扫描最新文件)**
797
- - ⑧ Exception/ErrorCode → 错误码体系
798
- - ⑨ MQ Consumer/Producer → 消息契约、幂等性保障
799
- - ⑩ @Configuration → 开关配置、扩展点注册
800
- 3. 提取:核心实体、业务规则、API 契约、状态机、错误码、关键 SQL 模式、扩展点、**业务不变量**(新增)
801
- 4. 生成标准 17 节格式的 Skill 文件(含 `key_files`、`status: draft`、`format_version: v3`)
726
+ #### 8.3 每个 SubAgent 的任务(统一规范)
802
727
 
803
- **Context 超限自动保护策略(替换原有硬限制):**
728
+ 1. **接收**域名称 + 全量文件路径列表(来自 Step 5 strategy 的扫描结果)
729
+ 2. **使用 Read 工具读取**:
730
+ - `templates/skills/modus-init/strategies/{stack}-init.md`(栈特化扫描指南 + 17 节填充重点)
731
+ - `templates/skills/modus-init/shared/universal-skill-format.md`(17 节通用骨架,节号节名跨栈一致)
732
+ - `templates/skills/modus-init/shared/frontmatter-spec.md`(防腐字段规范)
733
+ 3. **按 strategy 文档的"文件分批扫描"指令执行**(各栈分批顺序不同,Java 是 Controller→Service→Mapper→Enum→...,前端是 Page→Hook→API→Type→...)
734
+ 4. **生成符合 17 节通用骨架的业务 Skill 文件**:
735
+ - 节号、节名、知识标签**严格遵循** `shared/universal-skill-format.md`(跨栈一致)
736
+ - 节内填充语义按 strategy 的"17 节填充指南"分流
737
+ - frontmatter 严格遵循 `shared/frontmatter-spec.md`
738
+ 5. **目标路径**:`modus/knowledge/biz-{domain}/SKILL.md`
739
+
740
+ #### 8.4 Context 超限自动保护策略(栈无关)
804
741
 
805
- ```
806
742
  当 token 预算不足(预计超出上下文窗口)时:
807
- → 自动拆分:启动 SubAgent-A 扫描第一批 + 第二批文件
808
- 启动 SubAgent-B 扫描第三批文件(含剩余第二批)
809
- 合并:两个 SubAgent 完成后,由主流程执行知识合并:
810
- - SubAgent-A 的结果作为 Skill 主体(Section 1-9)
811
- - SubAgent-B 的补充结果追加合并(Section 10-17 + 知识条目去重)
812
- 在 Skill 末尾标注:「[两段合并扫描: 批次A={N}个 + 批次B={M}个,共 {N+M} 个文件]」
743
+
744
+ ```
745
+ 自动拆分:SubAgent-A 扫描第一批 + 第二批文件
746
+ SubAgent-B 扫描第三批文件(含剩余第二批)
747
+ 合并:两个 SubAgent 完成后,由主流程执行知识合并:
748
+ - SubAgent-A 的结果作为 Skill 主体(Section 1-9)
749
+ - SubAgent-B 的补充结果追加合并(Section 10-17 + 知识条目去重)
750
+ → 在 Skill 末尾标注:「[两段合并扫描: 批次A={N}个 + 批次B={M}个,共 {N+M} 个文件]」
813
751
 
814
752
  当两段都超限时(超大域 > 200 个文件):
815
- → 按域内子包进一步拆分(如 biz-order-core / biz-order-query / biz-order-settle)
816
- → 提示用户是否手动拆分为多个子域,或接受分段扫描
753
+ → 按域内子包进一步拆分(如 biz-order-core / biz-order-query / biz-order-settle)
754
+ → 提示用户是否手动拆分为多个子域,或接受分段扫描
817
755
  ```
818
756
 
819
- **废除所有「⚠️ 未覆盖文件」提示块**,替换为:
757
+ #### 8.5 Section 10 跨域依赖回写(所有 SubAgent 完成后,主流程执行)
758
+
759
+ 所有并行 SubAgent 完成后,主流程统一执行一轮跨域依赖回写:
760
+
761
+ 1. 汇总 Step 5 strategy 的"轮次 4 跨域依赖"扫描结果
762
+ 2. 对每个 Skill 的 Section 10(跨域依赖)填入 upstream / downstream
763
+ 3. 同步更新 frontmatter 的 `upstream_skills` 和 `downstream_skills` 字段
764
+ 4. 执行 upstream/downstream 双向同步(详见 `modus-skill-creator` Step 7 扩展算法)
765
+
766
+ #### 8.6 聚合等待(输出格式栈无关)
820
767
 
821
768
  ```
822
- ✓ {domain} 域已完成全量扫描(共 {N} 个文件,第一批 {A} + 第二批 {B} 个 + 第三批 {C} 个)
769
+ modus/knowledge/biz-{domain1} 已生成(v3-{stack}/17节,{N1}个key_files,{M1}条规则,{K1}个API/endpoint)
770
+ ✓ modus/knowledge/biz-{domain2} 已生成(v3-{stack}/17节,{N2}个key_files,{M2}条规则,{K2}个API/endpoint)
771
+
772
+ 跨域依赖 Section 10 回写完成:
773
+ biz-{domain1}.upstream_skills = [biz-{domainX}, biz-{domainY}]
774
+ biz-{domain2}.downstream_skills = [biz-{domainZ}]
823
775
  ```
824
776
 
825
- **Section 10 跨域依赖回写(所有 SubAgent 完成后,主流程执行):**
777
+ ---
778
+
779
+ ### Step 8 补充:frontmatter 规范 ★ 委派给 shared
780
+
781
+ > 所有栈通用的 frontmatter 防腐字段规范(基础元数据、防腐核心、key_files、质量评分、跨域依赖、外部依赖)已抽到 `shared/frontmatter-spec.md`。Step 8 SubAgent 必须在生成 Skill 前读取该文件。
782
+
783
+ #### 8补.1 必读文件
826
784
 
827
- 所有并行 SubAgent 完成后,主流程统一执行一轮跨域依赖分析:
828
- 1. 汇总 Step 5 轮次 4 的跨域依赖关系图
829
- 2. 对每个域 Skill Section 10 进行回写,填入上游依赖域和下游被依赖域
830
- 3. 同步更新各 Skill frontmatter 的 `upstream_skills` 和 `downstream_skills` 字段
831
- 4. 执行 upstream/downstream 双向同步(详见 `modus-skill-creator`(SubAgent 00)Step 7 扩展算法)
785
+ `templates/skills/modus-init/shared/frontmatter-spec.md` 定义:
786
+ - 一、基础元数据字段(含跨栈通用的 `stack` 字段)
787
+ - 二、防腐机制核心字段(`last_hash` / `file_hashes` / `usage_count` 等)
788
+ - 三、key_files 填写通则(具体优先级清单见各 strategy)
789
+ - 四、质量评分字段
790
+ - 五、跨域依赖字段
791
+ - 六、外部依赖感知字段(按栈而异:Java 从 pom.xml;前端从 package.json)
792
+ - 七、frontmatter 模板(语言无关参考)
793
+ - 八、Status 生命周期与衰减规则
794
+ - 九、同步副本管理规约
832
795
 
833
- **聚合等待:**
796
+ #### 8补.2 关键约束(Router 强制校验)
797
+
798
+ 主流程在汇总 SubAgent 输出前,必须校验每个 Skill 的 frontmatter 完整性:
834
799
 
835
800
  ```
836
- modus/knowledge/biz-order 已生成(v3/17节,18个key_files,6条业务规则,5个API,状态机含4个状态)
837
- ✓ modus/knowledge/biz-payment 已生成(v3/17节,12个key_files,5条业务规则,3个API,⚠️ 共87个文件,已覆盖50个)
838
- ✓ modus/knowledge/biz-user 已生成(v3/17节,10个key_files,4条业务规则,6个API)
801
+ 对每个 SubAgent 产出的 modus/knowledge/biz-{domain}/SKILL.md:
839
802
 
840
- 跨域依赖 Section 10 回写完成:
841
- biz-order.upstream_skills = [biz-payment, biz-user]
842
- biz-payment.downstream_skills = [biz-order, biz-refund]
843
- ```
844
-
845
- ### Step 8 补充:生成 Business Skill 时必须填写完整 frontmatter(防腐机制核心)
846
-
847
- 在生成每个业务 Skill(`.codebuddy/skills/modus-biz-{domain}/SKILL.md`)时,**必须**在 frontmatter 中填写以下**完整字段清单**。这些字段是知识防腐机制的核心,缺一不可:
848
-
849
- #### 一、基础元数据字段(必填)
850
- - `name`: Skill 唯一标识符(与目录名一致)
851
- - `description`: 一句话描述,必须包含 `[MODUS:BIZ]` 标记
852
- - `version`: 语义化版本号(初始 1.0.0)
853
- - `updated`: 最后更新日期(YYYY-MM-DD)
854
- - `status`: 成熟度状态(初始 draft)
855
- - `format_version`: 节结构版本(当前 v3)
856
- - `stale_after_days`: 过期天数阈值(默认 90)
857
-
858
- #### 二、防腐机制核心字段(必填,缺少则无法检测代码变更)
859
- - **`last_referenced`**: 最后引用时间(初始值 = `updated` 日期)
860
- - 用途:计算知识衰减,超过 `stale_after_days` 自动降级
861
- - **`usage_count`**: 使用次数(初始值 = 0)
862
- - 用途:成熟度升级判定(draft→verified→proven)
863
- - **`last_hash`**: 全局 SHA-1(按区块 B 标准算法:对每个文件单独 SHA-1,将「路径:SHA-1」对按文件路径字母序排序后拼接,再整体计算 SHA-1
864
- - 用途:**快速比对**入口——先比对全局 hash,一致则跳过;不一致时展开 `file_hashes` 逐文件比对,精准输出「变更文件清单」
865
- - 计算时机:**init 生成 Skill 时即计算并写入**;后续命令引用时重新计算并比对
866
- - ⚠️ **所有命令必须使用统一算法**,详见下方「标准 hash 计算算法」区块
867
- - **`file_hashes`**: 文件级 hash map(`{路径: SHA-1}` 格式,与 `key_files` 中每个文件一一对应)
868
- - 用途:全局 hash 不一致时逐文件展开比对,精准定位哪个文件发生了变更,而非笼统标为 stale
869
- - 计算时机:与 `last_hash` 同步计算写入;key_files 中每个文件单独计算 SHA-1
870
- - **`last_verified_by`**: 最后确认人(初始值 = "",留空)
871
- - 用途:记录人工验证信息,升为 verified 时填写
872
- - **`verified_at`**: 最后验证日期(初始值 = "",留空)
873
- - 用途:记录人工验证时间,由 `/modus:verify` 在升为 verified 时自动写入(YYYY-MM-DD 格式)
874
-
875
- #### 三、key_files 填写规则(最多 20 个,用于 hash 检测)
876
- - 上限 **20 个**文件(覆盖全部 10 类文件类型)
877
- - 按以下优先级选取(满 20 个时从后往前截断):
878
- - **优先级 1(必选)**:Service、Manager、Mapper/DAO、Domain/Entity
879
- - **优先级 2(强烈建议)**:Enum/Constant(状态/类型枚举)、Exception/ErrorCode
880
- - **优先级 3(有则加入)**:MQ Consumer/Producer、@Configuration
881
- - 对每个文件单独计算 SHA-1,按「路径:SHA-1」字母序排序后整体 SHA-1 得到 `last_hash`(禁止内容直接拼接,详见区块 B)
882
- - 确保 Enum/MQ/ErrorCode/Config 的变化能被 hash 检查感知
883
-
884
- #### 四、质量评分字段(必填,用于知识库质量报告)
885
- - **`domain_confidence`**: 本域的置信度评分(0-10),来自 Step 5 置信度评分矩阵
886
- - **`invariant_count`**: 生成的业务不变量条目数(Section 15)
887
- - **`glossary_size`**: 领域词汇表条目数(Section 16)
888
- - **`hidden_knowledge_rate`**: 隐性知识补全率(0-100,来自 Step 7 访谈问卷)
889
- - **`contract_version`**: 本域对外暴露接口的当前版本(初始 "1.0");接口升级时更新,下游调用域在自己的 Section 10 中记录此版本号
890
-
891
- #### 五、跨域依赖字段(由 Section 10 回写阶段自动填入)
892
- - **`upstream_skills`**: 本域依赖的其他域 Skill 列表
893
- - **`downstream_skills`**: 依赖本域的其他域 Skill 列表
894
- - **`stale_cascade`**: 联动失效标记(初始 false);当任一 upstream_skills 的 hash 变更时自动置为 true
895
-
896
- #### 六、外部依赖感知字段(新增,init 自动从 pom.xml/package.json 提取)
897
- - **`external_deps`**: 本域规范依赖的外部库版本范围(map 格式)
898
- - 计算时机:init 生成 Skill 时自动扫描 `pom.xml` 或 `package.json`,提取该域代码中 import 频率最高的第三方库
899
- - 格式:`{lib-name}: "semver-range"` — 如 `spring-boot: "~2.7"`、`mybatis-plus: ">=3.5"`
900
- - 衰减规则:当 `pom.xml` / `package.json` 中被记录的库发生 **major version 升级**(如 2.x → 3.x)时,自动将本 Skill 降级为 `stale`,并追加注释 `⚠️ 外部依赖 {lib} 升级({old} → {new}),规范需验证`
901
- - 检测时机:`/modus:init`(含 `--lint` 模式)及 `modus update` 执行时
902
-
903
- **自动提取逻辑:** 对每个域,扫描其 `key_files` 中 import 语句,统计来自 `pom.xml` 中 `<dependencies>` 的第三方库(排除 java.*、springframework.*)引用频次,取前 5 个高频库记录版本范围。
904
-
905
- **示例:**
906
- ```yaml
907
- external_deps:
908
- spring-boot: "~2.7" # 整个项目级别的关键框架
909
- mybatis-plus: ">=3.5 <4.0" # 该域 Mapper 依赖
910
- dubbo: "~3.1" # 该域跨域 RPC 依赖
911
- ```
912
-
913
- **⛔ 重要提示:** 如果 frontmatter 缺少上述任一防腐字段(特别是 `last_referenced`、`usage_count`、`last_hash`、`file_hashes`、`key_files`),将导致:
914
- - 无法自动检测代码变更
915
- - 无法触发 Skill 更新
916
- - 无法计算知识衰减
917
- - 防腐机制完全失效
803
+ 强制项检查:
804
+ name / description / version / updated / status / format_version / stack
805
+ stale_after_days / last_referenced / usage_count
806
+ ✓ last_hash / file_hashes / key_files
807
+ ✓ last_verified_by / verified_at
808
+ domain_confidence / invariant_count / glossary_size / hidden_knowledge_rate / contract_version
809
+ ✓ upstream_skills / downstream_skills / stale_cascade
810
+ external_deps
811
+
812
+ 任一字段缺失:
813
+ 自动补 "" 或 0 占位,不允许生成不完整 Skill
814
+ 在汇总报告中标 ⚠️ "{domain}: frontmatter 字段 {field} 由 Router 自动补全为占位值,建议手动核对"
815
+ ```
816
+
817
+ #### 8补.3 标准 hash 计算算法
818
+
819
+ > 所有命令(init / verify / refresh / vibe / plan / spec / harness)**必须使用同一算法**:
820
+
821
+ ```bash
822
+ # 第一步:对 key_files 中每个文件单独计算 SHA-1(写入 file_hashes)
823
+ # 第二步:将「文件路径:SHA-1」对按文件路径字母序排序后拼接,再整体计算 SHA-1,得到 last_hash
824
+
825
+ for f in $(echo "{key_files}" | tr ' ' '\n' | sort); do
826
+ echo "$(shasum -a 1 "$f" | awk '{print $1}'):$f"
827
+ done | shasum -a 1 | awk '{print $1}'
828
+ ```
829
+
830
+ > **禁止使用「内容拼接后整体计算」的方式**——受文件顺序影响,且无法与 file_hashes 兼容。详见 `shared/frontmatter-spec.md` §标准 hash 计算算法。
918
831
 
919
832
  ---
920
833
 
@@ -1027,7 +940,6 @@ alwaysApply: false
1027
940
 
1028
941
  ---
1029
942
 
1030
-
1031
943
  ### Step 11:生成技术知识 Skill(Layer 1)
1032
944
 
1033
945
  **目标路径(v3.1):** `modus/knowledge/_tech-wiki/SKILL.md`
@@ -1194,6 +1106,7 @@ flowchart TD
1194
1106
  DRAFT -->|"/modus:verify\n满足对应门槛"| VERIFIED
1195
1107
  VERIFIED -->|"usage_count≥2\n不同工作流"| PROVEN
1196
1108
  PROVEN -.->|"超过衰减阈值"| VERIFIED
1109
+ PROVEN -.->|"超过衰减阈值"| STALE_S
1197
1110
  VERIFIED -.->|"超过衰减阈值"| STALE_S
1198
1111
  STALE_S -->|"/modus:refresh"| DRAFT
1199
1112
  STALE_S -.->|"超过stale_after_days"| ARCHIVED
@@ -1353,454 +1266,47 @@ name: modus-biz-{domain}
1353
1266
 
1354
1267
  ---
1355
1268
  <!-- ============================================================ -->
1356
- <!-- 区块 C:Business Skill 标准格式参考(执行 Step 5 时按需读取)-->
1269
+ <!-- 区块 C:Business Skill 标准格式(v3.3 shared/universal-skill-format.md)-->
1357
1270
  <!-- ============================================================ -->
1358
1271
 
1359
- ## Business Skill 标准格式参考(v3.1 / 17节)
1272
+ ## Business Skill 标准格式 委派给 shared
1360
1273
 
1361
- ### 多语言适配说明
1274
+ > **v3.3 路由模式**:业务 Skill 的 17 节标准格式已抽到独立的"通用 17 节骨架"文件,强调**节号、节名、知识标签三者跨栈完全一致**——这是通用知识库的核心契约。
1362
1275
 
1363
- 本模板以 **Java + Spring Boot + MyBatis** 为默认实现(最常见的企业 Java 技术栈)。对于其他语言/框架的项目,按以下规则调整:
1276
+ ### C.1 必读文件
1364
1277
 
1365
- | 调整点 | Java(默认) | Go + Gin/gRPC | Python + FastAPI |
1366
- |--------|------------|--------------|-----------------|
1367
- | **Section 3 字段表** | Java 类型(`Long`、`String`) | Go 类型(`int64`、`string`) | Pydantic 模型字段(含 `Field(...)` 校验) |
1368
- | **Section 6 特有模式** | `AopContext.currentProxy()`、`@Transactional`、`BaseRpcResponse` | 中间件链(`middleware`)、`defer` 错误处理、gRPC status codes | `async/await` 模式、依赖注入(`Depends()`)、Pydantic 校验器 |
1369
- | **Section 7 代码示例** | Java 类风格 | Go 函数风格(接收者方法) | Python async 函数风格 |
1370
- | **Section 8 状态机** | 包含 `@Transactional` 注解 | 包含数据库事务块(`db.Begin()`/`tx.Commit()`) | 包含 SQLAlchemy 事务上下文 |
1371
- | **Section 12 SQL 模式** | MyBatis XML Mapper | GORM / sqlx 查询 | SQLAlchemy ORM / 原生 SQL |
1372
- | **key_files 文件类型** | `.java` | `.go` | `.py` |
1278
+ `templates/skills/modus-init/shared/universal-skill-format.md` 提供:
1373
1279
 
1374
- > **操作指引**:当 Step 2 检测到项目为 Go/Python 项目时,生成 Business Skill 前须先调整以上差异项,其余节格式保持不变。
1280
+ - **17 节总览表**:节号 / 节名 / 知识标签(跨所有栈一致)
1281
+ - **跨栈语义对齐表**:节内填充按栈分流(Java=Service+MyBatis 语义;前端=Hook+API 语义;Go=Handler 语义;Python=Pydantic 语义)
1282
+ - **17 节标准 Markdown 模板**:所有 strategy 在 Step 8 复用本模板
1283
+ - **节级最低内容门槛**:用于 `/modus:verify` 的自检规则
1375
1284
 
1376
- ---
1377
-
1378
- ```markdown
1379
- ---
1380
- name: biz-{domain}
1381
- description: "[MODUS:BIZ] {中文域名}业务知识 — {核心职责一句话}"
1382
- version: 1.0.0
1383
- updated: {YYYY-MM-DD}
1384
- status: draft # draft | verified | proven | stale | archived
1385
- format_version: v3 # v1=7节 | v2=14节 | v3=17节(当前默认,含不变量/词汇表/新人指南)
1386
- stale_after_days: 90 # 超过此天数自动降为 stale(默认 90 天)
1387
- last_referenced: {YYYY-MM-DD}
1388
- usage_count: 0
1389
- last_hash: "" # 全局 SHA-1(key_files 所有内容拼接后计算);init 时写入,引用时快速比对
1390
- file_hashes: {} # 文件级 hash map:{路径: SHA-1},与 key_files 一一对应;全局 hash 不一致时展开精准比对
1391
- last_verified_by: "" # 最后确认人(升为 verified 时填写)
1392
- domain_confidence: 0 # 域置信度评分(0-10),来自 Step 2 评分矩阵
1393
- invariant_count: 0 # Section 15 业务不变量条目数
1394
- glossary_size: 0 # Section 16 领域词汇表条目数
1395
- hidden_knowledge_rate: 0 # 隐性知识补全率(0-100),来自 Step 4 访谈问卷
1396
- contract_version: "1.0" # 本域对外暴露接口的当前版本;升级接口时同步更新,下游调用域在 Section 10 中记录此版本
1397
- upstream_skills: # 本 Skill 在 Section 10 中依赖的其他域 Skill
1398
- - biz-payment
1399
- - biz-user
1400
- downstream_skills: # 依赖本域的其他 Skill(被依赖方)
1401
- - biz-refund
1402
- key_files: # 关键源文件列表,用于 hash 检查(最多 20 个,覆盖全 10 类文件)
1403
- # 优先级 1:核心业务逻辑(必选)
1404
- - src/.../service/{Domain}Service.java
1405
- - src/.../manager/{Domain}Manager.java
1406
- - src/.../dao/{Domain}CustomMapper.java
1407
- - src/.../domain/{Domain}.java
1408
- # 优先级 2:状态与规则(强烈建议)
1409
- - src/.../enums/{Domain}Status.java
1410
- - src/.../enums/{Domain}Type.java
1411
- - src/.../exception/{Domain}Exception.java
1412
- # 优先级 3:消息与配置(有则加入)
1413
- - src/.../mq/{Domain}Consumer.java
1414
- - src/.../mq/{Domain}Producer.java
1415
- - src/.../config/{Domain}Config.java
1416
- ---
1285
+ ### C.2 多语言节内填充按栈分流
1417
1286
 
1418
- # {中文域名}业务知识
1287
+ strategy 文件(`strategies/{stack}-init.md`)提供本栈的"17 节填充指南",定义节内具体填什么(按栈而异),但**不允许新增/删除/重命名节标题**。
1419
1288
 
1420
- > Modus Skills Builder 自动生成。[MODUS:BIZ]
1289
+ | | Java 填充重点 | 前端填充重点 |
1290
+ |---|------------|-------------|
1291
+ | 2 核心实体 | Entity / Domain 类 + Java 类型 | TS interface / Zod schema + TS 类型 |
1292
+ | 5 API 契约 | 本域**对外暴露**的 REST/RPC | 本域**调用**的后端 endpoint |
1293
+ | 6 项目特有模式 | `@Transactional` + 同类调用陷阱 + 分布式锁 | Hook 命名 + 状态管理选型 + 错误边界 |
1294
+ | 12 关键数据访问模式 | XML Mapper SQL JOIN/索引 | API debounce/缓存/重试/取消/乐观更新 |
1295
+ | 13 开发陷阱 | 同类事务失效 + 枚举存 name() | Closure / 依赖数组 / SSR Hydration |
1421
1296
 
1422
- ---
1297
+ > 完整对照见 `shared/universal-skill-format.md` § 跨栈语义对齐表。
1423
1298
 
1424
- > **渐进加载模式(Agent 按任务类型选择,降低 token 消耗):**
1425
- >
1426
- > | 模式 | 读取范围 | 预估 token | 适用场景 |
1427
- > |------|---------|-----------|---------|
1428
- > | **极简模式** | Section 1、2、15 | ~500 tokens | 快速了解业务边界和不变量约束 |
1429
- > | **开发模式** | Section 1-8、10 | ~1500 tokens | 新增功能、接口开发 |
1430
- > | **审查模式** | Section 3、8、13、15 | ~1000 tokens | Code Review、架构评审 |
1431
- > | **排查模式** | Section 9、13 + Section 8 | ~600 tokens | 线上 Bug 排查、异常分析 |
1432
- > | **完整模式** | 全量(Section 1-17) | ~3500 tokens | 首次接触本域、生成设计文档 |
1433
- >
1434
- > **员工速读导航:**
1435
- > 初次接触本域 → 推荐阅读顺序:**Section 16(词汇表)→ Section 17.B(新人手册)→ Section 8(状态机)→ Section 3(业务规则)**
1436
- > 排查线上问题 → 重点读:**Section 9(错误码)→ Section 13(开发陷阱)→ Section 15(业务不变量)**
1437
- >
1438
- > **Skill 状态:** `[SKILL_STATUS]` | **最后更新:** `[UPDATED]` | **hash:** `[HASH_PREFIX]`
1439
- > 若 status 为 `stale`,禁止直接引用,先运行 `/modus:refresh {domain}`
1299
+ ### C.3 frontmatter 规范(防腐机制)
1440
1300
 
1441
- ---
1301
+ frontmatter 字段规范不在本区块——见 **`shared/frontmatter-spec.md`**(语言无关)和 Step 8 补充。
1442
1302
 
1443
- ## 1. 域概述
1303
+ ### C.4 Skill 文件末尾追加"更新摘要"(栈无关)
1444
1304
 
1445
- {业务域的职责边界和核心价值,2-3 句话,人类可读}
1305
+ 每次 SubAgent 生成或刷新 Skill 时,必须在文件末尾追加:
1446
1306
 
1447
- **边界说明:**
1448
- - 属于本域:{列举主要职责}
1449
- - 不属于本域:{明确排除的职责}
1450
-
1451
- ## 2. 核心实体 [model]
1452
-
1453
- | 实体名 | 中文名 | 说明 | 关键字段 |
1454
- |--------|--------|------|----------|
1455
- | Order | 订单 | ... | id, status, tenantId, amount |
1456
-
1457
- ### 重要枚举 [model]
1458
-
1459
- \`\`\`java
1460
- // OrderStatus — 订单状态
1461
- CREATED(1, "已创建"),
1462
- PAID(2, "已支付"),
1463
- COMPLETED(3, "已完成"),
1464
- CANCELLED(4, "已取消")
1465
- \`\`\`
1466
-
1467
- ## 3. 业务规则 [process] [guideline]
1468
-
1469
- **Section 3 子节划分规范(必须按此结构组织,禁止混写):**
1470
-
1471
- ### 核心字段说明
1472
-
1473
- Section 3 最低内容门槛:每个核心字段必含:Java 类型、是否非空、业务含义、关联枚举(如有)
1474
-
1475
- | 字段 | Java 类型 | 非空 | 业务含义 | 关联枚举 |
1476
- |------|----------|------|----------|----------|
1477
- | {fieldName} | {类型} | ✓/- | {业务含义} | {枚举类名,无则-} |
1478
-
1479
- ### 业务流程规则 [process]
1480
-
1481
- - [process] {流程规则:如 订单状态只能按 CREATED→PAID→COMPLETED 单向流转}
1482
-
1483
- ### 推荐做法 [guideline]
1484
-
1485
- - [guideline] {推荐做法:如 退款金额必须 ≤ 原始支付金额,在 Service 层校验}
1486
-
1487
- ### 架构决策 [decision]
1488
-
1489
- - [decision] {架构决策:如 选择 MQ 异步通知而非同步 RPC,原因是解耦和削峰}
1490
-
1491
- > **⚠️ 内容边界约束(含信号词分流指引):**
1492
- >
1493
- > 当不确定某条内容该写在哪个 Section 时,根据以下**信号词**判断归属:
1494
- >
1495
- > | 信号词模式 | 正确归属 | 典型例子 |
1496
- > |----------|---------|---------|
1497
- > | 「必须/禁止 + 违反=Bug/生产事故」 | Section 15 `[invariant]` | 「退款金额必须 ≤ 原始支付金额,否则为严重 Bug」 |
1498
- > | 「推荐/建议/最佳实践」 | Section 3 `[guideline]` | 「建议在 Service 层做二次校验,而非只依赖前端」 |
1499
- > | 「如果 A 发生则执行 B 流程」 | Section 3 `[process]` | 「支付超时后订单状态自动流转至 CANCELLED」 |
1500
- > | 「选择方案 A 而非 B,因为...」 | Section 3 `[decision]` | 「选用 MQ 异步通知而非同步 RPC,原因是解耦削峰」 |
1501
- > | 「曾经踩过/容易犯/易错点」 | Section 13 `[pitfall]` | 「曾因未加分布式锁导致重复订单,教训:必须加锁」 |
1502
- > | 「新人首次开发前需了解/开发时注意」 | Section 17 | 「新人必读:状态枚举只存 code 值而非 name()」 |
1503
- >
1504
- > - `[process]`/`[guideline]`/`[decision]` 写本节,`[pitfall]` 写 Section 13,`[invariant]` 写 Section 15
1505
- > - 禁止在 Section 3 中混入「不变量」内容(如「金额必须 > 0」——这是约束而非规则,属 Section 15)
1506
- > - 若某子节无内容,可省略该子节标题
1507
-
1508
- ## 4. 关键文件索引 [model]
1509
-
1510
- | 层次 | 类名 | 路径 | 说明 |
1511
- |------|------|------|------|
1512
- | Controller | OrderController | src/.../controller/OrderController.java | 订单 REST 接口 |
1513
- | Service | OrderService | src/.../service/OrderService.java | 订单核心逻辑 |
1514
- | Mapper | OrderMapper | src/.../dao/OrderMapper.java | 订单 DB 操作(注意:在 dao 包下)|
1515
- | Domain | Order | src/.../domain/Order.java | 订单领域对象 |
1516
-
1517
- ## 5. API 契约 [model]
1518
-
1519
- Section 5 最低内容门槛:每个接口必含:入参校验规则、成功返回结构、错误码列表、是否需要幂等、权限注解值
1520
-
1521
- | 方法 | 路径 | 说明 | 关键参数 | 权限注解 | 幂等 |
1522
- |------|------|------|----------|----------|------|
1523
- | POST | /api/v1/orders | 创建订单 | amount(必填,>0), productId(必填) | @UserAuthorization | 是(防重token) |
1524
- | GET | /api/v1/orders/{id} | 查询订单 | id(必填) | @UserAuthorization | - |
1525
-
1526
- ## 6. 项目特有模式 [decision] [guideline]
1527
-
1528
- - [guideline] 事务使用 `AopContext.currentProxy()` 解决同类调用问题(avoid: @Transactional 直接同类调用)
1529
- - [guideline] 分布式锁使用 `@DistributedLock` 注解,key 格式为 `{domain}:{id}`
1530
- - [guideline] 响应统一用 `BaseRpcResponse.build(data)` 包装
1531
-
1532
- ## 7. 典型代码示例
1533
-
1534
- **Section 7 最低内容门槛:**
1535
- - 示例代码必须来自实际扫描的源码(不能是纯伪代码框架)
1536
- - 每段示例必须附带关键步骤的内联说明注释
1537
- - 至少包含 1 个「写入/变更」场景 + 1 个「查询/权限」场景(若存在)
1538
- - 示例中必须体现 Section 6 中列出的项目特有模式(如 AopContext、BaseRpcResponse 等)
1539
-
1540
- \`\`\`java
1541
- // 订单创建的标准模式(来自 OrderService.createOrder())
1542
- public OrderDTO createOrder(CreateOrderRequest request) {
1543
- // 1. 参数校验(Service 层,非 Controller 层)
1544
- validateCreateRequest(request);
1545
- // 2. 业务校验(余额、库存、限购等)
1546
- checkBusinessRules(request);
1547
- // 3. 创建 Domain 对象(领域逻辑封装在 Domain 中,不直接操作 Entity)
1548
- Order order = Order.create(request);
1549
- // 4. 持久化(通过 Mapper,注意:Mapper 必须在 dao 包下)
1550
- orderMapper.insert(order);
1551
- // 5. 发送 MQ 通知(异步,不影响主流程事务)
1552
- orderEventPublisher.publish(new OrderCreatedEvent(order));
1553
- // 6. 返回 DTO(使用 BaseRpcResponse 包装)
1554
- return BaseRpcResponse.build(OrderConverter.toDTO(order));
1555
- }
1556
- \`\`\`
1557
-
1558
- ## 8. 状态机 [process]
1559
-
1560
- **前置检测条件:** 域中存在含 `status`/`state` 字段的 Entity 才生成本节;否则整节省略,禁止填占位符。
1561
-
1562
- Section 8 最低内容门槛:每条转换必含:起始状态、目标状态、触发条件、触发方法名、是否有事务保护
1563
-
1564
- \`\`\`mermaid
1565
- stateDiagram-v2
1566
- [*] --> CREATED : createOrder() @Transactional
1567
- CREATED --> PAID : payOrder() 支付成功回调 @Transactional
1568
- PAID --> COMPLETED : completeOrder() 确认收货 @Transactional
1569
- PAID --> REFUNDING : applyRefund() 申请退款
1570
- REFUNDING --> REFUNDED : processRefund() @Transactional
1571
- CREATED --> CANCELLED : cancelOrder() 超时/主动取消 @Transactional
1572
- PAID --> CANCELLED : cancelOrder() 支付后取消(触发退款)
1573
- CREATED --> CREATE_FAILED : [异常流] 创建失败 (虚线)
1574
- PAID --> PAY_FAILED : [异常流] 支付失败回调 (虚线)
1575
- \`\`\`
1576
-
1577
- > **图例说明:** 实线 = 正常流转;虚线 = 异常流/超时流(在实际 Mermaid 中用 `-->` 配合状态名区分,说明见下方子节)
1578
-
1579
- ### 正常流转表
1580
-
1581
- | 起始状态 | 目标状态 | 触发条件 | 触发方法 | 事务保护 |
1582
- |---------|---------|---------|---------|---------|
1583
- | CREATED | PAID | 支付成功回调 | payOrder() | ✓ @Transactional |
1584
- | PAID | COMPLETED | 用户确认收货 | completeOrder() | ✓ @Transactional |
1585
-
1586
- ### 异常流(失败态处理)
1587
-
1588
- **前置检测条件:** 域中存在 `FAILED`/`ERROR`/`EXCEPTION` 类后缀状态,或 try-catch 中有状态变更操作,才生成本子节;否则省略。
1589
-
1590
- | 起始状态 | 失败目标状态 | 触发条件 | 触发方法 | 失败后处理 |
1591
- |---------|-----------|---------|---------|----------|
1592
- | CREATING | CREATE_FAILED | 数据库写入异常/库存不足 | createOrder() catch 块 | 记录失败原因,前端展示错误信息 |
1593
- | PAYING | PAY_FAILED | 支付网关超时/余额不足 | payOrder() catch 块 | 订单回退可支付状态,允许重新支付 |
1594
-
1595
- > 若无失败态枚举值,写「暂无发现,随工作流积累」。
1596
-
1597
- ### 超时自动流转
1598
-
1599
- **前置检测条件:** 域中存在定时任务(`@XxlJob`/`@Scheduled`/`XXXTimeoutJob`),或有 TTL 相关业务逻辑,才生成本子节;否则省略。
1600
-
1601
- | 当前状态 | 超时时长 | 流转目标 | 触发方式 | 补偿操作 |
1602
- |---------|---------|---------|---------|---------|
1603
- | CREATED | 30 分钟未支付 | CANCELLED | OrderTimeoutJob @XxlJob | 释放库存,发送取消通知 |
1604
- | REFUNDING | 24 小时未处理 | 需人工介入 | RefundTimeoutJob @XxlJob | 创建人工工单,发送告警 |
1605
-
1606
- > 若无超时自动流转,写「暂无发现,随工作流积累」。
1607
-
1608
- ### 补偿机制(MQ 失败重试与死信)
1609
-
1610
- **前置检测条件:** 域中存在 MQ 消费者(`@KafkaListener`/`@RocketMQMessageListener`),才生成本子节;否则省略。
1611
-
1612
- | 消息类型 | 正常消费 | 失败处理 | 重试策略 | 超限处理 |
1613
- |---------|---------|---------|---------|---------|
1614
- | payment.success | 订单状态流转至 PAID | 记录失败日志,状态不变 | 重试 3 次,间隔 1/2/5 分钟 | 进入死信队列,人工处理 |
1615
- | order.timeout | 订单状态流转至 CANCELLED | 幂等检查通过则忽略 | 重试 1 次 | 记录告警日志 |
1616
-
1617
- > 若无 MQ 消费,写「暂无发现,随工作流积累」。
1618
-
1619
- ## 9. 错误码与异常 [pitfall]
1620
-
1621
- (无条件生成。若为空则写「暂无发现,随工作流积累」,此为合法初始内容,质量自检通过。)
1622
-
1623
- | 错误码 | 异常类 | 触发场景 | HTTP状态 | 处理建议 |
1624
- |--------|--------|---------|---------|---------|
1625
- | ORDER_NOT_FOUND | OrderNotFoundException | 查询/操作不存在的订单 | 404 | 前端展示「订单不存在」 |
1626
- | ORDER_STATUS_INVALID | OrderStatusException | 状态流转不合法 | 400 | 检查当前订单状态后重试 |
1627
-
1628
- ## 10. 跨域依赖 [decision]
1629
-
1630
- (无条件生成。若为空则写「暂无发现,随工作流积累」,此为合法初始内容。由主流程 Section 10 回写阶段统一填入。)
1631
-
1632
- **上游依赖(本域调用的其他域):**
1633
- | 依赖域 | 交互方式 | 调用点 | 接口版本 | 降级预案 | 说明 |
1634
- |--------|---------|-------|---------|---------|------|
1635
- | payment | RPC @DubboReference | OrderService.createOrder() | v2.1 | 超时 3s 后返回支付处理中,异步重试 | 发起支付 |
1636
- | user | RPC @DubboReference | OrderService.checkUser() | v1.0 | 超时降级:跳过用户状态校验,记录告警 | 校验用户状态 |
1637
-
1638
- **下游被依赖(调用本域的其他域):**
1639
- | 调用域 | 交互方式 | 接口版本(本域提供)| 场景 |
1640
- |--------|---------|-----------------|------|
1641
- | refund | RPC | v1.2 | 退款申请时查询原订单信息 |
1642
-
1643
- > **契约版本维护规则:**
1644
- > - 本域对外暴露接口的当前版本记录在 frontmatter 的 `contract_version` 字段
1645
- > - 调用方在本节上游依赖表中记录**调用时使用的版本号**
1646
- > - 接口升级时:① 更新 `contract_version` ② 通知下游调用域更新其 Section 10 记录 ③ 触发 hash 更新
1647
-
1648
- ## 11. 数据流向 [process]
1649
-
1650
- **前置检测条件:** 域中存在以下任意一项即生成本节;否则整节省略:
1651
- - MQ 消息:`@KafkaListener` / `@RocketMQMessageListener` / `kafkaTemplate.send()` / `rocketMQTemplate.send()`
1652
- - Spring 事件:`ApplicationEventPublisher.publishEvent()` / `@EventListener` / `implements *EventListener` 接口
1653
- - 其他异步数据流:`@Async` + 跨域调用、`CompletableFuture` 跨域通信
1654
-
1655
- | 方向 | Topic/方法 | 触发时机 | 消费者/生产者 | 幂等保障 |
1656
- |------|-----------|---------|------------|---------|
1657
- | 发布 | order.created | 订单创建成功 | OrderService → NotifyConsumer | 业务唯一键去重 |
1658
- | 订阅 | payment.success | 支付成功回调 | PaymentConsumer → OrderService | DB 唯一索引防重 |
1659
-
1660
- ## 12. 关键 SQL 模式 [guideline]
1661
-
1662
- **前置检测条件:** 域中存在 XML Mapper 文件或含复杂 SQL 的注解(超过 2 表 JOIN 或有子查询)才生成本节;否则整节省略。
1663
-
1664
- Section 12 最低内容门槛:每条复杂 SQL 必含:查询语义说明、JOIN 表关系、索引命中路径、预期返回数据量级、是否存在慢查询风险
1665
-
1666
- | SQL 标识 | 查询语义 | JOIN 表 | 索引命中 | 数据量级 | 慢查询风险 |
1667
- |---------|---------|--------|---------|---------|---------|
1668
- | selectOrderWithItems | 查询订单及明细 | order + order_item | idx_order_id | ~20行 | 低(有索引) |
1669
- | selectByStatusAndDate | 按状态+日期查订单 | order | idx_status_date | 可能万级 | ⚠️ 注意分页 |
1670
-
1671
- ## 13. 常见开发陷阱 [pitfall]
1672
-
1673
- (无条件生成。若为空则写「暂无发现,随工作流积累」,此为合法初始内容。)
1674
-
1675
- - [pitfall] 并发创建订单时若不加 `@DistributedLock(key="order:create:{userId}")` 会出现重复订单
1676
- - [pitfall] `OrderStatus` 枚举在数据库存 code 值(int),禁止直接存 name(),避免改名导致数据不一致
1677
- - [pitfall] 跨 Service 调用 `@Transactional` 方法时必须通过 `AopContext.currentProxy()` 代理调用
1678
-
1679
- ## 14. 扩展点 [decision]
1680
-
1681
- **前置检测条件:** 域中存在以下任意一项即生成本节;否则整节省略:
1682
- - 标准扩展点:`interface + ≥2 个实现类`(策略模式、模板方法模式)
1683
- - 配置条件化:`@ConditionalOn*` 注解(Spring Boot 条件化装配)
1684
- - 项目级接口:`项目定义的 *EventListener` / `*Handler` / `*Strategy` / `*Processor` 接口 + ≥1 个实现类
1685
- - 插件化机制:`@Plugin` / `@Extension` / SPI `ServiceLoader` 加载点
1686
-
1687
- | 扩展点 | 接口/注解 | 当前实现 | 扩展方式 |
1688
- |--------|---------|---------|---------|
1689
- | 支付渠道策略 | PayChannelStrategy | AlipayStrategy, WechatStrategy | Map<String, PayChannelStrategy> 注入 |
1690
- | 订单事件监听 | @ConditionalOnProperty("order.notify") | DefaultNotifyHandler | 实现 OrderEventHandler 接口 |
1691
-
1692
- ## 15. 业务不变量 [invariant]
1693
-
1694
- (无条件生成。记录系统必须始终为真的业务约束,违反即为 Bug。来源:if/else 推断 + 校验器分析 + 人工访谈。)
1695
-
1696
- | 不变量描述 | 验证位置 | 违反后果 | 来源 |
1697
- |---------|---------|---------|------|
1698
- | 订单金额必须 > 0 | OrderService:validateAmount() | 抛 InvalidAmountException | 代码推断 |
1699
- | 同一用户同一商品当日限购 5 件 | OrderManager:checkDailyLimit() | 抛 PurchaseLimitException | 代码推断 |
1700
- | 退款金额 ≤ 原始支付金额 | RefundService:84 | 抛 InvalidRefundException | [人工补充: {YYYY-MM-DD}] |
1701
-
1702
- > 若无任何不变量,写「暂无发现,随工作流积累」(此为合法初始内容)。
1703
-
1704
- ## 16. 领域词汇表 [model]
1705
-
1706
- (无条件生成。帮助新人理解本域专属术语,消除歧义。来源:类名/枚举值语义分析 + 代码注释 + 人工访谈。)
1707
-
1708
- | 术语 | 定义 | 与通用概念的区别 |
1709
- |------|------|----------------|
1710
- | 订单 | 用户完成商品选购后生成的业务凭证,包含商品明细+支付信息 | 区别于「购物车」(临时)和「合同」(签约后) |
1711
- | 结算 | 将已完成订单的金额从冻结余额转为可提现余额的操作 | 区别于「支付」(资金从用户到平台) |
1712
- | 防重Token | 客户端生成的唯一标识符,服务端用于幂等检查,有效期5分钟 | 项目特有机制,非标准 JWT |
1713
-
1714
- > 若无特殊术语,写「暂无特定领域术语,使用通用定义」(此为合法初始内容)。
1715
-
1716
- ## 17. 新人上手指南 [process]
1717
-
1718
- (无条件生成。本节分为两个独立子节,分别服务不同受众:Agent 快速定位 + 员工新人入门。)
1719
-
1720
- ---
1721
-
1722
- ### 17.A — Agent 快速定位指南(机器优先)
1723
-
1724
- > 适用受众:AI Agent 执行任务时,根据任务类型找到最小必读路径。
1725
-
1726
- #### 按任务类型的最小读取路径
1727
-
1728
- | 任务类型 | 必读 Section | 关键文件 | 核心约束提示 |
1729
- |---------|------------|---------|------------|
1730
- | **新增 API 接口** | 5(API契约)→ 3(业务规则)→ 15(不变量) | `{Domain}Controller.java` / `{Domain}Facade.java` | 确认权限注解、幂等需求(见 Section 5)|
1731
- | **修改业务规则** | 3(业务规则)→ 8(状态机)→ 15(不变量) | `{Domain}Service.java` / `{Domain}Manager.java` | 修改后同步维护 Section 15 不变量 |
1732
- | **新增/修改状态流转** | 8(状态机)→ 3(流程规则)→ 9(错误码) | `{Domain}Status.java` / `{Domain}Service.java` | 同步更新 Section 8 状态图和转换表 |
1733
- | **Code Review** | 15(不变量)→ 13(陷阱)→ 8(状态机)→ 3(规则) | — | 重点检查不变量是否有校验代码 |
1734
- | **排查线上 Bug** | 9(错误码)→ 13(陷阱)→ 8(状态机) | — | 优先查错误码,再对照状态机异常流 |
1735
- | **新增 MQ 消息** | 11(数据流向)→ 3(规则)→ 15(不变量) | `{Domain}Consumer.java` / `{Domain}Producer.java` | 确认幂等保障机制(见 Section 11)|
1736
- | **修改数据库查询** | 12(SQL模式)→ 4(文件索引)→ 2(核心实体) | `{Domain}Mapper.java` / XML Mapper | 注意慢查询风险(见 Section 12)|
1737
-
1738
- ---
1739
-
1740
- ### 17.B — 员工新人入门手册(人类优先)
1741
-
1742
- > 适用受众:初次接触本域的研发同学,目标是读完本节即可开始独立开发,无需找业务方反复答疑。
1743
-
1744
- #### 开发前必读清单
1745
-
1746
- > 建议逐项确认后再开始开发:
1747
-
1748
- 1. 理解 `{Domain}Status` 枚举的 {N} 个状态及合法转换(见 Section 8 状态机)
1749
- 2. 了解 Section 15 的 {M} 条业务不变量,违反将导致生产事故
1750
- 3. 熟悉 Section 6 的项目特有编码模式(如 `AopContext.currentProxy()`、`BaseRpcResponse.build()`)
1751
- 4. 阅读「高频踩坑」中摘录的前 3 条 Section 13 陷阱
1752
-
1753
- #### 本域关键设计决策历史
1754
-
1755
- (自动从 Section 3 `[decision]` 条目中提取,补充设计背景;无内容时写「暂无记录,随工作流积累」)
1756
-
1757
- > **为什么这样设计?**(帮助新人理解现有架构,而不是仅知道怎么做)
1758
-
1759
- | 设计决策 | 选择方案 | 未选方案 | 设计理由 |
1760
- |---------|---------|---------|---------|
1761
- | {决策描述,如「通知方式」} | {选用方案,如「MQ 异步」} | {弃用方案,如「同步 RPC」} | {简要理由,如「解耦 + 削峰,支付服务故障不影响订单主流程」} |
1762
-
1763
- #### 本地环境搭建 Checklist
1764
-
1765
- (基于 Section 11 数据流向和 Section 10 跨域依赖自动生成;无相关配置时写「无特殊本地配置要求」)
1766
-
1767
- > **说明:** 以下为纯文字编号清单,本地启动前逐项确认:
1768
-
1769
- 1. **MQ Topic 配置**:确认 `application-local.yml` 中 Topic 名称与联调环境一致
1770
- - 本域订阅 Topic:{来自 Section 11 的订阅 Topic 列表,无则写「-」}
1771
- - 本域发布 Topic:{来自 Section 11 的发布 Topic 列表,无则写「-」}
1772
- 2. **RPC 依赖服务**:确认以下服务在本地可访问(或已 Mock)
1773
- - {来自 Section 10 的上游依赖域列表,无则写「-」}
1774
- 3. **数据库**:确认本地 DB 已执行最新 migration,重点关注以下表
1775
- - {来自 Section 2 核心实体对应的主表,无则写「-」}
1776
- 4. **配置开关**:确认以下特性开关状态
1777
- - {来自 Section 14 扩展点的条件化配置,无则写「-」}
1778
-
1779
- #### 首次开发任务推荐
1780
-
1781
- (推荐从最简单的查询接口入手,逐步熟悉域内结构)
1782
-
1783
- 推荐路径:**查询接口** → **写入接口** → **状态流转** → **跨域集成**
1784
-
1785
- #### 常见问题 FAQ
1786
-
1787
- (来自 Step 4 访谈问卷的回答摘要;无内容时写「暂无记录,随工作流积累」)
1788
-
1789
- | 问题 | 答案 | 来源 |
1790
- |------|------|------|
1791
- | {高频问题,如「为什么枚举存 code 不存 name?」} | {答案} | {代码推断 / [人工补充: {日期}]} |
1792
-
1793
- #### 高频踩坑(精选自 Section 13 前 3 条)
1794
-
1795
- (自动提取 Section 13 前 3 条 `[pitfall]`,无内容时写「暂无记录,随工作流积累」)
1796
-
1797
- 1. ...
1798
- 2. ...
1799
- 3. ...
1800
-
1801
- ---
1307
+ ```markdown
1802
1308
  <!-- 更新摘要(由 Skills Builder 自动追加)
1803
- [{YYYY-MM-DD}] 模式A生成:17节完整格式(v3),扫描 {M} 个文件,不变量{I}条,词汇{G}个,隐性知识率{H}%
1309
+ [{YYYY-MM-DD}] {stack} strategy 生成:17节完整格式(v3-{stack}),扫描 {M} 个文件,不变量{I}条,词汇{G}个,隐性知识率{H}%
1804
1310
  -->
1805
1311
  ```
1806
1312