codedev-mcp 3.2.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 +90 -0
- package/LICENSE +21 -0
- package/README.md +760 -0
- package/dist/analyzers/api-contract.d.ts +46 -0
- package/dist/analyzers/api-contract.d.ts.map +1 -0
- package/dist/analyzers/api-contract.js +319 -0
- package/dist/analyzers/api-contract.js.map +1 -0
- package/dist/analyzers/architecture.d.ts +37 -0
- package/dist/analyzers/architecture.d.ts.map +1 -0
- package/dist/analyzers/architecture.js +149 -0
- package/dist/analyzers/architecture.js.map +1 -0
- package/dist/analyzers/branch-compare.d.ts +46 -0
- package/dist/analyzers/branch-compare.d.ts.map +1 -0
- package/dist/analyzers/branch-compare.js +128 -0
- package/dist/analyzers/branch-compare.js.map +1 -0
- package/dist/analyzers/cicd.d.ts +42 -0
- package/dist/analyzers/cicd.d.ts.map +1 -0
- package/dist/analyzers/cicd.js +237 -0
- package/dist/analyzers/cicd.js.map +1 -0
- package/dist/analyzers/codebase.d.ts +64 -0
- package/dist/analyzers/codebase.d.ts.map +1 -0
- package/dist/analyzers/codebase.js +354 -0
- package/dist/analyzers/codebase.js.map +1 -0
- package/dist/analyzers/complexity-heatmap.d.ts +50 -0
- package/dist/analyzers/complexity-heatmap.d.ts.map +1 -0
- package/dist/analyzers/complexity-heatmap.js +156 -0
- package/dist/analyzers/complexity-heatmap.js.map +1 -0
- package/dist/analyzers/context-pack.d.ts +43 -0
- package/dist/analyzers/context-pack.d.ts.map +1 -0
- package/dist/analyzers/context-pack.js +232 -0
- package/dist/analyzers/context-pack.js.map +1 -0
- package/dist/analyzers/coverage.d.ts +70 -0
- package/dist/analyzers/coverage.d.ts.map +1 -0
- package/dist/analyzers/coverage.js +313 -0
- package/dist/analyzers/coverage.js.map +1 -0
- package/dist/analyzers/db-schema.d.ts +55 -0
- package/dist/analyzers/db-schema.d.ts.map +1 -0
- package/dist/analyzers/db-schema.js +237 -0
- package/dist/analyzers/db-schema.js.map +1 -0
- package/dist/analyzers/dead-code.d.ts +34 -0
- package/dist/analyzers/dead-code.d.ts.map +1 -0
- package/dist/analyzers/dead-code.js +131 -0
- package/dist/analyzers/dead-code.js.map +1 -0
- package/dist/analyzers/dep-vuln.d.ts +36 -0
- package/dist/analyzers/dep-vuln.d.ts.map +1 -0
- package/dist/analyzers/dep-vuln.js +342 -0
- package/dist/analyzers/dep-vuln.js.map +1 -0
- package/dist/analyzers/docs.d.ts +47 -0
- package/dist/analyzers/docs.d.ts.map +1 -0
- package/dist/analyzers/docs.js +473 -0
- package/dist/analyzers/docs.js.map +1 -0
- package/dist/analyzers/git.d.ts +115 -0
- package/dist/analyzers/git.d.ts.map +1 -0
- package/dist/analyzers/git.js +214 -0
- package/dist/analyzers/git.js.map +1 -0
- package/dist/analyzers/iac.d.ts +39 -0
- package/dist/analyzers/iac.d.ts.map +1 -0
- package/dist/analyzers/iac.js +233 -0
- package/dist/analyzers/iac.js.map +1 -0
- package/dist/analyzers/impact.d.ts +51 -0
- package/dist/analyzers/impact.d.ts.map +1 -0
- package/dist/analyzers/impact.js +235 -0
- package/dist/analyzers/impact.js.map +1 -0
- package/dist/analyzers/monorepo.d.ts +36 -0
- package/dist/analyzers/monorepo.d.ts.map +1 -0
- package/dist/analyzers/monorepo.js +233 -0
- package/dist/analyzers/monorepo.js.map +1 -0
- package/dist/analyzers/notebook.d.ts +53 -0
- package/dist/analyzers/notebook.d.ts.map +1 -0
- package/dist/analyzers/notebook.js +149 -0
- package/dist/analyzers/notebook.js.map +1 -0
- package/dist/analyzers/perf-profile.d.ts +39 -0
- package/dist/analyzers/perf-profile.d.ts.map +1 -0
- package/dist/analyzers/perf-profile.js +222 -0
- package/dist/analyzers/perf-profile.js.map +1 -0
- package/dist/analyzers/scaffold.d.ts +46 -0
- package/dist/analyzers/scaffold.d.ts.map +1 -0
- package/dist/analyzers/scaffold.js +313 -0
- package/dist/analyzers/scaffold.js.map +1 -0
- package/dist/analyzers/security.d.ts +42 -0
- package/dist/analyzers/security.d.ts.map +1 -0
- package/dist/analyzers/security.js +281 -0
- package/dist/analyzers/security.js.map +1 -0
- package/dist/analyzers/symbols.d.ts +49 -0
- package/dist/analyzers/symbols.d.ts.map +1 -0
- package/dist/analyzers/symbols.js +212 -0
- package/dist/analyzers/symbols.js.map +1 -0
- package/dist/analyzers/tree-sitter.d.ts +71 -0
- package/dist/analyzers/tree-sitter.d.ts.map +1 -0
- package/dist/analyzers/tree-sitter.js +333 -0
- package/dist/analyzers/tree-sitter.js.map +1 -0
- package/dist/analyzers/type-flow.d.ts +39 -0
- package/dist/analyzers/type-flow.d.ts.map +1 -0
- package/dist/analyzers/type-flow.js +75 -0
- package/dist/analyzers/type-flow.js.map +1 -0
- package/dist/cache/memory-cache.d.ts +130 -0
- package/dist/cache/memory-cache.d.ts.map +1 -0
- package/dist/cache/memory-cache.js +273 -0
- package/dist/cache/memory-cache.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/constants/instructions.d.ts +2 -0
- package/dist/constants/instructions.d.ts.map +1 -0
- package/dist/constants/instructions.js +82 -0
- package/dist/constants/instructions.js.map +1 -0
- package/dist/db/connection.d.ts +12 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +34 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/json-store.d.ts +111 -0
- package/dist/db/json-store.d.ts.map +1 -0
- package/dist/db/json-store.js +201 -0
- package/dist/db/json-store.js.map +1 -0
- package/dist/db/sqlite-store.d.ts +153 -0
- package/dist/db/sqlite-store.d.ts.map +1 -0
- package/dist/db/sqlite-store.js +388 -0
- package/dist/db/sqlite-store.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/health.d.ts +35 -0
- package/dist/resources/health.d.ts.map +1 -0
- package/dist/resources/health.js +81 -0
- package/dist/resources/health.js.map +1 -0
- package/dist/schemas/output-schemas.d.ts +517 -0
- package/dist/schemas/output-schemas.d.ts.map +1 -0
- package/dist/schemas/output-schemas.js +296 -0
- package/dist/schemas/output-schemas.js.map +1 -0
- package/dist/search/fast-search.d.ts +90 -0
- package/dist/search/fast-search.d.ts.map +1 -0
- package/dist/search/fast-search.js +387 -0
- package/dist/search/fast-search.js.map +1 -0
- package/dist/search/semantic.d.ts +26 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +458 -0
- package/dist/search/semantic.js.map +1 -0
- package/dist/tools/analysis.d.ts +7 -0
- package/dist/tools/analysis.d.ts.map +1 -0
- package/dist/tools/analysis.js +491 -0
- package/dist/tools/analysis.js.map +1 -0
- package/dist/tools/architecture.d.ts +7 -0
- package/dist/tools/architecture.d.ts.map +1 -0
- package/dist/tools/architecture.js +176 -0
- package/dist/tools/architecture.js.map +1 -0
- package/dist/tools/devops.d.ts +7 -0
- package/dist/tools/devops.d.ts.map +1 -0
- package/dist/tools/devops.js +179 -0
- package/dist/tools/devops.js.map +1 -0
- package/dist/tools/docs.d.ts +7 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +102 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/git.d.ts +7 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +475 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/nav.d.ts +7 -0
- package/dist/tools/nav.d.ts.map +1 -0
- package/dist/tools/nav.js +275 -0
- package/dist/tools/nav.js.map +1 -0
- package/dist/tools/notebook.d.ts +7 -0
- package/dist/tools/notebook.d.ts.map +1 -0
- package/dist/tools/notebook.js +102 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/performance.d.ts +7 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +59 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/quality.d.ts +7 -0
- package/dist/tools/quality.d.ts.map +1 -0
- package/dist/tools/quality.js +279 -0
- package/dist/tools/quality.js.map +1 -0
- package/dist/tools/scaffold.d.ts +7 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +80 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/search.d.ts +7 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +308 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/security.d.ts +7 -0
- package/dist/tools/security.d.ts.map +1 -0
- package/dist/tools/security.js +138 -0
- package/dist/tools/security.js.map +1 -0
- package/dist/utils/analytics.d.ts +69 -0
- package/dist/utils/analytics.d.ts.map +1 -0
- package/dist/utils/analytics.js +144 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/concurrency.d.ts +43 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +78 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/fallback.d.ts +52 -0
- package/dist/utils/fallback.d.ts.map +1 -0
- package/dist/utils/fallback.js +137 -0
- package/dist/utils/fallback.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +24 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +108 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/languages.d.ts +72 -0
- package/dist/utils/languages.d.ts.map +1 -0
- package/dist/utils/languages.js +463 -0
- package/dist/utils/languages.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +34 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/plugins.d.ts +105 -0
- package/dist/utils/plugins.d.ts.map +1 -0
- package/dist/utils/plugins.js +325 -0
- package/dist/utils/plugins.js.map +1 -0
- package/dist/utils/security.d.ts +17 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +48 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/streaming.d.ts +56 -0
- package/dist/utils/streaming.d.ts.map +1 -0
- package/dist/utils/streaming.js +95 -0
- package/dist/utils/streaming.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/mcp.json +100 -0
- package/package.json +89 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { stat, readFile } from 'node:fs/promises';
|
|
4
|
+
import { extractCallGraph, isTreeSitterReady } from '../analyzers/tree-sitter.js';
|
|
5
|
+
import { parseCoverage, getFileCoverage, getUntestedFiles, findTestFiles } from '../analyzers/coverage.js';
|
|
6
|
+
import { outputSchemas } from '../schemas/output-schemas.js';
|
|
7
|
+
import { CWD, ROOTS, IS_MULTI_ROOT, safePath } from '../config.js';
|
|
8
|
+
import { mapCodebase } from '../analyzers/codebase.js';
|
|
9
|
+
import { analyzeFile, formatFileOutline, extractImports } from '../analyzers/symbols.js';
|
|
10
|
+
import { searchCode, listFiles } from '../search/fast-search.js';
|
|
11
|
+
import { detectLanguage } from '../utils/languages.js';
|
|
12
|
+
/**
|
|
13
|
+
* Registers analysis tools for codebase mapping, file analysis, dependency graphing, metrics, call graphs, and test coverage.
|
|
14
|
+
* @param server - The MCP server instance to register tools on.
|
|
15
|
+
*/
|
|
16
|
+
export function registerAnalysisTools(server) {
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
18
|
+
// TOOL: codebase_map — Full codebase overview
|
|
19
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
20
|
+
server.registerTool('codebase_map', {
|
|
21
|
+
description: 'Generate a comprehensive overview of the entire codebase: languages, frameworks, directory structure, file counts, infrastructure (tests, CI, Docker). Essential first step for understanding any project.',
|
|
22
|
+
outputSchema: outputSchemas.codebase_map,
|
|
23
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
24
|
+
}, async () => {
|
|
25
|
+
try {
|
|
26
|
+
if (IS_MULTI_ROOT) {
|
|
27
|
+
const parts = [`## Multi-Root Workspace (${ROOTS.length} roots)\n`];
|
|
28
|
+
for (const root of ROOTS) {
|
|
29
|
+
const { tree, summary } = await mapCodebase(root);
|
|
30
|
+
parts.push(`### Root: ${root}\n${summary}\n\n#### Directory Tree\n\`\`\`\n${tree}\n\`\`\`\n`);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
content: [{ type: 'text', text: parts.join('\n') }],
|
|
34
|
+
structuredContent: { summary: parts.join('\n'), tree: '', roots: ROOTS.length },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const { tree, summary } = await mapCodebase(CWD);
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `${summary}\n\n### Directory Tree\n\`\`\`\n${tree}\n\`\`\``,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
structuredContent: { summary, tree, roots: 1 },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: `codebase_map failed: ${error.message}. Ensure the working directory is a valid project. Check that the path is accessible.`,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
isError: true,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
61
|
+
// TOOL: analyze_file — Deep analysis of a single file
|
|
62
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
63
|
+
server.registerTool('analyze_file', {
|
|
64
|
+
description: 'Deep analysis of a single file: symbols (functions, classes, types), imports, line counts, complexity score, and full structural outline.',
|
|
65
|
+
inputSchema: {
|
|
66
|
+
path: z.string().describe('File path relative to project root'),
|
|
67
|
+
},
|
|
68
|
+
outputSchema: outputSchemas.analyze_file,
|
|
69
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
70
|
+
}, async (params) => {
|
|
71
|
+
try {
|
|
72
|
+
const filePath = safePath(params.path);
|
|
73
|
+
const analysis = await analyzeFile(filePath);
|
|
74
|
+
const outline = formatFileOutline(analysis);
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: 'text', text: outline }],
|
|
77
|
+
structuredContent: {
|
|
78
|
+
file: params.path,
|
|
79
|
+
language: analysis.language || 'unknown',
|
|
80
|
+
lines: analysis.lines || 0,
|
|
81
|
+
outline,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return {
|
|
87
|
+
content: [
|
|
88
|
+
{
|
|
89
|
+
type: 'text',
|
|
90
|
+
text: `analyze_file failed: ${error.message}. Verify the file path is correct and relative to the project root. Use file_tree to list available files.`,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
isError: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
98
|
+
// TOOL: dependency_graph — Analyze imports and dependencies
|
|
99
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
100
|
+
server.registerTool('dependency_graph', {
|
|
101
|
+
description: 'Analyze import relationships and dependencies. Shows what each file imports and what imports it. Useful for understanding code architecture and impact of changes.',
|
|
102
|
+
inputSchema: {
|
|
103
|
+
file: z.string().optional().describe('Analyze dependencies for a specific file'),
|
|
104
|
+
directory: z.string().optional().describe('Analyze all files in a directory'),
|
|
105
|
+
language: z.string().optional().describe('Filter by language'),
|
|
106
|
+
max_files: z.number().optional().describe('Max files to analyze (default: 100)'),
|
|
107
|
+
},
|
|
108
|
+
outputSchema: outputSchemas.dependency_graph,
|
|
109
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
110
|
+
}, async (params) => {
|
|
111
|
+
try {
|
|
112
|
+
if (params.file) {
|
|
113
|
+
// Single file dependency analysis
|
|
114
|
+
const filePath = safePath(params.file);
|
|
115
|
+
const imports = await extractImports(filePath);
|
|
116
|
+
// Also find what imports this file
|
|
117
|
+
const baseName = path.basename(params.file, path.extname(params.file));
|
|
118
|
+
const importedBy = await searchCode({
|
|
119
|
+
cwd: CWD,
|
|
120
|
+
pattern: baseName,
|
|
121
|
+
isRegex: false,
|
|
122
|
+
maxResults: 50,
|
|
123
|
+
});
|
|
124
|
+
const importers = importedBy
|
|
125
|
+
.filter((r) => r.file !== params.file && r.text.match(/import|require|from|use|include/))
|
|
126
|
+
.map((r) => ` ${r.file}:${r.line}`);
|
|
127
|
+
let output = `📄 ${params.file}\n\n`;
|
|
128
|
+
output += `### Imports (${imports.length}):\n${imports.map((i) => ` → ${i}`).join('\n') || ' (none)'}\n\n`;
|
|
129
|
+
output += `### Imported by (${importers.length}):\n${importers.join('\n') || ' (none)'}`;
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: 'text', text: output }],
|
|
132
|
+
structuredContent: { file: params.file, imports, importers: importers.map((i) => i.trim()) },
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Directory-wide analysis
|
|
136
|
+
let files = await listFiles(CWD, { type: 'file' });
|
|
137
|
+
if (params.directory)
|
|
138
|
+
files = files.filter((f) => f.startsWith(params.directory));
|
|
139
|
+
if (params.language)
|
|
140
|
+
files = files.filter((f) => detectLanguage(f) === params.language);
|
|
141
|
+
files = files.filter((f) => detectLanguage(f) !== 'unknown').slice(0, params.max_files || 100);
|
|
142
|
+
const graph = [];
|
|
143
|
+
for (const file of files) {
|
|
144
|
+
try {
|
|
145
|
+
const imports = await extractImports(path.join(CWD, file));
|
|
146
|
+
if (imports.length > 0)
|
|
147
|
+
graph.push({ file, imports });
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
/* skip */
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const output = graph
|
|
154
|
+
.map(({ file, imports }) => `${file}\n${imports.map((i) => ` → ${i}`).join('\n')}`)
|
|
155
|
+
.join('\n\n');
|
|
156
|
+
return {
|
|
157
|
+
content: [
|
|
158
|
+
{
|
|
159
|
+
type: 'text',
|
|
160
|
+
text: `Dependency graph (${graph.length} files with imports):\n\n${output}`,
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
structuredContent: { file: params.directory || '.', imports: graph.flatMap((g) => g.imports), importers: [] },
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
content: [
|
|
169
|
+
{
|
|
170
|
+
type: 'text',
|
|
171
|
+
text: `dependency_graph failed: ${error.message}. Verify file/directory exists. Use file_tree to discover project structure.`,
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
isError: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
179
|
+
// TOOL: code_metrics — Codebase-wide metrics and statistics
|
|
180
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
181
|
+
server.registerTool('code_metrics', {
|
|
182
|
+
description: 'Calculate code metrics: lines of code, comment ratios, complexity scores, file size distribution. Works per-file, per-directory, or codebase-wide.',
|
|
183
|
+
inputSchema: {
|
|
184
|
+
path: z.string().optional().describe('File or directory to analyze (default: entire codebase)'),
|
|
185
|
+
language: z.string().optional().describe('Filter by language'),
|
|
186
|
+
sort_by: z
|
|
187
|
+
.enum(['lines', 'complexity', 'size', 'name'])
|
|
188
|
+
.optional()
|
|
189
|
+
.describe('Sort files by metric (default: lines)'),
|
|
190
|
+
},
|
|
191
|
+
outputSchema: outputSchemas.code_metrics,
|
|
192
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
193
|
+
}, async (params) => {
|
|
194
|
+
try {
|
|
195
|
+
const targetPath = params.path ? safePath(params.path) : CWD;
|
|
196
|
+
const fileStat = await stat(targetPath);
|
|
197
|
+
if (fileStat.isFile()) {
|
|
198
|
+
const analysis = await analyzeFile(targetPath);
|
|
199
|
+
return {
|
|
200
|
+
content: [{ type: 'text', text: formatFileOutline(analysis) }],
|
|
201
|
+
structuredContent: {
|
|
202
|
+
totalFiles: 1,
|
|
203
|
+
totalLines: analysis.lines || 0,
|
|
204
|
+
languages: {},
|
|
205
|
+
blankLines: analysis.blankLines || 0,
|
|
206
|
+
commentLines: analysis.commentLines || 0,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Directory metrics
|
|
211
|
+
let files = await listFiles(targetPath, { type: 'file' });
|
|
212
|
+
files = files.filter((f) => detectLanguage(f) !== 'unknown');
|
|
213
|
+
if (params.language)
|
|
214
|
+
files = files.filter((f) => detectLanguage(f) === params.language);
|
|
215
|
+
// Limit for performance
|
|
216
|
+
files = files.slice(0, 300);
|
|
217
|
+
const analyses = [];
|
|
218
|
+
for (const file of files) {
|
|
219
|
+
try {
|
|
220
|
+
const analysis = await analyzeFile(path.join(targetPath, file));
|
|
221
|
+
analyses.push({
|
|
222
|
+
file,
|
|
223
|
+
lines: analysis.lines,
|
|
224
|
+
codeLines: analysis.codeLines,
|
|
225
|
+
commentLines: analysis.commentLines,
|
|
226
|
+
complexity: analysis.complexity,
|
|
227
|
+
size: analysis.size,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
/* skip */
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Sort
|
|
235
|
+
const sortKey = params.sort_by || 'lines';
|
|
236
|
+
analyses.sort((a, b) => {
|
|
237
|
+
if (sortKey === 'name')
|
|
238
|
+
return a.file.localeCompare(b.file);
|
|
239
|
+
const key = sortKey === 'lines' ? 'codeLines' : sortKey;
|
|
240
|
+
return b[key] - a[key];
|
|
241
|
+
});
|
|
242
|
+
// Totals
|
|
243
|
+
const totals = analyses.reduce((acc, a) => ({
|
|
244
|
+
lines: acc.lines + a.lines,
|
|
245
|
+
code: acc.code + a.codeLines,
|
|
246
|
+
comments: acc.comments + a.commentLines,
|
|
247
|
+
avgComplexity: acc.avgComplexity + a.complexity,
|
|
248
|
+
}), { lines: 0, code: 0, comments: 0, avgComplexity: 0 });
|
|
249
|
+
let output = `## Code Metrics${params.path ? ` — ${params.path}` : ''}\n`;
|
|
250
|
+
output += `Total: ${totals.lines} lines (${totals.code} code, ${totals.comments} comments) across ${analyses.length} files\n`;
|
|
251
|
+
output += `Comment ratio: ${totals.lines > 0 ? Math.round((totals.comments / totals.lines) * 100) : 0}%\n`;
|
|
252
|
+
output += `Avg complexity: ${analyses.length > 0 ? Math.round(totals.avgComplexity / analyses.length) : 0}\n\n`;
|
|
253
|
+
output += `### Top files by ${sortKey}\n`;
|
|
254
|
+
output += analyses
|
|
255
|
+
.slice(0, 30)
|
|
256
|
+
.map((a) => ` ${a.file.padEnd(50)} ${String(a.codeLines).padStart(6)} loc complexity: ${a.complexity}`)
|
|
257
|
+
.join('\n');
|
|
258
|
+
return {
|
|
259
|
+
content: [{ type: 'text', text: output }],
|
|
260
|
+
structuredContent: {
|
|
261
|
+
totalFiles: analyses.length,
|
|
262
|
+
totalLines: totals.lines,
|
|
263
|
+
languages: {},
|
|
264
|
+
blankLines: 0,
|
|
265
|
+
commentLines: totals.comments,
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
return {
|
|
271
|
+
content: [
|
|
272
|
+
{
|
|
273
|
+
type: 'text',
|
|
274
|
+
text: `code_metrics failed: ${error.message}. Verify the path exists. For directories, ensure it contains recognized source files.`,
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
isError: true,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
282
|
+
// TOOL: call_graph — Who calls what (tree-sitter or regex)
|
|
283
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
284
|
+
server.registerTool('call_graph', {
|
|
285
|
+
description: 'Extract function call relationships. Shows which functions call which others. Uses tree-sitter AST when available, falls back to regex.',
|
|
286
|
+
inputSchema: {
|
|
287
|
+
file: z.string().describe('File to analyze'),
|
|
288
|
+
function_name: z.string().optional().describe('Filter to calls from/to this function'),
|
|
289
|
+
direction: z
|
|
290
|
+
.enum(['callers', 'callees', 'both'])
|
|
291
|
+
.optional()
|
|
292
|
+
.describe('Direction: who calls it (callers), what it calls (callees), or both (default: both)'),
|
|
293
|
+
},
|
|
294
|
+
outputSchema: outputSchemas.call_graph,
|
|
295
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
296
|
+
}, async (params) => {
|
|
297
|
+
try {
|
|
298
|
+
const filePath = safePath(params.file);
|
|
299
|
+
const language = detectLanguage(params.file);
|
|
300
|
+
const direction = params.direction || 'both';
|
|
301
|
+
// Try tree-sitter first
|
|
302
|
+
let calls = await extractCallGraph(filePath, language);
|
|
303
|
+
// Fallback: regex-based call extraction
|
|
304
|
+
if (!calls) {
|
|
305
|
+
const content = await readFile(filePath, 'utf-8');
|
|
306
|
+
const lines = content.split('\n');
|
|
307
|
+
calls = [];
|
|
308
|
+
let currentFunc = '<module>';
|
|
309
|
+
const funcDef = /(?:function|def|fn|func|async\s+function)\s+(\w+)/;
|
|
310
|
+
const callPattern = /(\w+)\s*\(/g;
|
|
311
|
+
for (let i = 0; i < lines.length; i++) {
|
|
312
|
+
const defMatch = lines[i].match(funcDef);
|
|
313
|
+
if (defMatch)
|
|
314
|
+
currentFunc = defMatch[1];
|
|
315
|
+
let m;
|
|
316
|
+
while ((m = callPattern.exec(lines[i])) !== null) {
|
|
317
|
+
const callee = m[1];
|
|
318
|
+
if (!['if', 'for', 'while', 'switch', 'catch', 'return', 'new', 'typeof', 'console'].includes(callee)) {
|
|
319
|
+
calls.push({ caller: currentFunc, callee, file: params.file, line: i + 1 });
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Filter by function name
|
|
325
|
+
if (params.function_name) {
|
|
326
|
+
if (direction === 'callers' || direction === 'both') {
|
|
327
|
+
const callers = calls.filter((c) => c.callee === params.function_name);
|
|
328
|
+
if (direction === 'callers')
|
|
329
|
+
calls = callers;
|
|
330
|
+
}
|
|
331
|
+
if (direction === 'callees' || direction === 'both') {
|
|
332
|
+
const callees = calls.filter((c) => c.caller === params.function_name);
|
|
333
|
+
if (direction === 'callees')
|
|
334
|
+
calls = callees;
|
|
335
|
+
else
|
|
336
|
+
calls = [...calls.filter((c) => c.callee === params.function_name), ...callees];
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// Deduplicate
|
|
340
|
+
const unique = new Map();
|
|
341
|
+
for (const c of calls)
|
|
342
|
+
unique.set(`${c.caller}->${c.callee}`, c);
|
|
343
|
+
const dedupCalls = [...unique.values()];
|
|
344
|
+
// Format output
|
|
345
|
+
const callerGroups = new Map();
|
|
346
|
+
for (const c of dedupCalls) {
|
|
347
|
+
if (!callerGroups.has(c.caller))
|
|
348
|
+
callerGroups.set(c.caller, []);
|
|
349
|
+
callerGroups.get(c.caller).push(`→ ${c.callee} (L${c.line})`);
|
|
350
|
+
}
|
|
351
|
+
let output = `Call graph for ${params.file}${params.function_name ? ` (${params.function_name})` : ''}\n`;
|
|
352
|
+
output += `${dedupCalls.length} call relationships found${isTreeSitterReady() ? ' (tree-sitter AST)' : ' (regex fallback)'}:\n\n`;
|
|
353
|
+
for (const [caller, callees] of callerGroups) {
|
|
354
|
+
output += `${caller}:\n${callees.map((c) => ` ${c}`).join('\n')}\n\n`;
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
content: [{ type: 'text', text: output }],
|
|
358
|
+
structuredContent: {
|
|
359
|
+
file: params.file,
|
|
360
|
+
functions: Array.from(callerGroups).map(([name, calls]) => ({ name, calls, calledBy: [] })),
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
return {
|
|
366
|
+
content: [
|
|
367
|
+
{
|
|
368
|
+
type: 'text',
|
|
369
|
+
text: `call_graph failed: ${error.message}. Verify the file exists. Use file_tree to discover files.`,
|
|
370
|
+
},
|
|
371
|
+
],
|
|
372
|
+
isError: true,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
377
|
+
// TOOL: test_coverage — Test coverage analysis
|
|
378
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
379
|
+
server.registerTool('test_coverage', {
|
|
380
|
+
description: 'Analyze test coverage. Reads lcov, istanbul, and cobertura formats. Shows covered/uncovered lines, untested functions, and coverage percentages.',
|
|
381
|
+
inputSchema: {
|
|
382
|
+
action: z
|
|
383
|
+
.enum(['summary', 'file', 'untested', 'test_files'])
|
|
384
|
+
.describe('summary: overall coverage stats, file: coverage for specific file, untested: list uncovered files, test_files: find test files'),
|
|
385
|
+
file: z.string().optional().describe('File path for file-specific coverage'),
|
|
386
|
+
},
|
|
387
|
+
outputSchema: outputSchemas.test_coverage,
|
|
388
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
389
|
+
}, async (params) => {
|
|
390
|
+
try {
|
|
391
|
+
if (params.action === 'test_files') {
|
|
392
|
+
const testFiles = await findTestFiles(CWD);
|
|
393
|
+
return {
|
|
394
|
+
content: [{ type: 'text', text: `Found ${testFiles.length} test files:\n\n${testFiles.join('\n')}` }],
|
|
395
|
+
structuredContent: { action: 'test_files', data: testFiles },
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
const coverage = await parseCoverage(CWD);
|
|
399
|
+
if (!coverage) {
|
|
400
|
+
return {
|
|
401
|
+
content: [
|
|
402
|
+
{
|
|
403
|
+
type: 'text',
|
|
404
|
+
text: 'No coverage data found. Run your test suite with coverage enabled first (e.g. "jest --coverage", "pytest --cov", "go test -coverprofile"). Supported formats: lcov, istanbul JSON, cobertura XML.',
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
structuredContent: { action: 'summary', data: [] },
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
switch (params.action) {
|
|
411
|
+
case 'summary': {
|
|
412
|
+
let output = `## Test Coverage (${coverage.format})\n\n`;
|
|
413
|
+
output += `Files: ${coverage.totalFiles}\n`;
|
|
414
|
+
output += `Lines: ${coverage.lines.covered}/${coverage.lines.total} (${coverage.lines.percentage}%)\n`;
|
|
415
|
+
output += `Functions: ${coverage.functions.covered}/${coverage.functions.total} (${coverage.functions.percentage}%)\n`;
|
|
416
|
+
output += `Branches: ${coverage.branches.covered}/${coverage.branches.total} (${coverage.branches.percentage}%)\n\n`;
|
|
417
|
+
output += `### Lowest coverage files:\n`;
|
|
418
|
+
output += coverage.files
|
|
419
|
+
.slice(0, 15)
|
|
420
|
+
.map((f) => ` ${f.file.padEnd(50)} ${String(f.lines.percentage).padStart(3)}% lines ${String(f.functions.percentage).padStart(3)}% funcs`)
|
|
421
|
+
.join('\n');
|
|
422
|
+
return {
|
|
423
|
+
content: [{ type: 'text', text: output }],
|
|
424
|
+
structuredContent: {
|
|
425
|
+
action: 'summary',
|
|
426
|
+
data: coverage.files.slice(0, 15).map((f) => ({
|
|
427
|
+
file: f.file,
|
|
428
|
+
linesPercent: f.lines.percentage,
|
|
429
|
+
funcsPercent: f.functions.percentage,
|
|
430
|
+
})),
|
|
431
|
+
},
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
case 'file': {
|
|
435
|
+
if (!params.file)
|
|
436
|
+
return {
|
|
437
|
+
content: [{ type: 'text', text: 'File path required for file-specific coverage.' }],
|
|
438
|
+
isError: true,
|
|
439
|
+
};
|
|
440
|
+
const fc = getFileCoverage(coverage, params.file);
|
|
441
|
+
if (!fc)
|
|
442
|
+
return {
|
|
443
|
+
content: [
|
|
444
|
+
{
|
|
445
|
+
type: 'text',
|
|
446
|
+
text: `No coverage data for "${params.file}". Ensure the file is included in coverage reports.`,
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
structuredContent: { action: 'file', data: [] },
|
|
450
|
+
};
|
|
451
|
+
let output = `Coverage for ${fc.file}:\n`;
|
|
452
|
+
output += ` Lines: ${fc.lines.covered}/${fc.lines.total} (${fc.lines.percentage}%)\n`;
|
|
453
|
+
output += ` Functions: ${fc.functions.covered}/${fc.functions.total} (${fc.functions.percentage}%)\n`;
|
|
454
|
+
output += ` Branches: ${fc.branches.covered}/${fc.branches.total} (${fc.branches.percentage}%)\n`;
|
|
455
|
+
if (fc.uncoveredLines.length > 0)
|
|
456
|
+
output += ` Uncovered lines: ${fc.uncoveredLines.slice(0, 50).join(', ')}${fc.uncoveredLines.length > 50 ? '...' : ''}\n`;
|
|
457
|
+
if (fc.uncoveredFunctions.length > 0)
|
|
458
|
+
output += ` Untested functions: ${fc.uncoveredFunctions.join(', ')}\n`;
|
|
459
|
+
return {
|
|
460
|
+
content: [{ type: 'text', text: output }],
|
|
461
|
+
structuredContent: {
|
|
462
|
+
action: 'file',
|
|
463
|
+
data: [{ file: params.file, linesPercent: fc.lines.percentage, funcsPercent: fc.functions.percentage }],
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
case 'untested': {
|
|
468
|
+
const untested = getUntestedFiles(coverage);
|
|
469
|
+
return {
|
|
470
|
+
content: [{ type: 'text', text: `${untested.length} files with 0% coverage:\n\n${untested.join('\n')}` }],
|
|
471
|
+
structuredContent: { action: 'untested', data: untested },
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
default:
|
|
475
|
+
return { content: [{ type: 'text', text: `Unknown action: ${params.action}` }], isError: true };
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch (error) {
|
|
479
|
+
return {
|
|
480
|
+
content: [
|
|
481
|
+
{
|
|
482
|
+
type: 'text',
|
|
483
|
+
text: `test_coverage failed: ${error.message}. Ensure coverage reports exist in the project.`,
|
|
484
|
+
},
|
|
485
|
+
],
|
|
486
|
+
isError: true,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/tools/analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC3G,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,0EAA0E;IAC1E,8CAA8C;IAC9C,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EACT,4MAA4M;QAC9M,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAChF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAa,CAAC,4BAA4B,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;gBAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;oBAClD,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,OAAO,oCAAoC,IAAI,YAAY,CAAC,CAAC;gBAChG,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnD,iBAAiB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;iBAChF,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,GAAG,OAAO,mCAAmC,IAAI,UAAU;qBAClE;iBACF;gBACD,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wBAAyB,KAAe,CAAC,OAAO,uFAAuF;qBAC9I;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0EAA0E;IAC1E,sDAAsD;IACtD,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EACT,2IAA2I;QAC7I,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;SAChE;QACD,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC1C,iBAAiB,EAAE;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,SAAS;oBACxC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;oBAC1B,OAAO;iBACR;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wBAAyB,KAAe,CAAC,OAAO,4GAA4G;qBACnK;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0EAA0E;IAC1E,4DAA4D;IAC5D,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EACT,oKAAoK;QACtK,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YAChF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YAC7E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC9D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SACjF;QACD,YAAY,EAAE,aAAa,CAAC,gBAAgB;QAC5C,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAE/C,mCAAmC;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC;oBAClC,GAAG,EAAE,GAAG;oBACR,OAAO,EAAE,QAAQ;oBACjB,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,EAAE;iBACf,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,UAAU;qBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;qBACxF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAEvC,IAAI,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,CAAC;gBACrC,MAAM,IAAI,gBAAgB,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,MAAM,CAAC;gBAC7G,MAAM,IAAI,oBAAoB,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;gBAE1F,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBACzC,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE;iBAC9F,CAAC;YACJ,CAAC;YAED,0BAA0B;YAC1B,IAAI,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,SAAS;gBAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC,CAAC;YACnF,IAAI,MAAM,CAAC,QAAQ;gBAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxF,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;YAE/F,MAAM,KAAK,GAA0C,EAAE,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC3D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACxD,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU;gBACZ,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,KAAK;iBACjB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;iBACnF,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qBAAqB,KAAK,CAAC,MAAM,4BAA4B,MAAM,EAAE;qBAC5E;iBACF;gBACD,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;aAC9G,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA6B,KAAe,CAAC,OAAO,8EAA8E;qBACzI;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0EAA0E;IAC1E,4DAA4D;IAC5D,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EACT,oJAAoJ;QACtJ,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC9D,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;iBAC7C,QAAQ,EAAE;iBACV,QAAQ,CAAC,uCAAuC,CAAC;SACrD;QACD,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;YAExC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;gBAC/C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9D,iBAAiB,EAAE;wBACjB,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;wBAC/B,SAAS,EAAE,EAAE;wBACb,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,CAAC;wBACpC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,CAAC;qBACzC;iBACF,CAAC;YACJ,CAAC;YAED,oBAAoB;YACpB,IAAI,KAAK,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,QAAQ;gBAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxF,wBAAwB;YACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAE5B,MAAM,QAAQ,GAOR,EAAE,CAAC;YAET,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;oBAChE,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI;wBACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,YAAY,EAAE,QAAQ,CAAC,YAAY;wBACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU;gBACZ,CAAC;YACH,CAAC;YAED,OAAO;YACP,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,IAAI,OAAO,KAAK,MAAM;oBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;gBACxD,OAAQ,CAAC,CAAC,GAAqB,CAAY,GAAI,CAAC,CAAC,GAAqB,CAAY,CAAC;YACrF,CAAC,CAAC,CAAC;YAEH,SAAS;YACT,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;gBAC1B,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;gBAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,YAAY;gBACvC,aAAa,EAAE,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,UAAU;aAChD,CAAC,EACF,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CACrD,CAAC;YAEF,IAAI,MAAM,GAAG,kBAAkB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1E,MAAM,IAAI,UAAU,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,QAAQ,qBAAqB,QAAQ,CAAC,MAAM,UAAU,CAAC;YAC9H,MAAM,IAAI,kBAAkB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3G,MAAM,IAAI,mBAAmB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAEhH,MAAM,IAAI,oBAAoB,OAAO,IAAI,CAAC;YAC1C,MAAM,IAAI,QAAQ;iBACf,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,UAAU,EAAE,CAAC;iBACxG,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACzC,iBAAiB,EAAE;oBACjB,UAAU,EAAE,QAAQ,CAAC,MAAM;oBAC3B,UAAU,EAAE,MAAM,CAAC,KAAK;oBACxB,SAAS,EAAE,EAAE;oBACb,UAAU,EAAE,CAAC;oBACb,YAAY,EAAE,MAAM,CAAC,QAAQ;iBAC9B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wBAAyB,KAAe,CAAC,OAAO,wFAAwF;qBAC/I;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IACF,0EAA0E;IAC1E,2DAA2D;IAC3D,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,WAAW,EACT,yIAAyI;QAC3I,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAC5C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACtF,SAAS,EAAE,CAAC;iBACT,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;iBACpC,QAAQ,EAAE;iBACV,QAAQ,CAAC,qFAAqF,CAAC;SACnG;QACD,YAAY,EAAE,aAAa,CAAC,UAAU;QACtC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;YAE7C,wBAAwB;YACxB,IAAI,KAAK,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvD,wCAAwC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,KAAK,GAAG,EAAE,CAAC;gBACX,IAAI,WAAW,GAAG,UAAU,CAAC;gBAE7B,MAAM,OAAO,GAAG,mDAAmD,CAAC;gBACpE,MAAM,WAAW,GAAG,aAAa,CAAC;gBAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACzC,IAAI,QAAQ;wBAAE,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAExC,IAAI,CAAC,CAAC;oBACN,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBACjD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;4BACtG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC9E,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBACpD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC;oBACvE,IAAI,SAAS,KAAK,SAAS;wBAAE,KAAK,GAAG,OAAO,CAAC;gBAC/C,CAAC;gBACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBACpD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC;oBACvE,IAAI,SAAS,KAAK,SAAS;wBAAE,KAAK,GAAG,OAAO,CAAC;;wBACxC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;YAED,cAAc;YACd,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;YACpD,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAExC,gBAAgB;YAChB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,MAAM,GAAG,kBAAkB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1G,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,4BAA4B,iBAAiB,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,OAAO,CAAC;YAElI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACzE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACzC,iBAAiB,EAAE;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;iBAC5F;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sBAAuB,KAAe,CAAC,OAAO,4DAA4D;qBACjH;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0EAA0E;IAC1E,+CAA+C;IAC/C,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EACT,kJAAkJ;QACpJ,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;iBACnD,QAAQ,CACP,gIAAgI,CACjI;YACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;SAC7E;QACD,YAAY,EAAE,aAAa,CAAC,aAAa;QACzC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,SAAS,CAAC,MAAM,mBAAmB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACrG,iBAAiB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC7D,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,mMAAmM;yBAC1M;qBACF;oBACD,iBAAiB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;iBACnD,CAAC;YACJ,CAAC;YAED,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,IAAI,MAAM,GAAG,qBAAqB,QAAQ,CAAC,MAAM,OAAO,CAAC;oBACzD,MAAM,IAAI,UAAU,QAAQ,CAAC,UAAU,IAAI,CAAC;oBAC5C,MAAM,IAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC;oBACvG,MAAM,IAAI,cAAc,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,KAAK,QAAQ,CAAC,SAAS,CAAC,UAAU,MAAM,CAAC;oBACvH,MAAM,IAAI,aAAa,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,CAAC,UAAU,QAAQ,CAAC;oBACrH,MAAM,IAAI,8BAA8B,CAAC;oBACzC,MAAM,IAAI,QAAQ,CAAC,KAAK;yBACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;yBACZ,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAClI;yBACA,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wBACzC,iBAAiB,EAAE;4BACjB,MAAM,EAAE,SAAS;4BACjB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU;gCAChC,YAAY,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU;6BACrC,CAAC,CAAC;yBACJ;qBACF,CAAC;gBACJ,CAAC;gBAED,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,IAAI,CAAC,MAAM,CAAC,IAAI;wBACd,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gDAAgD,EAAE,CAAC;4BACnF,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBAClD,IAAI,CAAC,EAAE;wBACL,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,yBAAyB,MAAM,CAAC,IAAI,qDAAqD;iCAChG;6BACF;4BACD,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;yBAChD,CAAC;oBAEJ,IAAI,MAAM,GAAG,gBAAgB,EAAE,CAAC,IAAI,KAAK,CAAC;oBAC1C,MAAM,IAAI,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC;oBACvF,MAAM,IAAI,gBAAgB,EAAE,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC,SAAS,CAAC,UAAU,MAAM,CAAC;oBACvG,MAAM,IAAI,eAAe,EAAE,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC,QAAQ,CAAC,UAAU,MAAM,CAAC;oBACnG,IAAI,EAAE,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;wBAC9B,MAAM,IAAI,sBAAsB,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;oBAC7H,IAAI,EAAE,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;wBAClC,MAAM,IAAI,yBAAyB,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC1E,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wBACzC,iBAAiB,EAAE;4BACjB,MAAM,EAAE,MAAM;4BACd,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;yBACxG;qBACF,CAAC;gBACJ,CAAC;gBAED,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;oBAC5C,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,+BAA+B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;wBACzG,iBAAiB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1D,CAAC;gBACJ,CAAC;gBAED;oBACE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACpG,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yBAA0B,KAAe,CAAC,OAAO,iDAAiD;qBACzG;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registers architecture tools for checking architectural constraints, database schemas, and API contracts.
|
|
4
|
+
* @param server - The MCP server instance to register tools on.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerArchitectureTools(server: McpServer): void;
|
|
7
|
+
//# sourceMappingURL=architecture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/tools/architecture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA2L1D"}
|