@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.
- package/CHANGELOG.md +32 -0
- package/README.md +138 -854
- package/README.zh-CN.md +1096 -0
- package/dist/cli/commands/analyze-options.d.ts.map +1 -1
- package/dist/cli/commands/analyze-options.js +8 -0
- package/dist/cli/commands/analyze-options.js.map +1 -1
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +60 -41
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/benchmark.d.ts +8 -0
- package/dist/cli/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/commands/benchmark.js +150 -0
- package/dist/cli/commands/benchmark.js.map +1 -0
- package/dist/cli/commands/deps.d.ts +2 -1
- package/dist/cli/commands/deps.d.ts.map +1 -1
- package/dist/cli/commands/deps.js +107 -78
- package/dist/cli/commands/deps.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +34 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- 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/query.d.ts +1 -0
- package/dist/cli/commands/query.d.ts.map +1 -1
- package/dist/cli/commands/query.js +123 -140
- package/dist/cli/commands/query.js.map +1 -1
- 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/doctor/check-agent.d.ts +3 -0
- package/dist/cli/doctor/check-agent.d.ts.map +1 -0
- package/dist/cli/doctor/check-agent.js +60 -0
- package/dist/cli/doctor/check-agent.js.map +1 -0
- package/dist/cli/doctor/check-ghost-commands.d.ts +3 -0
- package/dist/cli/doctor/check-ghost-commands.d.ts.map +1 -0
- package/dist/cli/doctor/check-ghost-commands.js +86 -0
- package/dist/cli/doctor/check-ghost-commands.js.map +1 -0
- package/dist/cli/doctor/check-native-deps.d.ts +3 -0
- package/dist/cli/doctor/check-native-deps.d.ts.map +1 -0
- package/dist/cli/doctor/check-native-deps.js +54 -0
- package/dist/cli/doctor/check-native-deps.js.map +1 -0
- package/dist/cli/doctor/check-workspace-drift.d.ts +3 -0
- package/dist/cli/doctor/check-workspace-drift.d.ts.map +1 -0
- package/dist/cli/doctor/check-workspace-drift.js +83 -0
- package/dist/cli/doctor/check-workspace-drift.js.map +1 -0
- package/dist/cli/doctor/formatter.d.ts +20 -0
- package/dist/cli/doctor/formatter.d.ts.map +1 -0
- package/dist/cli/doctor/formatter.js +91 -0
- package/dist/cli/doctor/formatter.js.map +1 -0
- package/dist/cli/doctor/index.d.ts +8 -0
- package/dist/cli/doctor/index.d.ts.map +1 -0
- package/dist/cli/doctor/index.js +9 -0
- package/dist/cli/doctor/index.js.map +1 -0
- package/dist/cli/doctor/orchestrator.d.ts +3 -0
- package/dist/cli/doctor/orchestrator.d.ts.map +1 -0
- package/dist/cli/doctor/orchestrator.js +37 -0
- package/dist/cli/doctor/orchestrator.js.map +1 -0
- package/dist/cli/doctor/types.d.ts +19 -0
- package/dist/cli/doctor/types.d.ts.map +1 -0
- package/dist/cli/doctor/types.js +4 -0
- package/dist/cli/doctor/types.js.map +1 -0
- 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 +80 -21
- 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/interface-contract/commands/analyze.d.ts +3 -0
- package/dist/cli/interface-contract/commands/analyze.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/analyze.js +138 -0
- package/dist/cli/interface-contract/commands/analyze.js.map +1 -0
- package/dist/cli/interface-contract/commands/benchmark.d.ts +3 -0
- package/dist/cli/interface-contract/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/benchmark.js +107 -0
- package/dist/cli/interface-contract/commands/benchmark.js.map +1 -0
- package/dist/cli/interface-contract/commands/deps.d.ts +3 -0
- package/dist/cli/interface-contract/commands/deps.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/deps.js +129 -0
- package/dist/cli/interface-contract/commands/deps.js.map +1 -0
- package/dist/cli/interface-contract/commands/doctor.d.ts +3 -0
- package/dist/cli/interface-contract/commands/doctor.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/doctor.js +59 -0
- package/dist/cli/interface-contract/commands/doctor.js.map +1 -0
- package/dist/cli/interface-contract/commands/index.d.ts +9 -0
- package/dist/cli/interface-contract/commands/index.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/index.js +18 -0
- package/dist/cli/interface-contract/commands/index.js.map +1 -0
- package/dist/cli/interface-contract/commands/init.d.ts +3 -0
- package/dist/cli/interface-contract/commands/init.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/init.js +87 -0
- package/dist/cli/interface-contract/commands/init.js.map +1 -0
- package/dist/cli/interface-contract/commands/query.d.ts +3 -0
- package/dist/cli/interface-contract/commands/query.d.ts.map +1 -0
- package/dist/cli/interface-contract/commands/query.js +185 -0
- package/dist/cli/interface-contract/commands/query.js.map +1 -0
- package/dist/cli/interface-contract/index.d.ts +22 -0
- package/dist/cli/interface-contract/index.d.ts.map +1 -0
- package/dist/cli/interface-contract/index.js +41 -0
- package/dist/cli/interface-contract/index.js.map +1 -0
- package/dist/cli/interface-contract/schema.d.ts +30 -0
- package/dist/cli/interface-contract/schema.d.ts.map +1 -0
- package/dist/cli/interface-contract/schema.js +72 -0
- package/dist/cli/interface-contract/schema.js.map +1 -0
- package/dist/cli/interface-contract/types.d.ts +76 -0
- package/dist/cli/interface-contract/types.d.ts.map +1 -0
- package/dist/cli/interface-contract/types.js +4 -0
- package/dist/cli/interface-contract/types.js.map +1 -0
- package/dist/cli/output/apply-suggestion.d.ts +12 -0
- package/dist/cli/output/apply-suggestion.d.ts.map +1 -0
- package/dist/cli/output/apply-suggestion.js +29 -0
- package/dist/cli/output/apply-suggestion.js.map +1 -0
- package/dist/cli/output/error-codes.d.ts +22 -0
- package/dist/cli/output/error-codes.d.ts.map +1 -0
- package/dist/cli/output/error-codes.js +82 -0
- package/dist/cli/output/error-codes.js.map +1 -0
- package/dist/cli/output/errors.d.ts +14 -0
- package/dist/cli/output/errors.d.ts.map +1 -0
- package/dist/cli/output/errors.js +170 -0
- package/dist/cli/output/errors.js.map +1 -0
- package/dist/cli/output/index.d.ts +13 -0
- package/dist/cli/output/index.d.ts.map +1 -0
- package/dist/cli/output/index.js +11 -0
- package/dist/cli/output/index.js.map +1 -0
- package/dist/cli/output/mode.d.ts +12 -0
- package/dist/cli/output/mode.d.ts.map +1 -0
- package/dist/cli/output/mode.js +23 -0
- package/dist/cli/output/mode.js.map +1 -0
- package/dist/cli/output/progress.d.ts +9 -0
- package/dist/cli/output/progress.d.ts.map +1 -0
- package/dist/cli/output/progress.js +65 -0
- package/dist/cli/output/progress.js.map +1 -0
- package/dist/cli/output/render.d.ts +11 -0
- package/dist/cli/output/render.d.ts.map +1 -0
- package/dist/cli/output/render.js +18 -0
- package/dist/cli/output/render.js.map +1 -0
- package/dist/cli/output/types.d.ts +53 -0
- package/dist/cli/output/types.d.ts.map +1 -0
- package/dist/cli/output/types.js +14 -0
- package/dist/cli/output/types.js.map +1 -0
- package/dist/cli/output/wasm-fallback.d.ts +13 -0
- package/dist/cli/output/wasm-fallback.d.ts.map +1 -0
- package/dist/cli/output/wasm-fallback.js +92 -0
- package/dist/cli/output/wasm-fallback.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/cli/tree-sitter-check.d.ts +6 -1
- package/dist/cli/tree-sitter-check.d.ts.map +1 -1
- package/dist/cli/tree-sitter-check.js +23 -1
- package/dist/cli/tree-sitter-check.js.map +1 -1
- package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/SQLiteStorage.js +2 -2
- package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/sqlite-loader.d.ts +23 -0
- package/dist/infrastructure/storage/adapters/sqlite-loader.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/sqlite-loader.js +210 -0
- package/dist/infrastructure/storage/adapters/sqlite-loader.js.map +1 -0
- 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/dist/orchestrator/types.d.ts +2 -0
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/parser/implementations/tree-sitter-loader.d.ts +16 -0
- package/dist/parser/implementations/tree-sitter-loader.d.ts.map +1 -0
- package/dist/parser/implementations/tree-sitter-loader.js +105 -0
- package/dist/parser/implementations/tree-sitter-loader.js.map +1 -0
- package/dist/parser/implementations/tree-sitter-parser.d.ts +3 -0
- package/dist/parser/implementations/tree-sitter-parser.d.ts.map +1 -1
- package/dist/parser/implementations/tree-sitter-parser.js +8 -3
- package/dist/parser/implementations/tree-sitter-parser.js.map +1 -1
- package/dist/server/mcp/schema-adapter.d.ts +45 -0
- package/dist/server/mcp/schema-adapter.d.ts.map +1 -0
- package/dist/server/mcp/schema-adapter.js +290 -0
- package/dist/server/mcp/schema-adapter.js.map +1 -0
- package/dist/server/mcp/server.d.ts.map +1 -1
- package/dist/server/mcp/server.js +32 -2
- package/dist/server/mcp/server.js.map +1 -1
- package/docs/AI_ASSISTANT_SETUP.md +173 -14
- package/docs/README.md +40 -1
- package/docs/SETUP_GUIDE.md +23 -26
- 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 +125 -13
- package/docs/ai-guide/INTEGRATION.md +78 -11
- package/docs/ai-guide/OUTPUT.md +295 -2
- package/docs/ai-guide/PATTERNS.md +3 -3
- package/docs/ai-guide/PROMPTS.md +2 -2
- package/docs/ai-guide/QUICKSTART.md +41 -5
- package/docs/ai-guide/README.md +9 -9
- package/docs/archive/ideation/2026-04-15-executable-architecture-constitution-ideation-archive.md +70 -0
- package/docs/archive/ideation/2026-04-20-mycodemap-init-enhancements-ideation-archive.md +109 -0
- 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/archive/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation-archive.md +54 -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-15-executable-architecture-constitution-ideation.md +10 -22
- package/docs/ideation/2026-04-20-mycodemap-init-enhancements-ideation.md +51 -0
- package/docs/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation.md +114 -0
- package/docs/ideation/2026-04-29-ux-install-agent-experience-ideation.md +256 -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/plans/2026-04-30-install-guide-and-repo-analyzer-design.md +394 -0
- package/docs/rules/README.md +5 -1
- package/docs/rules/architecture-guardrails.md +2 -1
- package/docs/rules/deployment.md +7 -0
- package/docs/rules/engineering-with-codex-openai.md +48 -9
- package/docs/rules/harness.md +106 -0
- package/docs/rules/pre-release-checklist.md +72 -33
- package/docs/rules/release.md +303 -0
- package/docs/rules/testing.md +70 -0
- package/docs/rules/validation.md +16 -7
- package/examples/claude/skills/mycodemap-repo-analyzer/SKILL.md +294 -0
- package/examples/claude/skills/mycodemap-repo-analyzer/references/analysis-guide.md +166 -0
- package/examples/claude/skills/mycodemap-repo-analyzer/references/module-analysis-guide.md +150 -0
- package/mycodemap.config.schema.json +1 -1
- package/package.json +9 -6
- 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/sync-analyze-docs.js +2 -2
- package/scripts/validate-docs.js +395 -29
- package/docs/references/tmp.md +0 -527
package/scripts/validate-docs.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
675
|
-
'
|
|
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-
|
|
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
|
-
'
|
|
818
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'-
|
|
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;插件通过
|
|
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
|
-
'| "需要切换/排查图存储后端" | 编辑
|
|
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
|
|
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` 会读取
|
|
992
|
-
'`export json|graphml|dot` 会从
|
|
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
|
-
'| "需要切换/排查图存储后端" | 编辑
|
|
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
|
-
'若改动涉及
|
|
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) {
|