@modus-ai/modus 0.2.4 → 0.2.5
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/README.md +45 -4
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +9 -8
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/global.js +1 -1
- package/dist/commands/global.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +0 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/generators/claude.d.ts.map +1 -1
- package/dist/generators/claude.js +0 -36
- package/dist/generators/claude.js.map +1 -1
- package/dist/generators/copilot.d.ts.map +1 -1
- package/dist/generators/copilot.js +0 -1
- package/dist/generators/copilot.js.map +1 -1
- package/dist/utils/config.d.ts +32 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +10 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +2 -1
- package/dist/utils/file-system.js.map +1 -1
- package/package.json +1 -1
- package/schemas/knowledge-schema.yaml +111 -1
- package/templates/behavior-guard.md +165 -0
- package/templates/commands/auto.md +3 -1
- package/templates/commands/commit.md +63 -0
- package/templates/commands/harness.md +15 -8
- package/templates/commands/vibe.md +1 -1
- package/templates/knowledge-catalog.md +61 -32
- package/templates/skills/modus-agents/analyst/SKILL.md +16 -0
- package/templates/skills/modus-agents/deployer/SKILL.md +114 -62
- package/templates/skills/modus-agents/designer/SKILL.md +104 -92
- package/templates/skills/modus-agents/developer/SKILL.md +106 -67
- package/templates/skills/modus-agents/perf-auditor/SKILL.md +98 -61
- package/templates/skills/modus-agents/reviewer/SKILL.md +25 -2
- package/templates/skills/modus-agents/security-auditor/SKILL.md +111 -67
- package/templates/skills/modus-agents/skill-creator/SKILL.md +30 -12
- package/templates/skills/modus-agents/tester/SKILL.md +100 -54
- package/templates/skills/modus-auto/SKILL.md +16 -1
- package/templates/skills/modus-design-brief/SKILL.md +31 -13
- package/templates/skills/modus-harness/SKILL.md +78 -12
- package/templates/skills/modus-init/SKILL.md +783 -172
- package/templates/skills/modus-plan/SKILL.md +109 -43
- package/templates/skills/modus-spec/SKILL.md +175 -331
- package/templates/skills/modus-vibe/SKILL.md +147 -44
package/dist/utils/config.js
CHANGED
|
@@ -5,7 +5,7 @@ import { fileExists, readFile, writeFile } from './file-system.js';
|
|
|
5
5
|
const DEFAULT_CONFIG = {
|
|
6
6
|
version: '1',
|
|
7
7
|
commands: {
|
|
8
|
-
enabled: ['init', 'vibe', 'plan', 'spec', 'harness'],
|
|
8
|
+
enabled: ['init', 'vibe', 'plan', 'spec', 'auto', 'harness'],
|
|
9
9
|
},
|
|
10
10
|
};
|
|
11
11
|
export function getConfigPath(projectRoot) {
|
|
@@ -30,7 +30,15 @@ export function loadConfig(projectRoot) {
|
|
|
30
30
|
if (!fileExists(configPath))
|
|
31
31
|
return { ...DEFAULT_CONFIG };
|
|
32
32
|
const raw = readFile(configPath);
|
|
33
|
-
|
|
33
|
+
const parsed = yaml.load(raw);
|
|
34
|
+
// Defensive: ensure required nested fields exist to prevent runtime crashes
|
|
35
|
+
if (!parsed.commands) {
|
|
36
|
+
parsed.commands = { ...DEFAULT_CONFIG.commands };
|
|
37
|
+
}
|
|
38
|
+
else if (!Array.isArray(parsed.commands.enabled)) {
|
|
39
|
+
parsed.commands.enabled = [...DEFAULT_CONFIG.commands.enabled];
|
|
40
|
+
}
|
|
41
|
+
return parsed;
|
|
34
42
|
}
|
|
35
43
|
export function saveConfig(projectRoot, config) {
|
|
36
44
|
const configPath = getConfigPath(projectRoot);
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAgFnE,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE;QACR,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;KAC7D;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,CAAC;IAC7C,4EAA4E;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAmB;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKlD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAMjE;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAG9D;AAED,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAG5D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
3
4
|
export function ensureDir(dirPath) {
|
|
4
5
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
5
6
|
}
|
|
@@ -35,7 +36,7 @@ export function findBizSkillDirs(projectRoot) {
|
|
|
35
36
|
}
|
|
36
37
|
/** Read a template file bundled with the package */
|
|
37
38
|
export function readTemplate(templateRelPath) {
|
|
38
|
-
const templateBase = new URL('../../templates/', import.meta.url)
|
|
39
|
+
const templateBase = fileURLToPath(new URL('../../templates/', import.meta.url));
|
|
39
40
|
return readFile(path.join(templateBase, templateRelPath));
|
|
40
41
|
}
|
|
41
42
|
//# sourceMappingURL=file-system.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IACzD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACpD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,GAAY;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACjE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,YAAY,CAAC,eAAuB;IAClD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
package/package.json
CHANGED
|
@@ -4,6 +4,49 @@
|
|
|
4
4
|
name: knowledge
|
|
5
5
|
description: 知识体系 schema — 知识目录索引、Skill frontmatter、知识条目类型
|
|
6
6
|
|
|
7
|
+
# ─────────────────────────────────────────
|
|
8
|
+
# config.yaml scanRules 结构
|
|
9
|
+
# ─────────────────────────────────────────
|
|
10
|
+
scan_rules:
|
|
11
|
+
description: |
|
|
12
|
+
/modus:init Step 2 执行代码扫描时的规则配置,遵循公式:
|
|
13
|
+
最终扫描文件 = (include_extensions 匹配的文件) - (exclude_patterns 排除的路径)
|
|
14
|
+
各规则来源叠加计算(类似 .gitignore 的分层覆盖机制)。
|
|
15
|
+
location: "modus/config.yaml → scanRules 字段"
|
|
16
|
+
fields:
|
|
17
|
+
- name: include_extensions
|
|
18
|
+
type: list[string]
|
|
19
|
+
description: 要扫描的文件后缀名列表。默认值覆盖主流后端/前端语言。
|
|
20
|
+
default: [".java", ".kt", ".py", ".ts", ".tsx", ".js", ".go", ".rs", ".php", ".rb", ".swift", ".scala"]
|
|
21
|
+
|
|
22
|
+
- name: exclude_patterns
|
|
23
|
+
type: list[string]
|
|
24
|
+
description: |
|
|
25
|
+
glob 格式的排除模式,支持 ** 通配符。
|
|
26
|
+
默认已排除:构建产物(target/、build/、dist/)、IDE 配置(.idea/、.vscode/)、
|
|
27
|
+
依赖目录(node_modules/)、生成代码(generated/、*Generated.java)。
|
|
28
|
+
用户可在 config.yaml 中追加项目特有的排除模式。
|
|
29
|
+
default:
|
|
30
|
+
- "target/**"
|
|
31
|
+
- "build/**"
|
|
32
|
+
- "dist/**"
|
|
33
|
+
- "node_modules/**"
|
|
34
|
+
- ".idea/**"
|
|
35
|
+
- ".vscode/**"
|
|
36
|
+
- "generated/**"
|
|
37
|
+
- "**/*Generated.java"
|
|
38
|
+
- "*.lock"
|
|
39
|
+
|
|
40
|
+
- name: include_paths
|
|
41
|
+
type: list[string]
|
|
42
|
+
required: false
|
|
43
|
+
description: 额外需要扫描的目录,默认扫描项目 src/ 下全部内容。用于将 plugins/、extensions/ 等非标准目录纳入扫描。
|
|
44
|
+
|
|
45
|
+
- name: exclude_domain_patterns
|
|
46
|
+
type: list[string]
|
|
47
|
+
required: false
|
|
48
|
+
description: 强制排除的包名 glob 模式(如 "com.example.legacy.**"),用于将不希望被 modus 管理的历史代码排除在域识别之外。
|
|
49
|
+
|
|
7
50
|
# ─────────────────────────────────────────
|
|
8
51
|
# knowledge-catalog.md 结构
|
|
9
52
|
# ─────────────────────────────────────────
|
|
@@ -94,6 +137,38 @@ skill_frontmatter:
|
|
|
94
137
|
description: 知识层级(仅 team-conventions 和 tech-wiki 需要填写)
|
|
95
138
|
values: ["0-T", "1"]
|
|
96
139
|
|
|
140
|
+
- name: upstream_skills
|
|
141
|
+
type: list
|
|
142
|
+
required: false
|
|
143
|
+
description: |
|
|
144
|
+
本 Skill 依赖的上游 Skill 列表(仅填写直接依赖,不递归填写传递依赖)。
|
|
145
|
+
当上游 Skill 的 last_hash 发生变化或 maturity 降级时,本 Skill 的 stale_cascade 自动置为 true。
|
|
146
|
+
格式:["modus-biz-order", "modus-biz-user"]
|
|
147
|
+
default: []
|
|
148
|
+
|
|
149
|
+
- name: stale_cascade
|
|
150
|
+
type: boolean
|
|
151
|
+
required: false
|
|
152
|
+
description: |
|
|
153
|
+
联动失效标记。当任一 upstream_skills 中的 Skill 发生 hash 变更或 maturity 降级时,
|
|
154
|
+
由 vibe/plan 的防腐机制自动将此字段置为 true。
|
|
155
|
+
置为 true 后,引用本 Skill 前须先执行 /modus:refresh 验证依赖链是否仍然有效,
|
|
156
|
+
确认无误后由 skill-creator 模式 B 将此字段重置为 false。
|
|
157
|
+
default: false
|
|
158
|
+
|
|
159
|
+
- name: external_deps
|
|
160
|
+
type: map
|
|
161
|
+
required: false
|
|
162
|
+
description: |
|
|
163
|
+
本 Skill 的规范依赖外部库的版本范围。当 pom.xml / package.json 中对应库发生
|
|
164
|
+
跨大版本升级(major version 变化)时,自动触发 stale 降级。
|
|
165
|
+
格式:key 为库名,value 为 semver 范围(如 "~2.7"、">=3.0 <4.0")
|
|
166
|
+
example:
|
|
167
|
+
spring-boot: "~2.7"
|
|
168
|
+
mybatis-plus: ">=3.5"
|
|
169
|
+
dubbo: "~3.1"
|
|
170
|
+
default: {}
|
|
171
|
+
|
|
97
172
|
# ─────────────────────────────────────────
|
|
98
173
|
# 知识条目类型(五类 MECE)
|
|
99
174
|
# ─────────────────────────────────────────
|
|
@@ -147,10 +222,45 @@ maturity_lifecycle:
|
|
|
147
222
|
verified_decay:
|
|
148
223
|
condition: "verified 且距 last_referenced 超过 6 个月"
|
|
149
224
|
action: "降为 draft,追加注释 ⚠️ 6个月未引用,可能已过时"
|
|
225
|
+
upstream_cascade_decay:
|
|
226
|
+
condition: "upstream_skills 中任一 Skill 的 last_hash 发生变化,或其 maturity 降级"
|
|
227
|
+
action: "将本 Skill 的 stale_cascade 置为 true,在 knowledge-catalog 中标注 ⚠️ 上游变更待验证"
|
|
228
|
+
external_dep_decay:
|
|
229
|
+
condition: "pom.xml 或 package.json 中,external_deps 里某库的 major version 发生变化"
|
|
230
|
+
action: "将本 Skill maturity 降为 stale,追加注释 ⚠️ 外部依赖 {lib} 升级({old} → {new}),规范需验证"
|
|
150
231
|
|
|
151
232
|
decay_check_trigger:
|
|
152
|
-
- "
|
|
233
|
+
- "modus-skill-creator(SubAgent 00)模式 D 执行时"
|
|
153
234
|
- "可手动触发:/modus:init --lint"
|
|
235
|
+
- "vibe/plan Step 3 防腐检查时(仅检查 stale_cascade,不全量扫描)"
|
|
236
|
+
- "modus-init 执行后自动扫描 pom.xml/package.json 版本变化触发 external_dep_decay"
|
|
237
|
+
|
|
238
|
+
# ─────────────────────────────────────────
|
|
239
|
+
# external_deps 自动提取规范
|
|
240
|
+
# ─────────────────────────────────────────
|
|
241
|
+
external_deps_extraction:
|
|
242
|
+
description: |
|
|
243
|
+
/modus:init 生成 Skill 时,自动从构建文件中提取该域依赖的外部库版本,
|
|
244
|
+
写入 Skill frontmatter 的 external_deps 字段。
|
|
245
|
+
source_files:
|
|
246
|
+
java: "pom.xml(根目录 + 各 module 级别)"
|
|
247
|
+
node: "package.json(各包目录)"
|
|
248
|
+
python: "pyproject.toml / requirements.txt"
|
|
249
|
+
extraction_logic: |
|
|
250
|
+
1. 扫描该域 key_files 中的 import/require 语句
|
|
251
|
+
2. 提取引用了 pom.xml/package.json 中声明的第三方库(排除标准库)
|
|
252
|
+
3. 按引用频次排序,取前 5 个高频库
|
|
253
|
+
4. 从构建文件中读取对应库的当前版本,转为 semver 范围(固定 major.minor,不锁 patch)
|
|
254
|
+
5. 写入 frontmatter: external_deps: {lib: version-range}
|
|
255
|
+
version_range_format:
|
|
256
|
+
example_input: "spring-boot-starter 2.7.14"
|
|
257
|
+
example_output: "spring-boot: \"~2.7\""
|
|
258
|
+
rule: "major.minor 相同则用 ~minor,跨 minor 用 >=min <max"
|
|
259
|
+
decay_detection: |
|
|
260
|
+
modus update / /modus:init --lint 执行时:
|
|
261
|
+
1. 重新读取 pom.xml/package.json 中 external_deps 列出的库的当前版本
|
|
262
|
+
2. 比对 major version:若发生变化(如 2.x → 3.x),触发 external_dep_decay
|
|
263
|
+
3. 将受影响的 Skill 降级为 stale,在 knowledge-catalog 中标注 ⚠️
|
|
154
264
|
|
|
155
265
|
# ─────────────────────────────────────────
|
|
156
266
|
# HANDOFF 块格式(Harness 产物交接协议)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Modus Behavior Guard
|
|
2
|
+
|
|
3
|
+
> 安装位置:`modus/behavior-guard.md`(由 `/modus:init` 创建)
|
|
4
|
+
> 加载时机:所有 Modus 命令 Step 0 读取,与 `modus/config.yaml` 同级
|
|
5
|
+
> 来源:直接借鉴 [Andrej Karpathy's LLM coding guidelines](https://x.com/karpathy/status/2015883857489522876),适配 Modus/Java 上下文
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
这是对所有 Modus SubAgent 生效的**全局行为约束**。优先级低于 `constitution.hard_rules`(项目技术规则),高于任何 Skill 中的建议。
|
|
10
|
+
|
|
11
|
+
**权衡声明:** 这些原则偏向谨慎而非速度。对于显然的单步操作,使用判断力。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Think Before Coding
|
|
16
|
+
|
|
17
|
+
**不假设。不隐藏困惑。暴露权衡。**
|
|
18
|
+
|
|
19
|
+
开始实现前:
|
|
20
|
+
- 明确说出你的假设。如果不确定,问。
|
|
21
|
+
- 如果存在多种解读,呈现它们,不要静默选择。
|
|
22
|
+
- 如果有更简单的方案,说出来。该推回时推回。
|
|
23
|
+
- 如果有不清楚的地方,停下来。说明困惑是什么。问。
|
|
24
|
+
|
|
25
|
+
**modus 场景示例:**
|
|
26
|
+
|
|
27
|
+
❌ 错误:直接按猜测的域开始生成代码
|
|
28
|
+
✅ 正确:`[已匹配 order 域 · 置信度 92%]` → 继续;或展示候选列表等待确认
|
|
29
|
+
|
|
30
|
+
❌ 错误:用户说「做个导出功能」,直接生成完整导出模块
|
|
31
|
+
✅ 正确:
|
|
32
|
+
```
|
|
33
|
+
「导出功能」可能意味着:
|
|
34
|
+
A. 接口返回分页 JSON(最简,当前 Skill 中无导出相关记录)
|
|
35
|
+
B. 后台任务生成文件+邮件通知(需新 MQ Topic)
|
|
36
|
+
C. 前端直接下载 CSV(需 Facade 层新接口)
|
|
37
|
+
哪种更符合你的期望?
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 2. Simplicity First
|
|
43
|
+
|
|
44
|
+
**最少代码解决问题。没有投机性内容。**
|
|
45
|
+
|
|
46
|
+
- 不实现未被要求的功能。
|
|
47
|
+
- 单次使用的代码不抽象。
|
|
48
|
+
- 未被要求的"灵活性"或"可配置性"不加。
|
|
49
|
+
- 不可能发生的场景不做错误处理。
|
|
50
|
+
- 如果写了 200 行但 50 行能做到,重写。
|
|
51
|
+
|
|
52
|
+
自我检验:「资深工程师会说这过于复杂吗?」如果是,简化。
|
|
53
|
+
|
|
54
|
+
**modus 场景示例:**
|
|
55
|
+
|
|
56
|
+
❌ 错误:用户说「加个状态校验」,生成了 Strategy 模式 + 枚举工厂 + 抽象类体系
|
|
57
|
+
✅ 正确:在 Service 方法头加一行 `if (!order.canTransit(targetStatus)) throw new BizException(...);`
|
|
58
|
+
|
|
59
|
+
❌ 错误:modus-init 对 50 个文件的项目也跑 5 轮全量扫描 + SubAgent 并行
|
|
60
|
+
✅ 正确:先读目录结构,按实际发现的域数量决定深度
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 3. Surgical Changes
|
|
65
|
+
|
|
66
|
+
**只动必须动的地方。只清理自己的垃圾。**
|
|
67
|
+
|
|
68
|
+
修改已有代码时:
|
|
69
|
+
- 不「顺手优化」相邻代码、注释或格式。
|
|
70
|
+
- 不重构未损坏的东西。
|
|
71
|
+
- 匹配现有代码风格,即使你会选择不同方式。
|
|
72
|
+
- 发现无关的死代码,提及——不删除。
|
|
73
|
+
|
|
74
|
+
你的改动产生孤儿时:
|
|
75
|
+
- 删除**你的改动**让其变得无用的 import/变量/方法。
|
|
76
|
+
- 不删除原本就存在的死代码,除非被要求。
|
|
77
|
+
|
|
78
|
+
检验标准:每一行改动都必须能追溯到用户的请求。
|
|
79
|
+
|
|
80
|
+
**modus 场景示例:**
|
|
81
|
+
|
|
82
|
+
❌ 错误:用户让修一个 NPE bug,顺便把整个方法改成 Optional 链式 + 加了 log + 补了注释
|
|
83
|
+
✅ 正确:只加 `if (order == null) throw new BizException(ORDER_NOT_FOUND);`,其余不动
|
|
84
|
+
|
|
85
|
+
❌ 错误:vibe 编码完成后自动更新 Skill 文件(用户没要求更新文档)
|
|
86
|
+
✅ 正确:缓冲到 pending-knowledge.yaml,等 git commit 时统一沉淀
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 4. Goal-Driven Execution
|
|
91
|
+
|
|
92
|
+
**定义成功标准。循环直到验证通过。**
|
|
93
|
+
|
|
94
|
+
将任务转化为可验证的目标:
|
|
95
|
+
- 「加个校验」→「为无效输入写测试,然后让测试通过」
|
|
96
|
+
- 「修这个 bug」→「写出能复现的测试,然后让它通过」
|
|
97
|
+
- 「重构 X」→「确保重构前后测试都通过」
|
|
98
|
+
|
|
99
|
+
多步骤任务,先陈述简短计划:
|
|
100
|
+
```
|
|
101
|
+
1. [步骤] → 验证:[检查项]
|
|
102
|
+
2. [步骤] → 验证:[检查项]
|
|
103
|
+
3. [步骤] → 验证:[检查项]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
强成功标准让 Agent 独立循环完成。弱标准(「让它能跑」)需要反复澄清。
|
|
107
|
+
|
|
108
|
+
**modus 场景示例:**
|
|
109
|
+
|
|
110
|
+
❌ 错误:`/modus:vibe 加批量审批` → 直接开始写代码,没有说明"完成"意味着什么
|
|
111
|
+
✅ 正确:
|
|
112
|
+
```
|
|
113
|
+
任务目标:实现批量审批接口,支持最多 50 条订单同时审批
|
|
114
|
+
完成标准:
|
|
115
|
+
· mvn test -Dtest=BatchApproveServiceTest 通过
|
|
116
|
+
· 并发场景下不产生重复审批(分布式锁验证)
|
|
117
|
+
· 影响范围:仅 OrderService + OrderFacade,不触及其他文件
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 5. Token Budget Guard
|
|
125
|
+
|
|
126
|
+
**有意识地使用 token。大操作前声明预算。**
|
|
127
|
+
|
|
128
|
+
Token 是 AI 工作流的核心成本约束。每次命令执行前,应在内部估算本次的 token 消耗范围,避免不必要的全量加载。
|
|
129
|
+
|
|
130
|
+
**Modus 各步骤 token 预算参考:**
|
|
131
|
+
|
|
132
|
+
| 操作 | 估算 token | 说明 |
|
|
133
|
+
|------|-----------|------|
|
|
134
|
+
| Level 1:读 knowledge-catalog | ~200 | 仅目录索引,所有命令必须执行 |
|
|
135
|
+
| Level 2:读 1 个业务 Skill | ~3,000 | 按需加载,不相关的域不读 |
|
|
136
|
+
| Level 3:读 1 个实际代码文件 | ~500–2,000 | 仅在编码时按需读取 |
|
|
137
|
+
| 全量加载(8 个业务 Skill) | ~24,000 | 应避免——三级加载 vs 全量差约 **10×** |
|
|
138
|
+
| behavior-guard + config.yaml | ~500 | Step 0 固定成本 |
|
|
139
|
+
| Design Brief(Simple) | ~200 | 内联生成,不读额外文件 |
|
|
140
|
+
| Design Brief(Medium/Complex) | ~1,000 | 调用 design-brief Skill |
|
|
141
|
+
|
|
142
|
+
**决策规则:**
|
|
143
|
+
- 若任务只涉及 1 个域 → 只读该域 Skill(Level 2 成本 = ~3,000 tokens)
|
|
144
|
+
- 若置信度 < 85% 涉及多域 → 先确认再加载,不预先全量加载
|
|
145
|
+
- 若 Skill 已加载但任务无关 → 不重复读取,复用上下文中已有的内容
|
|
146
|
+
|
|
147
|
+
自我检验:「本次操作有没有读了不必要的文件?」如果有,下次先匹配域再加载。
|
|
148
|
+
|
|
149
|
+
**modus 场景示例:**
|
|
150
|
+
|
|
151
|
+
❌ 错误:vibe 任务只涉及 order 域,但读了全部 8 个业务 Skill(~24,000 tokens)
|
|
152
|
+
✅ 正确:Level 1 读目录 → 匹配 order 域 → Level 2 仅读 order Skill(~3,200 tokens)
|
|
153
|
+
|
|
154
|
+
❌ 错误:连续 3 次 vibe 都重新读 behavior-guard.md 和 config.yaml
|
|
155
|
+
✅ 正确:同一 session 中,Step 0 内容已在上下文,不重复读取
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 这些原则生效时的表现
|
|
160
|
+
|
|
161
|
+
- **diff 中没有多余改动** — 只有被请求的变更
|
|
162
|
+
- **第一次就写简单代码** — 不因过度设计而返工
|
|
163
|
+
- **澄清问题在实现前提出** — 不是在出错后
|
|
164
|
+
- **干净的 PR,没有顺手重构** — 每行改动都有来源
|
|
165
|
+
- **token 消耗在合理范围** — 三级加载优于全量加载,同 session 不重复读取
|
|
@@ -15,7 +15,9 @@ Read and follow the skill at `.codebuddy/skills/modus-auto/SKILL.md` to execute
|
|
|
15
15
|
5. Show recommendation with reasoning + comparison table of other options
|
|
16
16
|
6. Wait for human mode selection
|
|
17
17
|
7. Show parameter confirmation window (second confirmation step)
|
|
18
|
-
8. Auto-launch the selected mode with TAPD context pre-filled
|
|
18
|
+
8. Auto-launch the selected mode with TAPD context pre-filled:
|
|
19
|
+
- **plan** mode: appends `[AUTO_MODE: questions_confirmed]` + confirmed key info summary to the prompt; modus-plan Step 3 will skip interactive clarification when it detects this marker
|
|
20
|
+
- **vibe** / **spec** / **harness** modes: pass TAPD context directly without this marker
|
|
19
21
|
|
|
20
22
|
## Usage
|
|
21
23
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# /modus:commit
|
|
2
|
+
|
|
3
|
+
Knowledge-aware git commit. Drains pending knowledge from `modus/sessions/pending-knowledge.yaml` into the corresponding business Skill files, then executes the actual git commit.
|
|
4
|
+
|
|
5
|
+
## Instructions
|
|
6
|
+
|
|
7
|
+
Read and follow the steps below to execute this command.
|
|
8
|
+
|
|
9
|
+
## What It Does
|
|
10
|
+
|
|
11
|
+
During `/modus:vibe` sessions, newly discovered knowledge (new enum values, business rules, pitfalls) is buffered to `modus/sessions/pending-knowledge.yaml` rather than written directly to Skill files. This prevents exploratory or incomplete sessions from polluting the knowledge base.
|
|
12
|
+
|
|
13
|
+
`/modus:commit` is the trigger that drains this buffer at the right moment — when code is confirmed ready to commit.
|
|
14
|
+
|
|
15
|
+
## Execution Steps
|
|
16
|
+
|
|
17
|
+
1. **Check pending knowledge buffer:**
|
|
18
|
+
Read `modus/sessions/pending-knowledge.yaml` (if it exists).
|
|
19
|
+
If empty or absent → skip to Step 4 and execute a normal git commit.
|
|
20
|
+
|
|
21
|
+
2. **Show pending entries for confirmation:**
|
|
22
|
+
```
|
|
23
|
+
📚 发现 {N} 条待沉淀知识(来自最近 {K} 次 vibe 会话):
|
|
24
|
+
|
|
25
|
+
· [pitfall] order 域:批量操作超 50 条需分批处理
|
|
26
|
+
证据: OrderService.java:142
|
|
27
|
+
· [guideline] order 域:新增审批流必须记录审批人 ID 到日志
|
|
28
|
+
证据: OrderManager.java:89
|
|
29
|
+
· [model] payment 域:PayStatus 新增 REFUNDING 枚举值
|
|
30
|
+
证据: PayStatus.java:15
|
|
31
|
+
|
|
32
|
+
是否将以上知识写入对应 Skill 文件?[Y/n]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. **Write back to Skills (if confirmed):**
|
|
36
|
+
For each entry in `pending-knowledge.yaml`:
|
|
37
|
+
- Call `modus-skill-creator` Mode C to append the entry to the corresponding `modus-biz-{domain}/SKILL.md`
|
|
38
|
+
- Mark the entry as `settled: true` in `pending-knowledge.yaml`
|
|
39
|
+
- Output per-entry status: `✓ [pitfall] → modus-biz-order 已写入`
|
|
40
|
+
|
|
41
|
+
After all entries processed:
|
|
42
|
+
- Remove settled entries from `pending-knowledge.yaml` (keep only `settled: false` entries)
|
|
43
|
+
- Update `modus/knowledge-catalog.md` if any Skill version changed
|
|
44
|
+
|
|
45
|
+
4. **Execute git commit:**
|
|
46
|
+
Run the standard git commit flow:
|
|
47
|
+
```bash
|
|
48
|
+
git add .
|
|
49
|
+
git commit
|
|
50
|
+
```
|
|
51
|
+
(Opens editor for commit message or accepts message from user input)
|
|
52
|
+
|
|
53
|
+
5. **Output summary:**
|
|
54
|
+
```
|
|
55
|
+
✅ 知识沉淀完成({N} 条已写入 Skill)
|
|
56
|
+
✅ Git commit 执行完成
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Notes
|
|
60
|
+
|
|
61
|
+
- If the user skips knowledge write-back (answer `n`), the entries remain in `pending-knowledge.yaml` for the next `/modus:commit` call.
|
|
62
|
+
- Entries with `settled: false` that are older than 30 days will be highlighted with `⚠️ 较旧` to prompt cleanup.
|
|
63
|
+
- This command only handles knowledge write-back for `/modus:vibe` sessions. Knowledge from `/modus:plan`, `/modus:spec`, and `/modus:harness` is written back immediately (not buffered).
|
|
@@ -11,10 +11,14 @@ Read and follow the skill at `.codebuddy/skills/modus-harness/SKILL.md` to execu
|
|
|
11
11
|
1. Check for business Skills — if absent, strongly recommend running `/modus:init` first
|
|
12
12
|
2. Accept TAPD Story URL as input
|
|
13
13
|
3. Create working directory: `modus/plans/active/{story-id}/`
|
|
14
|
-
4. Run the Harness Orchestrator which coordinates
|
|
14
|
+
4. Run the Harness Orchestrator which coordinates up to 9 SubAgents (00–07 + 01.5):
|
|
15
15
|
|
|
16
16
|
**Loop 1 (sequential):**
|
|
17
|
+
- SubAgent 00: Knowledge injection (Skill update/creation)
|
|
17
18
|
- SubAgent 01: Requirements analysis → `01-analysis.md`
|
|
19
|
+
- Gate A0: Validate `01-analysis.md` HANDOFF gate_status = "passed"
|
|
20
|
+
- SubAgent 01.5: Design brief generation ⏸️ (human architecture decision confirmation) → `01.5-design-brief.md`
|
|
21
|
+
- Gate A0.5: Validate `01.5-design-brief.md` HANDOFF gate_status ∈ {passed, warning}
|
|
18
22
|
- SubAgent 02: Code development → `02-sprint-contract.md` + code changes
|
|
19
23
|
- Gate A: Build compilation check
|
|
20
24
|
- SubAgent 03/04/05 (parallel): Tests + Performance audit + Security audit
|
|
@@ -26,19 +30,22 @@ Read and follow the skill at `.codebuddy/skills/modus-harness/SKILL.md` to execu
|
|
|
26
30
|
- Gate C: No P1/P2 → proceed
|
|
27
31
|
- SubAgent 07: Deployment verification → `07-deploy-status.md`
|
|
28
32
|
|
|
33
|
+
**Step Final:** SubAgent 00 (Mode D) — ARCHIVE knowledge extraction
|
|
34
|
+
|
|
29
35
|
5. Final Review: human confirms before merging
|
|
30
36
|
|
|
31
37
|
## Working Directory
|
|
32
38
|
|
|
33
39
|
```
|
|
34
40
|
modus/plans/active/{story-id}/
|
|
35
|
-
├── 01-analysis.md
|
|
36
|
-
├──
|
|
37
|
-
├──
|
|
38
|
-
├──
|
|
39
|
-
├──
|
|
40
|
-
├──
|
|
41
|
-
|
|
41
|
+
├── 01-analysis.md ← SubAgent 01 产出,含 HANDOFF 块
|
|
42
|
+
├── 01.5-design-brief.md ← SubAgent 01.5 产出,含架构决策
|
|
43
|
+
├── 02-sprint-contract.md ← SubAgent 02 产出,含代码变更清单
|
|
44
|
+
├── 03-test-report.md ← SubAgent 03 产出
|
|
45
|
+
├── 04-perf-report.md ← SubAgent 04 产出
|
|
46
|
+
├── 05-security-report.md ← SubAgent 05 产出
|
|
47
|
+
├── cr-report.md ← SubAgent 06 产出,含 HANDOFF.issues
|
|
48
|
+
└── 07-deploy-status.md ← SubAgent 07 产出
|
|
42
49
|
```
|
|
43
50
|
|
|
44
51
|
## Resume Support
|
|
@@ -16,7 +16,7 @@ Read and follow the skill at `.codebuddy/skills/modus-vibe/SKILL.md` to execute
|
|
|
16
16
|
6. Load matched Skill files as context (Level 2, ~3000 tokens each)
|
|
17
17
|
7. **Adaptive Design Brief**: Simple tasks → 3-section inline brief; Medium/Complex → full 9-section brief
|
|
18
18
|
8. Execute the coding task with business context (Level 3 on-demand file reads)
|
|
19
|
-
9. **
|
|
19
|
+
9. **Buffer new knowledge** (silent): if new knowledge discovered (new enums, pitfalls, rule changes), append to `modus/sessions/pending-knowledge.yaml`; show one-line `[缓冲 {N} 条新知识 → 将在 /modus:commit 时沉淀到 Skill]`; if nothing new, stay silent. **Do NOT write to Skill files directly** — run `/modus:commit` to persist buffered knowledge.
|
|
20
20
|
10. Append session log to `modus/sessions/vibe-log.md`
|
|
21
21
|
|
|
22
22
|
**Degraded mode** (no business Skills): proceed without domain context, note quality may be lower, show `[降级模式:无业务上下文,建议先运行 /modus:init]`.
|
|
@@ -1,53 +1,82 @@
|
|
|
1
1
|
# Modus 知识全景目录
|
|
2
2
|
# 所有 Modus 命令启动时先读此文件(Level 1 加载,~200 tokens)
|
|
3
|
-
# 按需再读完整 SKILL.md(Level 2
|
|
4
|
-
#
|
|
5
|
-
# maturity: draft → verified → proven
|
|
6
|
-
# 衰减:proven 12个月未引用→verified;verified 6个月未引用→draft
|
|
3
|
+
# 按需再读完整 SKILL.md(Level 2,~3000 tokens/个)
|
|
4
|
+
# 或直接读 Skill 引用的实际代码文件(Level 3,按需)
|
|
7
5
|
|
|
8
6
|
updated: {YYYY-MM-DD}
|
|
9
7
|
|
|
8
|
+
## 全局行为守卫 (Layer 0-G)
|
|
9
|
+
# 所有命令 Step 0 加载,优先级:低于 constitution.hard_rules,高于 Skill 建议
|
|
10
|
+
- **behavior-guard**: `modus/behavior-guard.md` — 五条全局行为约束
|
|
11
|
+
(Think Before Coding · Simplicity First · Surgical Changes · Goal-Driven Execution · Token Budget Guard)
|
|
12
|
+
[由 /modus:init 生成,不随项目代码变化,手动维护]
|
|
13
|
+
|
|
10
14
|
## 团队约定 (Layer 0-T)
|
|
11
|
-
- **modus-team-conventions**:
|
|
15
|
+
- **modus-team-conventions**: 代码规范/提交规范/最佳实践
|
|
16
|
+
[status: draft] [format: v2/14节] [upstream: -]
|
|
17
|
+
更新: {日期}
|
|
12
18
|
|
|
13
19
|
## 技术知识 (Layer 1)
|
|
14
|
-
- **modus-tech-wiki**:
|
|
20
|
+
- **modus-tech-wiki**: 跨项目技术经验(反模式、架构决策、性能优化)
|
|
21
|
+
[status: draft] [format: v2/14节] [upstream: -]
|
|
22
|
+
更新: {日期}
|
|
15
23
|
|
|
16
24
|
## 业务知识 (Layer 2)
|
|
17
25
|
<!-- 由 /modus:init 生成,由各模式工作流自动更新 -->
|
|
18
|
-
- **modus-biz-{domain}**: {中文域名} — {核心职责一句话}
|
|
26
|
+
- **modus-biz-{domain}**: {中文域名} — {核心职责一句话}
|
|
27
|
+
[status: draft] [format: v3/17节] [upstream: {依赖域列表,无则写-}]
|
|
28
|
+
更新: {日期} hash: {last_hash 前8位}
|
|
29
|
+
|
|
30
|
+
## 域依赖图 (Dependency Graph)
|
|
31
|
+
<!--
|
|
32
|
+
格式:{下游域} --> {上游域1}, {上游域2}
|
|
33
|
+
含义:下游域的 Skill 中 upstream_skills 声明了对上游域的依赖。
|
|
34
|
+
当上游域 hash 变更时,下游域的 stale_cascade 自动置为 true(在 ⚠️ 标注处可见)。
|
|
35
|
+
由 /modus:init 自动生成,可手动补充跨域调用关系。
|
|
36
|
+
-->
|
|
37
|
+
<!-- example:
|
|
38
|
+
payment --> order, user
|
|
39
|
+
notification --> order, payment
|
|
40
|
+
report --> order, payment, user
|
|
41
|
+
-->
|
|
42
|
+
<!-- 当前依赖关系(/modus:init 扫描后填入):
|
|
43
|
+
{待填入}
|
|
44
|
+
-->
|
|
19
45
|
|
|
20
46
|
## 渐进加载说明
|
|
47
|
+
|
|
21
48
|
启动任意 Modus 命令时的加载顺序:
|
|
22
|
-
Level 1(必须,~200 tokens):
|
|
23
|
-
Level 2(按需,~3000 tokens
|
|
24
|
-
Level 3(按需,无上限):
|
|
49
|
+
Level 1(必须,~200 tokens): 读本文件,了解有哪些知识可用
|
|
50
|
+
Level 2(按需,~3000 tokens): 根据任务匹配相关域,读对应 SKILL.md
|
|
51
|
+
Level 3(按需,无上限): 执行任务时读 Skill 引用的实际代码文件
|
|
25
52
|
|
|
26
53
|
目标:不相关的 Skill 不加载,大幅降低 token 消耗。
|
|
27
54
|
|
|
28
|
-
## Skill
|
|
55
|
+
## Skill status 生命周期
|
|
29
56
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
57
|
+
| status | 含义 | 升级方式 |
|
|
58
|
+
|-----------|-------------------------|-----------------------------------|
|
|
59
|
+
| draft | 初始生成,未经验证 | 运行 /modus:verify 且满足四项条件 |
|
|
60
|
+
| verified | 经至少 1 次真实使用验证 | usage_count ≥ 2 且不同工作流 |
|
|
61
|
+
| proven | 经 ≥2 个不同工作流验证 | - |
|
|
62
|
+
| stale | hash 不匹配或衰减超期 | 运行 /modus:refresh 后回到 draft |
|
|
63
|
+
| archived | 域已废弃,不再维护 | -(禁止引用) |
|
|
36
64
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- stale
|
|
65
|
+
## 衰减规则(活跃度感知,基于 last_referenced + usage_count)
|
|
66
|
+
|
|
67
|
+
衰减阈值根据 usage_count 动态调整:
|
|
68
|
+
- 活跃域(usage_count ≥ 10):verified → stale 12个月 / proven → verified 24个月
|
|
69
|
+
- 正常域(usage_count 3-9):verified → stale 6个月 / proven → verified 12个月
|
|
70
|
+
- 冷门域(usage_count ≤ 2):verified → stale 3个月 / proven → verified 6个月
|
|
71
|
+
- stale + 超过 stale_after_days 天 → archived(需人工二次确认)
|
|
72
|
+
|
|
73
|
+
## 防腐机制核心字段
|
|
41
74
|
|
|
42
|
-
### 防腐机制核心字段
|
|
43
75
|
每个 Skill frontmatter 必须包含以下字段,缺一不可:
|
|
44
|
-
- **last_referenced**:
|
|
45
|
-
- **usage_count**:
|
|
46
|
-
- **last_hash**:
|
|
47
|
-
- **
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
- 无法触发 Skill 更新
|
|
52
|
-
- 无法计算知识衰减
|
|
53
|
-
- 防腐机制完全失效
|
|
76
|
+
- **last_referenced**: 最后引用时间(每次被命令加载时更新)
|
|
77
|
+
- **usage_count**: 使用次数(每次完成真实开发任务后 +1)
|
|
78
|
+
- **last_hash**: 全局 SHA-1(对每个文件单独计算 SHA-1,将「路径:SHA-1」对按文件路径字母序排序后拼接,再整体计算 SHA-1,禁止内容直接拼接);引用时快速比对,不一致则展开 file_hashes 逐文件定位
|
|
79
|
+
- **file_hashes**: 文件级 hash map(`{路径: SHA-1}`);全局 hash 不一致时使用,精准输出变更文件清单
|
|
80
|
+
- **key_files**: 关键源文件列表(最多 20 个,用于 hash 计算)
|
|
81
|
+
|
|
82
|
+
详细说明见:modus/templates/skills/modus-init/SKILL.md「防腐机制总览」章节
|