@mycodemap/mycodemap 0.5.2-beta.1 → 2.0.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 (272) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +138 -854
  3. package/README.zh-CN.md +1096 -0
  4. package/dist/cli/commands/analyze-options.d.ts.map +1 -1
  5. package/dist/cli/commands/analyze-options.js +8 -0
  6. package/dist/cli/commands/analyze-options.js.map +1 -1
  7. package/dist/cli/commands/analyze.d.ts.map +1 -1
  8. package/dist/cli/commands/analyze.js +60 -41
  9. package/dist/cli/commands/analyze.js.map +1 -1
  10. package/dist/cli/commands/benchmark.d.ts +8 -0
  11. package/dist/cli/commands/benchmark.d.ts.map +1 -0
  12. package/dist/cli/commands/benchmark.js +150 -0
  13. package/dist/cli/commands/benchmark.js.map +1 -0
  14. package/dist/cli/commands/deps.d.ts +2 -1
  15. package/dist/cli/commands/deps.d.ts.map +1 -1
  16. package/dist/cli/commands/deps.js +107 -78
  17. package/dist/cli/commands/deps.js.map +1 -1
  18. package/dist/cli/commands/doctor.d.ts +3 -0
  19. package/dist/cli/commands/doctor.d.ts.map +1 -0
  20. package/dist/cli/commands/doctor.js +34 -0
  21. package/dist/cli/commands/doctor.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +7 -2
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +22 -34
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/publish-status.d.ts +31 -0
  27. package/dist/cli/commands/publish-status.d.ts.map +1 -0
  28. package/dist/cli/commands/publish-status.js +101 -0
  29. package/dist/cli/commands/publish-status.js.map +1 -0
  30. package/dist/cli/commands/query.d.ts +1 -0
  31. package/dist/cli/commands/query.d.ts.map +1 -1
  32. package/dist/cli/commands/query.js +123 -140
  33. package/dist/cli/commands/query.js.map +1 -1
  34. package/dist/cli/commands/readiness-gate.d.ts +25 -0
  35. package/dist/cli/commands/readiness-gate.d.ts.map +1 -0
  36. package/dist/cli/commands/readiness-gate.js +197 -0
  37. package/dist/cli/commands/readiness-gate.js.map +1 -0
  38. package/dist/cli/commands/ship/checker.d.ts +4 -9
  39. package/dist/cli/commands/ship/checker.d.ts.map +1 -1
  40. package/dist/cli/commands/ship/checker.js +60 -22
  41. package/dist/cli/commands/ship/checker.js.map +1 -1
  42. package/dist/cli/commands/ship/monitor.d.ts +6 -1
  43. package/dist/cli/commands/ship/monitor.d.ts.map +1 -1
  44. package/dist/cli/commands/ship/monitor.js +223 -46
  45. package/dist/cli/commands/ship/monitor.js.map +1 -1
  46. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
  47. package/dist/cli/commands/ship/pipeline.js +14 -5
  48. package/dist/cli/commands/ship/pipeline.js.map +1 -1
  49. package/dist/cli/commands/ship/rules/quality-rules.d.ts +12 -8
  50. package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -1
  51. package/dist/cli/commands/ship/rules/quality-rules.js +49 -34
  52. package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -1
  53. package/dist/cli/config-loader.js +1 -1
  54. package/dist/cli/config-loader.js.map +1 -1
  55. package/dist/cli/doctor/check-agent.d.ts +3 -0
  56. package/dist/cli/doctor/check-agent.d.ts.map +1 -0
  57. package/dist/cli/doctor/check-agent.js +60 -0
  58. package/dist/cli/doctor/check-agent.js.map +1 -0
  59. package/dist/cli/doctor/check-ghost-commands.d.ts +3 -0
  60. package/dist/cli/doctor/check-ghost-commands.d.ts.map +1 -0
  61. package/dist/cli/doctor/check-ghost-commands.js +86 -0
  62. package/dist/cli/doctor/check-ghost-commands.js.map +1 -0
  63. package/dist/cli/doctor/check-native-deps.d.ts +3 -0
  64. package/dist/cli/doctor/check-native-deps.d.ts.map +1 -0
  65. package/dist/cli/doctor/check-native-deps.js +54 -0
  66. package/dist/cli/doctor/check-native-deps.js.map +1 -0
  67. package/dist/cli/doctor/check-workspace-drift.d.ts +3 -0
  68. package/dist/cli/doctor/check-workspace-drift.d.ts.map +1 -0
  69. package/dist/cli/doctor/check-workspace-drift.js +83 -0
  70. package/dist/cli/doctor/check-workspace-drift.js.map +1 -0
  71. package/dist/cli/doctor/formatter.d.ts +20 -0
  72. package/dist/cli/doctor/formatter.d.ts.map +1 -0
  73. package/dist/cli/doctor/formatter.js +91 -0
  74. package/dist/cli/doctor/formatter.js.map +1 -0
  75. package/dist/cli/doctor/index.d.ts +8 -0
  76. package/dist/cli/doctor/index.d.ts.map +1 -0
  77. package/dist/cli/doctor/index.js +9 -0
  78. package/dist/cli/doctor/index.js.map +1 -0
  79. package/dist/cli/doctor/orchestrator.d.ts +3 -0
  80. package/dist/cli/doctor/orchestrator.d.ts.map +1 -0
  81. package/dist/cli/doctor/orchestrator.js +37 -0
  82. package/dist/cli/doctor/orchestrator.js.map +1 -0
  83. package/dist/cli/doctor/types.d.ts +19 -0
  84. package/dist/cli/doctor/types.d.ts.map +1 -0
  85. package/dist/cli/doctor/types.js +4 -0
  86. package/dist/cli/doctor/types.js.map +1 -0
  87. package/dist/cli/first-run-guide.d.ts.map +1 -1
  88. package/dist/cli/first-run-guide.js +10 -12
  89. package/dist/cli/first-run-guide.js.map +1 -1
  90. package/dist/cli/index.js +80 -21
  91. package/dist/cli/index.js.map +1 -1
  92. package/dist/cli/init/hooks.d.ts +17 -0
  93. package/dist/cli/init/hooks.d.ts.map +1 -0
  94. package/dist/cli/init/hooks.js +220 -0
  95. package/dist/cli/init/hooks.js.map +1 -0
  96. package/dist/cli/init/receipt.d.ts +4 -0
  97. package/dist/cli/init/receipt.d.ts.map +1 -0
  98. package/dist/cli/init/receipt.js +117 -0
  99. package/dist/cli/init/receipt.js.map +1 -0
  100. package/dist/cli/init/reconciler.d.ts +44 -0
  101. package/dist/cli/init/reconciler.d.ts.map +1 -0
  102. package/dist/cli/init/reconciler.js +377 -0
  103. package/dist/cli/init/reconciler.js.map +1 -0
  104. package/dist/cli/init/rule-templates.d.ts +9 -0
  105. package/dist/cli/init/rule-templates.d.ts.map +1 -0
  106. package/dist/cli/init/rule-templates.js +105 -0
  107. package/dist/cli/init/rule-templates.js.map +1 -0
  108. package/dist/cli/init/rules.d.ts +13 -0
  109. package/dist/cli/init/rules.d.ts.map +1 -0
  110. package/dist/cli/init/rules.js +113 -0
  111. package/dist/cli/init/rules.js.map +1 -0
  112. package/dist/cli/interface-contract/commands/analyze.d.ts +3 -0
  113. package/dist/cli/interface-contract/commands/analyze.d.ts.map +1 -0
  114. package/dist/cli/interface-contract/commands/analyze.js +138 -0
  115. package/dist/cli/interface-contract/commands/analyze.js.map +1 -0
  116. package/dist/cli/interface-contract/commands/benchmark.d.ts +3 -0
  117. package/dist/cli/interface-contract/commands/benchmark.d.ts.map +1 -0
  118. package/dist/cli/interface-contract/commands/benchmark.js +107 -0
  119. package/dist/cli/interface-contract/commands/benchmark.js.map +1 -0
  120. package/dist/cli/interface-contract/commands/deps.d.ts +3 -0
  121. package/dist/cli/interface-contract/commands/deps.d.ts.map +1 -0
  122. package/dist/cli/interface-contract/commands/deps.js +129 -0
  123. package/dist/cli/interface-contract/commands/deps.js.map +1 -0
  124. package/dist/cli/interface-contract/commands/doctor.d.ts +3 -0
  125. package/dist/cli/interface-contract/commands/doctor.d.ts.map +1 -0
  126. package/dist/cli/interface-contract/commands/doctor.js +59 -0
  127. package/dist/cli/interface-contract/commands/doctor.js.map +1 -0
  128. package/dist/cli/interface-contract/commands/index.d.ts +9 -0
  129. package/dist/cli/interface-contract/commands/index.d.ts.map +1 -0
  130. package/dist/cli/interface-contract/commands/index.js +18 -0
  131. package/dist/cli/interface-contract/commands/index.js.map +1 -0
  132. package/dist/cli/interface-contract/commands/init.d.ts +3 -0
  133. package/dist/cli/interface-contract/commands/init.d.ts.map +1 -0
  134. package/dist/cli/interface-contract/commands/init.js +87 -0
  135. package/dist/cli/interface-contract/commands/init.js.map +1 -0
  136. package/dist/cli/interface-contract/commands/query.d.ts +3 -0
  137. package/dist/cli/interface-contract/commands/query.d.ts.map +1 -0
  138. package/dist/cli/interface-contract/commands/query.js +185 -0
  139. package/dist/cli/interface-contract/commands/query.js.map +1 -0
  140. package/dist/cli/interface-contract/index.d.ts +22 -0
  141. package/dist/cli/interface-contract/index.d.ts.map +1 -0
  142. package/dist/cli/interface-contract/index.js +41 -0
  143. package/dist/cli/interface-contract/index.js.map +1 -0
  144. package/dist/cli/interface-contract/schema.d.ts +30 -0
  145. package/dist/cli/interface-contract/schema.d.ts.map +1 -0
  146. package/dist/cli/interface-contract/schema.js +72 -0
  147. package/dist/cli/interface-contract/schema.js.map +1 -0
  148. package/dist/cli/interface-contract/types.d.ts +76 -0
  149. package/dist/cli/interface-contract/types.d.ts.map +1 -0
  150. package/dist/cli/interface-contract/types.js +4 -0
  151. package/dist/cli/interface-contract/types.js.map +1 -0
  152. package/dist/cli/output/apply-suggestion.d.ts +12 -0
  153. package/dist/cli/output/apply-suggestion.d.ts.map +1 -0
  154. package/dist/cli/output/apply-suggestion.js +29 -0
  155. package/dist/cli/output/apply-suggestion.js.map +1 -0
  156. package/dist/cli/output/error-codes.d.ts +22 -0
  157. package/dist/cli/output/error-codes.d.ts.map +1 -0
  158. package/dist/cli/output/error-codes.js +82 -0
  159. package/dist/cli/output/error-codes.js.map +1 -0
  160. package/dist/cli/output/errors.d.ts +14 -0
  161. package/dist/cli/output/errors.d.ts.map +1 -0
  162. package/dist/cli/output/errors.js +170 -0
  163. package/dist/cli/output/errors.js.map +1 -0
  164. package/dist/cli/output/index.d.ts +13 -0
  165. package/dist/cli/output/index.d.ts.map +1 -0
  166. package/dist/cli/output/index.js +11 -0
  167. package/dist/cli/output/index.js.map +1 -0
  168. package/dist/cli/output/mode.d.ts +12 -0
  169. package/dist/cli/output/mode.d.ts.map +1 -0
  170. package/dist/cli/output/mode.js +23 -0
  171. package/dist/cli/output/mode.js.map +1 -0
  172. package/dist/cli/output/progress.d.ts +9 -0
  173. package/dist/cli/output/progress.d.ts.map +1 -0
  174. package/dist/cli/output/progress.js +65 -0
  175. package/dist/cli/output/progress.js.map +1 -0
  176. package/dist/cli/output/render.d.ts +11 -0
  177. package/dist/cli/output/render.d.ts.map +1 -0
  178. package/dist/cli/output/render.js +18 -0
  179. package/dist/cli/output/render.js.map +1 -0
  180. package/dist/cli/output/types.d.ts +53 -0
  181. package/dist/cli/output/types.d.ts.map +1 -0
  182. package/dist/cli/output/types.js +14 -0
  183. package/dist/cli/output/types.js.map +1 -0
  184. package/dist/cli/output/wasm-fallback.d.ts +13 -0
  185. package/dist/cli/output/wasm-fallback.d.ts.map +1 -0
  186. package/dist/cli/output/wasm-fallback.js +92 -0
  187. package/dist/cli/output/wasm-fallback.js.map +1 -0
  188. package/dist/cli/paths.d.ts +4 -2
  189. package/dist/cli/paths.d.ts.map +1 -1
  190. package/dist/cli/paths.js +13 -5
  191. package/dist/cli/paths.js.map +1 -1
  192. package/dist/cli/tree-sitter-check.d.ts +6 -1
  193. package/dist/cli/tree-sitter-check.d.ts.map +1 -1
  194. package/dist/cli/tree-sitter-check.js +23 -1
  195. package/dist/cli/tree-sitter-check.js.map +1 -1
  196. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -1
  197. package/dist/infrastructure/storage/adapters/SQLiteStorage.js +2 -2
  198. package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -1
  199. package/dist/infrastructure/storage/adapters/sqlite-loader.d.ts +23 -0
  200. package/dist/infrastructure/storage/adapters/sqlite-loader.d.ts.map +1 -0
  201. package/dist/infrastructure/storage/adapters/sqlite-loader.js +210 -0
  202. package/dist/infrastructure/storage/adapters/sqlite-loader.js.map +1 -0
  203. package/dist/orchestrator/test-linker.d.ts.map +1 -1
  204. package/dist/orchestrator/test-linker.js +5 -36
  205. package/dist/orchestrator/test-linker.js.map +1 -1
  206. package/dist/orchestrator/types.d.ts +2 -0
  207. package/dist/orchestrator/types.d.ts.map +1 -1
  208. package/dist/orchestrator/types.js.map +1 -1
  209. package/dist/parser/implementations/tree-sitter-loader.d.ts +16 -0
  210. package/dist/parser/implementations/tree-sitter-loader.d.ts.map +1 -0
  211. package/dist/parser/implementations/tree-sitter-loader.js +105 -0
  212. package/dist/parser/implementations/tree-sitter-loader.js.map +1 -0
  213. package/dist/parser/implementations/tree-sitter-parser.d.ts +3 -0
  214. package/dist/parser/implementations/tree-sitter-parser.d.ts.map +1 -1
  215. package/dist/parser/implementations/tree-sitter-parser.js +8 -3
  216. package/dist/parser/implementations/tree-sitter-parser.js.map +1 -1
  217. package/dist/server/mcp/schema-adapter.d.ts +45 -0
  218. package/dist/server/mcp/schema-adapter.d.ts.map +1 -0
  219. package/dist/server/mcp/schema-adapter.js +290 -0
  220. package/dist/server/mcp/schema-adapter.js.map +1 -0
  221. package/dist/server/mcp/server.d.ts.map +1 -1
  222. package/dist/server/mcp/server.js +32 -2
  223. package/dist/server/mcp/server.js.map +1 -1
  224. package/docs/AI_ASSISTANT_SETUP.md +173 -14
  225. package/docs/README.md +40 -1
  226. package/docs/SETUP_GUIDE.md +23 -26
  227. package/docs/agents/domain.md +36 -0
  228. package/docs/agents/issue-tracker.md +22 -0
  229. package/docs/agents/triage-labels.md +15 -0
  230. package/docs/ai-guide/COMMANDS.md +125 -13
  231. package/docs/ai-guide/INTEGRATION.md +78 -11
  232. package/docs/ai-guide/OUTPUT.md +295 -2
  233. package/docs/ai-guide/PATTERNS.md +3 -3
  234. package/docs/ai-guide/PROMPTS.md +2 -2
  235. package/docs/ai-guide/QUICKSTART.md +41 -5
  236. package/docs/ai-guide/README.md +9 -9
  237. package/docs/archive/ideation/2026-04-15-executable-architecture-constitution-ideation-archive.md +70 -0
  238. package/docs/archive/ideation/2026-04-20-mycodemap-init-enhancements-ideation-archive.md +109 -0
  239. package/docs/archive/ideation/2026-04-22-harness-rules-entry-docs-optimization-ideation.md +102 -0
  240. package/docs/archive/ideation/2026-04-22-rules-claude-agents-optimization-ideation.md +107 -0
  241. package/docs/archive/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation-archive.md +54 -0
  242. package/docs/brainstorms/2026-04-22-rules-entry-docs-phase1-structure-consolidation-requirements.md +110 -0
  243. package/docs/brainstorms/999.1-mycodemap-init-enhancements-requirements.md +166 -0
  244. package/docs/exec-plans/README.md +3 -0
  245. package/docs/ideation/2026-04-15-executable-architecture-constitution-ideation.md +10 -22
  246. package/docs/ideation/2026-04-20-mycodemap-init-enhancements-ideation.md +51 -0
  247. package/docs/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation.md +114 -0
  248. package/docs/ideation/2026-04-29-ux-install-agent-experience-ideation.md +256 -0
  249. package/docs/lesson-learn/2026-04-19-prerelease-trusted-publishing-fix.md +119 -0
  250. package/docs/lesson-learn/image.png +0 -0
  251. package/docs/plans/2026-04-30-install-guide-and-repo-analyzer-design.md +394 -0
  252. package/docs/rules/README.md +5 -1
  253. package/docs/rules/architecture-guardrails.md +2 -1
  254. package/docs/rules/deployment.md +7 -0
  255. package/docs/rules/engineering-with-codex-openai.md +48 -9
  256. package/docs/rules/harness.md +106 -0
  257. package/docs/rules/pre-release-checklist.md +72 -33
  258. package/docs/rules/release.md +303 -0
  259. package/docs/rules/testing.md +70 -0
  260. package/docs/rules/validation.md +16 -7
  261. package/examples/claude/skills/mycodemap-repo-analyzer/SKILL.md +294 -0
  262. package/examples/claude/skills/mycodemap-repo-analyzer/references/analysis-guide.md +166 -0
  263. package/examples/claude/skills/mycodemap-repo-analyzer/references/module-analysis-guide.md +150 -0
  264. package/mycodemap.config.schema.json +1 -1
  265. package/package.json +9 -6
  266. package/scripts/hooks/templates/commit-msg +38 -0
  267. package/scripts/hooks/templates/pre-commit +224 -0
  268. package/scripts/pre-release-check.js +4 -4
  269. package/scripts/release.sh +1 -1
  270. package/scripts/sync-analyze-docs.js +2 -2
  271. package/scripts/validate-docs.js +395 -29
  272. package/docs/references/tmp.md +0 -527
