@mycodemap/mycodemap 0.4.2 → 0.5.1

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 (288) hide show
  1. package/CHANGELOG.md +105 -3
  2. package/README.md +192 -53
  3. package/dist/ai/claude.d.ts +38 -0
  4. package/dist/ai/claude.d.ts.map +1 -0
  5. package/dist/ai/claude.js +169 -0
  6. package/dist/ai/claude.js.map +1 -0
  7. package/dist/ai/codex.d.ts +38 -0
  8. package/dist/ai/codex.d.ts.map +1 -0
  9. package/dist/ai/codex.js +169 -0
  10. package/dist/ai/codex.js.map +1 -0
  11. package/dist/ai/factory.d.ts +48 -0
  12. package/dist/ai/factory.d.ts.map +1 -0
  13. package/dist/ai/factory.js +95 -0
  14. package/dist/ai/factory.js.map +1 -0
  15. package/dist/ai/index.d.ts +12 -0
  16. package/dist/ai/index.d.ts.map +1 -0
  17. package/dist/ai/index.js +29 -0
  18. package/dist/ai/index.js.map +1 -0
  19. package/dist/ai/provider.d.ts +70 -0
  20. package/dist/ai/provider.d.ts.map +1 -0
  21. package/dist/ai/provider.js +31 -0
  22. package/dist/ai/provider.js.map +1 -0
  23. package/dist/ai/subagent-caller.d.ts +90 -0
  24. package/dist/ai/subagent-caller.d.ts.map +1 -0
  25. package/dist/ai/subagent-caller.js +280 -0
  26. package/dist/ai/subagent-caller.js.map +1 -0
  27. package/dist/ai/types.d.ts +70 -0
  28. package/dist/ai/types.d.ts.map +1 -0
  29. package/dist/ai/types.js +5 -0
  30. package/dist/ai/types.js.map +1 -0
  31. package/dist/cli/commands/analyze.d.ts +18 -0
  32. package/dist/cli/commands/analyze.d.ts.map +1 -1
  33. package/dist/cli/commands/analyze.js +239 -6
  34. package/dist/cli/commands/analyze.js.map +1 -1
  35. package/dist/cli/commands/check.d.ts +22 -0
  36. package/dist/cli/commands/check.d.ts.map +1 -0
  37. package/dist/cli/commands/check.js +168 -0
  38. package/dist/cli/commands/check.js.map +1 -0
  39. package/dist/cli/commands/ci.d.ts +25 -0
  40. package/dist/cli/commands/ci.d.ts.map +1 -1
  41. package/dist/cli/commands/ci.js +139 -36
  42. package/dist/cli/commands/ci.js.map +1 -1
  43. package/dist/cli/commands/complexity.d.ts.map +1 -1
  44. package/dist/cli/commands/complexity.js +6 -0
  45. package/dist/cli/commands/complexity.js.map +1 -1
  46. package/dist/cli/commands/design.d.ts +52 -0
  47. package/dist/cli/commands/design.d.ts.map +1 -0
  48. package/dist/cli/commands/design.js +274 -0
  49. package/dist/cli/commands/design.js.map +1 -0
  50. package/dist/cli/commands/generate.d.ts +1 -0
  51. package/dist/cli/commands/generate.d.ts.map +1 -1
  52. package/dist/cli/commands/generate.js +121 -8
  53. package/dist/cli/commands/generate.js.map +1 -1
  54. package/dist/cli/commands/history.d.ts +26 -0
  55. package/dist/cli/commands/history.d.ts.map +1 -0
  56. package/dist/cli/commands/history.js +92 -0
  57. package/dist/cli/commands/history.js.map +1 -0
  58. package/dist/cli/commands/mcp.d.ts +13 -0
  59. package/dist/cli/commands/mcp.d.ts.map +1 -0
  60. package/dist/cli/commands/mcp.js +108 -0
  61. package/dist/cli/commands/mcp.js.map +1 -0
  62. package/dist/cli/commands/server.d.ts +9 -0
  63. package/dist/cli/commands/server.d.ts.map +1 -0
  64. package/dist/cli/commands/server.js +65 -0
  65. package/dist/cli/commands/server.js.map +1 -0
  66. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
  67. package/dist/cli/commands/ship/pipeline.js +8 -1
  68. package/dist/cli/commands/ship/pipeline.js.map +1 -1
  69. package/dist/cli/commands/ship/publisher.d.ts +9 -1
  70. package/dist/cli/commands/ship/publisher.d.ts.map +1 -1
  71. package/dist/cli/commands/ship/publisher.js +149 -6
  72. package/dist/cli/commands/ship/publisher.js.map +1 -1
  73. package/dist/cli/commands/workflow.d.ts.map +1 -1
  74. package/dist/cli/commands/workflow.js +22 -2
  75. package/dist/cli/commands/workflow.js.map +1 -1
  76. package/dist/cli/config-loader.d.ts.map +1 -1
  77. package/dist/cli/config-loader.js +3 -2
  78. package/dist/cli/config-loader.js.map +1 -1
  79. package/dist/cli/contract-checker.d.ts +33 -0
  80. package/dist/cli/contract-checker.d.ts.map +1 -0
  81. package/dist/cli/contract-checker.js +719 -0
  82. package/dist/cli/contract-checker.js.map +1 -0
  83. package/dist/cli/contract-diff-scope.d.ts +14 -0
  84. package/dist/cli/contract-diff-scope.d.ts.map +1 -0
  85. package/dist/cli/contract-diff-scope.js +127 -0
  86. package/dist/cli/contract-diff-scope.js.map +1 -0
  87. package/dist/cli/contract-gate-thresholds.d.ts +14 -0
  88. package/dist/cli/contract-gate-thresholds.d.ts.map +1 -0
  89. package/dist/cli/contract-gate-thresholds.js +19 -0
  90. package/dist/cli/contract-gate-thresholds.js.map +1 -0
  91. package/dist/cli/design-contract-loader.d.ts +15 -0
  92. package/dist/cli/design-contract-loader.d.ts.map +1 -0
  93. package/dist/cli/design-contract-loader.js +527 -0
  94. package/dist/cli/design-contract-loader.js.map +1 -0
  95. package/dist/cli/design-contract-schema.d.ts +11 -0
  96. package/dist/cli/design-contract-schema.d.ts.map +1 -0
  97. package/dist/cli/design-contract-schema.js +75 -0
  98. package/dist/cli/design-contract-schema.js.map +1 -0
  99. package/dist/cli/design-handoff-builder.d.ts +15 -0
  100. package/dist/cli/design-handoff-builder.d.ts.map +1 -0
  101. package/dist/cli/design-handoff-builder.js +345 -0
  102. package/dist/cli/design-handoff-builder.js.map +1 -0
  103. package/dist/cli/design-scope-resolver.d.ts +8 -0
  104. package/dist/cli/design-scope-resolver.d.ts.map +1 -0
  105. package/dist/cli/design-scope-resolver.js +760 -0
  106. package/dist/cli/design-scope-resolver.js.map +1 -0
  107. package/dist/cli/design-verification-builder.d.ts +8 -0
  108. package/dist/cli/design-verification-builder.d.ts.map +1 -0
  109. package/dist/cli/design-verification-builder.js +369 -0
  110. package/dist/cli/design-verification-builder.js.map +1 -0
  111. package/dist/cli/index.js +20 -6
  112. package/dist/cli/index.js.map +1 -1
  113. package/dist/cli/paths.d.ts.map +1 -1
  114. package/dist/cli/paths.js +30 -7
  115. package/dist/cli/paths.js.map +1 -1
  116. package/dist/cli-new/commands/server.d.ts +13 -0
  117. package/dist/cli-new/commands/server.d.ts.map +1 -0
  118. package/dist/cli-new/commands/server.js +90 -0
  119. package/dist/cli-new/commands/server.js.map +1 -0
  120. package/dist/core/analyzer.d.ts.map +1 -1
  121. package/dist/core/analyzer.js +16 -0
  122. package/dist/core/analyzer.js.map +1 -1
  123. package/dist/domain/entities/CodeGraph.d.ts +5 -1
  124. package/dist/domain/entities/CodeGraph.d.ts.map +1 -1
  125. package/dist/domain/entities/CodeGraph.js +29 -12
  126. package/dist/domain/entities/CodeGraph.js.map +1 -1
  127. package/dist/domain/entities/Dependency.d.ts +8 -1
  128. package/dist/domain/entities/Dependency.d.ts.map +1 -1
  129. package/dist/domain/entities/Dependency.js +19 -4
  130. package/dist/domain/entities/Dependency.js.map +1 -1
  131. package/dist/domain/entities/Symbol.d.ts +2 -1
  132. package/dist/domain/entities/Symbol.d.ts.map +1 -1
  133. package/dist/domain/entities/Symbol.js +6 -3
  134. package/dist/domain/entities/Symbol.js.map +1 -1
  135. package/dist/generator/ai-overview.d.ts +51 -0
  136. package/dist/generator/ai-overview.d.ts.map +1 -0
  137. package/dist/generator/ai-overview.js +160 -0
  138. package/dist/generator/ai-overview.js.map +1 -0
  139. package/dist/infrastructure/storage/StorageFactory.d.ts +13 -5
  140. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
  141. package/dist/infrastructure/storage/StorageFactory.js +62 -16
  142. package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
  143. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +3 -1
  144. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -1
  145. package/dist/infrastructure/storage/adapters/FileSystemStorage.js +10 -2
  146. package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -1
  147. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +3 -1
  148. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -1
  149. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +9 -1
  150. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -1
  151. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +3 -1
  152. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -1
  153. package/dist/infrastructure/storage/adapters/MemoryStorage.js +9 -1
  154. package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -1
  155. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +41 -0
  156. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
  157. package/dist/infrastructure/storage/adapters/Neo4jStorage.js +162 -0
  158. package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
  159. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts +53 -0
  160. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -0
  161. package/dist/infrastructure/storage/adapters/SQLiteStorage.js +879 -0
  162. package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -0
  163. package/dist/infrastructure/storage/graph-helpers.d.ts +3 -1
  164. package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -1
  165. package/dist/infrastructure/storage/graph-helpers.js +90 -0
  166. package/dist/infrastructure/storage/graph-helpers.js.map +1 -1
  167. package/dist/infrastructure/storage/index.d.ts +1 -1
  168. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  169. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +3 -1
  170. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -1
  171. package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -1
  172. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts +27 -0
  173. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts.map +1 -0
  174. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js +246 -0
  175. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js.map +1 -0
  176. package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts +25 -0
  177. package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts.map +1 -0
  178. package/dist/infrastructure/storage/sqlite/perf-thresholds.js +25 -0
  179. package/dist/infrastructure/storage/sqlite/perf-thresholds.js.map +1 -0
  180. package/dist/infrastructure/storage/sqlite/schema.d.ts +4 -0
  181. package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
  182. package/dist/infrastructure/storage/sqlite/schema.js +111 -0
  183. package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
  184. package/dist/interface/types/design-check.d.ts +73 -0
  185. package/dist/interface/types/design-check.d.ts.map +1 -0
  186. package/dist/interface/types/design-check.js +4 -0
  187. package/dist/interface/types/design-check.js.map +1 -0
  188. package/dist/interface/types/design-contract.d.ts +123 -0
  189. package/dist/interface/types/design-contract.d.ts.map +1 -0
  190. package/dist/interface/types/design-contract.js +7 -0
  191. package/dist/interface/types/design-contract.js.map +1 -0
  192. package/dist/interface/types/design-handoff.d.ts +68 -0
  193. package/dist/interface/types/design-handoff.d.ts.map +1 -0
  194. package/dist/interface/types/design-handoff.js +4 -0
  195. package/dist/interface/types/design-handoff.js.map +1 -0
  196. package/dist/interface/types/design-mapping.d.ts +51 -0
  197. package/dist/interface/types/design-mapping.d.ts.map +1 -0
  198. package/dist/interface/types/design-mapping.js +4 -0
  199. package/dist/interface/types/design-mapping.js.map +1 -0
  200. package/dist/interface/types/design-verification.d.ts +49 -0
  201. package/dist/interface/types/design-verification.d.ts.map +1 -0
  202. package/dist/interface/types/design-verification.js +4 -0
  203. package/dist/interface/types/design-verification.js.map +1 -0
  204. package/dist/interface/types/history-risk.d.ts +90 -0
  205. package/dist/interface/types/history-risk.d.ts.map +1 -0
  206. package/dist/interface/types/history-risk.js +4 -0
  207. package/dist/interface/types/history-risk.js.map +1 -0
  208. package/dist/interface/types/index.d.ts +20 -1
  209. package/dist/interface/types/index.d.ts.map +1 -1
  210. package/dist/interface/types/storage.d.ts +28 -1
  211. package/dist/interface/types/storage.d.ts.map +1 -1
  212. package/dist/orchestrator/adapters/ast-grep-adapter.d.ts +10 -0
  213. package/dist/orchestrator/adapters/ast-grep-adapter.d.ts.map +1 -1
  214. package/dist/orchestrator/adapters/ast-grep-adapter.js +46 -17
  215. package/dist/orchestrator/adapters/ast-grep-adapter.js.map +1 -1
  216. package/dist/orchestrator/adapters/codemap-adapter.d.ts.map +1 -1
  217. package/dist/orchestrator/adapters/codemap-adapter.js +2 -22
  218. package/dist/orchestrator/adapters/codemap-adapter.js.map +1 -1
  219. package/dist/orchestrator/ai-feed-generator.d.ts +210 -0
  220. package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
  221. package/dist/orchestrator/ai-feed-generator.js +377 -0
  222. package/dist/orchestrator/ai-feed-generator.js.map +1 -0
  223. package/dist/orchestrator/history-risk-service.d.ts +55 -0
  224. package/dist/orchestrator/history-risk-service.d.ts.map +1 -0
  225. package/dist/orchestrator/history-risk-service.js +680 -0
  226. package/dist/orchestrator/history-risk-service.js.map +1 -0
  227. package/dist/orchestrator/types.d.ts +19 -1
  228. package/dist/orchestrator/types.d.ts.map +1 -1
  229. package/dist/orchestrator/types.js +19 -0
  230. package/dist/orchestrator/types.js.map +1 -1
  231. package/dist/server/mcp/index.d.ts +4 -0
  232. package/dist/server/mcp/index.d.ts.map +1 -0
  233. package/dist/server/mcp/index.js +5 -0
  234. package/dist/server/mcp/index.js.map +1 -0
  235. package/dist/server/mcp/server.d.ts +17 -0
  236. package/dist/server/mcp/server.d.ts.map +1 -0
  237. package/dist/server/mcp/server.js +84 -0
  238. package/dist/server/mcp/server.js.map +1 -0
  239. package/dist/server/mcp/service.d.ts +22 -0
  240. package/dist/server/mcp/service.d.ts.map +1 -0
  241. package/dist/server/mcp/service.js +177 -0
  242. package/dist/server/mcp/service.js.map +1 -0
  243. package/dist/server/mcp/types.d.ts +56 -0
  244. package/dist/server/mcp/types.d.ts.map +1 -0
  245. package/dist/server/mcp/types.js +4 -0
  246. package/dist/server/mcp/types.js.map +1 -0
  247. package/docs/AI_ASSISTANT_SETUP.md +1 -1
  248. package/docs/SETUP_GUIDE.md +6 -6
  249. package/docs/ai-guide/COMMANDS.md +171 -4
  250. package/docs/ai-guide/INTEGRATION.md +137 -433
  251. package/docs/ai-guide/OUTPUT.md +890 -5
  252. package/docs/ai-guide/PATTERNS.md +54 -14
  253. package/docs/ai-guide/PROMPTS.md +17 -6
  254. package/docs/archive/test-report-symbol-search.md +384 -0
  255. package/docs/archive/test-scenario-4-complexity-analysis.md +460 -0
  256. package/docs/archive/test_report_scenario5.md +615 -0
  257. package/docs/archive/test_scenario_3_impact_analysis_report.md +520 -0
  258. package/docs/backlog.md +177 -0
  259. package/docs/eatdogfood-reports/2026-04-17-eatdogfood-agent-experience.md +231 -0
  260. package/docs/exec-plans/completed/2026-04-17-eatdogfood-codemap-cli.md +103 -0
  261. package/docs/ideation/2026-04-15-executable-architecture-constitution-ideation.md +102 -0
  262. package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +126 -0
  263. package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +11 -10
  264. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +10 -10
  265. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +17 -12
  266. package/docs/product-specs/README.md +2 -1
  267. package/docs/rules/README.md +16 -11
  268. package/docs/rules/architecture-guardrails.md +24 -336
  269. package/docs/rules/code-quality-redlines.md +25 -311
  270. package/docs/rules/engineering-with-codex-openai.md +20 -3
  271. package/docs/rules/validation.md +90 -37
  272. package/mycodemap.config.schema.json +3 -3
  273. package/package.json +7 -2
  274. package/scripts/benchmark-governance-graph.mjs +132 -0
  275. package/scripts/calibrate-contract-gate.mjs +221 -0
  276. package/scripts/capability-report.py +255 -0
  277. package/scripts/experiments/arcadedb-http-smoke.mjs +90 -0
  278. package/scripts/qa-rule-control.sh +254 -0
  279. package/scripts/report-high-risk-files.mjs +395 -0
  280. package/scripts/rule-context.mjs +155 -0
  281. package/scripts/smoke-sqlite-impact.mjs +85 -0
  282. package/scripts/sync-analyze-docs.js +1 -0
  283. package/scripts/tests/test_capability_report.py +89 -0
  284. package/scripts/tests/test_rule_control_workflow.py +51 -0
  285. package/scripts/tests/test_validate_rules.py +81 -0
  286. package/scripts/validate-ai-docs.js +283 -1
  287. package/scripts/validate-docs.js +479 -25
  288. package/scripts/validate-rules.py +254 -0
