@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
@@ -0,0 +1,83 @@
1
+ // [META] since:2026-04-30 | owner:cli-team | stable:false
2
+ // [WHY] Workspace drift detection — compares init-last.json receipt asset paths against actual filesystem state
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import path from 'node:path';
5
+ const RECEIPT_RELATIVE_PATH = '.mycodemap/status/init-last.json';
6
+ export function checkWorkspaceDrift(rootDir) {
7
+ const receiptPath = path.join(rootDir, RECEIPT_RELATIVE_PATH);
8
+ if (!existsSync(receiptPath)) {
9
+ return [
10
+ {
11
+ category: 'config',
12
+ severity: 'warn',
13
+ id: 'workspace-not-initialized',
14
+ message: 'No init receipt found — workspace has not been initialized',
15
+ remediation: "Run 'codemap init' to create the workspace",
16
+ nextCommand: 'mycodemap init',
17
+ },
18
+ ];
19
+ }
20
+ let receipt;
21
+ try {
22
+ const raw = readFileSync(receiptPath, 'utf8');
23
+ receipt = JSON.parse(raw);
24
+ }
25
+ catch {
26
+ return [
27
+ {
28
+ category: 'config',
29
+ severity: 'error',
30
+ id: 'receipt-invalid',
31
+ message: 'init-last.json exists but cannot be parsed',
32
+ remediation: "Run 'codemap init' to regenerate the receipt",
33
+ nextCommand: 'mycodemap init',
34
+ },
35
+ ];
36
+ }
37
+ if (!Array.isArray(receipt.assets)) {
38
+ return [
39
+ {
40
+ category: 'config',
41
+ severity: 'error',
42
+ id: 'receipt-invalid',
43
+ message: 'init-last.json has no assets array',
44
+ remediation: "Run 'codemap init' to regenerate the receipt",
45
+ nextCommand: 'mycodemap init',
46
+ },
47
+ ];
48
+ }
49
+ const driftResults = [];
50
+ for (const asset of receipt.assets) {
51
+ if (!asset.path) {
52
+ continue;
53
+ }
54
+ const absolutePath = path.resolve(rootDir, asset.path);
55
+ if (!existsSync(absolutePath)) {
56
+ const relativePath = path.relative(rootDir, absolutePath);
57
+ const isToolOwned = asset.ownership === 'tool-owned';
58
+ driftResults.push({
59
+ category: 'config',
60
+ severity: isToolOwned ? 'error' : 'warn',
61
+ id: 'workspace-drift-detected',
62
+ message: `Receipt asset "${asset.key}" (${asset.label}) not found at ${relativePath}`,
63
+ remediation: isToolOwned
64
+ ? "Run 'codemap init' to recreate missing tool-owned files"
65
+ : 'Verify if the file was intentionally removed, or run codemap init to recreate it',
66
+ nextCommand: isToolOwned ? 'mycodemap init' : undefined,
67
+ });
68
+ }
69
+ }
70
+ if (driftResults.length === 0) {
71
+ return [
72
+ {
73
+ category: 'config',
74
+ severity: 'ok',
75
+ id: 'workspace-drift-ok',
76
+ message: 'All receipt assets match the filesystem',
77
+ remediation: 'No action needed',
78
+ },
79
+ ];
80
+ }
81
+ return driftResults;
82
+ }
83
+ //# sourceMappingURL=check-workspace-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-workspace-drift.js","sourceRoot":"","sources":["../../../src/cli/doctor/check-workspace-drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { DiagnosticResult } from './types.js';
2
+ /**
3
+ * Build serializable data array from diagnostics — same filtering logic as
4
+ * formatDoctorJson but returns the array of objects instead of a JSON string.
5
+ * Used by renderOutput for JSON mode output.
6
+ */
7
+ export declare function formatDoctorJsonData(results: DiagnosticResult[]): Record<string, string>[];
8
+ /**
9
+ * Format diagnostics as a JSON flat array — simple, grepable, jq-friendly.
10
+ * Each element: {category, severity, id, message, remediation}
11
+ * nextCommand is included only when defined.
12
+ */
13
+ export declare function formatDoctorJson(results: DiagnosticResult[]): string;
14
+ /**
15
+ * Format diagnostics as a colorized table — human-friendly for TTY output.
16
+ * Columns: CATEGORY, SEVERITY, ID, MESSAGE
17
+ * Grouped by category order with a summary line.
18
+ */
19
+ export declare function formatDoctorReport(results: DiagnosticResult[]): string;
20
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor/formatter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AAkCvE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAc1F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAiCtE"}
@@ -0,0 +1,91 @@
1
+ // [META] since:2026-04-30 | owner:cli-team | stable:false
2
+ // [WHY] TTY-aware output formatting — JSON flat array for non-TTY/CI, colorized table for interactive terminals
3
+ import chalk from 'chalk';
4
+ const CATEGORY_ORDER = {
5
+ install: 0,
6
+ config: 1,
7
+ runtime: 2,
8
+ agent: 3,
9
+ };
10
+ const CATEGORY_WIDTH = 10;
11
+ const SEVERITY_WIDTH = 8;
12
+ const ID_WIDTH = 28;
13
+ function severityLabel(severity) {
14
+ switch (severity) {
15
+ case 'error':
16
+ return chalk.red('error');
17
+ case 'warn':
18
+ return chalk.yellow('warn');
19
+ case 'ok':
20
+ return chalk.green('ok');
21
+ case 'info':
22
+ return chalk.cyan('info');
23
+ }
24
+ }
25
+ function sortByCategory(results) {
26
+ return [...results].sort((a, b) => {
27
+ const orderA = CATEGORY_ORDER[a.category] ?? 99;
28
+ const orderB = CATEGORY_ORDER[b.category] ?? 99;
29
+ return orderA - orderB;
30
+ });
31
+ }
32
+ /**
33
+ * Build serializable data array from diagnostics — same filtering logic as
34
+ * formatDoctorJson but returns the array of objects instead of a JSON string.
35
+ * Used by renderOutput for JSON mode output.
36
+ */
37
+ export function formatDoctorJsonData(results) {
38
+ return results.map((r) => {
39
+ const entry = {
40
+ category: r.category,
41
+ severity: r.severity,
42
+ id: r.id,
43
+ message: r.message,
44
+ remediation: r.remediation,
45
+ };
46
+ if (r.nextCommand) {
47
+ entry.nextCommand = r.nextCommand;
48
+ }
49
+ return entry;
50
+ });
51
+ }
52
+ /**
53
+ * Format diagnostics as a JSON flat array — simple, grepable, jq-friendly.
54
+ * Each element: {category, severity, id, message, remediation}
55
+ * nextCommand is included only when defined.
56
+ */
57
+ export function formatDoctorJson(results) {
58
+ return JSON.stringify(formatDoctorJsonData(results), null, 2);
59
+ }
60
+ /**
61
+ * Format diagnostics as a colorized table — human-friendly for TTY output.
62
+ * Columns: CATEGORY, SEVERITY, ID, MESSAGE
63
+ * Grouped by category order with a summary line.
64
+ */
65
+ export function formatDoctorReport(results) {
66
+ const sorted = sortByCategory(results);
67
+ const lines = [];
68
+ // Header
69
+ const header = 'CATEGORY'.padEnd(CATEGORY_WIDTH) +
70
+ 'SEVERITY'.padEnd(SEVERITY_WIDTH) +
71
+ 'ID'.padEnd(ID_WIDTH) +
72
+ 'MESSAGE';
73
+ lines.push(header);
74
+ lines.push('-'.repeat(header.length));
75
+ // Data rows
76
+ for (const r of sorted) {
77
+ const category = r.category.padEnd(CATEGORY_WIDTH);
78
+ const severity = severityLabel(r.severity).padEnd(SEVERITY_WIDTH + 9); // +9 for ANSI escape codes from chalk
79
+ const id = r.id.padEnd(ID_WIDTH);
80
+ lines.push(`${category}${severity}${id}${r.message}`);
81
+ }
82
+ // Summary line
83
+ const errorCount = results.filter((r) => r.severity === 'error').length;
84
+ const warnCount = results.filter((r) => r.severity === 'warn').length;
85
+ const infoCount = results.filter((r) => r.severity === 'info').length;
86
+ const okCount = results.filter((r) => r.severity === 'ok').length;
87
+ lines.push('');
88
+ lines.push(`Total: ${results.length} diagnostics (${errorCount} errors, ${warnCount} warnings, ${infoCount} info, ${okCount} passed)`);
89
+ return lines.join('\n');
90
+ }
91
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/cli/doctor/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type { DiagnosticCategory, DiagnosticResult, DiagnosticSeverity, DoctorOptions, DoctorReport, } from './types.js';
2
+ export { runDoctor } from './orchestrator.js';
3
+ export { formatDoctorJson, formatDoctorReport } from './formatter.js';
4
+ export { checkGhostCommands } from './check-ghost-commands.js';
5
+ export { checkNativeDeps } from './check-native-deps.js';
6
+ export { checkWorkspaceDrift } from './check-workspace-drift.js';
7
+ export { checkAgent } from './check-agent.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ // [META] since:2026-04-30 | owner:cli-team | stable:false
2
+ // [WHY] Public API for the doctor module — orchestrator, formatters, types, individual checkers
3
+ export { runDoctor } from './orchestrator.js';
4
+ export { formatDoctorJson, formatDoctorReport } from './formatter.js';
5
+ export { checkGhostCommands } from './check-ghost-commands.js';
6
+ export { checkNativeDeps } from './check-native-deps.js';
7
+ export { checkWorkspaceDrift } from './check-workspace-drift.js';
8
+ export { checkAgent } from './check-agent.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/doctor/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,gGAAgG;AAUhG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DoctorOptions, DoctorReport } from './types.js';
2
+ export declare function runDoctor(options: DoctorOptions): Promise<DoctorReport>;
3
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor/orchestrator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAoB,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhF,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAgC7E"}
@@ -0,0 +1,37 @@
1
+ // [META] since:2026-04-30 | owner:cli-team | stable:false
2
+ // [WHY] Orchestrate all doctor checkers and compute aggregate exit code per CONTEXT.md exit behavior decision
3
+ import { checkGhostCommands } from './check-ghost-commands.js';
4
+ import { checkNativeDeps } from './check-native-deps.js';
5
+ import { checkWorkspaceDrift } from './check-workspace-drift.js';
6
+ import { checkAgent } from './check-agent.js';
7
+ export async function runDoctor(options) {
8
+ const rootDir = options.cwd ?? process.cwd();
9
+ // Run all checkers in parallel — ghost/native/workspace are sync, agent is async
10
+ const [ghostResults, nativeResults, workspaceResults, agentResults] = await Promise.all([
11
+ Promise.resolve(checkGhostCommands(rootDir)),
12
+ Promise.resolve(checkNativeDeps()),
13
+ Promise.resolve(checkWorkspaceDrift(rootDir)),
14
+ checkAgent(),
15
+ ]);
16
+ const results = [
17
+ ...ghostResults,
18
+ ...nativeResults,
19
+ ...workspaceResults,
20
+ ...agentResults,
21
+ ];
22
+ // Compute exit code: 0=all pass, 1=has errors, 2=warnings only
23
+ const hasErrors = results.some((r) => r.severity === 'error');
24
+ const hasWarnings = results.some((r) => r.severity === 'warn');
25
+ let exitCode;
26
+ if (hasErrors) {
27
+ exitCode = 1;
28
+ }
29
+ else if (hasWarnings) {
30
+ exitCode = 2;
31
+ }
32
+ else {
33
+ exitCode = 0;
34
+ }
35
+ return { results, exitCode };
36
+ }
37
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/cli/doctor/orchestrator.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,8GAA8G;AAE9G,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE7C,iFAAiF;IACjF,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtF,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAClC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7C,UAAU,EAAE;KACb,CAAC,CAAC;IAEH,MAAM,OAAO,GAAuB;QAClC,GAAG,YAAY;QACf,GAAG,aAAa;QAChB,GAAG,gBAAgB;QACnB,GAAG,YAAY;KAChB,CAAC;IAEF,+DAA+D;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAE/D,IAAI,QAAgB,CAAC;IACrB,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type DiagnosticCategory = 'install' | 'config' | 'runtime' | 'agent';
2
+ export type DiagnosticSeverity = 'ok' | 'warn' | 'error' | 'info';
3
+ export interface DiagnosticResult {
4
+ category: DiagnosticCategory;
5
+ severity: DiagnosticSeverity;
6
+ id: string;
7
+ message: string;
8
+ remediation: string;
9
+ nextCommand?: string;
10
+ }
11
+ export interface DoctorOptions {
12
+ json?: boolean;
13
+ cwd?: string;
14
+ }
15
+ export interface DoctorReport {
16
+ results: DiagnosticResult[];
17
+ exitCode: number;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,4 @@
1
+ // [META] since:2026-04-30 | owner:cli-team | stable:false
2
+ // [WHY] Shared diagnostic types for codemap doctor — single source of truth for checker output shape
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/doctor/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,qGAAqG"}
@@ -1 +1 @@
1
- {"version":3,"file":"first-run-guide.d.ts","sourceRoot":"","sources":["../../src/cli/first-run-guide.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAY/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,IAAI,CAYlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CA2BxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CASrE"}
1
+ {"version":3,"file":"first-run-guide.d.ts","sourceRoot":"","sources":["../../src/cli/first-run-guide.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAa/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,IAAI,CAYlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAwBxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CASrE"}
@@ -14,11 +14,12 @@ const FIRST_RUN_MARKER = '.mycodemap/.first-run-done';
14
14
  * - 不存在旧输出目录(用于迁移检测)
15
15
  */
16
16
  export function isFirstRun(cwd = process.cwd()) {
17
- const configNew = path.join(cwd, 'mycodemap.config.json');
18
- const configOld = path.join(cwd, 'codemap.config.json');
17
+ const canonicalConfig = path.join(cwd, '.mycodemap', 'config.json');
18
+ const rootConfig = path.join(cwd, 'mycodemap.config.json');
19
+ const legacyConfig = path.join(cwd, 'codemap.config.json');
19
20
  const markerPath = path.join(cwd, FIRST_RUN_MARKER);
20
21
  const oldOutputDir = path.join(cwd, '.codemap');
21
- const hasConfig = fs.existsSync(configNew) || fs.existsSync(configOld);
22
+ const hasConfig = fs.existsSync(canonicalConfig) || fs.existsSync(rootConfig) || fs.existsSync(legacyConfig);
22
23
  const hasMarker = fs.existsSync(markerPath);
23
24
  const hasOldOutput = fs.existsSync(oldOutputDir);
24
25
  // 如果有旧配置或旧输出目录,不是首次运行(需要迁移)
@@ -45,15 +46,14 @@ export function markFirstRunDone(cwd = process.cwd()) {
45
46
  */
46
47
  export function showFirstRunGuide() {
47
48
  console.log('');
48
- console.log(chalk.cyan('━'.repeat(60)));
49
- console.log(chalk.white.bold(' 欢迎使用 CodeMap - TypeScript 代码地图工具'));
50
- console.log(chalk.cyan('━'.repeat(60)));
49
+ console.log(chalk.cyan('━'.repeat(48)));
50
+ console.log(chalk.white.bold(' 欢迎使用 CodeMap'));
51
+ console.log(chalk.cyan('━'.repeat(48)));
51
52
  console.log('');
52
- console.log(chalk.white(' 快速开始:'));
53
+ console.log(chalk.white(' 首次使用建议顺序:'));
53
54
  console.log('');
54
- console.log(chalk.gray(' 1. ') + chalk.white('初始化配置'));
55
+ console.log(chalk.gray(' 1. ') + chalk.white('初始化项目'));
55
56
  console.log(chalk.gray(' ') + chalk.cyan('mycodemap init'));
56
- console.log(chalk.gray(' 或 ') + chalk.cyan('codemap init'));
57
57
  console.log('');
58
58
  console.log(chalk.gray(' 2. ') + chalk.white('生成代码地图'));
59
59
  console.log(chalk.gray(' ') + chalk.cyan('mycodemap generate'));
@@ -61,9 +61,7 @@ export function showFirstRunGuide() {
61
61
  console.log(chalk.gray(' 3. ') + chalk.white('查看帮助'));
62
62
  console.log(chalk.gray(' ') + chalk.cyan('mycodemap --help'));
63
63
  console.log('');
64
- console.log(chalk.cyan('━'.repeat(60)));
65
- console.log(chalk.gray(' 更多功能:query | deps | cycles | complexity | impact'));
66
- console.log(chalk.cyan('━'.repeat(60)));
64
+ console.log(chalk.cyan('━'.repeat(48)));
67
65
  console.log('');
68
66
  }
69
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"first-run-guide.js","sourceRoot":"","sources":["../../src/cli/first-run-guide.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,iCAAiC;AAEjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AACH,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAEjD,4BAA4B;IAC5B,OAAO,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"first-run-guide.js","sourceRoot":"","sources":["../../src/cli/first-run-guide.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -15,7 +15,11 @@ import { workflowCommand } from './commands/workflow.js';
15
15
  import { exportCommand } from './commands/export.js';
16
16
  import { checkCommand } from './commands/check.js';
17
17
  import { historyCommand } from './commands/history.js';
18
+ import { publishStatusCommand } from './commands/publish-status.js';
19
+ import { readinessGateCommand } from './commands/readiness-gate.js';
18
20
  import { mcpCommand, isMcpStartInvocation } from './commands/mcp.js';
21
+ import { doctorCommand } from './commands/doctor.js';
22
+ import { benchmarkCommand } from './commands/benchmark.js';
19
23
  import { shipCommand } from './commands/ship/index.js';
20
24
  import { ANALYZE_COMMAND_DESCRIPTION, configureAnalyzeCommand } from './commands/analyze-options.js';
21
25
  import { setupRuntimeLogging } from './runtime-logger.js';
@@ -23,9 +27,21 @@ import { runFirstRunGuide } from './first-run-guide.js';
23
27
  import { printMigrationWarning } from './paths.js';
24
28
  import { validatePlatform } from './platform-check.js';
25
29
  import { formatRemovedCommandMessage, getRemovedTopLevelCommand } from './removed-commands.js';
26
- import { commandRequiresTreeSitter, validateTreeSitter } from './tree-sitter-check.js';
30
+ import { commandRequiresTreeSitter, validateTreeSitterAsync } from './tree-sitter-check.js';
31
+ import { getFullContract } from './interface-contract/index.js';
32
+ import { tryApplySuggestion } from './output/apply-suggestion.js';
33
+ import { resolveOutputMode, formatError } from './output/index.js';
27
34
  const program = new Command();
28
35
  const cliArgs = process.argv.slice(2);
36
+ // --schema must bypass all startup side effects to keep stdout machine-parseable
37
+ // Only intercept at root level (no subcommand present) so valid subcommand args
38
+ // that happen to be exactly --schema are not hijacked.
39
+ const firstArg = cliArgs[0];
40
+ const isRootLevel = !firstArg || firstArg.startsWith('-');
41
+ if (isRootLevel && cliArgs.includes('--schema')) {
42
+ console.log(JSON.stringify(getFullContract(), null, 2));
43
+ process.exit(0);
44
+ }
29
45
  const shouldBypassHumanStartupSideEffects = isMcpStartInvocation(cliArgs);
30
46
  const removedCommand = getRemovedTopLevelCommand(cliArgs);
31
47
  if (removedCommand) {
@@ -50,31 +66,46 @@ catch (error) {
50
66
  process.exit(1);
51
67
  }
52
68
  /**
53
- * 包装命令 action,按需检测 tree-sitter
69
+ * 统一命令 action 包装器:tree-sitter 检查 + 集中式错误处理 + suggestion 自动修复
54
70
  */
55
- function wrapWithTreeSitterCheck(commandName, action) {
56
- return async (options) => {
57
- if (commandRequiresTreeSitter(commandName)) {
58
- try {
59
- validateTreeSitter();
71
+ async function createActionHandler(commandName, action) {
72
+ return async (...args) => {
73
+ try {
74
+ if (commandRequiresTreeSitter(commandName)) {
75
+ await validateTreeSitterAsync();
60
76
  }
61
- catch (error) {
62
- console.error(error instanceof Error ? error.message : String(error));
63
- process.exit(1);
77
+ await action(...args);
78
+ }
79
+ catch (error) {
80
+ const mode = resolveOutputMode({});
81
+ const formatted = formatError(error, mode, commandName);
82
+ process.stdout.write(formatted + '\n');
83
+ // 尝试自动修复(如果 --apply-suggestion 已设置且错误是 ActionableError)
84
+ const cliOpts = program.opts();
85
+ if (cliOpts.applySuggestion && error && typeof error === 'object' && 'nextCommand' in error) {
86
+ const suggestionResult = await tryApplySuggestion(error, { applySuggestion: cliOpts.applySuggestion, wasmFallback: cliOpts.wasmFallback }, mode);
87
+ if (suggestionResult.success) {
88
+ process.exitCode = 0;
89
+ return;
90
+ }
64
91
  }
92
+ process.exitCode = 1;
65
93
  }
66
- return action(options);
67
94
  };
68
95
  }
69
96
  program
70
97
  .name('mycodemap')
71
98
  .alias('codemap') // 兼容旧命令名
72
99
  .description('TypeScript 代码地图工具 - 为 AI 辅助开发提供结构化上下文')
73
- .version('0.1.0');
100
+ .version('0.1.0')
101
+ .option('--apply-suggestion', 'Allow automatic execution of high-confidence remediation suggestions (confidence >= 0.8)')
102
+ .option('--wasm-fallback', 'Automatically use WASM fallback when native dependencies fail to compile')
103
+ .option('--native', 'Force native binary usage for tree-sitter and better-sqlite3 (disables WASM fallback)');
74
104
  program
75
105
  .command('init')
76
- .description('初始化 CodeMap 配置')
106
+ .description('初始化并收敛 CodeMap 项目状态')
77
107
  .option('-y, --yes', '使用默认配置')
108
+ .option('--interactive', '仅显示 reconciliation preview,不写入文件')
78
109
  .action(initCommand);
79
110
  program
80
111
  .command('generate')
@@ -83,7 +114,7 @@ program
83
114
  .option('-o, --output <dir>', '输出目录', '.mycodemap')
84
115
  .option('--symbol-level', '额外 materialize symbol-level 调用依赖到代码图存储', false)
85
116
  .option('--ai-context', '为每个文件生成 AI 描述(需要 AI Provider)', false)
86
- .action(async (options, command) => {
117
+ .action(await createActionHandler('generate', async (options, command) => {
87
118
  await generateCommand({
88
119
  ...options,
89
120
  __optionSources: {
@@ -91,7 +122,7 @@ program
91
122
  output: command.getOptionValueSource('output'),
92
123
  },
93
124
  });
94
- });
125
+ }));
95
126
  program.addCommand(designCommand);
96
127
  program
97
128
  .command('query')
@@ -102,6 +133,7 @@ program
102
133
  .option('-S, --search <word>', '模糊搜索')
103
134
  .option('-l, --limit <number>', '限制结果数量', '50')
104
135
  .option('-j, --json', 'JSON 格式输出')
136
+ .option('--human', '强制人类可读输出')
105
137
  .option('--structured', '输出完全结构化的 JSON(不包含自然语言字符串,需要配合 --json 使用)')
106
138
  .option('-v, --verbose', '显示性能指标')
107
139
  .option('-r, --regex', '使用正则表达式搜索(仅适用于 -S/--search)')
@@ -116,15 +148,16 @@ program
116
148
  .description('分析项目模块依赖关系')
117
149
  .option('-m, --module <path>', '查看指定模块的依赖')
118
150
  .option('-j, --json', 'JSON 格式输出')
151
+ .option('--human', '强制人类可读输出')
119
152
  .option('--structured', '输出完全结构化的 JSON(不包含自然语言字符串,需要配合 --json 使用)')
120
- .action(depsCommand);
153
+ .action(await createActionHandler('deps', depsCommand));
121
154
  program
122
155
  .command('cycles')
123
156
  .description('检测项目中的循环依赖')
124
157
  .option('-d, --depth <number>', '检测深度', '5')
125
158
  .option('-j, --json', 'JSON 格式输出')
126
159
  .option('--structured', '输出完全结构化的 JSON(不包含自然语言字符串,需要配合 --json 使用)')
127
- .action(cyclesCommand);
160
+ .action(await createActionHandler('cycles', cyclesCommand));
128
161
  program
129
162
  .command('complexity')
130
163
  .description('分析代码复杂度(圈复杂度、认知复杂度、可维护性)')
@@ -132,7 +165,7 @@ program
132
165
  .option('-d, --detail', '显示函数级复杂度详情(使用 AST 精确分析)')
133
166
  .option('-j, --json', 'JSON 格式输出')
134
167
  .option('--structured', '输出完全结构化的 JSON(不包含自然语言字符串,需要配合 --json 使用)')
135
- .action(complexityCommand);
168
+ .action(await createActionHandler('complexity', complexityCommand));
136
169
  program
137
170
  .command('impact')
138
171
  .description('分析文件变更的影响范围')
@@ -140,22 +173,37 @@ program
140
173
  .option('-t, --transitive', '包含传递依赖')
141
174
  .option('-j, --json', 'JSON 格式输出')
142
175
  .option('--structured', '输出完全结构化的 JSON(不包含自然语言字符串,需要配合 --json 使用)')
143
- .action(impactCommand);
176
+ .action(await createActionHandler('impact', impactCommand));
144
177
  configureAnalyzeCommand(program
145
178
  .command('analyze')
146
- .description(ANALYZE_COMMAND_DESCRIPTION)).action(async () => {
179
+ .description(ANALYZE_COMMAND_DESCRIPTION)).action(await createActionHandler('analyze', async () => {
147
180
  const { analyzeCommand } = await import('./commands/analyze.js');
148
181
  // 跳过 program name 和 command name
149
182
  await analyzeCommand(process.argv.slice(2));
150
- });
183
+ }));
151
184
  // CI Gateway 命令
152
185
  program.addCommand(ciCommand);
153
186
  // Contract gate 命令
154
187
  program.addCommand(checkCommand);
155
188
  // History risk 命令
156
189
  program.addCommand(historyCommand);
190
+ // Publish workflow follow-up 命令
191
+ program.addCommand(publishStatusCommand);
192
+ // Readiness gate 命令
193
+ program.addCommand(readinessGateCommand);
157
194
  // Experimental MCP 命令
158
195
  program.addCommand(mcpCommand);
196
+ // Doctor command
197
+ program.addCommand(doctorCommand);
198
+ // Benchmark command
199
+ program
200
+ .command('benchmark')
201
+ .description('Compare WASM vs Native performance')
202
+ .option('-t, --target <path>', 'Target repository', '.')
203
+ .option('-m, --mode <mode>', 'Benchmark mode: native, wasm, both', 'both')
204
+ .option('-i, --iterations <n>', 'Number of iterations', '3')
205
+ .option('-j, --json', 'JSON output')
206
+ .action(benchmarkCommand);
159
207
  // Workflow 命令
160
208
  program.addCommand(workflowCommand);
161
209
  // Export 命令
@@ -173,5 +221,16 @@ program
173
221
  .option('--verbose', '显示详细输出')
174
222
  .option('--yes, -y', '置信度 60-75 时自动确认(不询问)')
175
223
  .action(shipCommand);
224
+ // Handle --native flag: disable WASM fallback before any command runs
225
+ const cliOpts = program.opts();
226
+ if (cliOpts.native) {
227
+ process.env.CODEMAP_USE_WASM_TREE_SITTER = '0';
228
+ process.env.CODEMAP_USE_WASM_BETTER_SQLITE3 = '0';
229
+ }
230
+ // Handle --wasm-fallback flag: activate WASM fallback before any command runs
231
+ if (cliOpts.wasmFallback) {
232
+ process.env.CODEMAP_USE_WASM_TREE_SITTER = '1';
233
+ process.env.CODEMAP_USE_WASM_BETTER_SQLITE3 = '1';
234
+ }
176
235
  program.parse();
177
236
  //# sourceMappingURL=index.js.map