@@ -1,7 +1,7 @@
1
1
  // [META] since:2026-03 | owner:docs-team | stable:true
2
2
  // [WHY] Validate high-signal documentation facts against the current repository guardrails
3
3
 
4
- import { existsSync, readFileSync } from 'node:fs';
4
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
5
5
  import path from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import { collectAnalyzeDocSyncFailures } from './sync-analyze-docs.js';
@@ -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) {
@@ -81,7 +273,7 @@ function validatePackageScripts(rootDir, failures) {
81
273
  }
82
274
 
83
275
  function validateAnalyzeDocs(rootDir, failures) {
84
- const readme = readText(rootDir, 'README.md', failures);
276
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
85
277
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
86
278
  const claudeGuide = readText(rootDir, 'CLAUDE.md', failures);
87
279
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
@@ -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(
@@ -218,7 +410,7 @@ function validateAnalyzeDocs(rootDir, failures) {
218
410
  }
219
411
 
220
412
  function validateHistoryRiskDocs(rootDir, failures) {
221
- const readme = readText(rootDir, 'README.md', failures);
413
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
222
414
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
223
415
  const claudeGuide = readText(rootDir, 'CLAUDE.md', failures);
224
416
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
@@ -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) {
@@ -321,7 +513,7 @@ function validateHistoryRiskDocs(rootDir, failures) {
321
513
  }
322
514
 
323
515
  function validateDesignContractDocs(rootDir, failures) {
324
- const readme = readText(rootDir, 'README.md', failures);
516
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
325
517
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
326
518
  const claudeGuide = readText(rootDir, 'CLAUDE.md', failures);
327
519
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
@@ -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) {
@@ -643,8 +835,104 @@ function validateDesignContractDocs(rootDir, failures) {
643
835
  }
644
836
  }
645
837
 
838
+ function validateNpmScriptsAreReal(rootDir, failures) {
839
+ const packageJsonText = readText(rootDir, 'package.json', failures);
840
+ if (!packageJsonText) {
841
+ return;
842
+ }
843
+
844
+ let packageJson;
845
+ try {
846
+ packageJson = JSON.parse(packageJsonText);
847
+ } catch {
848
+ failures.push('package.json is not valid JSON — cannot validate npm scripts');
849
+ return;
850
+ }
851
+
852
+ const scripts = packageJson.scripts;
853
+ if (!scripts || typeof scripts !== 'object') {
854
+ return;
855
+ }
856
+
857
+ /** Pattern matching echo stubs like: echo 'dependency-cruiser not installed, run: npm i -D dependency-cruiser' */
858
+ const ECHO_STUB_PATTERN = /^echo\s+['"].*not installed/i;
859
+
860
+ // Check all referenced npm scripts in docs are real (not echo stubs)
861
+ const docsDir = path.join(rootDir, 'docs');
862
+ const githubDir = path.join(rootDir, '.github');
863
+ const npmRunPattern = /npm\s+run\s+([a-zA-Z0-9:_-]+)/g;
864
+
865
+ function scanFileForNpmRun(filePath, label) {
866
+ if (!existsSync(filePath)) {
867
+ return;
868
+ }
869
+
870
+ let content;
871
+ try {
872
+ content = readFileSync(filePath, 'utf8');
873
+ } catch {
874
+ return;
875
+ }
876
+
877
+ let match;
878
+ while ((match = npmRunPattern.exec(content)) !== null) {
879
+ const scriptName = match[1].replace(/[.,;:!?`'"()\[\]{}]+$/, '');
880
+ // Skip known npm lifecycle scripts that don't need to be in package.json
881
+ const npmLifecycleScripts = new Set([
882
+ 'postinstall', 'preinstall', 'prepare', 'prepublish', 'prepublishOnly',
883
+ 'prerestart', 'postrestart', 'prestart', 'poststart', 'prestop', 'poststop',
884
+ 'pretest', 'posttest', 'preversion', 'postversion',
885
+ ]);
886
+ if (npmLifecycleScripts.has(scriptName)) {
887
+ continue;
888
+ }
889
+
890
+ // Skip if not a defined script
891
+ if (!(scriptName in scripts)) {
892
+ failures.push(`[docs-script-ghost] ${label} references undefined npm script: "npm run ${scriptName}"`);
893
+ continue;
894
+ }
895
+
896
+ const scriptValue = scripts[scriptName];
897
+ if (typeof scriptValue === 'string' && ECHO_STUB_PATTERN.test(scriptValue)) {
898
+ failures.push(`[docs-script-stub] ${label} references npm script "${scriptName}" which is an echo stub, not a real command`);
899
+ }
900
+ }
901
+ }
902
+
903
+ function scanDirectory(dirPath, labelPrefix) {
904
+ if (!existsSync(dirPath)) {
905
+ return;
906
+ }
907
+
908
+ // Walk directory recursively
909
+ function walk(currentPath, relativePath) {
910
+ const items = readdirSync(currentPath, { withFileTypes: true });
911
+ for (const item of items) {
912
+ const itemPath = path.join(currentPath, item.name);
913
+ const itemRelPath = path.join(relativePath, item.name);
914
+ if (item.isDirectory()) {
915
+ // Skip historical artifact directories
916
+ if (item.name === 'exec-plans' || item.name === 'ideation' || item.name === 'references' || item.name === 'archive') {
917
+ continue;
918
+ }
919
+ walk(itemPath, itemRelPath);
920
+ } else if (item.isFile() && item.name.endsWith('.md')) {
921
+ scanFileForNpmRun(itemPath, `${labelPrefix}/${itemRelPath}`);
922
+ }
923
+ }
924
+ }
925
+ walk(dirPath, '');
926
+ }
927
+
928
+ scanDirectory(docsDir, 'docs');
929
+ scanDirectory(githubDir, '.github');
930
+ // Note: docs/exec-plans/ and docs/ideation/ contain historical artifacts
931
+ // that reference scripts from their time period — skip them
932
+ }
933
+
646
934
  function validatePositioningBaselineDocs(rootDir, failures) {
647
- const readme = readText(rootDir, 'README.md', failures);
935
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
648
936
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
649
937
  const aiGuideIndex = readText(rootDir, 'docs/ai-guide/README.md', failures);
650
938
  const outputGuide = readText(rootDir, 'docs/ai-guide/OUTPUT.md', failures);
@@ -652,7 +940,7 @@ function validatePositioningBaselineDocs(rootDir, failures) {
652
940
 
653
941
  if (readme) {
654
942
  const requiredReadmeSnippets = [
655
- 'AI-first 代码地图工具',
943
+ 'AI-Native',
656
944
  'AI/Agent 是主要消费者',
657
945
  '`server`、`watch`、`report`、`logs` 已从 public CLI 移除,并在调用时给出迁移提示。'
658
946
  ];
@@ -671,8 +959,8 @@ function validatePositioningBaselineDocs(rootDir, failures) {
671
959
 
672
960
  if (aiGuide) {
673
961
  const requiredAiGuideSnippets = [
674
- 'CodeMap 是一个 AI-first 代码地图工具',
675
- '当前 CLI 过渡现实',
962
+ 'CodeMap 是一个 AI-Native 优先',
963
+ 'JSON/NDJSON 默认输出',
676
964
  '`Server Layer` 是内部架构层,不等于公共 `mycodemap server` 命令',
677
965
  '后者已从 public CLI 移除'
678
966
  ];
@@ -684,7 +972,7 @@ function validatePositioningBaselineDocs(rootDir, failures) {
684
972
 
685
973
  if (aiGuideIndex) {
686
974
  const requiredIndexSnippets = [
687
- 'AI-first 代码地图工具',
975
+ 'AI-Native 优先、人类友好的代码架构治理基础设施',
688
976
  'AI/Agent 是主要消费者',
689
977
  '`server`、`watch`、`report`、`logs` 已从 public CLI 移除'
690
978
  ];
@@ -717,7 +1005,7 @@ function validatePositioningBaselineDocs(rootDir, failures) {
717
1005
  }
718
1006
 
719
1007
  function validateCliSurfaceDocs(rootDir, failures) {
720
- const readme = readText(rootDir, 'README.md', failures);
1008
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
721
1009
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
722
1010
  const aiGuideIndex = readText(rootDir, 'docs/ai-guide/README.md', failures);
723
1011
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
@@ -805,23 +1093,30 @@ function validateCliSurfaceDocs(rootDir, failures) {
805
1093
  }
806
1094
 
807
1095
  function validateConfigDocs(rootDir, failures) {
808
- const readme = readText(rootDir, 'README.md', failures);
1096
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
1097
+ const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
809
1098
  const setupGuide = readText(rootDir, 'docs/SETUP_GUIDE.md', failures);
810
1099
  const assistantGuide = readText(rootDir, 'docs/AI_ASSISTANT_SETUP.md', failures);
1100
+ const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
1101
+ const quickstartGuide = readText(rootDir, 'docs/ai-guide/QUICKSTART.md', failures);
811
1102
 
812
1103
  if (readme) {
813
1104
  validateSnippets(
814
1105
  readme,
815
1106
  'README.md config contract',
816
1107
  [
817
- '执行后会在项目根目录生成 `mycodemap.config.json` 配置文件。',
818
- '通过 `mycodemap init` 生成的 `mycodemap.config.json` 配置文件支持以下选项:',
1108
+ '执行后会收敛 `.mycodemap/config.json`,并把 machine-readable receipt 写入 `.mycodemap/status/init-last.json`。',
1109
+ '`init` 还会同步 `.mycodemap/hooks/` 与 `.mycodemap/rules/`;但不会自动改写团队自有的 `CLAUDE.md` / `AGENTS.md`,只会在 receipt 中输出可复制片段。',
1110
+ '通过 `mycodemap init` 收敛的 canonical 配置文件是 `.mycodemap/config.json`',
819
1111
  '"$schema": "https://mycodemap.dev/schema/config.json"',
820
1112
  '"mode": "hybrid"',
821
1113
  '"plugins": {',
1114
+ '"outputPath": ".mycodemap/storage"',
822
1115
  '| `plugins.builtInPlugins` | `boolean` | 是否启用内置插件 | `true` |'
823
1116
  ],
824
1117
  [
1118
+ '执行后会在项目根目录生成 `mycodemap.config.json` 配置文件。',
1119
+ '通过 `mycodemap init` 生成的 `mycodemap.config.json` 配置文件支持以下选项:',
825
1120
  '执行后会在项目根目录生成 `codemap.config.json` 配置文件。',
826
1121
  '通过 `codemap init` 生成的 `codemap.config.json` 配置文件支持以下选项:',
827
1122
  '"$schema": "https://codemap.dev/schema.json"',
@@ -831,18 +1126,33 @@ function validateConfigDocs(rootDir, failures) {
831
1126
  );
832
1127
  }
833
1128
 
1129
+ if (aiGuide) {
1130
+ validateSnippets(
1131
+ aiGuide,
1132
+ 'AI_GUIDE.md init contract',
1133
+ [
1134
+ '| "需要先把项目初始化到 canonical `.mycodemap/` 工作区" | `init --interactive` → 确认 receipt → `init --yes` |'
1135
+ ],
1136
+ [],
1137
+ failures
1138
+ );
1139
+ }
1140
+
834
1141
  if (setupGuide) {
835
1142
  validateSnippets(
836
1143
  setupGuide,
837
1144
  'docs/SETUP_GUIDE.md config contract',
838
1145
  [
839
- '生成的配置文件 `mycodemap.config.json`:',
1146
+ '执行后会收敛 canonical 配置 `.mycodemap/config.json`,并把 receipt 写入 `.mycodemap/status/init-last.json`。',
1147
+ '生成的 canonical 配置文件 `.mycodemap/config.json`:',
840
1148
  '"include": ["src/**/*.ts"]',
841
1149
  '"watch": false',
842
1150
  '"plugins": {',
1151
+ '"outputPath": ".mycodemap/storage"',
843
1152
  '| `plugins.debug` | boolean | `false` | 是否输出插件调试日志 |'
844
1153
  ],
845
1154
  [
1155
+ '会询问以下问题:',
846
1156
  '"include": ["src/**/*"]'
847
1157
  ],
848
1158
  failures
@@ -854,7 +1164,9 @@ function validateConfigDocs(rootDir, failures) {
854
1164
  assistantGuide,
855
1165
  'docs/AI_ASSISTANT_SETUP.md config contract',
856
1166
  [
857
- '- `mycodemap.config.json` - CodeMap 配置文件'
1167
+ '- `.mycodemap/config.json` - CodeMap canonical 配置文件',
1168
+ '- `.mycodemap/status/init-last.json` - init receipt / managed asset ledger',
1169
+ '- `.mycodemap/rules/` - 通用 AI guardrails rules bundle(需手动引用到 `CLAUDE.md` / `AGENTS.md`)'
858
1170
  ],
859
1171
  [
860
1172
  '- `codemap.config.json` - CodeMap 配置文件'
@@ -862,10 +1174,38 @@ function validateConfigDocs(rootDir, failures) {
862
1174
  failures
863
1175
  );
864
1176
  }
1177
+
1178
+ if (commandsGuide) {
1179
+ validateSnippets(
1180
+ commandsGuide,
1181
+ 'docs/ai-guide/COMMANDS.md init contract',
1182
+ [
1183
+ '### init - 收敛项目状态',
1184
+ '`init` 会收敛 `.mycodemap/config.json`、`.mycodemap/status/init-last.json`、`.mycodemap/hooks/` 与 `.mycodemap/rules/`',
1185
+ '`init` 不会自动改写 `CLAUDE.md` 或 `AGENTS.md`,只会输出可复制的 rules 引用片段'
1186
+ ],
1187
+ [],
1188
+ failures
1189
+ );
1190
+ }
1191
+
1192
+ if (quickstartGuide) {
1193
+ validateSnippets(
1194
+ quickstartGuide,
1195
+ 'docs/ai-guide/QUICKSTART.md init contract',
1196
+ [
1197
+ 'node dist/cli/index.js init --interactive',
1198
+ 'node dist/cli/index.js init --yes',
1199
+ '`init` 的 receipt 会把 `done`、`manual action`、`conflict`、`skipped` 分开显示'
1200
+ ],
1201
+ [],
1202
+ failures
1203
+ );
1204
+ }
865
1205
  }
866
1206
 
867
1207
  function validatePluginRuntimeDocs(rootDir, failures) {
868
- const readme = readText(rootDir, 'README.md', failures);
1208
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
869
1209
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
870
1210
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
871
1211
  const outputGuide = readText(rootDir, 'docs/ai-guide/OUTPUT.md', failures);
@@ -903,7 +1243,7 @@ function validatePluginRuntimeDocs(rootDir, failures) {
903
1243
  commandsGuide,
904
1244
  'docs/ai-guide/COMMANDS.md plugin runtime contract',
905
1245
  [
906
- '`generate` 不提供独立 `--plugin` flags;插件通过 `mycodemap.config.json` 的 `plugins` 段声明。',
1246
+ '`generate` 不提供独立 `--plugin` flags;插件通过 `.mycodemap/config.json` 的 `plugins` 段声明。',
907
1247
  '`AI_MAP.md` 会增加 `Plugin Summary`,`codemap.json` 会增加 `pluginReport`'
908
1248
  ],
909
1249
  [],
@@ -940,7 +1280,7 @@ function validatePluginRuntimeDocs(rootDir, failures) {
940
1280
  }
941
1281
 
942
1282
  function validateGraphStorageDocs(rootDir, failures) {
943
- const readme = readText(rootDir, 'README.md', failures);
1283
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
944
1284
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
945
1285
  const claudeGuide = readText(rootDir, 'CLAUDE.md', failures);
946
1286
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
@@ -970,7 +1310,7 @@ function validateGraphStorageDocs(rootDir, failures) {
970
1310
  aiGuide,
971
1311
  'AI_GUIDE.md graph storage contract',
972
1312
  [
973
- '| "需要切换/排查图存储后端" | 编辑 `mycodemap.config.json.storage` → 运行 `generate` / `export` |',
1313
+ '| "需要切换/排查图存储后端" | 编辑 `.mycodemap/config.json` 的 `storage` → 运行 `generate` / `export` |',
974
1314
  '`generate` 会写入配置的图存储后端;`export` 与内部 `Server Layer` handler 会读取同一份后端数据。',
975
1315
  '`neo4j` 与 `kuzudb` 已不再是正式支持的 backend;旧配置会暴露显式迁移错误,不会静默 fallback。',
976
1316
  '`storage.type = "auto"` 当前优先选择 `sqlite`;若运行时缺少 `better-sqlite3` 或 Node.js `<20` 导致 SQLite 不可用,则 warning 后回退到 `filesystem`。'
@@ -980,7 +1320,7 @@ function validateGraphStorageDocs(rootDir, failures) {
980
1320
  );
981
1321
  }
982
1322
 
983
- // NOTE: CLAUDE.md 已演进为执行手册(路由层),graph storage 合约已移至 AI_GUIDE.md / docs/ai-guide/
1323
+ // NOTE: CLAUDE.md 已演进为入口路由,graph storage 合约已移至 AI_GUIDE.md / docs/ai-guide/
984
1324
  // 相关检查已下放至 AI_GUIDE.md 与 docs/ai-guide/*.md 的 validateSnippets 中
985
1325
 
986
1326
  if (commandsGuide) {
@@ -988,8 +1328,8 @@ function validateGraphStorageDocs(rootDir, failures) {
988
1328
  commandsGuide,
989
1329
  'docs/ai-guide/COMMANDS.md graph storage contract',
990
1330
  [
991
- '`generate` 会读取 `mycodemap.config.json.storage`,并把 CodeGraph 写入所选后端。',
992
- '`export json|graphml|dot` 会从 `mycodemap.config.json.storage` 指定的后端读取 CodeGraph。',
1331
+ '`generate` 会读取 `.mycodemap/config.json` 的 `storage` 段,并把 CodeGraph 写入所选后端。',
1332
+ '`export json|graphml|dot` 会从 `.mycodemap/config.json` 的 `storage` 段指定后端读取 CodeGraph。',
993
1333
  '图存储后端收口不等于重新开放公共 `mycodemap server` 产品面;`Server Layer` 仍是内部层。'
994
1334
  ],
995
1335
  [],
@@ -1003,7 +1343,7 @@ function validateGraphStorageDocs(rootDir, failures) {
1003
1343
  'docs/ai-guide/QUICKSTART.md graph storage contract',
1004
1344
  [
1005
1345
  'stdout 还会显示当前写入的 `MVP3 Storage (...)`',
1006
- '| "需要切换/排查图存储后端" | 编辑 `mycodemap.config.json.storage` 后运行 `generate` | `export json` 验证是否能从同一 backend 读回 | 文本 + 机器可读 |'
1346
+ '| "需要切换/排查图存储后端" | 编辑 `.mycodemap/config.json` 的 `storage` 段后运行 `generate` | `export json` 验证是否能从同一 backend 读回 | 文本 + 机器可读 |'
1007
1347
  ],
1008
1348
  [],
1009
1349
  failures
@@ -1031,7 +1371,7 @@ function validateGraphStorageDocs(rootDir, failures) {
1031
1371
  validationRule,
1032
1372
  'docs/rules/validation.md graph storage guardrail',
1033
1373
  [
1034
- '若改动涉及 `mycodemap.config.json.storage` 或图数据库适配器',
1374
+ '若改动涉及 `.mycodemap/config.json` 的 `storage` 段或图数据库适配器',
1035
1375
  'schema / README / AI 文档没同步',
1036
1376
  '旧的 `neo4j` / `kuzudb` 配置已经不受支持,但文档还把它写成正式 backend',
1037
1377
  'Node.js `>=20`',
@@ -1050,6 +1390,7 @@ function validateGraphStorageDocs(rootDir, failures) {
1050
1390
  '"storage"',
1051
1391
  '"enum": ["filesystem", "sqlite", "memory", "auto"]',
1052
1392
  '"outputPath"',
1393
+ '".mycodemap/storage"',
1053
1394
  '"databasePath"',
1054
1395
  '"autoThresholds"'
1055
1396
  ],
@@ -1086,7 +1427,7 @@ function validateTestingDocs(rootDir, failures) {
1086
1427
  }
1087
1428
 
1088
1429
  function validateWorkflowAndDiscoveryDocs(rootDir, failures) {
1089
- const readme = readText(rootDir, 'README.md', failures);
1430
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
1090
1431
  const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
1091
1432
  const commandsGuide = readText(rootDir, 'docs/ai-guide/COMMANDS.md', failures);
1092
1433
  const outputGuide = readText(rootDir, 'docs/ai-guide/OUTPUT.md', failures);
@@ -1286,7 +1627,7 @@ function validateProductSpecsDocs(rootDir, failures) {
1286
1627
  }
1287
1628
 
1288
1629
  function validateGuardrailDocs(rootDir, failures) {
1289
- const readme = readText(rootDir, 'README.md', failures);
1630
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
1290
1631
  const engineeringRule = readText(rootDir, 'docs/rules/engineering-with-codex-openai.md', failures);
1291
1632
  const validationRule = readText(rootDir, 'docs/rules/validation.md', failures);
1292
1633
  const ciWorkflow = readText(rootDir, '.github/workflows/ci-gateway.yml', failures);
@@ -1347,6 +1688,28 @@ function validateGuardrailDocs(rootDir, failures) {
1347
1688
  }
1348
1689
  }
1349
1690
 
1691
+ function validateValidationTruthDocs(rootDir, failures) {
1692
+ const readme = readText(rootDir, 'README.zh-CN.md', failures) || readText(rootDir, 'README.md', failures);
1693
+ const aiGuide = readText(rootDir, 'AI_GUIDE.md', failures);
1694
+ const validationRule = readText(rootDir, 'docs/rules/validation.md', failures);
1695
+ const engineeringRule = readText(rootDir, 'docs/rules/engineering-with-codex-openai.md', failures);
1696
+ const requiredTruthSnippets = [
1697
+ '文档/入口变更先跑 `npm run docs:check`。',
1698
+ '统一 docs/AI guardrail 入口:`node dist/cli/index.js ci check-docs-sync`(产品命令等价于 `mycodemap ci check-docs-sync`)。',
1699
+ 'repo-local rules 预检:`python3 scripts/validate-rules.py code --report-only` 只报告,不阻断。',
1700
+ 'CI / PR 超窗、fallback 或 false-positive 漂移时,`warn-only / fallback` 不是 hard gate success。'
1701
+ ];
1702
+
1703
+ for (const [label, text] of [
1704
+ ['README.md validation quick truth', readme],
1705
+ ['AI_GUIDE.md validation quick truth', aiGuide],
1706
+ ['docs/rules/validation.md validation quick truth', validationRule],
1707
+ ['docs/rules/engineering-with-codex-openai.md validation quick truth', engineeringRule]
1708
+ ]) {
1709
+ validateSnippets(text, label, requiredTruthSnippets, [], failures);
1710
+ }
1711
+ }
1712
+
1350
1713
  function validateAssistantDocs(rootDir, failures) {
1351
1714
  const assistantGuide = readText(rootDir, 'docs/AI_ASSISTANT_SETUP.md', failures);
1352
1715
  const setupGuide = readText(rootDir, 'docs/SETUP_GUIDE.md', failures);
@@ -1384,11 +1747,13 @@ function validateDocs(rootDir) {
1384
1747
  const failures = [];
1385
1748
 
1386
1749
  validatePackageScripts(rootDir, failures);
1750
+ validateNpmScriptsAreReal(rootDir, failures);
1387
1751
  validatePositioningBaselineDocs(rootDir, failures);
1388
1752
  validateCliSurfaceDocs(rootDir, failures);
1389
1753
  validateConfigDocs(rootDir, failures);
1390
1754
  validatePluginRuntimeDocs(rootDir, failures);
1391
1755
  validateGraphStorageDocs(rootDir, failures);
1756
+ validateEntryDocGovernance(rootDir, failures);
1392
1757
  validateAnalyzeDocs(rootDir, failures);
1393
1758
  validateHistoryRiskDocs(rootDir, failures);
1394
1759
  validateDesignContractDocs(rootDir, failures);
@@ -1396,6 +1761,7 @@ function validateDocs(rootDir) {
1396
1761
  validateWorkflowAndDiscoveryDocs(rootDir, failures);
1397
1762
  validateProductSpecsDocs(rootDir, failures);
1398
1763
  validateGuardrailDocs(rootDir, failures);
1764
+ validateValidationTruthDocs(rootDir, failures);
1399
1765
  validateAssistantDocs(rootDir, failures);
1400
1766
 
1401
1767
  if (failures.length > 0) {