@@ -1,321 +1,35 @@
1
1
  # 代码质量红线
2
2
 
3
- > 代码生成绝对禁止项清单与 Enforcement 策略
3
+ > 目标:用最少的文字描述“什么会被挡住、怎么检查、失败后怎么修”。
4
4
 
5
- ## 1. 红线总则
5
+ ## 红线表
6
6
 
7
- 以下代码模式在 CodeMap 仓库中被视为**硬性阻断项**。AI 生成代码时必须主动避免,否则必须在可信度自评中标记风险。
7
+ | 红线 | 命令 | 阈值/级别 | 失败后果 | 恢复方式 |
8
+ |---|---|---|---|---|
9
+ | 敏感信息硬编码 | `grep -rn "password.*=.*['\"]" src/ --include="*.ts"` | 生产代码出现明文凭证 | 阻断提交/审查 | 改为 `process.env` + 类型检查 |
10
+ | 非边界文件使用 `any` | `npm run typecheck` / `npx eslint src --rule '@typescript-eslint/no-explicit-any: error'` | 非测试/边界文件禁止 | 阻断 | 改为具体类型或 `unknown` + 守卫 |
11
+ | 函数超过 50 行 | `npx eslint src --rule 'max-lines-per-function: [error, { max: 50, skipBlankLines: true, skipComments: true }]'` | 单函数 > 50 行 | 阻断 | 拆成小函数,保持单一职责 |
12
+ | 未处理 Promise | `npx eslint src --rule '@typescript-eslint/no-floating-promises: error'` | 无 `await` / `.catch()` | 阻断 | 显式 `await` 或补错误处理 |
13
+ | 遗留 `console.log` | `npx eslint src --rule 'no-console: [error, { allow: [\"error\"] }]'` | `src/cli/runtime-logger.ts` 外禁止 | 阻断 | 换成 `runtime-logger` |
14
+ | 未使用 import / 变量 | `tsc --noUnusedLocals --noEmit` / `npm run lint` | 任意未使用符号 | 阻断 | 删除无用 import / 变量 |
15
+ | TS 源文件缺少 `[META]` / `[WHY]` | `.githooks/pre-commit` | 非测试 `.ts` 源文件必须有文件头 | 阻断 | 补文件头注释 |
8
16
 
