@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.
Files changed (96) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +84 -10
  3. package/dist/cli/commands/init.d.ts +7 -2
  4. package/dist/cli/commands/init.d.ts.map +1 -1
  5. package/dist/cli/commands/init.js +22 -34
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/cli/commands/publish-status.d.ts +31 -0
  8. package/dist/cli/commands/publish-status.d.ts.map +1 -0
  9. package/dist/cli/commands/publish-status.js +101 -0
  10. package/dist/cli/commands/publish-status.js.map +1 -0
  11. package/dist/cli/commands/readiness-gate.d.ts +25 -0
  12. package/dist/cli/commands/readiness-gate.d.ts.map +1 -0
  13. package/dist/cli/commands/readiness-gate.js +197 -0
  14. package/dist/cli/commands/readiness-gate.js.map +1 -0
  15. package/dist/cli/commands/ship/checker.d.ts +4 -9
  16. package/dist/cli/commands/ship/checker.d.ts.map +1 -1
  17. package/dist/cli/commands/ship/checker.js +60 -22
  18. package/dist/cli/commands/ship/checker.js.map +1 -1
  19. package/dist/cli/commands/ship/monitor.d.ts +6 -1
  20. package/dist/cli/commands/ship/monitor.d.ts.map +1 -1
  21. package/dist/cli/commands/ship/monitor.js +223 -46
  22. package/dist/cli/commands/ship/monitor.js.map +1 -1
  23. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
  24. package/dist/cli/commands/ship/pipeline.js +14 -5
  25. package/dist/cli/commands/ship/pipeline.js.map +1 -1
  26. package/dist/cli/commands/ship/rules/quality-rules.d.ts +12 -8
  27. package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -1
  28. package/dist/cli/commands/ship/rules/quality-rules.js +49 -34
  29. package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -1
  30. package/dist/cli/config-loader.js +1 -1
  31. package/dist/cli/config-loader.js.map +1 -1
  32. package/dist/cli/first-run-guide.d.ts.map +1 -1
  33. package/dist/cli/first-run-guide.js +10 -12
  34. package/dist/cli/first-run-guide.js.map +1 -1
  35. package/dist/cli/index.js +8 -1
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/init/hooks.d.ts +17 -0
  38. package/dist/cli/init/hooks.d.ts.map +1 -0
  39. package/dist/cli/init/hooks.js +220 -0
  40. package/dist/cli/init/hooks.js.map +1 -0
  41. package/dist/cli/init/receipt.d.ts +4 -0
  42. package/dist/cli/init/receipt.d.ts.map +1 -0
  43. package/dist/cli/init/receipt.js +117 -0
  44. package/dist/cli/init/receipt.js.map +1 -0
  45. package/dist/cli/init/reconciler.d.ts +44 -0
  46. package/dist/cli/init/reconciler.d.ts.map +1 -0
  47. package/dist/cli/init/reconciler.js +377 -0
  48. package/dist/cli/init/reconciler.js.map +1 -0
  49. package/dist/cli/init/rule-templates.d.ts +9 -0
  50. package/dist/cli/init/rule-templates.d.ts.map +1 -0
  51. package/dist/cli/init/rule-templates.js +105 -0
  52. package/dist/cli/init/rule-templates.js.map +1 -0
  53. package/dist/cli/init/rules.d.ts +13 -0
  54. package/dist/cli/init/rules.d.ts.map +1 -0
  55. package/dist/cli/init/rules.js +113 -0
  56. package/dist/cli/init/rules.js.map +1 -0
  57. package/dist/cli/paths.d.ts +4 -2
  58. package/dist/cli/paths.d.ts.map +1 -1
  59. package/dist/cli/paths.js +13 -5
  60. package/dist/cli/paths.js.map +1 -1
  61. package/dist/orchestrator/test-linker.d.ts.map +1 -1
  62. package/dist/orchestrator/test-linker.js +5 -36
  63. package/dist/orchestrator/test-linker.js.map +1 -1
  64. package/docs/AI_ASSISTANT_SETUP.md +4 -2
  65. package/docs/SETUP_GUIDE.md +12 -12
  66. package/docs/agents/domain.md +36 -0
  67. package/docs/agents/issue-tracker.md +22 -0
  68. package/docs/agents/triage-labels.md +15 -0
  69. package/docs/ai-guide/COMMANDS.md +57 -3
  70. package/docs/ai-guide/INTEGRATION.md +1 -1
  71. package/docs/ai-guide/PATTERNS.md +3 -3
  72. package/docs/ai-guide/QUICKSTART.md +13 -4
  73. package/docs/ai-guide/README.md +7 -7
  74. package/docs/archive/ideation/2026-04-22-harness-rules-entry-docs-optimization-ideation.md +102 -0
  75. package/docs/archive/ideation/2026-04-22-rules-claude-agents-optimization-ideation.md +107 -0
  76. package/docs/brainstorms/2026-04-22-rules-entry-docs-phase1-structure-consolidation-requirements.md +110 -0
  77. package/docs/brainstorms/999.1-mycodemap-init-enhancements-requirements.md +166 -0
  78. package/docs/exec-plans/README.md +3 -0
  79. package/docs/ideation/2026-04-20-mycodemap-init-enhancements-ideation.md +96 -0
  80. package/docs/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation.md +119 -0
  81. package/docs/lesson-learn/2026-04-19-prerelease-trusted-publishing-fix.md +119 -0
  82. package/docs/lesson-learn/image.png +0 -0
  83. package/docs/rules/README.md +4 -1
  84. package/docs/rules/deployment.md +7 -0
  85. package/docs/rules/engineering-with-codex-openai.md +47 -8
  86. package/docs/rules/pre-release-checklist.md +44 -33
  87. package/docs/rules/release.md +303 -0
  88. package/docs/rules/testing.md +19 -0
  89. package/docs/rules/validation.md +16 -7
  90. package/mycodemap.config.schema.json +1 -1
  91. package/package.json +3 -3
  92. package/scripts/hooks/templates/commit-msg +38 -0
  93. package/scripts/hooks/templates/pre-commit +224 -0
  94. package/scripts/pre-release-check.js +4 -4
  95. package/scripts/release.sh +1 -1
  96. package/scripts/validate-docs.js +283 -14
