@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
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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,
|
|
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
|
|
18
|
-
const
|
|
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(
|
|
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(
|
|
49
|
-
console.log(chalk.white.bold(' 欢迎使用 CodeMap
|
|
50
|
-
console.log(chalk.cyan('━'.repeat(
|
|
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(
|
|
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,
|
|
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,
|
|
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
|
-
*
|
|
69
|
+
* 统一命令 action 包装器:tree-sitter 检查 + 集中式错误处理 + suggestion 自动修复
|
|
54
70
|
*/
|
|
55
|
-
function
|
|
56
|
-
return async (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
71
|
+
async function createActionHandler(commandName, action) {
|
|
72
|
+
return async (...args) => {
|
|
73
|
+
try {
|
|
74
|
+
if (commandRequiresTreeSitter(commandName)) {
|
|
75
|
+
await validateTreeSitterAsync();
|
|
60
76
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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('
|
|
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
|