9
- **红线判定标准**:
10
- - 可能导致安全漏洞
11
- - 严重降低代码可维护性
12
- - 破坏类型安全保证
13
- - 违反架构分层原则
17
+ ## 默认执行顺序
14
18
 
15
- ## 2. 红线清单
19
+ 1. `npm run typecheck`
20
+ 2. `npm run lint`
21
+ 3. 变更涉及行为时再补 `npm test`
16
22
 
17
- ### 2.1 敏感信息硬编码
23
+ ## 技术债例外
18
24
 
19
- **禁止模式**:
20
- ```typescript
21
- // ❌ 绝对禁止
22
- const API_KEY = "sk-abc123xyz";
23
- const password = "admin123";
24
- const secret = "my-jwt-secret";
25
- ```
25
+ - 只允许在边界场景临时记录 `TODO-DEBT`。
26
+ - 例外必须写清:原因、风险、偿还计划。
26
27
 
27
- **合规模式**:
28
- ```typescript
29
- // ✅ 使用环境变量
30
- const API_KEY = process.env.OPENAI_API_KEY;
31
- if (!API_KEY) {
32
- throw new Error('OPENAI_API_KEY is required');
33
- }
34
- ```
28
+ ## 最小提交前清单
35
29
 
36
- **检测方式**:
37
- ```bash
38
- # 正则检测敏感信息字面量
39
- grep -rn "password.*=.*['\"]" src/ --include="*.ts"
40
- grep -rn "secret.*=.*['\"]" src/ --include="*.ts"
41
- grep -rn "api_key.*=.*['\"]" src/ --include="*.ts"
42
- ```
43
-
44
- **阻断阈值**:生产代码中出现任何明文凭证
45
-
46
- ### 2.2 `any` 类型使用
47
-
48
- **禁止模式**:
49
- ```typescript
50
- // ❌ 非边界文件禁止使用 any
51
- function processData(data: any): any {
52
- return data.value;
53
- }
54
- ```
55
-
56
- **合规模式**:
57
- ```typescript
58
- // ✅ 使用具体类型或 unknown + 类型守卫
59
- interface DataPayload {
60
- value: string;
61
- }
62
-
63
- function processData(data: unknown): string {
64
- if (typeof data === 'object' && data !== null && 'value' in data) {
65
- return (data as DataPayload).value;
66
- }
67
- throw new Error('Invalid data format');
68
- }
69
- ```
70
-
71
- **例外情况**(需标记 TODO-DEBT):
72
- - 第三方库无类型定义时的临时处理
73
- - 与遗留系统集成的边界
74
-
75
- **检测方式**:
76
- ```bash
77
- # TypeScript 编译器检查
78
- npx tsc --noImplicitAny --noEmit
79
-
80
- # ESLint 检查
81
- npx eslint src --rule '@typescript-eslint/no-explicit-any: error'
82
- ```
83
-
84
- **阻断阈值**:非边界文件出现 `any` 类型
85
-
86
- ### 2.3 函数超过 50 行
87
-
88
- **计算方式**:函数体实际代码行数(不含空行、注释、类型定义)
89
-
90
- **禁止模式**:
91
- ```typescript
92
- // ❌ 超过 50 行的函数
93
- function complexFunction(data: Data) {
94
- // 行 1
95
- // 行 2
96
- // ... 50+ 行
97
- // 行 51
98
- // 行 52
99
- }
100
- ```
101
-
102
- **合规模式**:
103
- ```typescript
104
- // ✅ 拆分为子函数
105
- function complexFunction(data: Data) {
106
- const validated = validateData(data);
107
- const transformed = transformData(validated);
108
- return persistData(transformed);
109
- }
110
-
111
- function validateData(data: Data): ValidatedData { ... }
112
- function transformData(data: ValidatedData): TransformedData { ... }
113
- function persistData(data: TransformedData): Result { ... }
114
- ```
115
-
116
- **检测方式**:
117
- ```bash
118
- # 使用 ESLint 的 max-lines-per-function 规则
119
- npx eslint src --rule 'max-lines-per-function: [error, { max: 50, skipBlankLines: true, skipComments: true }]'
120
- ```
121
-
122
- **阻断阈值**:单函数超过 50 行代码
123
-
124
- ### 2.4 未处理 Promise
125
-
126
- **禁止模式**:
127
- ```typescript
128
- // ❌ 未处理的异步操作
129
- fetchUserData(userId); // 没有 await 或 .catch()
130
- database.query(sql); // 没有错误处理
131
- ```
132
-
133
- **合规模式**:
134
- ```typescript
135
- // ✅ 正确处理异步操作
136
- try {
137
- const user = await fetchUserData(userId);
138
- } catch (error) {
139
- logger.error('Failed to fetch user', error);
140
- throw new UserFetchError(userId);
141
- }
142
-
143
- // 或显式忽略
144
- void fetchUserData(userId).catch(() => {}); // 有意的显式忽略
145
- ```
146
-
147
- **检测方式**:
148
- ```bash
149
- # ESLint 检查
150
- npx eslint src --rule '@typescript-eslint/no-floating-promises: error'
151
- ```
152
-
153
- **阻断阈值**:未使用 `await` 或未附加错误处理的 Promise
154
-
155
- ### 2.5 `console.log` 遗留代码
156
-
157
- **禁止模式**:
158
- ```typescript
159
- // ❌ 生产代码中的调试语句
160
- console.log('Debug:', data);
161
- console.warn('Warning');
162
- ```
163
-
164
- **合规模式**:
165
- ```typescript
166
- // ✅ 使用 runtime-logger
167
- import { runtimeLogger } from '../cli/runtime-logger';
168
- runtimeLogger.debug('Debug:', data);
169
- runtimeLogger.warn('Warning');
170
- ```
171
-
172
- **例外情况**:
173
- - `src/cli/runtime-logger.ts` 本身
174
- - 临时调试代码(提交前必须删除)
175
-
176
- **检测方式**:
177
- ```bash
178
- # ESLint 检查
179
- npx eslint src --rule 'no-console: [error, { allow: ["error"] }]'
180
- ```
181
-
182
- **阻断阈值**:非 logger 模块出现 `console.log`
183
-
184
- ### 2.6 未使用 Import
185
-
186
- **禁止模式**:
187
- ```typescript
188
- // ❌ 导入但未使用
189
- import { unusedFunction } from './utils';
190
- import type { UnusedType } from './types';
191
-
192
- export function doSomething() {
193
- // 未使用上面的导入
194
- }
195
- ```
196
-
197
- **合规模式**:
198
- ```typescript
199
- // ✅ 删除未使用的导入
200
- export function doSomething() {
201
- // 干净的代码
202
- }
203
- ```
204
-
205
- **检测方式**:
206
- ```bash
207
- # TypeScript 检查
208
- npx tsc --noUnusedLocals --noEmit
209
-
210
- # ESLint 检查
211
- npx eslint src --rule '@typescript-eslint/no-unused-vars: [error, { argsIgnorePattern: "^_" }]'
212
- ```
213
-
214
- **阻断阈值**:存在未使用的 import 或变量
215
-
216
- ### 2.7 缺少文件头注释
217
-
218
- **禁止模式**:
219
- ```typescript
220
- // ❌ 缺少 META 和 WHY 注释
221
- export function analyze() { ... }
222
- ```
223
-
224
- **合规模式**:
225
- ```typescript
226
- // [META] since:2026-03 | owner:team | stable:false
227
- // [WHY] 分析器主入口,负责协调解析和生成流程
228
- export function analyze() { ... }
229
- ```
230
-
231
- **检测方式**:
232
- ```bash
233
- # pre-commit hook 自动检查
234
- # 或手动检查
235
- grep -L "\[META\]" src/**/*.ts | grep -v ".test.ts" | grep -v ".d.ts"
236
- ```
237
-
238
- **阻断阈值**:TS 源文件缺少 `[META]` 或 `[WHY]` 注释
239
-
240
- ## 3. 检测自动化
241
-
242
- ### 3.1 集成到 CI
243
-
244
- ```yaml
245
- # .github/workflows/ci-gateway.yml
246
- - name: Check code quality redlines
247
- run: |
248
- npx eslint src \
249
- --rule '@typescript-eslint/no-explicit-any: error' \
250
- --rule '@typescript-eslint/no-floating-promises: error' \
251
- --rule 'no-console: [error, { allow: ["error"] }]'
252
- ```
253
-
254
- ### 3.2 本地检查脚本
255
-
256
- ```json
257
- // package.json
258
- {
259
- "scripts": {
260
- "check:redlines": "npm run check:types && npm run check:lint",
261
- "check:types": "tsc --noImplicitAny --noUnusedLocals --noEmit",
262
- "check:lint": "eslint src --ext .ts"
263
- }
264
- }
265
- ```
266
-
267
- ## 4. 自动修复策略
268
-
269
- | 红线 | 自动修复 | 修复命令 |
270
- |------|---------|---------|
271
- | `any` 类型 | 部分可行 | 使用类型推导工具(如 TS 语言服务) |
272
- | 未使用 import | 完全可行 | `eslint --fix` |
273
- | `console.log` | 部分可行 | 替换为 logger 引用(需人工确认) |
274
- | 函数长度 | 不可行 | 需人工重构 |
275
- | 未处理 Promise | 部分可行 | 添加 `await` 或 `.catch()`(需人工确认逻辑) |
276
- | 敏感信息 | 不可行 | 需人工替换为环境变量 |
277
- | 缺少文件头 | 部分可行 | 使用代码片段模板 |
278
-
279
- ## 5. 例外处理
280
-
281
- ### 5.1 技术债务标记
282
-
283
- 若因特殊原因必须违反红线,必须标记为技术债务:
284
-
285
- ```typescript
286
- // TODO-DEBT [L1] [日期:2026-03-17] [作者:AI] [原因:第三方库无类型定义]
287
- // 问题:被迫使用 any 类型处理无类型的第三方库
288
- // 风险:丢失类型安全
289
- // 偿还计划:提交 PR 给第三方库添加类型定义,或使用 @types 包
290
- function handleLegacyAPI(response: any): any {
291
- return response.data;
292
- }
293
- ```
294
-
295
- ### 5.2 边界文件例外
296
-
297
- 以下文件类型允许适当的灵活性:
298
- - 测试文件(`.test.ts`)
299
- - 类型声明文件(`.d.ts`)
300
- - 配置文件(如 `vitest.config.ts`)
301
- - 脚本文件(`scripts/` 目录)
302
-
303
- ## 6. 验收检查清单
304
-
305
- 提交代码前检查:
306
-
307
- - [ ] 无敏感信息硬编码
308
- - [ ] 无 `any` 类型(或已标记 TODO-DEBT)
309
- - [ ] 函数长度 <= 50 行(或已拆分为子函数)
310
- - [ ] 所有 Promise 都有错误处理
311
- - [ ] 无 `console.log` 遗留
312
- - [ ] 无未使用的 import
313
- - [ ] TS 源文件有 `[META]` 和 `[WHY]` 注释
314
- - [ ] `npm run check:redlines` 通过
315
-
316
- ## 7. 相关文档
317
-
318
- - `AGENTS.md` - 任务分级与可信度自评
319
- - `CLAUDE.md` - 执行清单与验收标准
320
- - `docs/rules/engineering-with-codex-openai.md` - 工程规则
321
- - `docs/rules/architecture-guardrails.md` - 架构护栏
30
+ - [ ] 无明文凭证
31
+ - [ ] 无多余 `any`
32
+ - [ ] 无漂浮 Promise
33
+ - [ ] 无遗留 `console.log`
34
+ - [ ] 无未使用 import
35
+ - [ ] `.ts` 文件头完整
@@ -44,15 +44,29 @@
44
44
 
