@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,290 @@
|
|
|
1
|
+
// [META] since:2026-04-30 | owner:server-team | stable:false
|
|
2
|
+
// [WHY] Adapt CLI interface contract schema to MCP tool definitions with zero handwritten maintenance
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
/**
|
|
5
|
+
* Convert a single contract flag definition into a Zod schema.
|
|
6
|
+
* Handles type mapping, arrays, defaults, optionality, and descriptions.
|
|
7
|
+
*/
|
|
8
|
+
export function convertFlagTypeToZod(flag) {
|
|
9
|
+
let schema;
|
|
10
|
+
switch (flag.type) {
|
|
11
|
+
case 'string': {
|
|
12
|
+
schema = z.string();
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
case 'boolean': {
|
|
16
|
+
schema = z.boolean();
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case 'number': {
|
|
20
|
+
schema = z.number();
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
default: {
|
|
24
|
+
// Graceful degradation for unknown flag types
|
|
25
|
+
schema = z.string();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (flag.multiple) {
|
|
29
|
+
schema = z.array(schema);
|
|
30
|
+
}
|
|
31
|
+
if (flag.defaultValue !== undefined) {
|
|
32
|
+
schema = schema.default(flag.defaultValue);
|
|
33
|
+
}
|
|
34
|
+
else if (!flag.required) {
|
|
35
|
+
schema = schema.optional();
|
|
36
|
+
}
|
|
37
|
+
if (flag.description) {
|
|
38
|
+
schema = schema.describe(flag.description);
|
|
39
|
+
}
|
|
40
|
+
return schema;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Convert an array of flag definitions into a Zod raw shape object
|
|
44
|
+
* suitable for the MCP SDK's `inputSchema` field.
|
|
45
|
+
*/
|
|
46
|
+
export function convertFlagsToZodShape(flags) {
|
|
47
|
+
const shape = {};
|
|
48
|
+
for (const flag of flags) {
|
|
49
|
+
shape[flag.name] = convertFlagTypeToZod(flag);
|
|
50
|
+
}
|
|
51
|
+
return shape;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Recursively convert an OutputProperty into a JSON Schema fragment.
|
|
55
|
+
* Falls back to permissive schemas on unexpected depth or complexity.
|
|
56
|
+
*/
|
|
57
|
+
function convertOutputPropertyToJsonSchema(prop, depth = 0) {
|
|
58
|
+
// Prevent runaway recursion on deeply nested or circular schemas
|
|
59
|
+
if (depth > 10) {
|
|
60
|
+
return { type: 'object', description: 'Nested structure (depth limit reached)' };
|
|
61
|
+
}
|
|
62
|
+
const schema = {};
|
|
63
|
+
if (prop.description) {
|
|
64
|
+
schema.description = prop.description;
|
|
65
|
+
}
|
|
66
|
+
if (prop.nullable) {
|
|
67
|
+
schema.type = [prop.type, 'null'];
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
schema.type = prop.type;
|
|
71
|
+
}
|
|
72
|
+
if (prop.items) {
|
|
73
|
+
schema.items = convertOutputPropertyToJsonSchema(prop.items, depth + 1);
|
|
74
|
+
}
|
|
75
|
+
if (prop.properties && prop.properties.length > 0) {
|
|
76
|
+
schema.properties = Object.fromEntries(prop.properties.map(p => [p.name, convertOutputPropertyToJsonSchema(p, depth + 1)]));
|
|
77
|
+
}
|
|
78
|
+
return schema;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Convert an OutputShape into a JSON Schema object.
|
|
82
|
+
* Degrades gracefully to a permissive object schema on failure.
|
|
83
|
+
*/
|
|
84
|
+
export function convertOutputShapeToJsonSchema(outputShape) {
|
|
85
|
+
try {
|
|
86
|
+
const properties = {};
|
|
87
|
+
const required = [];
|
|
88
|
+
for (const prop of outputShape.properties) {
|
|
89
|
+
properties[prop.name] = convertOutputPropertyToJsonSchema(prop);
|
|
90
|
+
if (!prop.nullable) {
|
|
91
|
+
required.push(prop.name);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const schema = {
|
|
95
|
+
type: outputShape.type,
|
|
96
|
+
properties,
|
|
97
|
+
};
|
|
98
|
+
if (required.length > 0) {
|
|
99
|
+
schema.required = required;
|
|
100
|
+
}
|
|
101
|
+
if (outputShape.description) {
|
|
102
|
+
schema.description = outputShape.description;
|
|
103
|
+
}
|
|
104
|
+
return schema;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return {
|
|
108
|
+
type: 'object',
|
|
109
|
+
description: outputShape.description ?? 'Command output',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Convert an OutputProperty into a Zod schema.
|
|
115
|
+
* Degrades to z.any() for complex or unsupported structures.
|
|
116
|
+
*/
|
|
117
|
+
function outputPropertyToZodSchema(prop, depth = 0) {
|
|
118
|
+
if (depth > 10) {
|
|
119
|
+
return z.any().describe(prop.description ?? 'Nested structure');
|
|
120
|
+
}
|
|
121
|
+
let schema;
|
|
122
|
+
switch (prop.type) {
|
|
123
|
+
case 'string': {
|
|
124
|
+
schema = z.string();
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
case 'number': {
|
|
128
|
+
schema = z.number();
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case 'boolean': {
|
|
132
|
+
schema = z.boolean();
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'null': {
|
|
136
|
+
schema = z.null();
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 'array': {
|
|
140
|
+
schema = prop.items
|
|
141
|
+
? z.array(outputPropertyToZodSchema(prop.items, depth + 1))
|
|
142
|
+
: z.array(z.any());
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 'object': {
|
|
146
|
+
if (prop.properties && prop.properties.length > 0) {
|
|
147
|
+
const shape = {};
|
|
148
|
+
for (const p of prop.properties) {
|
|
149
|
+
shape[p.name] = outputPropertyToZodSchema(p, depth + 1);
|
|
150
|
+
}
|
|
151
|
+
schema = z.object(shape);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
schema = z.record(z.string(), z.any());
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
default: {
|
|
159
|
+
schema = z.any();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (prop.nullable) {
|
|
163
|
+
schema = schema.nullable();
|
|
164
|
+
}
|
|
165
|
+
if (prop.description) {
|
|
166
|
+
schema = schema.describe(prop.description);
|
|
167
|
+
}
|
|
168
|
+
return schema;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Convert an OutputShape into a Zod schema suitable for the MCP SDK's `outputSchema` field.
|
|
172
|
+
* Degrades gracefully to z.any() on failure.
|
|
173
|
+
*/
|
|
174
|
+
export function convertOutputShapeToZodSchema(outputShape) {
|
|
175
|
+
try {
|
|
176
|
+
if (outputShape.type === 'array') {
|
|
177
|
+
const itemSchema = outputShape.properties.length === 1
|
|
178
|
+
? outputPropertyToZodSchema(outputShape.properties[0])
|
|
179
|
+
: z.any();
|
|
180
|
+
let schema = z.array(itemSchema);
|
|
181
|
+
if (outputShape.description) {
|
|
182
|
+
schema = schema.describe(outputShape.description);
|
|
183
|
+
}
|
|
184
|
+
return schema;
|
|
185
|
+
}
|
|
186
|
+
const shape = {};
|
|
187
|
+
for (const prop of outputShape.properties) {
|
|
188
|
+
shape[prop.name] = outputPropertyToZodSchema(prop);
|
|
189
|
+
}
|
|
190
|
+
let schema = z.object(shape);
|
|
191
|
+
if (outputShape.description) {
|
|
192
|
+
schema = schema.describe(outputShape.description);
|
|
193
|
+
}
|
|
194
|
+
return schema;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return z.any().describe(outputShape.description ?? 'Command output');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function shellQuote(value) {
|
|
201
|
+
if (/^[A-Za-z0-9@+_./:-]+$/.test(value)) {
|
|
202
|
+
return value;
|
|
203
|
+
}
|
|
204
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
205
|
+
}
|
|
206
|
+
function buildCliCommandLine(contract, args, programName = 'codemap') {
|
|
207
|
+
const flagArgs = Object.entries(args)
|
|
208
|
+
.filter(([, v]) => v !== undefined && v !== '' && v !== false && !(Array.isArray(v) && v.length === 0))
|
|
209
|
+
.map(([k, v]) => {
|
|
210
|
+
if (Array.isArray(v)) {
|
|
211
|
+
return v.map(item => `--${k} ${shellQuote(String(item))}`).join(' ');
|
|
212
|
+
}
|
|
213
|
+
if (typeof v === 'boolean') {
|
|
214
|
+
return `--${k}`;
|
|
215
|
+
}
|
|
216
|
+
return `--${k} ${shellQuote(String(v))}`;
|
|
217
|
+
})
|
|
218
|
+
.join(' ');
|
|
219
|
+
return `${programName} ${contract.name}${flagArgs ? ` ${flagArgs}` : ''}`;
|
|
220
|
+
}
|
|
221
|
+
function createCliAvailabilityHandler(contract, programName) {
|
|
222
|
+
return async (args) => {
|
|
223
|
+
const commandLine = buildCliCommandLine(contract, args, programName);
|
|
224
|
+
return {
|
|
225
|
+
content: [{
|
|
226
|
+
type: 'text',
|
|
227
|
+
text: `Command available via CLI: ${commandLine}`,
|
|
228
|
+
}],
|
|
229
|
+
structuredContent: {
|
|
230
|
+
status: 'cli_redirect',
|
|
231
|
+
command: contract.name,
|
|
232
|
+
args,
|
|
233
|
+
cliCommand: commandLine,
|
|
234
|
+
description: contract.description,
|
|
235
|
+
examples: contract.examples,
|
|
236
|
+
errorCodes: contract.errorCodes.map(e => e.code),
|
|
237
|
+
},
|
|
238
|
+
isError: false,
|
|
239
|
+
};
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Zod schema matching the structured content returned by cli_redirect handlers.
|
|
244
|
+
* Used as the output schema for contract tools until handlers return real command output.
|
|
245
|
+
*
|
|
246
|
+
* NOTE: `z.unknown()` is used for `args` instead of `z.record(z.unknown())` because
|
|
247
|
+
* Zod v4's `z.record()` triggers a crash in `z4mini.toJSONSchema` when the SDK
|
|
248
|
+
* serializes the schema for `listTools()` discovery.
|
|
249
|
+
*/
|
|
250
|
+
const cliRedirectOutputSchema = z.object({
|
|
251
|
+
status: z.literal('cli_redirect'),
|
|
252
|
+
command: z.string(),
|
|
253
|
+
args: z.unknown(),
|
|
254
|
+
cliCommand: z.string(),
|
|
255
|
+
description: z.string(),
|
|
256
|
+
examples: z.array(z.string()),
|
|
257
|
+
errorCodes: z.array(z.string()),
|
|
258
|
+
});
|
|
259
|
+
/**
|
|
260
|
+
* Convert a CommandContract into one or more MCP tool definitions.
|
|
261
|
+
* The primary command and any aliases each get their own tool name.
|
|
262
|
+
*/
|
|
263
|
+
export function convertContractToMcpTools(contract, programName = 'codemap') {
|
|
264
|
+
const definitions = [];
|
|
265
|
+
const inputSchema = convertFlagsToZodShape(contract.flags);
|
|
266
|
+
definitions.push({
|
|
267
|
+
name: `codemap_${contract.name}`,
|
|
268
|
+
config: {
|
|
269
|
+
title: `CodeMap ${contract.name}`,
|
|
270
|
+
description: `${contract.description}\n\nExamples:\n${contract.examples.join('\n')}`,
|
|
271
|
+
inputSchema,
|
|
272
|
+
outputSchema: cliRedirectOutputSchema,
|
|
273
|
+
},
|
|
274
|
+
handler: createCliAvailabilityHandler(contract, programName),
|
|
275
|
+
});
|
|
276
|
+
for (const alias of contract.aliases ?? []) {
|
|
277
|
+
definitions.push({
|
|
278
|
+
name: `codemap_${alias}`,
|
|
279
|
+
config: {
|
|
280
|
+
title: `CodeMap ${alias}`,
|
|
281
|
+
description: `${contract.description} (alias for ${contract.name})\n\nExamples:\n${contract.examples.join('\n')}`,
|
|
282
|
+
inputSchema,
|
|
283
|
+
outputSchema: cliRedirectOutputSchema,
|
|
284
|
+
},
|
|
285
|
+
handler: createCliAvailabilityHandler({ ...contract, name: alias }, programName),
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
return definitions;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=schema-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-adapter.js","sourceRoot":"","sources":["../../../src/server/mcp/schema-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAUjE,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAqFD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAanE;AAED,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC;IACT,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,QAAQ,CAAC;IAClB,SAAS,EAAE,oBAAoB,CAAC;IAChC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CAiBD"}
|
|
@@ -5,13 +5,15 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
5
5
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { createConfiguredStorage } from '../../cli/storage-runtime.js';
|
|
8
|
+
import { getFullContract } from '../../cli/interface-contract/index.js';
|
|
8
9
|
import { CodeMapMcpService } from './service.js';
|
|
10
|
+
import { convertContractToMcpTools } from './schema-adapter.js';
|
|
9
11
|
const MCP_SERVER_NAME = 'mycodemap-experimental';
|
|
10
12
|
const MCP_SERVER_VERSION = process.env.npm_package_version ?? '0.5.0';
|
|
11
13
|
function renderStructuredContent(result) {
|
|
12
14
|
return JSON.stringify(result, null, 2);
|
|
13
15
|
}
|
|
14
|
-
function
|
|
16
|
+
function registerNativeTools(server, service) {
|
|
15
17
|
server.registerTool('codemap_query', {
|
|
16
18
|
title: 'CodeMap Query',
|
|
17
19
|
description: 'Experimental: query a symbol definition plus callers and callees from the local CodeMap graph.',
|
|
@@ -56,13 +58,41 @@ function registerTools(server, service) {
|
|
|
56
58
|
};
|
|
57
59
|
});
|
|
58
60
|
}
|
|
61
|
+
function registerContractTools(server, contract, reservedNames) {
|
|
62
|
+
const registeredNames = new Set(reservedNames);
|
|
63
|
+
for (const command of contract.commands) {
|
|
64
|
+
const definitions = convertContractToMcpTools(command, contract.programName);
|
|
65
|
+
for (const def of definitions) {
|
|
66
|
+
let toolName = def.name;
|
|
67
|
+
// If a native tool occupies this name, register under a stable alternative
|
|
68
|
+
if (registeredNames.has(toolName)) {
|
|
69
|
+
const altName = `${toolName}_contract`;
|
|
70
|
+
if (registeredNames.has(altName)) {
|
|
71
|
+
console.warn(`Contract tool "${def.name}" skipped — name reserved by native tool and alternative "${altName}" also taken`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
console.warn(`Contract tool "${def.name}" renamed to "${altName}" — name reserved by native tool`);
|
|
75
|
+
toolName = altName;
|
|
76
|
+
}
|
|
77
|
+
registeredNames.add(toolName);
|
|
78
|
+
server.registerTool(toolName, {
|
|
79
|
+
title: def.config.title,
|
|
80
|
+
description: def.config.description,
|
|
81
|
+
inputSchema: def.config.inputSchema,
|
|
82
|
+
outputSchema: def.config.outputSchema,
|
|
83
|
+
}, async (args) => def.handler(args));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
59
87
|
export function createCodeMapMcpServer(storage) {
|
|
60
88
|
const server = new McpServer({
|
|
61
89
|
name: MCP_SERVER_NAME,
|
|
62
90
|
version: MCP_SERVER_VERSION,
|
|
63
91
|
});
|
|
64
92
|
const service = new CodeMapMcpService(storage);
|
|
65
|
-
|
|
93
|
+
const reservedNames = new Set(['codemap_query', 'codemap_impact']);
|
|
94
|
+
registerNativeTools(server, service);
|
|
95
|
+
registerContractTools(server, getFullContract(), reservedNames);
|
|
66
96
|
return server;
|
|
67
97
|
}
|
|
68
98
|
export async function startCodeMapMcpServer(options = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,oGAAoG;AAEpG,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,10 @@ MyCodeMap 可以与多种 AI 编程助手集成,让 AI 能够:
|
|
|
24
24
|
- 📊 **依赖分析** - 理解项目结构和模块关系
|
|
25
25
|
- ⚡ **影响评估** - 分析代码变更的影响范围
|
|
26
26
|
- 🛡️ **质量门禁** - 自动执行 CI 检查
|
|
27
|
+
- 🩺 **持续健康诊断** (`doctor`) - 安装 / 配置 / 运行时 / Agent 四类健康检查
|
|
28
|
+
- 🧬 **WASM 回退** - 当 Native 依赖不可用时自动切换 WASM 实现
|
|
29
|
+
- 📜 **接口契约自省** (`--schema`) - 输出完整 CLI 契约 JSON,供 Agent 动态发现能力
|
|
30
|
+
- 🔌 **MCP 自动网关** - 所有 Schema 定义的 CLI 命令自动暴露为 MCP tools,动态注册
|
|
27
31
|
|
|
28
32
|
### 快速选择
|
|
29
33
|
|
|
@@ -53,7 +57,7 @@ MyCodeMap 可以与多种 AI 编程助手集成,让 AI 能够:
|
|
|
53
57
|
- 也可以通过 `mycodemap ci check-docs-sync` 走统一的 CI 子命令入口
|
|
54
58
|
- 当前仓库的 agent 工程规则以 `docs/rules/engineering-with-codex-openai.md` 为准
|
|
55
59
|
- 若文档或提示词仍把 `server`、`watch`、`report`、`logs` 当成当前 public CLI,必须同步改成 removed-command 迁移说明
|
|
56
|
-
- 若项目启用了
|
|
60
|
+
- 若项目启用了 `.mycodemap/config.json` 中 `storage.type = "sqlite"`,先确认 `better-sqlite3` 已安装且 Node.js `>=20`;若仍看到 `kuzudb` / `neo4j` 配置,应先迁移再让 AI 判断 graph backend 失败原因
|
|
57
61
|
|
|
58
62
|
---
|
|
59
63
|
|
|
@@ -138,23 +142,20 @@ $CODEMAP_CMD complexity -f "<file-path>"
|
|
|
138
142
|
|
|
139
143
|
### 统一分析入口(analyze)
|
|
140
144
|
```bash
|
|
141
|
-
#
|
|
142
|
-
$CODEMAP_CMD analyze -i
|
|
145
|
+
# 符号查找
|
|
146
|
+
$CODEMAP_CMD analyze -i find -s "<symbol-name>"
|
|
143
147
|
|
|
144
|
-
#
|
|
145
|
-
$CODEMAP_CMD analyze -i
|
|
146
|
-
|
|
147
|
-
# 复杂度分析
|
|
148
|
-
$CODEMAP_CMD analyze -i complexity -t "<path>"
|
|
148
|
+
# 代码读取(含上下文)
|
|
149
|
+
$CODEMAP_CMD analyze -i read -t "<file-path>" --scope transitive
|
|
149
150
|
|
|
150
|
-
#
|
|
151
|
-
$CODEMAP_CMD analyze -i
|
|
151
|
+
# 依赖链接分析
|
|
152
|
+
$CODEMAP_CMD analyze -i link -t "<module-path>"
|
|
152
153
|
|
|
153
|
-
#
|
|
154
|
-
$CODEMAP_CMD analyze -i
|
|
154
|
+
# 项目概览展示
|
|
155
|
+
$CODEMAP_CMD analyze -i show -t "<path>"
|
|
155
156
|
|
|
156
157
|
# JSON 输出
|
|
157
|
-
$CODEMAP_CMD analyze -i
|
|
158
|
+
$CODEMAP_CMD analyze -i find -s "<symbol>" --json
|
|
158
159
|
```
|
|
159
160
|
|
|
160
161
|
### CI 门禁(ci)
|
|
@@ -422,7 +423,9 @@ mycodemap impact -f "src/file.ts"
|
|
|
422
423
|
|
|
423
424
|
## 关键文件
|
|
424
425
|
|
|
425
|
-
-
|
|
426
|
+
- `.mycodemap/config.json` - CodeMap canonical 配置文件
|
|
427
|
+
- `.mycodemap/status/init-last.json` - init receipt / managed asset ledger
|
|
428
|
+
- `.mycodemap/rules/` - 通用 AI guardrails rules bundle(需手动引用到 `CLAUDE.md` / `AGENTS.md`)
|
|
426
429
|
- `.mycodemap/AI_MAP.md` - 项目全局概览
|
|
427
430
|
|
|
428
431
|
## 开发规范
|
|
@@ -806,6 +809,162 @@ npm install --save-dev @mycodemap/mycodemap
|
|
|
806
809
|
|
|
807
810
|
---
|
|
808
811
|
|
|
812
|
+
## AI CLI 一键安装引导
|
|
813
|
+
|
|
814
|
+
> 本章节面向 AI CLI 工具(Claude Code、Codex CLI 等),提供结构化安装引导。
|
|
815
|
+
> 当用户说"帮我安装 mycodemap"时,AI CLI 应按照以下步骤引导。
|
|
816
|
+
|
|
817
|
+
### Step 1: 前置条件检查 [CONFIRM]
|
|
818
|
+
|
|
819
|
+
在开始安装前,确认以下条件:
|
|
820
|
+
|
|
821
|
+
- Node.js >= 18 是否已安装(`node --version`)
|
|
822
|
+
- 当前项目是否有 package.json(`ls package.json`)
|
|
823
|
+
- 向用户确认:是项目级别安装还是全局安装
|
|
824
|
+
|
|
825
|
+
### Step 2: 安装依赖 [CONFIRM]
|
|
826
|
+
|
|
827
|
+
```bash
|
|
828
|
+
# 项目级别安装(推荐)
|
|
829
|
+
npm install @mycodemap/mycodemap
|
|
830
|
+
|
|
831
|
+
# 或全局安装
|
|
832
|
+
npm install -g @mycodemap/mycodemap
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
### Step 3: 初始化 [CONFIRM]
|
|
836
|
+
|
|
837
|
+
```bash
|
|
838
|
+
# 先预览配置(不写入文件)
|
|
839
|
+
mycodemap init
|
|
840
|
+
|
|
841
|
+
# 确认后写入
|
|
842
|
+
mycodemap init -y
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
### Step 4: 生成代码地图
|
|
846
|
+
|
|
847
|
+
```bash
|
|
848
|
+
mycodemap generate
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
安装完成后会生成:
|
|
852
|
+
- `.mycodemap/AI_MAP.md` — 项目全局概览
|
|
853
|
+
- `.mycodemap/codemap.json` — 结构化数据
|
|
854
|
+
- `.mycodemap/CONTEXT.md` — 上下文入口
|
|
855
|
+
|
|
856
|
+
### Step 5: 环境健康诊断 [CONFIRM]
|
|
857
|
+
|
|
858
|
+
运行 `codemap doctor` 验证环境健康状态:
|
|
859
|
+
|
|
860
|
+
```bash
|
|
861
|
+
# 运行全部诊断(安装 / 配置 / 运行时 / Agent)
|
|
862
|
+
codemap doctor
|
|
863
|
+
|
|
864
|
+
# 或按类别诊断
|
|
865
|
+
codemap doctor --category install
|
|
866
|
+
codemap doctor --category config
|
|
867
|
+
codemap doctor --category runtime
|
|
868
|
+
codemap doctor --category agent
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
诊断输出为结构化 JSON,包含 `rootCause` + `remediationPlan` + `confidence` + `nextCommand`。修复所有 HIGH 级别问题后再继续。
|
|
872
|
+
|
|
873
|
+
### Step 6: 查看接口契约 [CONFIRM]
|
|
874
|
+
|
|
875
|
+
运行 `codemap --schema` 查看完整 CLI 接口契约,供 Agent 自省:
|
|
876
|
+
|
|
877
|
+
```bash
|
|
878
|
+
# 输出完整契约 JSON
|
|
879
|
+
codemap --schema
|
|
880
|
+
|
|
881
|
+
# 或保存到文件供 skill 引用
|
|
882
|
+
codemap --schema > .mycodemap/interface-contract.json
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
契约包含所有命令、参数、输出格式的结构化定义,是 MCP Gateway 动态暴露 tools 的单一数据源。
|
|
886
|
+
|
|
887
|
+
### Step 7: 配置 AI 助手 skill [CONFIRM]
|
|
888
|
+
|
|
889
|
+
根据使用的 AI 助手,拷贝对应的 skill 文件:
|
|
890
|
+
|
|
891
|
+
**Claude Code:**
|
|
892
|
+
```bash
|
|
893
|
+
mkdir -p .claude/skills/codemap
|
|
894
|
+
cp node_modules/@mycodemap/mycodemap/examples/claude/codemap-skill.md .claude/skills/codemap/SKILL.md
|
|
895
|
+
|
|
896
|
+
# 可选:安装架构分析技能(Phase 48 已交付)
|
|
897
|
+
mkdir -p .claude/skills/mycodemap-repo-analyzer
|
|
898
|
+
cp node_modules/@mycodemap/mycodemap/examples/claude/skills/mycodemap-repo-analyzer/SKILL.md .claude/skills/mycodemap-repo-analyzer/SKILL.md
|
|
899
|
+
cp -r node_modules/@mycodemap/mycodemap/examples/claude/skills/mycodemap-repo-analyzer/references .claude/skills/mycodemap-repo-analyzer/
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
**Codex CLI:**
|
|
903
|
+
```bash
|
|
904
|
+
mkdir -p .agents/skills/codemap
|
|
905
|
+
cp node_modules/@mycodemap/mycodemap/examples/codex/codemap-agent.md .agents/skills/codemap/SKILL.md
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
### Step 8: 更新项目 rules [CONFIRM]
|
|
909
|
+
|
|
910
|
+
在项目的 `CLAUDE.md` 和 `AGENTS.md` 中追加以下内容:
|
|
911
|
+
|
|
912
|
+
```markdown
|
|
913
|
+
## CodeMap Skill
|
|
914
|
+
|
|
915
|
+
### 何时使用
|
|
916
|
+
- 需要理解项目整体结构或模块关系
|
|
917
|
+
- 分析代码变更的影响范围
|
|
918
|
+
- 查询符号定义、调用关系、依赖链
|
|
919
|
+
- 评估代码复杂度或检测循环依赖
|
|
920
|
+
|
|
921
|
+
### 何时不用
|
|
922
|
+
- 简单的单文件修改或调试
|
|
923
|
+
- 非代码文件操作(文档、配置等)
|
|
924
|
+
- 已有明确上下文的局部改动
|
|
925
|
+
|
|
926
|
+
### 如何使用
|
|
927
|
+
- 参考 .claude/skills/codemap/ 中的 skill 指令
|
|
928
|
+
- 使用 mycodemap CLI 命令(generate/query/impact/deps/cycles/complexity)
|
|
929
|
+
|
|
930
|
+
### 索引维护
|
|
931
|
+
- 代码变更后需运行 `mycodemap generate` 更新索引
|
|
932
|
+
- 在重大功能开发/重构完成后,主动更新一次
|
|
933
|
+
- 如发现 mycodemap 查询结果与代码不一致,先更新索引再使用
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
### Step 9: 验证安装
|
|
937
|
+
|
|
938
|
+
```bash
|
|
939
|
+
# 验证 CLI 可用
|
|
940
|
+
mycodemap query --help
|
|
941
|
+
|
|
942
|
+
# 验证 doctor 可用
|
|
943
|
+
codemap doctor --help
|
|
944
|
+
|
|
945
|
+
# 验证 schema 输出
|
|
946
|
+
codemap --schema | head -20
|
|
947
|
+
|
|
948
|
+
# 验证 skill 文件已就位
|
|
949
|
+
ls .claude/skills/codemap/SKILL.md
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
### 可选:MCP 服务器配置
|
|
953
|
+
|
|
954
|
+
CodeMap v2.0 采用 **CLI-as-MCP 自动网关**:所有 Schema 定义的 CLI 命令自动暴露为 MCP tools,无需手动维护 tool 列表。
|
|
955
|
+
|
|
956
|
+
```bash
|
|
957
|
+
# 安装 MCP 适配器(一次性)
|
|
958
|
+
codemap mcp install
|
|
959
|
+
|
|
960
|
+
# 验证动态 tool 注册(应列出 20+ 个 tools)
|
|
961
|
+
codemap mcp list-tools
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
配置完成后,AI 助手可通过 MCP 调用任意 `codemap` 命令(如 `doctor`、`benchmark`、`analyze`、`query` 等),Gateway 会根据 Interface Contract Schema 动态生成 tool 定义。无需再使用实验性的 2-tool 限制模式。
|
|
965
|
+
|
|
966
|
+
---
|
|
967
|
+
|
|
809
968
|
## 参考
|
|
810
969
|
|
|
811
970
|
- [SETUP_GUIDE.md](./SETUP_GUIDE.md) - 人类用户安装指南
|