@@ -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 已演进为执行手册(路由层),analyze 命令指南已移至 AI_GUIDE.md / docs/ai-guide/
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 已演进为执行手册(路由层),history 风险基线已移至 AI_GUIDE.md / docs/ai-guide/
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 已演进为执行手册(路由层),design 检索指南已移至 AI_GUIDE.md / docs/ai-guide/
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
- '执行后会在项目根目录生成 `mycodemap.config.json` 配置文件。',
818
- '通过 `mycodemap init` 生成的 `mycodemap.config.json` 配置文件支持以下选项:',
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
- '生成的配置文件 `mycodemap.config.json`:',
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
- '- `mycodemap.config.json` - CodeMap 配置文件'
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;插件通过 `mycodemap.config.json` 的 `plugins` 段声明。',
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
- '| "需要切换/排查图存储后端" | 编辑 `mycodemap.config.json.storage` → 运行 `generate` / `export` |',
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 已演进为执行手册(路由层),graph storage 合约已移至 AI_GUIDE.md / docs/ai-guide/
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` 会读取 `mycodemap.config.json.storage`,并把 CodeGraph 写入所选后端。',
992
- '`export json|graphml|dot` 会从 `mycodemap.config.json.storage` 指定的后端读取 CodeGraph。',
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
- '| "需要切换/排查图存储后端" | 编辑 `mycodemap.config.json.storage` 后运行 `generate` | `export json` 验证是否能从同一 backend 读回 | 文本 + 机器可读 |'
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
- '若改动涉及 `mycodemap.config.json.storage` 或图数据库适配器',
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) {