45
45
  - 仓库内调试与验证优先使用 `node dist/cli/index.js <command>`,因为当前真实 CLI 入口是 `dist/cli/index.js`。
46
46
  - 需求澄清、影响分析、引用定位优先走 `query`、`analyze`、`deps`、`impact`,不要直接全仓漫游。
47
- - 修改 `analyze`、`query`、`ci`、`workflow` 等高影响命令时,至少验证:
47
+ - 修改 `design`、`analyze`、`query`、`ci`、`workflow` 等高影响命令时,至少验证:
48
+ - `node dist/cli/index.js generate --symbol-level` 只在显式开启时新增 symbol-level `call` 依赖;默认 `generate` 路径不得被悄悄改变;
49
+ - `node dist/cli/index.js design validate mycodemap.design.md --json` 的成功/失败路径符合文档;
50
+ - `node dist/cli/index.js design map mycodemap.design.md --json` 的 success/blocker 路径、`candidates` / `unknowns` / `diagnostics` 与文档一致;
51
+ - `node dist/cli/index.js design handoff mycodemap.design.md --json` 的 `readyForExecution` / `approvals` / `assumptions` / `openQuestions` 与文档一致;
52
+ - `node dist/cli/index.js design verify mycodemap.design.md --json` 的 `checklist` / `drift` / `diagnostics` / `readyForExecution` 与文档一致,并保持 review-needed / blocker 分离语义;
53
+ - `node dist/cli/index.js check --contract mycodemap.design.md --against src` 的 JSON / `--human` / exit code 语义与文档一致;
54
+ - `node dist/cli/index.js mcp install` 必须显式标记 experimental,且只更新当前仓库 `.mcp.json`;
55
+ - `node dist/cli/index.js mcp start` 必须保持 `stdout` 协议纯净,不能混入欢迎信息、迁移提示或 runtime log;
56
+ - `codemap_query` / `codemap_impact` 必须返回显式 `graph_status` / `error.code`,并覆盖 `GRAPH_NOT_FOUND`、`SYMBOL_NOT_FOUND`、`AMBIGUOUS_EDGE`;
48
57
  - `node dist/cli/index.js analyze --help` 与文档示例一致;
