@mycodemap/mycodemap 0.5.2-beta.1 → 1.9.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.
- package/CHANGELOG.md +14 -0
- package/README.md +84 -10
- package/dist/cli/commands/init.d.ts +7 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +22 -34
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/publish-status.d.ts +31 -0
- package/dist/cli/commands/publish-status.d.ts.map +1 -0
- package/dist/cli/commands/publish-status.js +101 -0
- package/dist/cli/commands/publish-status.js.map +1 -0
- package/dist/cli/commands/readiness-gate.d.ts +25 -0
- package/dist/cli/commands/readiness-gate.d.ts.map +1 -0
- package/dist/cli/commands/readiness-gate.js +197 -0
- package/dist/cli/commands/readiness-gate.js.map +1 -0
- package/dist/cli/commands/ship/checker.d.ts +4 -9
- package/dist/cli/commands/ship/checker.d.ts.map +1 -1
- package/dist/cli/commands/ship/checker.js +60 -22
- package/dist/cli/commands/ship/checker.js.map +1 -1
- package/dist/cli/commands/ship/monitor.d.ts +6 -1
- package/dist/cli/commands/ship/monitor.d.ts.map +1 -1
- package/dist/cli/commands/ship/monitor.js +223 -46
- package/dist/cli/commands/ship/monitor.js.map +1 -1
- package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
- package/dist/cli/commands/ship/pipeline.js +14 -5
- package/dist/cli/commands/ship/pipeline.js.map +1 -1
- package/dist/cli/commands/ship/rules/quality-rules.d.ts +12 -8
- package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -1
- package/dist/cli/commands/ship/rules/quality-rules.js +49 -34
- package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -1
- package/dist/cli/config-loader.js +1 -1
- package/dist/cli/config-loader.js.map +1 -1
- package/dist/cli/first-run-guide.d.ts.map +1 -1
- package/dist/cli/first-run-guide.js +10 -12
- package/dist/cli/first-run-guide.js.map +1 -1
- package/dist/cli/index.js +8 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hooks.d.ts +17 -0
- package/dist/cli/init/hooks.d.ts.map +1 -0
- package/dist/cli/init/hooks.js +220 -0
- package/dist/cli/init/hooks.js.map +1 -0
- package/dist/cli/init/receipt.d.ts +4 -0
- package/dist/cli/init/receipt.d.ts.map +1 -0
- package/dist/cli/init/receipt.js +117 -0
- package/dist/cli/init/receipt.js.map +1 -0
- package/dist/cli/init/reconciler.d.ts +44 -0
- package/dist/cli/init/reconciler.d.ts.map +1 -0
- package/dist/cli/init/reconciler.js +377 -0
- package/dist/cli/init/reconciler.js.map +1 -0
- package/dist/cli/init/rule-templates.d.ts +9 -0
- package/dist/cli/init/rule-templates.d.ts.map +1 -0
- package/dist/cli/init/rule-templates.js +105 -0
- package/dist/cli/init/rule-templates.js.map +1 -0
- package/dist/cli/init/rules.d.ts +13 -0
- package/dist/cli/init/rules.d.ts.map +1 -0
- package/dist/cli/init/rules.js +113 -0
- package/dist/cli/init/rules.js.map +1 -0
- package/dist/cli/paths.d.ts +4 -2
- package/dist/cli/paths.d.ts.map +1 -1
- package/dist/cli/paths.js +13 -5
- package/dist/cli/paths.js.map +1 -1
- package/dist/orchestrator/test-linker.d.ts.map +1 -1
- package/dist/orchestrator/test-linker.js +5 -36
- package/dist/orchestrator/test-linker.js.map +1 -1
- package/docs/AI_ASSISTANT_SETUP.md +4 -2
- package/docs/SETUP_GUIDE.md +12 -12
- package/docs/agents/domain.md +36 -0
- package/docs/agents/issue-tracker.md +22 -0
- package/docs/agents/triage-labels.md +15 -0
- package/docs/ai-guide/COMMANDS.md +57 -3
- package/docs/ai-guide/INTEGRATION.md +1 -1
- package/docs/ai-guide/PATTERNS.md +3 -3
- package/docs/ai-guide/QUICKSTART.md +13 -4
- package/docs/ai-guide/README.md +7 -7
- package/docs/archive/ideation/2026-04-22-harness-rules-entry-docs-optimization-ideation.md +102 -0
- package/docs/archive/ideation/2026-04-22-rules-claude-agents-optimization-ideation.md +107 -0
- package/docs/brainstorms/2026-04-22-rules-entry-docs-phase1-structure-consolidation-requirements.md +110 -0
- package/docs/brainstorms/999.1-mycodemap-init-enhancements-requirements.md +166 -0
- package/docs/exec-plans/README.md +3 -0
- package/docs/ideation/2026-04-20-mycodemap-init-enhancements-ideation.md +96 -0
- package/docs/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation.md +119 -0
- package/docs/lesson-learn/2026-04-19-prerelease-trusted-publishing-fix.md +119 -0
- package/docs/lesson-learn/image.png +0 -0
- package/docs/rules/README.md +4 -1
- package/docs/rules/deployment.md +7 -0
- package/docs/rules/engineering-with-codex-openai.md +47 -8
- package/docs/rules/pre-release-checklist.md +44 -33
- package/docs/rules/release.md +303 -0
- package/docs/rules/testing.md +19 -0
- package/docs/rules/validation.md +16 -7
- package/mycodemap.config.schema.json +1 -1
- package/package.json +3 -3
- package/scripts/hooks/templates/commit-msg +38 -0
- package/scripts/hooks/templates/pre-commit +224 -0
- package/scripts/pre-release-check.js +4 -4
- package/scripts/release.sh +1 -1
- package/scripts/validate-docs.js +283 -14
package/scripts/validate-docs.js
CHANGED
|
@@ -46,6 +46,39 @@ function expectNotIncludes(text, snippet, label, failures) {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
function expectNoCommandSurface(text, label, forbiddenSnippets, failures) {
|
|
50
|
+
if (!text) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
for (const snippet of forbiddenSnippets) {
|
|
55
|
+
if (text.includes(snippet)) {
|
|
56
|
+
failures.push(`[entry-doc ghost-command] ${label} should stay routing-only, but contains command snippet: ${snippet}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function expectNoPolicyDuplication(text, label, forbiddenSnippets, failures) {
|
|
62
|
+
if (!text) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const snippet of forbiddenSnippets) {
|
|
67
|
+
if (text.includes(snippet)) {
|
|
68
|
+
failures.push(`[entry-doc duplicate-policy] ${label} duplicates governance policy that should stay in AGENTS.md or live rules: ${snippet}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function expectReferencedPaths(rootDir, label, references, failures) {
|
|
74
|
+
for (const reference of references) {
|
|
75
|
+
const absolutePath = path.join(rootDir, reference);
|
|
76
|
+
if (!existsSync(absolutePath)) {
|
|
77
|
+
failures.push(`[entry-doc ghost-route] ${label} references missing path: ${reference}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
49
82
|
function validateSnippets(text, label, requiredSnippets, outdatedSnippets, failures) {
|
|
50
83
|
if (!text) {
|
|
51
84
|
return;
|
|
@@ -60,6 +93,165 @@ function validateSnippets(text, label, requiredSnippets, outdatedSnippets, failu
|
|
|
60
93
|
}
|
|
61
94
|
}
|
|
62
95
|
|
|
96
|
+
function validateEntryDocGovernance(rootDir, failures) {
|
|
97
|
+
const agents = readText(rootDir, 'AGENTS.md', failures);
|
|
98
|
+
const claudeGuide = readText(rootDir, 'CLAUDE.md', failures);
|
|
99
|
+
const claudeAdapter = readText(rootDir, '.claude/CLAUDE.md', failures);
|
|
100
|
+
const rulesIndex = readText(rootDir, 'docs/rules/README.md', failures);
|
|
101
|
+
|
|
102
|
+
validateSnippets(
|
|
103
|
+
agents,
|
|
104
|
+
'AGENTS.md entry-doc authority baseline',
|
|
105
|
+
[
|
|
106
|
+
'`AGENTS.md = constitution` / `CLAUDE.md = router` / `.claude/CLAUDE.md = Claude adapter`',
|
|
107
|
+
'本文件只保留仓库级治理协议;若某条细则在 live doc 已定权,这里只保留原则与路由,不重复正文。'
|
|
108
|
+
],
|
|
109
|
+
[],
|
|
110
|
+
failures
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
validateSnippets(
|
|
114
|
+
claudeGuide,
|
|
115
|
+
'CLAUDE.md router baseline',
|
|
116
|
+
[
|
|
117
|
+
'本文件只回答三件事:**谁定权、下一步去哪读、规则变更时该改哪份文档**。',
|
|
118
|
+
'它不是执行手册、命令速查、验证清单或交付 checklist。'
|
|
119
|
+
],
|
|
120
|
+
[
|
|
121
|
+
'AI 执行手册',
|
|
122
|
+
'最小执行手册',
|
|
123
|
+
'Claude/Codex 执行手册'
|
|
124
|
+
],
|
|
125
|
+
failures
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
validateSnippets(
|
|
129
|
+
claudeAdapter,
|
|
130
|
+
'.claude/CLAUDE.md adapter baseline',
|
|
131
|
+
[
|
|
132
|
+
'Claude Code 会自动读取本文件;它只负责把 Claude 连接到仓库里的**共享真相**。',
|
|
133
|
+
'本文件不是执行手册,也不是第二套规则入口。'
|
|
134
|
+
],
|
|
135
|
+
[
|
|
136
|
+
'AI 执行手册',
|
|
137
|
+
'最小执行手册',
|
|
138
|
+
'Claude/Codex 执行手册',
|
|
139
|
+
'Claude 第二手册'
|
|
140
|
+
],
|
|
141
|
+
failures
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
validateSnippets(
|
|
145
|
+
rulesIndex,
|
|
146
|
+
'docs/rules/README.md routing baseline',
|
|
147
|
+
[
|
|
148
|
+
'入口角色约束:`AGENTS.md` 定权,根 `CLAUDE.md` 只负责把你路由到这里或其他 live docs;规则正文仍以本目录各文件为准。'
|
|
149
|
+
],
|
|
150
|
+
[],
|
|
151
|
+
failures
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
expectNoCommandSurface(
|
|
155
|
+
claudeGuide,
|
|
156
|
+
'CLAUDE.md',
|
|
157
|
+
['npm run ', 'node dist/cli/index.js', 'mycodemap ', 'rtk ', 'python3 scripts/', '$gsd-'],
|
|
158
|
+
failures
|
|
159
|
+
);
|
|
160
|
+
expectNoCommandSurface(
|
|
161
|
+
claudeAdapter,
|
|
162
|
+
'.claude/CLAUDE.md',
|
|
163
|
+
['npm run ', 'node dist/cli/index.js', 'mycodemap ', 'rtk ', 'python3 scripts/', '$gsd-'],
|
|
164
|
+
failures
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
expectNoPolicyDuplication(
|
|
168
|
+
claudeGuide,
|
|
169
|
+
'CLAUDE.md',
|
|
170
|
+
[
|
|
171
|
+
'## 3.1 任务分级与自主权边界(Harness 规范)',
|
|
172
|
+
'## 5. 证据协议',
|
|
173
|
+
'## 5.1 可信度自评要求(Harness 规范)',
|
|
174
|
+
'## 7.1 代码生成红线(Harness 规范)',
|
|
175
|
+
'## 8. 验证与失败预演'
|
|
176
|
+
],
|
|
177
|
+
failures
|
|
178
|
+
);
|
|
179
|
+
expectNoPolicyDuplication(
|
|
180
|
+
claudeAdapter,
|
|
181
|
+
'.claude/CLAUDE.md',
|
|
182
|
+
[
|
|
183
|
+
'## 3.1 任务分级与自主权边界(Harness 规范)',
|
|
184
|
+
'## 5. 证据协议',
|
|
185
|
+
'## 5.1 可信度自评要求(Harness 规范)',
|
|
186
|
+
'## 7.1 代码生成红线(Harness 规范)',
|
|
187
|
+
'## 8. 验证与失败预演'
|
|
188
|
+
],
|
|
189
|
+
failures
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
expectReferencedPaths(
|
|
193
|
+
rootDir,
|
|
194
|
+
'CLAUDE.md',
|
|
195
|
+
[
|
|
196
|
+
'AGENTS.md',
|
|
197
|
+
'.claude/CLAUDE.md',
|
|
198
|
+
'docs/rules/README.md',
|
|
199
|
+
'docs/rules/engineering-with-codex-openai.md',
|
|
200
|
+
'docs/rules/validation.md',
|
|
201
|
+
'docs/rules/architecture-guardrails.md',
|
|
202
|
+
'docs/rules/code-quality-redlines.md',
|
|
203
|
+
'docs/rules/testing.md',
|
|
204
|
+
'docs/rules/release.md',
|
|
205
|
+
'AI_GUIDE.md',
|
|
206
|
+
'ARCHITECTURE.md',
|
|
207
|
+
'docs/ai-guide'
|
|
208
|
+
],
|
|
209
|
+
failures
|
|
210
|
+
);
|
|
211
|
+
expectReferencedPaths(
|
|
212
|
+
rootDir,
|
|
213
|
+
'.claude/CLAUDE.md',
|
|
214
|
+
[
|
|
215
|
+
'AGENTS.md',
|
|
216
|
+
'CLAUDE.md',
|
|
217
|
+
'docs/rules/engineering-with-codex-openai.md',
|
|
218
|
+
'docs/rules/validation.md',
|
|
219
|
+
'AI_GUIDE.md',
|
|
220
|
+
'ARCHITECTURE.md'
|
|
221
|
+
],
|
|
222
|
+
failures
|
|
223
|
+
);
|
|
224
|
+
expectReferencedPaths(
|
|
225
|
+
rootDir,
|
|
226
|
+
'docs/rules/README.md',
|
|
227
|
+
[
|
|
228
|
+
'docs/rules/code-quality-redlines.md',
|
|
229
|
+
'docs/rules/architecture-guardrails.md',
|
|
230
|
+
'docs/rules/testing.md',
|
|
231
|
+
'docs/rules/validation.md',
|
|
232
|
+
'docs/rules/engineering-with-codex-openai.md',
|
|
233
|
+
'docs/rules/release.md',
|
|
234
|
+
'docs/rules/deployment.md',
|
|
235
|
+
'docs/rules/pre-release-checklist.md'
|
|
236
|
+
],
|
|
237
|
+
failures
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
if (
|
|
241
|
+
claudeGuide &&
|
|
242
|
+
(!claudeGuide.includes('AGENTS.md') || !claudeGuide.includes('docs/rules/README.md'))
|
|
243
|
+
) {
|
|
244
|
+
failures.push('[entry-doc authority-routing] CLAUDE.md no longer routes readers to AGENTS.md and docs/rules/README.md');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (
|
|
248
|
+
claudeAdapter &&
|
|
249
|
+
(!claudeAdapter.includes('AGENTS.md') || !claudeAdapter.includes('CLAUDE.md'))
|
|
250
|
+
) {
|
|
251
|
+
failures.push('[entry-doc authority-routing] .claude/CLAUDE.md no longer points Claude back to AGENTS.md and root CLAUDE.md');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
63
255
|
function validatePackageScripts(rootDir, failures) {
|
|
64
256
|
const packageJsonText = readText(rootDir, 'package.json', failures);
|
|
65
257
|
if (!packageJsonText) {
|
|
@@ -195,7 +387,7 @@ function validateAnalyzeDocs(rootDir, failures) {
|
|
|
195
387
|
failures
|
|
196
388
|
);
|
|
197
389
|
|
|
198
|
-
// NOTE: CLAUDE.md
|
|
390
|
+
// NOTE: CLAUDE.md 已演进为入口路由,analyze 命令指南已移至 AI_GUIDE.md / docs/ai-guide/
|
|
199
391
|
// 相关检查已下放至 AI_GUIDE.md 与 docs/ai-guide/*.md 的 validateSnippets 中
|
|
200
392
|
|
|
201
393
|
validateSnippets(
|
|
@@ -274,7 +466,7 @@ function validateHistoryRiskDocs(rootDir, failures) {
|
|
|
274
466
|
);
|
|
275
467
|
}
|
|
276
468
|
|
|
277
|
-
// NOTE: CLAUDE.md
|
|
469
|
+
// NOTE: CLAUDE.md 已演进为入口路由,history 风险基线已移至 AI_GUIDE.md / docs/ai-guide/
|
|
278
470
|
// 相关检查已下放至 AI_GUIDE.md 与 docs/ai-guide/*.md 的 validateSnippets 中
|
|
279
471
|
|
|
280
472
|
if (commandsGuide) {
|
|
@@ -437,7 +629,7 @@ function validateDesignContractDocs(rootDir, failures) {
|
|
|
437
629
|
);
|
|
438
630
|
}
|
|
439
631
|
|
|
440
|
-
// NOTE: CLAUDE.md
|
|
632
|
+
// NOTE: CLAUDE.md 已演进为入口路由,design 检索指南已移至 AI_GUIDE.md / docs/ai-guide/
|
|
441
633
|
// 相关检查已下放至 AI_GUIDE.md 与 docs/ai-guide/*.md 的 validateSnippets 中
|
|
442
634
|
|
|
443
635
|
if (commandsGuide) {
|
|
@@ -806,22 +998,29 @@ function validateCliSurfaceDocs(rootDir, failures) {
|
|
|
806
998
|
|
|
807
999
|
function validateConfigDocs(rootDir, failures) {
|
|
808
1000
|
const readme = readText(rootDir, 'README.md', failures);
|
|
1001
|
+
const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
|
|
809
1002
|
const setupGuide = readText(rootDir, 'docs/SETUP_GUIDE.md', failures);
|
|
810
1003
|
const assistantGuide = readText(rootDir, 'docs/AI_ASSISTANT_SETUP.md', failures);
|
|
1004
|
+
const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
|
|
1005
|
+
const quickstartGuide = readText(rootDir, 'docs/ai-guide/QUICKSTART.md', failures);
|
|
811
1006
|
|
|
812
1007
|
if (readme) {
|
|
813
1008
|
validateSnippets(
|
|
814
1009
|
readme,
|
|
815
1010
|
'README.md config contract',
|
|
816
1011
|
[
|
|
817
|
-
'
|
|
818
|
-
'
|
|
1012
|
+
'执行后会收敛 `.mycodemap/config.json`,并把 machine-readable receipt 写入 `.mycodemap/status/init-last.json`。',
|
|
1013
|
+
'`init` 还会同步 `.mycodemap/hooks/` 与 `.mycodemap/rules/`;但不会自动改写团队自有的 `CLAUDE.md` / `AGENTS.md`,只会在 receipt 中输出可复制片段。',
|
|
1014
|
+
'通过 `mycodemap init` 收敛的 canonical 配置文件是 `.mycodemap/config.json`',
|
|
819
1015
|
'"$schema": "https://mycodemap.dev/schema/config.json"',
|
|
820
1016
|
'"mode": "hybrid"',
|
|
821
1017
|
'"plugins": {',
|
|
1018
|
+
'"outputPath": ".mycodemap/storage"',
|
|
822
1019
|
'| `plugins.builtInPlugins` | `boolean` | 是否启用内置插件 | `true` |'
|
|
823
1020
|
],
|
|
824
1021
|
[
|
|
1022
|
+
'执行后会在项目根目录生成 `mycodemap.config.json` 配置文件。',
|
|
1023
|
+
'通过 `mycodemap init` 生成的 `mycodemap.config.json` 配置文件支持以下选项:',
|
|
825
1024
|
'执行后会在项目根目录生成 `codemap.config.json` 配置文件。',
|
|
826
1025
|
'通过 `codemap init` 生成的 `codemap.config.json` 配置文件支持以下选项:',
|
|
827
1026
|
'"$schema": "https://codemap.dev/schema.json"',
|
|
@@ -831,18 +1030,33 @@ function validateConfigDocs(rootDir, failures) {
|
|
|
831
1030
|
);
|
|
832
1031
|
}
|
|
833
1032
|
|
|
1033
|
+
if (aiGuide) {
|
|
1034
|
+
validateSnippets(
|
|
1035
|
+
aiGuide,
|
|
1036
|
+
'AI_GUIDE.md init contract',
|
|
1037
|
+
[
|
|
1038
|
+
'| "需要先把项目初始化到 canonical `.mycodemap/` 工作区" | `init --interactive` → 确认 receipt → `init --yes` |'
|
|
1039
|
+
],
|
|
1040
|
+
[],
|
|
1041
|
+
failures
|
|
1042
|
+
);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
834
1045
|
if (setupGuide) {
|
|
835
1046
|
validateSnippets(
|
|
836
1047
|
setupGuide,
|
|
837
1048
|
'docs/SETUP_GUIDE.md config contract',
|
|
838
1049
|
[
|
|
839
|
-
'
|
|
1050
|
+
'执行后会收敛 canonical 配置 `.mycodemap/config.json`,并把 receipt 写入 `.mycodemap/status/init-last.json`。',
|
|
1051
|
+
'生成的 canonical 配置文件 `.mycodemap/config.json`:',
|
|
840
1052
|
'"include": ["src/**/*.ts"]',
|
|
841
1053
|
'"watch": false',
|
|
842
1054
|
'"plugins": {',
|
|
1055
|
+
'"outputPath": ".mycodemap/storage"',
|
|
843
1056
|
'| `plugins.debug` | boolean | `false` | 是否输出插件调试日志 |'
|
|
844
1057
|
],
|
|
845
1058
|
[
|
|
1059
|
+
'会询问以下问题:',
|
|
846
1060
|
'"include": ["src/**/*"]'
|
|
847
1061
|
],
|
|
848
1062
|
failures
|
|
@@ -854,7 +1068,9 @@ function validateConfigDocs(rootDir, failures) {
|
|
|
854
1068
|
assistantGuide,
|
|
855
1069
|
'docs/AI_ASSISTANT_SETUP.md config contract',
|
|
856
1070
|
[
|
|
857
|
-
'-
|
|
1071
|
+
'- `.mycodemap/config.json` - CodeMap canonical 配置文件',
|
|
1072
|
+
'- `.mycodemap/status/init-last.json` - init receipt / managed asset ledger',
|
|
1073
|
+
'- `.mycodemap/rules/` - 通用 AI guardrails rules bundle(需手动引用到 `CLAUDE.md` / `AGENTS.md`)'
|
|
858
1074
|
],
|
|
859
1075
|
[
|
|
860
1076
|
'- `codemap.config.json` - CodeMap 配置文件'
|
|
@@ -862,6 +1078,34 @@ function validateConfigDocs(rootDir, failures) {
|
|
|
862
1078
|
failures
|
|
863
1079
|
);
|
|
864
1080
|
}
|
|
1081
|
+
|
|
1082
|
+
if (commandsGuide) {
|
|
1083
|
+
validateSnippets(
|
|
1084
|
+
commandsGuide,
|
|
1085
|
+
'docs/ai-guide/COMMANDS.md init contract',
|
|
1086
|
+
[
|
|
1087
|
+
'### init - 收敛项目状态',
|
|
1088
|
+
'`init` 会收敛 `.mycodemap/config.json`、`.mycodemap/status/init-last.json`、`.mycodemap/hooks/` 与 `.mycodemap/rules/`',
|
|
1089
|
+
'`init` 不会自动改写 `CLAUDE.md` 或 `AGENTS.md`,只会输出可复制的 rules 引用片段'
|
|
1090
|
+
],
|
|
1091
|
+
[],
|
|
1092
|
+
failures
|
|
1093
|
+
);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
if (quickstartGuide) {
|
|
1097
|
+
validateSnippets(
|
|
1098
|
+
quickstartGuide,
|
|
1099
|
+
'docs/ai-guide/QUICKSTART.md init contract',
|
|
1100
|
+
[
|
|
1101
|
+
'node dist/cli/index.js init --interactive',
|
|
1102
|
+
'node dist/cli/index.js init --yes',
|
|
1103
|
+
'`init` 的 receipt 会把 `done`、`manual action`、`conflict`、`skipped` 分开显示'
|
|
1104
|
+
],
|
|
1105
|
+
[],
|
|
1106
|
+
failures
|
|
1107
|
+
);
|
|
1108
|
+
}
|
|
865
1109
|
}
|
|
866
1110
|
|
|
867
1111
|
function validatePluginRuntimeDocs(rootDir, failures) {
|
|
@@ -903,7 +1147,7 @@ function validatePluginRuntimeDocs(rootDir, failures) {
|
|
|
903
1147
|
commandsGuide,
|
|
904
1148
|
'docs/ai-guide/COMMANDS.md plugin runtime contract',
|
|
905
1149
|
[
|
|
906
|
-
'`generate` 不提供独立 `--plugin` flags;插件通过
|
|
1150
|
+
'`generate` 不提供独立 `--plugin` flags;插件通过 `.mycodemap/config.json` 的 `plugins` 段声明。',
|
|
907
1151
|
'`AI_MAP.md` 会增加 `Plugin Summary`,`codemap.json` 会增加 `pluginReport`'
|
|
908
1152
|
],
|
|
909
1153
|
[],
|
|
@@ -970,7 +1214,7 @@ function validateGraphStorageDocs(rootDir, failures) {
|
|
|
970
1214
|
aiGuide,
|
|
971
1215
|
'AI_GUIDE.md graph storage contract',
|
|
972
1216
|
[
|
|
973
|
-
'| "需要切换/排查图存储后端" | 编辑
|
|
1217
|
+
'| "需要切换/排查图存储后端" | 编辑 `.mycodemap/config.json` 的 `storage` 段 → 运行 `generate` / `export` |',
|
|
974
1218
|
'`generate` 会写入配置的图存储后端;`export` 与内部 `Server Layer` handler 会读取同一份后端数据。',
|
|
975
1219
|
'`neo4j` 与 `kuzudb` 已不再是正式支持的 backend;旧配置会暴露显式迁移错误,不会静默 fallback。',
|
|
976
1220
|
'`storage.type = "auto"` 当前优先选择 `sqlite`;若运行时缺少 `better-sqlite3` 或 Node.js `<20` 导致 SQLite 不可用,则 warning 后回退到 `filesystem`。'
|
|
@@ -980,7 +1224,7 @@ function validateGraphStorageDocs(rootDir, failures) {
|
|
|
980
1224
|
);
|
|
981
1225
|
}
|
|
982
1226
|
|
|
983
|
-
// NOTE: CLAUDE.md
|
|
1227
|
+
// NOTE: CLAUDE.md 已演进为入口路由,graph storage 合约已移至 AI_GUIDE.md / docs/ai-guide/
|
|
984
1228
|
// 相关检查已下放至 AI_GUIDE.md 与 docs/ai-guide/*.md 的 validateSnippets 中
|
|
985
1229
|
|
|
986
1230
|
if (commandsGuide) {
|
|
@@ -988,8 +1232,8 @@ function validateGraphStorageDocs(rootDir, failures) {
|
|
|
988
1232
|
commandsGuide,
|
|
989
1233
|
'docs/ai-guide/COMMANDS.md graph storage contract',
|
|
990
1234
|
[
|
|
991
|
-
'`generate` 会读取
|
|
992
|
-
'`export json|graphml|dot` 会从
|
|
1235
|
+
'`generate` 会读取 `.mycodemap/config.json` 的 `storage` 段,并把 CodeGraph 写入所选后端。',
|
|
1236
|
+
'`export json|graphml|dot` 会从 `.mycodemap/config.json` 的 `storage` 段指定后端读取 CodeGraph。',
|
|
993
1237
|
'图存储后端收口不等于重新开放公共 `mycodemap server` 产品面;`Server Layer` 仍是内部层。'
|
|
994
1238
|
],
|
|
995
1239
|
[],
|
|
@@ -1003,7 +1247,7 @@ function validateGraphStorageDocs(rootDir, failures) {
|
|
|
1003
1247
|
'docs/ai-guide/QUICKSTART.md graph storage contract',
|
|
1004
1248
|
[
|
|
1005
1249
|
'stdout 还会显示当前写入的 `MVP3 Storage (...)`',
|
|
1006
|
-
'| "需要切换/排查图存储后端" | 编辑
|
|
1250
|
+
'| "需要切换/排查图存储后端" | 编辑 `.mycodemap/config.json` 的 `storage` 段后运行 `generate` | `export json` 验证是否能从同一 backend 读回 | 文本 + 机器可读 |'
|
|
1007
1251
|
],
|
|
1008
1252
|
[],
|
|
1009
1253
|
failures
|
|
@@ -1031,7 +1275,7 @@ function validateGraphStorageDocs(rootDir, failures) {
|
|
|
1031
1275
|
validationRule,
|
|
1032
1276
|
'docs/rules/validation.md graph storage guardrail',
|
|
1033
1277
|
[
|
|
1034
|
-
'若改动涉及
|
|
1278
|
+
'若改动涉及 `.mycodemap/config.json` 的 `storage` 段或图数据库适配器',
|
|
1035
1279
|
'schema / README / AI 文档没同步',
|
|
1036
1280
|
'旧的 `neo4j` / `kuzudb` 配置已经不受支持,但文档还把它写成正式 backend',
|
|
1037
1281
|
'Node.js `>=20`',
|
|
@@ -1050,6 +1294,7 @@ function validateGraphStorageDocs(rootDir, failures) {
|
|
|
1050
1294
|
'"storage"',
|
|
1051
1295
|
'"enum": ["filesystem", "sqlite", "memory", "auto"]',
|
|
1052
1296
|
'"outputPath"',
|
|
1297
|
+
'".mycodemap/storage"',
|
|
1053
1298
|
'"databasePath"',
|
|
1054
1299
|
'"autoThresholds"'
|
|
1055
1300
|
],
|
|
@@ -1347,6 +1592,28 @@ function validateGuardrailDocs(rootDir, failures) {
|
|
|
1347
1592
|
}
|
|
1348
1593
|
}
|
|
1349
1594
|
|
|
1595
|
+
function validateValidationTruthDocs(rootDir, failures) {
|
|
1596
|
+
const readme = readText(rootDir, 'README.md', failures);
|
|
1597
|
+
const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
|
|
1598
|
+
const validationRule = readText(rootDir, 'docs/rules/validation.md', failures);
|
|
1599
|
+
const engineeringRule = readText(rootDir, 'docs/rules/engineering-with-codex-openai.md', failures);
|
|
1600
|
+
const requiredTruthSnippets = [
|
|
1601
|
+
'文档/入口变更先跑 `npm run docs:check`。',
|
|
1602
|
+
'统一 docs/AI guardrail 入口:`node dist/cli/index.js ci check-docs-sync`(产品命令等价于 `mycodemap ci check-docs-sync`)。',
|
|
1603
|
+
'repo-local rules 预检:`python3 scripts/validate-rules.py code --report-only` 只报告,不阻断。',
|
|
1604
|
+
'CI / PR 超窗、fallback 或 false-positive 漂移时,`warn-only / fallback` 不是 hard gate success。'
|
|
1605
|
+
];
|
|
1606
|
+
|
|
1607
|
+
for (const [label, text] of [
|
|
1608
|
+
['README.md validation quick truth', readme],
|
|
1609
|
+
['AI_GUIDE.md validation quick truth', aiGuide],
|
|
1610
|
+
['docs/rules/validation.md validation quick truth', validationRule],
|
|
1611
|
+
['docs/rules/engineering-with-codex-openai.md validation quick truth', engineeringRule]
|
|
1612
|
+
]) {
|
|
1613
|
+
validateSnippets(text, label, requiredTruthSnippets, [], failures);
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1350
1617
|
function validateAssistantDocs(rootDir, failures) {
|
|
1351
1618
|
const assistantGuide = readText(rootDir, 'docs/AI_ASSISTANT_SETUP.md', failures);
|
|
1352
1619
|
const setupGuide = readText(rootDir, 'docs/SETUP_GUIDE.md', failures);
|
|
@@ -1389,6 +1656,7 @@ function validateDocs(rootDir) {
|
|
|
1389
1656
|
validateConfigDocs(rootDir, failures);
|
|
1390
1657
|
validatePluginRuntimeDocs(rootDir, failures);
|
|
1391
1658
|
validateGraphStorageDocs(rootDir, failures);
|
|
1659
|
+
validateEntryDocGovernance(rootDir, failures);
|
|
1392
1660
|
validateAnalyzeDocs(rootDir, failures);
|
|
1393
1661
|
validateHistoryRiskDocs(rootDir, failures);
|
|
1394
1662
|
validateDesignContractDocs(rootDir, failures);
|
|
@@ -1396,6 +1664,7 @@ function validateDocs(rootDir) {
|
|
|
1396
1664
|
validateWorkflowAndDiscoveryDocs(rootDir, failures);
|
|
1397
1665
|
validateProductSpecsDocs(rootDir, failures);
|
|
1398
1666
|
validateGuardrailDocs(rootDir, failures);
|
|
1667
|
+
validateValidationTruthDocs(rootDir, failures);
|
|
1399
1668
|
validateAssistantDocs(rootDir, failures);
|
|
1400
1669
|
|
|
1401
1670
|
if (failures.length > 0) {
|