49
58
  - `find` / `read` / `link` / `show` 中受影响的 public intent 可以在当前仓库运行;
59
+ - `analyze -i find -k <keyword> --json --structured` 的 stdout JSON 必须包含 `diagnostics.status`,可区分 true zero-hit、`partialFailure` 与 `failure`;
60
+ - `complexity -f <file> --json` 必须只返回目标 `file`,不得返回全项目 `modules`;
61
+ - `ci assess-risk --json` 必须输出 `status: passed | failed | skipped`,且 failed path 保持 stdout JSON 可解析;
62
+ - `workflow start "<task>" --json` 必须输出纯 JSON,但 workflow 边界仍限于 `find → read → link → show` analysis-only 阶段;
50
63
  - 若文档保留 legacy alias 说明,真实输出仍会返回 `warnings[]`;
51
64
  - 若涉及机器输出,`--json` 与 `--structured --json` 仍保持纯 JSON 契约。
52
65
  - 修改 `README.md`、`AI_GUIDE.md`、`docs/ai-guide/OUTPUT.md`、`ARCHITECTURE.md` 这类入口文档时,必须明确区分“目标产品基线”和“当前 CLI 现实”,尤其是 `Server Layer` / `mycodemap server` 的命名边界。
53
- - 修改 `docs/product-specs/*` 现行规格时,必须同步 `docs/product-specs/README.md` 与 `scripts/validate-docs.js` 的高信号断言,避免规格正文和目录索引分叉。
66
+ - 修改 `docs/product-specs/*` 现行规格时,必须同步 `docs/product-specs/README.md` 与 `scripts/validate-docs.js` 的高信号断言,避免规格正文和目录索引分叉;`docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md` 也属于这一约束。
54
67
  - 若改动会影响 agent 执行手册、README 示例、测试事实或入口路由,先执行 `npm run docs:check`。
55
68
  - 若希望通过统一 CLI 护栏入口执行同一检查,使用 `node dist/cli/index.js ci check-docs-sync`;该命令会同时执行 docs guardrail 与 `sync-analyze-docs.js --check`。
69
+ - 若改动涉及 repo-root contract 或 CI gate,确认 `.github/workflows/ci-gateway.yml` 中的 `node dist/cli/index.js check --contract mycodemap.design.md --against src` 仍保持 PR 显式 base / push full scan 语义。
56
70
  - `ci check-branch --allow` 支持 `*` 通配;在 CI / PR 环境中,分支识别会回退到 `GITHUB_HEAD_REF` / `GITHUB_REF_NAME`。
57
71
  - `generate`、`analyze` 与 `ci check-headers -d` 共享 `.gitignore` 感知文件发现模块;没有 `.gitignore` 时回退到统一默认 `exclude`。
58
72
  - 涉及发布边界时,再补 `npm run build` 与 `npm run validate-pack`;不要把本地临时产物当成发布事实。
@@ -61,12 +75,15 @@
61
75
 
62
76
  - 本地护栏:
63
77
  - `.githooks/pre-commit` 会执行变更相关测试、文件头检查,并尝试生成 AI feed。
78
+ - `.githooks/pre-commit` 还会读取 `.claude/rule-system.config.json` 的 `hard_gate.mode`:`report-only` 时执行 `python3 scripts/validate-rules.py code --report-only` 并继续;`enforce` 时执行 `python3 scripts/validate-rules.py code`,其中 `1/4` 阻断、`2/3` 只告警。
64
79
  - 当变更涉及 README、`docs/`、CLI 入口、测试配置或 CI 配置时,`.githooks/pre-commit` 还会执行 `npm run docs:check`。
65
- - `.githooks/commit-msg` 会校验 `[TAG] scope: message` 格式与单次 commit 文件数量。
80
+ - `.githooks/commit-msg` 只校验 `[TAG] scope: message` 格式;单次 commit 文件数量限制只保留在 `.githooks/pre-commit`。
66
81
  - 服务端护栏:
82
+ - `.github/workflows/ci-gateway.yml` 包含固定命名的 `Rule validation backstop` step;即使本地使用 `git commit --no-verify` 绕过 hooks,CI 仍会运行 `python3 scripts/validate-rules.py code`,并仅在退出码 `1` 或 `4` 时 fail,`2/3` 只输出 warn-only / notice-only。
67
83
  - `.github/workflows/ci-gateway.yml` 会执行 `npm run docs:check`、`npm run typecheck`、`npm test`、`npm run build`,并通过 `node dist/cli/index.js ci ...` 执行 `check-docs-sync`(含 docs guardrail + analyze generated block)、`check-commits`、`check-commit-size`、`check-headers`、`assess-risk`、`check-output-contract` 与 AI feed 同步检查。
68
84
  - `check-working-tree`、`check-branch`、`check-scripts` 作为共享发布前 gate checks,由本地 `ci` 命令提供,`ship` 的 CHECK 阶段直接复用它们。
69
85
  - `.github/workflows/publish.yml` 会在发布前执行 `npm test` 与 `npm run build`。
86
+ - 禁止依赖 `git commit --no-verify` 作为解决方案;它只能跳过本地 hooks,不能绕过 CI 中的 `Rule validation backstop`。
70
87
  - 仓库协议仍然禁止通过 `--no-verify`、关闭 hook、放宽阈值、删除检查项来"修复"问题。
71
88
 
72
89
  ## 6. 代码生成红线详细规范(Harness 规范)
@@ -1,61 +1,114 @@
1
1
  # 验证规则
2
2
 
3
+ > 原则:先跑最相关检查,再扩大范围;没有验证,不得声称“已解决”。
4
+
3
5
  ## 最小验证顺序
4
6
 
5
- 1. 先验证与你改动最相关的命令、测试或模块。
6
- 2. 若改动影响 agent 路由、CLI 示例、规则文档或测试事实,先执行 `npm run docs:check`。
7
- 3. 若改动同时影响 CLI 护栏入口,再补 `node dist/cli/index.js ci check-docs-sync`;该命令会串联 docs guardrail analyze generated block 校验。
8
- 4. 若改动涉及 `analyze` canonical 示例、选项表或 `AI_GUIDE.md` 速查模板,优先用 `node scripts/sync-analyze-docs.js --check` 直接定位 generated block 漂移。
9
- 5. 若改动涉及产品定位、输出契约、共享文件发现规则或 `Server Layer` / `mycodemap server` 边界,确认 README、AI 文档、架构文档和 guardrail 脚本使用同一套措辞。
10
- 6. 若改动涉及 `docs/product-specs/*` 的现行规格,确认 `docs/product-specs/README.md`、相关规格文档与 `scripts/validate-docs.js` 同步;当前 docs guardrail 会显式校验 MVP3 三份架构规格的 shipped baseline 表述。
11
- 7. 若改动涉及 `mycodemap.config.json.storage` 或图数据库适配器,至少补跑对应 storage adapter 定点测试,并确认 `README.md`、`AI_GUIDE.md`、`docs/ai-guide/COMMANDS.md`、`docs/SETUP_GUIDE.md`、`mycodemap.config.schema.json` guardrail 脚本同步。
12
- 8. 再扩大到 `npm run typecheck`、`npm run lint`、`npm test`。
13
- 9. 涉及发布或打包时,再执行 `npm run build` 与 `npm run validate-pack`。
7
+ | 场景 | 先跑什么 | 为什么 |
8
+ |---|---|---|
9
+ | rules / CLAUDE / README / AI 文档 / 测试事实 | `npm run docs:check` | 先挡住文档漂移 |
10
+ | repo-local 规则控制脚本或 hook 路由 | `python3 scripts/validate-rules.py code --report-only` | 先看 contract,不先硬阻断 |
11
+ | CLI 文档入口或统一 guardrail | `node dist/cli/index.js ci check-docs-sync` | 同时验证 docs guardrail 与 analyze generated block |
12
+ | 改实现代码 | `npm run typecheck` `npm run lint` `npm test` | 从最小相关验证扩到基础回归 |
13
+ | 改发布/打包边界 | `npm run build` `npm run validate-pack` | 确认 shipped artifact 仍成立 |
14
14
 
15
- ## CI Gateway 验证流程
15
+ ## Repo-local rule validator
16
16
 
17
- CI Gateway 已集成以下自动检查(按执行顺序):
17
+ ### `validate-rules.py` exit-code 表
18
18
 
19
- 1. `npm run docs:check` - 文档护栏检查
20
- 2. `npm run typecheck` - TypeScript 类型检查
21
- 3. `npm run lint` - ESLint 代码质量检查(渐进式规则,0 error 通过)
22
- 4. `npm test` - 单元测试
23
- 5. `npm run build` - 构建验证
24
- 6. CLI 相关检查(当前 CI Gateway 直接执行 `check-docs-sync`、commit 格式、文件头、risk、output contract;`ship` 的本地 CHECK 阶段复用 `check-working-tree`、`check-branch`、`check-scripts`)
19
+ | 命令 | 退出码 | 含义 | 默认动作 |
20
+ |---|---:|---|---|
21
+ | `python3 scripts/validate-rules.py code --report-only` | `0` | pass / report-only | 只报告,不阻断 |
22
+ | `python3 scripts/validate-rules.py code` | `1` | `P0` | blocker |
23
+ | `python3 scripts/validate-rules.py code` | `2` | `P1` | warn-only |
24
+ | `python3 scripts/validate-rules.py code` | `3` | `P2` | notice-only |
25
+ | `python3 scripts/validate-rules.py code` | `4` | `unavailable` | 依赖缺失,必须显式处理 |
25
26
 
26
- > 当前 `check-docs-sync` 会串联 docs guardrail 与 analyze generated block 校验。
27
+ ### 当前默认值
27
28
 
28
- ## 强约束
29
+ - `.claude/rule-system.config.json` 默认开启 `enabled: true` 与 `route_by_edit_path: true`。
30
+ - `soft_gate.change_analyzer` 默认开启;`hard_gate.mode` 默认是 `report-only`。
31
+ - 本阶段默认 contract 是“先报告、再决定是否强阻断”,不要把 report-only 误写成 enforce。
29
32
 
30
- - 没有验证,不得声称“已解决”。
31
- - 失败时优先修根因,不绕过护栏。
32
- - 涉及 CI / hooks / 输出契约时,必须给出失败场景与修复验证证据。
33
- - 严禁使用 `--no-verify`、禁用 hooks、删除检查项规避失败。
33
+ ## CI Gateway 真实顺序
34
+
35
+ 当前 CI Gateway 直接执行 `check-docs-sync`、commit 格式、文件头、risk、output contract;`ship` 的本地 CHECK 阶段复用 `check-working-tree`、`check-branch`、`check-scripts`。
36
+
37
+ | 顺序 | 命令 | 说明 |
38
+ |---|---|---|
39
+ | 1 | `npm run docs:check` | 文档护栏 |
40
+ | 2 | `npm run typecheck` | 类型检查 |
41
+ | 3 | `npm run lint` | lint |
42
+ | 4 | `npm test` | 单元测试 |
43
+ | 5 | `npm run build` | 构建验证 |
44
+ | 6 | `node scripts/calibrate-contract-gate.mjs --max-changed-files 10 --max-false-positive-rate 0.10` | 设计 contract 校准;`changed files <= 10` 才可能进入 hard gate |
45
+ | 7 | `node dist/cli/index.js check --contract mycodemap.design.md --against src --base origin/main --annotation-format github` | PR 注解与 contract gate |
46
+ | 8 | `node dist/cli/index.js ci check-docs-sync` | 统一 docs/AI guardrail |
47
+ | 9 | `node dist/cli/index.js ci assess-risk --threshold=0.7` | 风险评估 |
48
+
49
+ > PR 超窗、`diff-scope-fallback` 或 `false-positive rate >10%` 时,workflow 必须明确标为 `warn-only / fallback`。
50
+
51
+ ## 需要特别补跑的场景
52
+
53
+ - 若改动涉及 `mycodemap.config.json.storage` 或图数据库适配器,至少补跑对应 storage adapter 定点测试,并确认 `README.md`、`AI_GUIDE.md`、`docs/ai-guide/COMMANDS.md`、`docs/SETUP_GUIDE.md`、`mycodemap.config.schema.json` 与 guardrail 脚本同步。
54
+ - 若改动涉及 `check` / `ci assess-risk` / `history` / `analyze --include-git-history` 的统一 risk truth,至少补跑 `node dist/cli/index.js history --symbol createCheckCommand`、`node scripts/report-high-risk-files.mjs --top 3`、`npm run build`。
55
+ - 若改动涉及产品定位、输出契约、共享文件发现规则或 `Server Layer` / `mycodemap server` 边界,确认 README、AI 文档、架构文档和 guardrail 脚本使用同一套措辞。
56
+
57
+ ## Design / Contract gate 速记
58
+
59
+ - 当前 canonical 设计链保持为 `design validate` / `design map` / `design handoff` / `design verify`,不要把 `workflow`、CI 或 ship 步骤混写进这条产品契约链。
60
+ - 需要验证完整链路时,直接运行 `design validate → design map → design handoff → design verify`。
61
+ - 常用命令:
62
+ - `node dist/cli/index.js design validate mycodemap.design.md --json`
63
+ - `node dist/cli/index.js design map mycodemap.design.md --json`
64
+ - `node dist/cli/index.js design handoff mycodemap.design.md --json`
65
+ - `node dist/cli/index.js design verify mycodemap.design.md --json`
66
+ - `node dist/cli/index.js check --contract mycodemap.design.md --against src`
67
+ - 裸 contract gate 片段必须保持为 `check --contract mycodemap.design.md --against src`
68
+ - PR 路径必须显式使用 `github.event.pull_request.base.sha`
69
+ - `review-needed 与 blocker 退出语义` 必须分开写;`review-needed` 不是 blocker。
34
70
 
35
71
  ## 典型失败模式
36
72
 
37
- - 入口文档改成 AI-first,但 `scripts/validate-docs.js` 仍检查旧措辞 `npm run docs:check` 失败。
38
- - 把 `Server Layer` 和公共 `mycodemap server` 命令混写成同一件事 → 架构文档与命令文档发生边界漂移。
39
- - 手改 `README.md`、`docs/ai-guide/COMMANDS.md` 或 `AI_GUIDE.md` 的 `analyze` canonical 代码块 / 选项表 / 速查模板,却没同步 generated block `node scripts/sync-analyze-docs.js --check` 失败。
40
- - 文档声称扫描类命令会尊重 `.gitignore`,但实现仍保留手写跳过规则 `analyze``check-headers -d` 的文件集合漂移。
41
- - `workflow` 重新扩回非分析阶段,却没同步 README / AI 命令文档 / guardrail 脚本 `npm run docs:check` 失败。
42
- - `docs/product-specs/README.md` 仍写“当前活跃产品规格暂为空”,但目录里已经有现行规格 目录索引与规格正文自相矛盾。
43
- - MVP3 规格文档继续把历史设计愿景写成当前现实(例如把 `neo4j`、14 种语言或公共 `server` 产品面写回去)→ `npm run docs:check` 失败。
44
- - `config-loader` 已支持 `storage`,但 schema / README / AI 文档没同步用户能写配置,编辑器和 guardrail 却仍把它当非法字段。
45
- - 旧的 `neo4j` 配置已经不受支持,但文档还把它写成正式 backend,或缺少 `kuzu` 时却被文档写成会自动 fallback 现场排障方向错误,误判为实现 bug。
73
+ | 失败模式 | 先看哪里 | 恢复方式 |
74
+ |---|---|---|
75
+ | `schema / README / AI 文档没同步` | `npm run docs:check` | 先修文档真相,再重跑 |
76
+ | 文档继续把历史设计写成当前现实 | `npm run docs:check` | 把 shipped baseline future intent 分开 |
77
+ | 旧的 `neo4j` / `kuzudb` 配置已经不受支持,但文档还把它写成正式 backend | `README.md` / `AI_GUIDE.md` / schema | 改回 `filesystem` / `sqlite` / `memory` / `auto` 真实 contract |
78
+ | `storage.type="sqlite"` 运行时不满足要求 | Node.js `>=20`、`better-sqlite3`、`STORAGE_BACKEND_MIGRATED`、`SQLITE_NOT_AVAILABLE` | 修运行时或改配置,不要静默 fallback |
79
+ | 风险 truth 漂移 | `check` / `ci assess-risk` / `history` / `analyze --include-git-history` | 统一命令输出与文档措辞 |
80
+ | `workflow` 写回非 analysis-only | `docs/rules/engineering-with-codex-openai.md` / README | 收敛回 `findread link → show` |
81
+ | 文档声称扫描类命令会尊重 `.gitignore`,但实现仍保留手写跳过规则 | `node dist/cli/index.js ci check-docs-sync` | 改回共享文件发现 contract,再重跑 docs guardrail |
82
+ | 把 `workflow` 重新扩回非分析阶段,却没同步 README / AI 命令文档 / guardrail 脚本 | `npm run docs:check` | 收敛回 analysis-only 边界,再同步文档 |
46
83
 
47
84
  ## 常用命令
48
85
 
49
86
  ```bash
87
+ python3 scripts/validate-rules.py code --report-only
50
88
  npm run docs:check
51
- node scripts/sync-analyze-docs.js --check
52
89
  node dist/cli/index.js ci check-docs-sync
53
- node dist/cli/index.js ci check-working-tree
54
- node dist/cli/index.js ci check-branch
55
- SHIP_IN_CI=1 node dist/cli/index.js ci check-scripts
90
+ node scripts/calibrate-contract-gate.mjs --max-changed-files 10 --max-false-positive-rate 0.10
91
+ node dist/cli/index.js check --contract mycodemap.design.md --against src
92
+ node dist/cli/index.js check --contract mycodemap.design.md --against src --base origin/main --annotation-format github
93
+ node dist/cli/index.js history --symbol createCheckCommand
94
+ node scripts/report-high-risk-files.mjs --top 3
56
95
  npm run typecheck
57
- npm test
58
96
  npm run lint
97
+ npm test
59
98
  npm run build
60
99
  npm run validate-pack
61
100
  ```
101
+
102
+ ## Rule Control QA
103
+
104
+ | 命令 | 目的 |
105
+ |---|---|
106
+ | `bash scripts/qa-rule-control.sh --scenario all` | 一键覆盖 capability、P0/P1/unavailable、disabled soft gate、rule-context、CI backstop 七个场景 |
107
+ | `python3 -m unittest scripts/tests/test_rule_control_workflow.py` | 锁住 helper scope、workflow `<rule_context>` 注入和 CI backstop 文本契约 |
108
+
109
+ ## 强约束
110
+
111
+ - 没有验证,不得声称“已解决”。
112
+ - 失败时优先修根因,不绕过护栏。
113
+ - 涉及 CI / hooks / 输出契约时,必须给出失败场景与修复验证证据。
114
+ - 不得把 `warn-only / fallback` 伪装成 hard gate success。
@@ -47,9 +47,9 @@
47
47
  "properties": {
48
48
  "type": {
49
49
  "type": "string",
50
- "enum": ["filesystem", "kuzudb", "memory", "auto"],
50
+ "enum": ["filesystem", "sqlite", "memory", "auto"],
51
51
  "default": "filesystem",
52
- "description": "Storage backend type (Neo4j is no longer supported)"
52
+ "description": "Storage backend type (Neo4j and KùzuDB are no longer supported)"
53
53
  },
54
54
  "outputPath": {
55
55
  "type": "string",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "databasePath": {
60
60
  "type": "string",
61
- "description": "KùzuDB database directory relative to project root"
61
+ "description": "SQLite database file path relative to project root"
62
62
  },
63
63
  "autoThresholds": {
64
64
  "type": "object",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mycodemap/mycodemap",
3
- "version": "0.4.2",
3
+ "version": "0.5.1",
4
4
  "description": "TypeScript 代码地图工具 - 为 AI 辅助开发提供结构化上下文",
5
5
  "repository": {
6
6
  "type": "git",
@@ -60,6 +60,8 @@
60
60
  "license": "MIT",
61
61
  "dependencies": {
62
62
  "@hono/node-server": "^1.19.11",
63
+ "@modelcontextprotocol/sdk": "^1.29.0",
64
+ "better-sqlite3": "^12.9.0",
63
65
  "chalk": "^5.3.0",
64
66
  "chokidar": "^3.5.3",
65
67
  "commander": "^11.1.0",
@@ -69,14 +71,17 @@
69
71
  "tree-sitter": "^0.21.1",
70
72
  "tree-sitter-typescript": "^0.23.2",
71
73
  "typescript": "^5.3.3",
72
- "typhonjs-escomplex": "^0.1.0"
74
+ "typhonjs-escomplex": "^0.1.0",
75
+ "zod": "^4.3.6"
73
76
  },
74
77
  "devDependencies": {
78
+ "@types/better-sqlite3": "^7.6.13",
75
79
  "@types/glob": "^8.1.0",
76
80
  "@types/node": "^20.10.0",
77
81
  "@typescript-eslint/eslint-plugin": "^6.21.0",
78
82
  "@typescript-eslint/parser": "^6.21.0",
79
83
  "@vitest/coverage-v8": "^1.6.1",
84
+ "dependency-cruiser": "^17.3.10",
80
85
  "eslint": "^8.57.1",
81
86
  "vitest": "^1.1.0"
82
87
  },