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,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codebase Mapper
|
|
3
|
+
* Generates comprehensive overview of any codebase
|
|
4
|
+
* Handles small to large enterprise codebases efficiently
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { listFiles } from '../search/fast-search.js';
|
|
9
|
+
import { detectLanguage, isCodeFile } from '../utils/languages.js';
|
|
10
|
+
import { extractSymbols } from './symbols.js';
|
|
11
|
+
/**
|
|
12
|
+
* List of directories generally ignored in tree generation.
|
|
13
|
+
*/
|
|
14
|
+
const TREE_IGNORE_LIST = new Set([
|
|
15
|
+
'node_modules',
|
|
16
|
+
'.git',
|
|
17
|
+
'dist',
|
|
18
|
+
'build',
|
|
19
|
+
'__pycache__',
|
|
20
|
+
'.venv',
|
|
21
|
+
'venv',
|
|
22
|
+
'target',
|
|
23
|
+
'.next',
|
|
24
|
+
'.nuxt',
|
|
25
|
+
'coverage',
|
|
26
|
+
'vendor',
|
|
27
|
+
'.idea',
|
|
28
|
+
'.vscode',
|
|
29
|
+
'.DS_Store',
|
|
30
|
+
'Pods',
|
|
31
|
+
'.dart_tool',
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Signals used to detect frameworks based on file presence.
|
|
35
|
+
* Format: [FrameworkName, [SignalFiles]]
|
|
36
|
+
*/
|
|
37
|
+
const FRAMEWORK_SIGNALS = [
|
|
38
|
+
['React', ['package.json']],
|
|
39
|
+
['Next.js', ['next.config.js', 'next.config.mjs', 'next.config.ts']],
|
|
40
|
+
['Vue.js', ['vue.config.js', 'nuxt.config.js', 'nuxt.config.ts']],
|
|
41
|
+
['Angular', ['angular.json']],
|
|
42
|
+
['Svelte', ['svelte.config.js']],
|
|
43
|
+
['Django', ['manage.py']],
|
|
44
|
+
['Flask', ['wsgi.py']],
|
|
45
|
+
['FastAPI', ['main.py']],
|
|
46
|
+
['Spring Boot', ['pom.xml', 'build.gradle']],
|
|
47
|
+
['Express.js', ['package.json']],
|
|
48
|
+
['Rails', ['Gemfile', 'config/routes.rb']],
|
|
49
|
+
['Laravel', ['artisan', 'composer.json']],
|
|
50
|
+
['Terraform', ['main.tf']],
|
|
51
|
+
['Flutter', ['pubspec.yaml']],
|
|
52
|
+
['SwiftUI', ['Package.swift']],
|
|
53
|
+
['.NET', ['*.csproj', '*.sln']],
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Generates a full overview of the codebase at the specified directory.
|
|
57
|
+
*
|
|
58
|
+
* @param cwd - The root directory of the codebase to map.
|
|
59
|
+
* @returns A promise resolving to the codebase statistics, tree structure, and summary string.
|
|
60
|
+
*/
|
|
61
|
+
export async function mapCodebase(cwd) {
|
|
62
|
+
const allFiles = await listFiles(cwd, { type: 'file' });
|
|
63
|
+
const langCounts = {};
|
|
64
|
+
let codeFiles = 0;
|
|
65
|
+
for (const file of allFiles) {
|
|
66
|
+
const lang = detectLanguage(file);
|
|
67
|
+
if (lang !== 'unknown') {
|
|
68
|
+
langCounts[lang] = (langCounts[lang] || 0) + 1;
|
|
69
|
+
}
|
|
70
|
+
if (isCodeFile(file))
|
|
71
|
+
codeFiles++;
|
|
72
|
+
}
|
|
73
|
+
const languageBreakdown = {};
|
|
74
|
+
for (const [lang, count] of Object.entries(langCounts).sort((a, b) => b[1] - a[1])) {
|
|
75
|
+
languageBreakdown[lang] = {
|
|
76
|
+
files: count,
|
|
77
|
+
percentage: Math.round((count / allFiles.length) * 100),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const dirCounts = {};
|
|
81
|
+
for (const file of allFiles) {
|
|
82
|
+
const topDir = file.split('/')[0] || '.';
|
|
83
|
+
dirCounts[topDir] = (dirCounts[topDir] || 0) + 1;
|
|
84
|
+
}
|
|
85
|
+
const topDirectories = Object.entries(dirCounts)
|
|
86
|
+
.sort((a, b) => b[1] - a[1])
|
|
87
|
+
.slice(0, 15)
|
|
88
|
+
.map(([p, files]) => ({ path: p, files }));
|
|
89
|
+
const frameworks = await detectFrameworks(cwd, allFiles);
|
|
90
|
+
const packageManagers = await detectPackageManagers(cwd, allFiles);
|
|
91
|
+
const hasTests = allFiles.some((f) => /\b(test|spec|__tests__|tests|_test|_spec)\b/i.test(f));
|
|
92
|
+
const hasCI = allFiles.some((f) => f.includes('.github/workflows') ||
|
|
93
|
+
f.includes('.gitlab-ci') ||
|
|
94
|
+
f.includes('Jenkinsfile') ||
|
|
95
|
+
f.includes('.circleci') ||
|
|
96
|
+
f.includes('.travis.yml') ||
|
|
97
|
+
f.includes('azure-pipelines'));
|
|
98
|
+
const hasDocs = allFiles.some((f) => /^(docs?|documentation)\//i.test(f) || f.toLowerCase() === 'readme.md');
|
|
99
|
+
const hasDocker = allFiles.some((f) => f.toLowerCase().includes('dockerfile') || f === 'docker-compose.yml' || f === 'docker-compose.yaml');
|
|
100
|
+
const estimatedSize = allFiles.length < 50 ? 'small' : allFiles.length < 500 ? 'medium' : allFiles.length < 5000 ? 'large' : 'enterprise';
|
|
101
|
+
const allDirs = new Set();
|
|
102
|
+
for (const file of allFiles) {
|
|
103
|
+
const dir = path.dirname(file);
|
|
104
|
+
if (dir !== '.')
|
|
105
|
+
allDirs.add(dir);
|
|
106
|
+
}
|
|
107
|
+
const stats = {
|
|
108
|
+
totalFiles: allFiles.length,
|
|
109
|
+
totalCodeFiles: codeFiles,
|
|
110
|
+
totalDirectories: allDirs.size,
|
|
111
|
+
languageBreakdown,
|
|
112
|
+
topDirectories,
|
|
113
|
+
estimatedSize,
|
|
114
|
+
frameworks,
|
|
115
|
+
packageManagers,
|
|
116
|
+
hasTests,
|
|
117
|
+
hasCI,
|
|
118
|
+
hasDocs,
|
|
119
|
+
hasDocker,
|
|
120
|
+
};
|
|
121
|
+
const maxDepth = estimatedSize === 'enterprise' ? 2 : estimatedSize === 'large' ? 3 : 4;
|
|
122
|
+
const tree = await generateTree(cwd, maxDepth);
|
|
123
|
+
const summary = formatSummary(stats);
|
|
124
|
+
return { stats, tree, summary };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Detects frameworks used in the codebase based on configuration files and dependencies.
|
|
128
|
+
*
|
|
129
|
+
* @param cwd - Root directory.
|
|
130
|
+
* @param files - List of all files in the codebase.
|
|
131
|
+
* @returns List of detected framework names.
|
|
132
|
+
*/
|
|
133
|
+
/**
|
|
134
|
+
* Detects frameworks used in the codebase based on configuration files and dependencies.
|
|
135
|
+
*
|
|
136
|
+
* @param cwd - The root directory of the codebase.
|
|
137
|
+
* @param files - List of all files in the codebase.
|
|
138
|
+
* @returns A promise resolving to a list of detected framework names.
|
|
139
|
+
*/
|
|
140
|
+
async function detectFrameworks(cwd, files) {
|
|
141
|
+
// ... (implementation same as before, just adding docs if missing)
|
|
142
|
+
const frameworks = [];
|
|
143
|
+
const fileSet = new Set(files.map((f) => f.toLowerCase()));
|
|
144
|
+
for (const [name, signals] of FRAMEWORK_SIGNALS) {
|
|
145
|
+
for (const signal of signals) {
|
|
146
|
+
if (signal.includes('*')) {
|
|
147
|
+
if (files.some((f) => f.endsWith(signal.replace('*', '')))) {
|
|
148
|
+
frameworks.push(name);
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else if (fileSet.has(signal.toLowerCase()) ||
|
|
153
|
+
files.some((f) => f.toLowerCase().endsWith('/' + signal.toLowerCase()))) {
|
|
154
|
+
if (name === 'React' && signal === 'package.json') {
|
|
155
|
+
if (await hasPackageDependency(cwd, 'react'))
|
|
156
|
+
frameworks.push('React');
|
|
157
|
+
}
|
|
158
|
+
else if (name === 'Express.js' && signal === 'package.json') {
|
|
159
|
+
if (await hasPackageDependency(cwd, 'express'))
|
|
160
|
+
frameworks.push('Express.js');
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
frameworks.push(name);
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return [...new Set(frameworks)];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Checks if a package dependency exists in package.json.
|
|
173
|
+
*
|
|
174
|
+
* @param cwd - Root directory.
|
|
175
|
+
* @param packageName - The package to check for.
|
|
176
|
+
* @returns True if found.
|
|
177
|
+
*/
|
|
178
|
+
async function hasPackageDependency(cwd, packageName) {
|
|
179
|
+
try {
|
|
180
|
+
const pkgContent = await readFile(path.join(cwd, 'package.json'), 'utf-8');
|
|
181
|
+
return pkgContent.includes(`"${packageName}"`);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Detects package managers (npm, yarn, etc.) based on lockfiles.
|
|
189
|
+
*
|
|
190
|
+
* @param cwd - Root directory.
|
|
191
|
+
* @param files - List of files.
|
|
192
|
+
* @returns List of package managers.
|
|
193
|
+
*/
|
|
194
|
+
async function detectPackageManagers(cwd, files) {
|
|
195
|
+
const managers = [];
|
|
196
|
+
const fileSet = new Set(files.map((f) => path.basename(f).toLowerCase()));
|
|
197
|
+
if (fileSet.has('package-lock.json') || fileSet.has('package.json'))
|
|
198
|
+
managers.push('npm');
|
|
199
|
+
if (fileSet.has('yarn.lock'))
|
|
200
|
+
managers.push('yarn');
|
|
201
|
+
if (fileSet.has('pnpm-lock.yaml'))
|
|
202
|
+
managers.push('pnpm');
|
|
203
|
+
if (fileSet.has('bun.lockb'))
|
|
204
|
+
managers.push('bun');
|
|
205
|
+
if (fileSet.has('requirements.txt') || fileSet.has('pyproject.toml') || fileSet.has('setup.py'))
|
|
206
|
+
managers.push('pip');
|
|
207
|
+
if (fileSet.has('poetry.lock'))
|
|
208
|
+
managers.push('poetry');
|
|
209
|
+
if (fileSet.has('pipfile.lock'))
|
|
210
|
+
managers.push('pipenv');
|
|
211
|
+
if (fileSet.has('cargo.toml'))
|
|
212
|
+
managers.push('cargo');
|
|
213
|
+
if (fileSet.has('go.mod'))
|
|
214
|
+
managers.push('go modules');
|
|
215
|
+
if (fileSet.has('gemfile'))
|
|
216
|
+
managers.push('bundler');
|
|
217
|
+
if (fileSet.has('composer.json'))
|
|
218
|
+
managers.push('composer');
|
|
219
|
+
if (fileSet.has('pubspec.yaml'))
|
|
220
|
+
managers.push('pub');
|
|
221
|
+
if (fileSet.has('build.gradle') || fileSet.has('build.gradle.kts'))
|
|
222
|
+
managers.push('gradle');
|
|
223
|
+
if (fileSet.has('pom.xml'))
|
|
224
|
+
managers.push('maven');
|
|
225
|
+
return managers;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Generates a visual directory tree structure.
|
|
229
|
+
*
|
|
230
|
+
* @param cwd - Root directory.
|
|
231
|
+
* @param maxDepth - Max depth for recursion.
|
|
232
|
+
* @returns Tree string.
|
|
233
|
+
*/
|
|
234
|
+
async function generateTree(cwd, maxDepth) {
|
|
235
|
+
const lines = [];
|
|
236
|
+
async function walk(dir, prefix, depth) {
|
|
237
|
+
if (depth > maxDepth) {
|
|
238
|
+
lines.push(`${prefix}└── ...`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
243
|
+
const filtered = entries
|
|
244
|
+
.filter((e) => !TREE_IGNORE_LIST.has(e.name) && !e.name.startsWith('.'))
|
|
245
|
+
.sort((a, b) => {
|
|
246
|
+
if (a.isDirectory() && !b.isDirectory())
|
|
247
|
+
return -1;
|
|
248
|
+
if (!a.isDirectory() && b.isDirectory())
|
|
249
|
+
return 1;
|
|
250
|
+
return a.name.localeCompare(b.name);
|
|
251
|
+
});
|
|
252
|
+
for (let i = 0; i < filtered.length; i++) {
|
|
253
|
+
const entry = filtered[i];
|
|
254
|
+
const isLast = i === filtered.length - 1;
|
|
255
|
+
const connector = isLast ? '└── ' : '├── ';
|
|
256
|
+
const nextPrefix = prefix + (isLast ? ' ' : '│ ');
|
|
257
|
+
if (entry.isDirectory()) {
|
|
258
|
+
lines.push(`${prefix}${connector}${entry.name}/`);
|
|
259
|
+
await walk(path.join(dir, entry.name), nextPrefix, depth + 1);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
lines.push(`${prefix}${connector}${entry.name}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Intentionally suppressed
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
lines.push(path.basename(cwd) + '/');
|
|
271
|
+
await walk(cwd, '', 1);
|
|
272
|
+
return lines.join('\n');
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Formats the codebase statistics into a human-readable summary string.
|
|
276
|
+
*
|
|
277
|
+
* @param stats - The codebase statistics.
|
|
278
|
+
* @returns Formatted summary string in Markdown.
|
|
279
|
+
*/
|
|
280
|
+
function formatSummary(stats) {
|
|
281
|
+
const parts = [];
|
|
282
|
+
parts.push(`## Codebase Overview`);
|
|
283
|
+
parts.push(`Size: ${stats.estimatedSize.toUpperCase()} (${stats.totalFiles} files, ${stats.totalCodeFiles} code files, ${stats.totalDirectories} directories)`);
|
|
284
|
+
parts.push('');
|
|
285
|
+
parts.push(`### Languages`);
|
|
286
|
+
for (const [lang, info] of Object.entries(stats.languageBreakdown).slice(0, 10)) {
|
|
287
|
+
const bar = '█'.repeat(Math.max(1, Math.round(info.percentage / 5)));
|
|
288
|
+
parts.push(` ${lang.padEnd(15)} ${bar} ${info.files} files (${info.percentage}%)`);
|
|
289
|
+
}
|
|
290
|
+
parts.push('');
|
|
291
|
+
if (stats.frameworks.length > 0) {
|
|
292
|
+
parts.push(`### Frameworks: ${stats.frameworks.join(', ')}`);
|
|
293
|
+
}
|
|
294
|
+
if (stats.packageManagers.length > 0) {
|
|
295
|
+
parts.push(`### Package Managers: ${stats.packageManagers.join(', ')}`);
|
|
296
|
+
}
|
|
297
|
+
const caps = [];
|
|
298
|
+
if (stats.hasTests)
|
|
299
|
+
caps.push('✅ Tests');
|
|
300
|
+
if (stats.hasCI)
|
|
301
|
+
caps.push('✅ CI/CD');
|
|
302
|
+
if (stats.hasDocs)
|
|
303
|
+
caps.push('✅ Docs');
|
|
304
|
+
if (stats.hasDocker)
|
|
305
|
+
caps.push('✅ Docker');
|
|
306
|
+
if (!stats.hasTests)
|
|
307
|
+
caps.push('❌ Tests');
|
|
308
|
+
if (!stats.hasCI)
|
|
309
|
+
caps.push('❌ CI/CD');
|
|
310
|
+
if (caps.length > 0) {
|
|
311
|
+
parts.push(`### Infrastructure: ${caps.join(' | ')}`);
|
|
312
|
+
}
|
|
313
|
+
parts.push('');
|
|
314
|
+
parts.push('### Top Directories');
|
|
315
|
+
for (const dir of stats.topDirectories.slice(0, 10)) {
|
|
316
|
+
parts.push(` ${dir.path.padEnd(30)} ${dir.files} files`);
|
|
317
|
+
}
|
|
318
|
+
return parts.join('\n');
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Maps symbols (functions, classes, etc.) for code files in the codebase.
|
|
322
|
+
*
|
|
323
|
+
* @param cwd - Root directory.
|
|
324
|
+
* @param options - Filtering and limit options.
|
|
325
|
+
* @returns List of files with their extracted symbols.
|
|
326
|
+
*/
|
|
327
|
+
export async function mapSymbols(cwd, options) {
|
|
328
|
+
let files = await listFiles(cwd, { type: 'file' });
|
|
329
|
+
if (options?.directory) {
|
|
330
|
+
files = files.filter((f) => f.startsWith(options.directory));
|
|
331
|
+
}
|
|
332
|
+
files = files.filter((f) => isCodeFile(f));
|
|
333
|
+
if (options?.language) {
|
|
334
|
+
files = files.filter((f) => detectLanguage(f) === options.language);
|
|
335
|
+
}
|
|
336
|
+
const maxFiles = options?.maxFiles || 200;
|
|
337
|
+
if (files.length > maxFiles) {
|
|
338
|
+
files = files.slice(0, maxFiles);
|
|
339
|
+
}
|
|
340
|
+
const results = [];
|
|
341
|
+
for (const file of files) {
|
|
342
|
+
try {
|
|
343
|
+
const symbols = await extractSymbols(path.join(cwd, file));
|
|
344
|
+
if (symbols.length > 0) {
|
|
345
|
+
results.push({ file, symbols });
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
// Skip files that fail symbol extraction
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return results;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=codebase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebase.js","sourceRoot":"","sources":["../../src/analyzers/codebase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity Heatmap
|
|
3
|
+
* Ranks files and functions by cyclomatic/cognitive complexity.
|
|
4
|
+
*/
|
|
5
|
+
export interface ComplexityEntry {
|
|
6
|
+
file: string;
|
|
7
|
+
symbol?: string;
|
|
8
|
+
line?: number;
|
|
9
|
+
metrics: {
|
|
10
|
+
cyclomatic: number;
|
|
11
|
+
cognitive: number;
|
|
12
|
+
nesting: number;
|
|
13
|
+
loc: number;
|
|
14
|
+
params?: number;
|
|
15
|
+
};
|
|
16
|
+
score: number;
|
|
17
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
18
|
+
}
|
|
19
|
+
export interface HeatmapResult {
|
|
20
|
+
hotspots: ComplexityEntry[];
|
|
21
|
+
fileScores: {
|
|
22
|
+
file: string;
|
|
23
|
+
score: number;
|
|
24
|
+
grade: string;
|
|
25
|
+
loc: number;
|
|
26
|
+
}[];
|
|
27
|
+
summary: {
|
|
28
|
+
totalFiles: number;
|
|
29
|
+
averageScore: number;
|
|
30
|
+
criticalCount: number;
|
|
31
|
+
healthyCount: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate a complexity heatmap for source files and functions.
|
|
36
|
+
* @param cwd - The working directory to scan.
|
|
37
|
+
* @param options - Configuration options.
|
|
38
|
+
* @param options.directory - The directory to analyze.
|
|
39
|
+
* @param options.fileGlob - Glob pattern for files to analyze.
|
|
40
|
+
* @param options.top - Number of top results to return.
|
|
41
|
+
* @param options.granularity - Analysis granularity level.
|
|
42
|
+
* @returns The heatmap result with hotspots and file scores.
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateHeatmap(cwd: string, options?: {
|
|
45
|
+
directory?: string;
|
|
46
|
+
fileGlob?: string;
|
|
47
|
+
top?: number;
|
|
48
|
+
granularity?: 'file' | 'function';
|
|
49
|
+
}): Promise<HeatmapResult>;
|
|
50
|
+
//# sourceMappingURL=complexity-heatmap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-heatmap.d.ts","sourceRoot":"","sources":["../../src/analyzers/complexity-heatmap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClG,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1E,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACpG;AAiED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GACnG,OAAO,CAAC,aAAa,CAAC,CA2ExB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity Heatmap
|
|
3
|
+
* Ranks files and functions by cyclomatic/cognitive complexity.
|
|
4
|
+
*/
|
|
5
|
+
import { listFiles } from '../search/fast-search.js';
|
|
6
|
+
import { extractSymbols } from '../analyzers/symbols.js';
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
function cyclomatic(code) {
|
|
10
|
+
let c = 1;
|
|
11
|
+
const ps = [
|
|
12
|
+
/\bif\b/g,
|
|
13
|
+
/\belse\s+if\b/g,
|
|
14
|
+
/\bwhile\b/g,
|
|
15
|
+
/\bfor\b/g,
|
|
16
|
+
/\bcase\b/g,
|
|
17
|
+
/\bcatch\b/g,
|
|
18
|
+
/&&/g,
|
|
19
|
+
/\|\|/g,
|
|
20
|
+
/\?[^.?:]/g,
|
|
21
|
+
];
|
|
22
|
+
for (const p of ps) {
|
|
23
|
+
const m = code.match(p);
|
|
24
|
+
if (m)
|
|
25
|
+
c += m.length;
|
|
26
|
+
}
|
|
27
|
+
return c;
|
|
28
|
+
}
|
|
29
|
+
function cognitive(code) {
|
|
30
|
+
let cog = 0, nest = 0;
|
|
31
|
+
for (const line of code.split('\n')) {
|
|
32
|
+
const t = line.trim();
|
|
33
|
+
if (/\b(if|elif|while|for|switch|match)\b/.test(t))
|
|
34
|
+
cog += 1 + nest;
|
|
35
|
+
if (/\belse\b/.test(t) && !/else\s+if/.test(t))
|
|
36
|
+
cog += 1;
|
|
37
|
+
cog += (t.match(/&&|\|\|/g) || []).length;
|
|
38
|
+
nest += (line.match(/{/g) || []).length - (line.match(/}/g) || []).length;
|
|
39
|
+
nest = Math.max(0, nest);
|
|
40
|
+
}
|
|
41
|
+
return cog;
|
|
42
|
+
}
|
|
43
|
+
function maxNesting(code) {
|
|
44
|
+
let max = 0, cur = 0;
|
|
45
|
+
for (const ch of code) {
|
|
46
|
+
if (ch === '{') {
|
|
47
|
+
cur++;
|
|
48
|
+
max = Math.max(max, cur);
|
|
49
|
+
}
|
|
50
|
+
else if (ch === '}')
|
|
51
|
+
cur = Math.max(0, cur - 1);
|
|
52
|
+
}
|
|
53
|
+
return max;
|
|
54
|
+
}
|
|
55
|
+
function grade(s) {
|
|
56
|
+
if (s <= 20)
|
|
57
|
+
return 'A';
|
|
58
|
+
if (s <= 40)
|
|
59
|
+
return 'B';
|
|
60
|
+
if (s <= 60)
|
|
61
|
+
return 'C';
|
|
62
|
+
if (s <= 80)
|
|
63
|
+
return 'D';
|
|
64
|
+
return 'F';
|
|
65
|
+
}
|
|
66
|
+
function score(m) {
|
|
67
|
+
return Math.round(Math.min(100, (m.cyclomatic / 30) * 100) * 0.3 +
|
|
68
|
+
Math.min(100, (m.cognitive / 50) * 100) * 0.3 +
|
|
69
|
+
Math.min(100, (m.nesting / 8) * 100) * 0.2 +
|
|
70
|
+
Math.min(100, (m.loc / 500) * 100) * 0.2);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate a complexity heatmap for source files and functions.
|
|
74
|
+
* @param cwd - The working directory to scan.
|
|
75
|
+
* @param options - Configuration options.
|
|
76
|
+
* @param options.directory - The directory to analyze.
|
|
77
|
+
* @param options.fileGlob - Glob pattern for files to analyze.
|
|
78
|
+
* @param options.top - Number of top results to return.
|
|
79
|
+
* @param options.granularity - Analysis granularity level.
|
|
80
|
+
* @returns The heatmap result with hotspots and file scores.
|
|
81
|
+
*/
|
|
82
|
+
export async function generateHeatmap(cwd, options) {
|
|
83
|
+
const dir = path.resolve(cwd, options?.directory || '.');
|
|
84
|
+
const files = await listFiles(dir, { glob: options?.fileGlob || '**/*.{ts,tsx,js,jsx,py,java,go,rs,rb,php,cs}' });
|
|
85
|
+
const top = options?.top || 20;
|
|
86
|
+
const hotspots = [];
|
|
87
|
+
const fileScores = [];
|
|
88
|
+
for (const file of files.slice(0, 500)) {
|
|
89
|
+
try {
|
|
90
|
+
const absPath = path.resolve(dir, file);
|
|
91
|
+
const content = await readFile(absPath, 'utf-8');
|
|
92
|
+
const lines = content.split('\n');
|
|
93
|
+
const codeLoc = lines.filter((l) => l.trim() && !l.trim().startsWith('//')).length;
|
|
94
|
+
const fm = {
|
|
95
|
+
cyclomatic: cyclomatic(content),
|
|
96
|
+
cognitive: cognitive(content),
|
|
97
|
+
nesting: maxNesting(content),
|
|
98
|
+
loc: codeLoc,
|
|
99
|
+
};
|
|
100
|
+
const fs = score(fm);
|
|
101
|
+
fileScores.push({ file, score: fs, grade: grade(fs), loc: codeLoc });
|
|
102
|
+
if (options?.granularity !== 'file') {
|
|
103
|
+
const symbols = await extractSymbols(absPath);
|
|
104
|
+
for (const fn of symbols.filter((s) => s.kind === 'function' || s.kind === 'class')) {
|
|
105
|
+
const start = fn.line - 1;
|
|
106
|
+
let end = start, braces = 0, opened = false;
|
|
107
|
+
for (let i = start; i < lines.length && i < start + 200; i++) {
|
|
108
|
+
for (const ch of lines[i]) {
|
|
109
|
+
if (ch === '{') {
|
|
110
|
+
braces++;
|
|
111
|
+
opened = true;
|
|
112
|
+
}
|
|
113
|
+
if (ch === '}')
|
|
114
|
+
braces--;
|
|
115
|
+
}
|
|
116
|
+
end = i;
|
|
117
|
+
if (opened && braces <= 0)
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
const body = lines.slice(start, end + 1).join('\n');
|
|
121
|
+
if (end - start < 3)
|
|
122
|
+
continue;
|
|
123
|
+
const paramMatch = lines[start]?.match(/\(([^)]*)\)/);
|
|
124
|
+
const params = paramMatch ? (paramMatch[1].trim() ? paramMatch[1].split(',').length : 0) : 0;
|
|
125
|
+
const m = {
|
|
126
|
+
cyclomatic: cyclomatic(body),
|
|
127
|
+
cognitive: cognitive(body),
|
|
128
|
+
nesting: maxNesting(body),
|
|
129
|
+
loc: end - start + 1,
|
|
130
|
+
params,
|
|
131
|
+
};
|
|
132
|
+
const s = score(m);
|
|
133
|
+
hotspots.push({ file, symbol: fn.name, line: fn.line, metrics: m, score: s, grade: grade(s) });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
/* skip */
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
hotspots.sort((a, b) => b.score - a.score);
|
|
142
|
+
fileScores.sort((a, b) => b.score - a.score);
|
|
143
|
+
const scores = fileScores.map((f) => f.score);
|
|
144
|
+
const avg = scores.length ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;
|
|
145
|
+
return {
|
|
146
|
+
hotspots: hotspots.slice(0, top),
|
|
147
|
+
fileScores: fileScores.slice(0, top),
|
|
148
|
+
summary: {
|
|
149
|
+
totalFiles: fileScores.length,
|
|
150
|
+
averageScore: avg,
|
|
151
|
+
criticalCount: fileScores.filter((f) => f.grade === 'D' || f.grade === 'F').length,
|
|
152
|
+
healthyCount: fileScores.filter((f) => f.grade === 'A' || f.grade === 'B').length,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=complexity-heatmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-heatmap.js","sourceRoot":"","sources":["../../src/analyzers/complexity-heatmap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAiB7B,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,EAAE,GAAG;QACT,SAAS;QACT,gBAAgB;QAChB,YAAY;QACZ,UAAU;QACV,WAAW;QACX,YAAY;QACZ,KAAK;QACL,OAAO;QACP,WAAW;KACZ,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC;YAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,GAAG,GAAG,CAAC,EACT,IAAI,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,sCAAsC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACpE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,GAAG,IAAI,CAAC,CAAC;QACzD,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1E,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,GAAG,GAAG,CAAC,EACT,GAAG,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,GAAG,EAAE,CAAC;YACN,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG;YAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,CAA6B;IAC1C,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAC3C,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,OAAoG;IAEpG,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,IAAI,8CAA8C,EAAE,CAAC,CAAC;IAClH,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAgC,EAAE,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YACnF,MAAM,EAAE,GAAG;gBACT,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC;gBAC/B,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;gBAC7B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;gBAC5B,GAAG,EAAE,OAAO;aACb,CAAC;YACF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAErE,IAAI,OAAO,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9C,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;oBACpF,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;oBAC1B,IAAI,GAAG,GAAG,KAAK,EACb,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,KAAK,CAAC;oBACjB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7D,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC1B,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gCACf,MAAM,EAAE,CAAC;gCACT,MAAM,GAAG,IAAI,CAAC;4BAChB,CAAC;4BACD,IAAI,EAAE,KAAK,GAAG;gCAAE,MAAM,EAAE,CAAC;wBAC3B,CAAC;wBACD,GAAG,GAAG,CAAC,CAAC;wBACR,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC;4BAAE,MAAM;oBACnC,CAAC;oBACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC;wBAAE,SAAS;oBAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;oBACtD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7F,MAAM,CAAC,GAAG;wBACR,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC;wBAC5B,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;wBACzB,GAAG,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC;wBACpB,MAAM;qBACP,CAAC;oBACF,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3C,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAChC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACpC,OAAO,EAAE;YACP,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,YAAY,EAAE,GAAG;YACjB,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,MAAM;YAClF,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,MAAM;SAClF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Context Window Packing
|
|
3
|
+
* Given a question/task, returns the most relevant files and symbols
|
|
4
|
+
* that fit within a given token budget. Helps agents minimize waste.
|
|
5
|
+
*/
|
|
6
|
+
export interface ContextItem {
|
|
7
|
+
file: string;
|
|
8
|
+
startLine?: number;
|
|
9
|
+
endLine?: number;
|
|
10
|
+
content: string;
|
|
11
|
+
/** 0-1 score */
|
|
12
|
+
relevance: number;
|
|
13
|
+
/** Why this item was included */
|
|
14
|
+
reason: string;
|
|
15
|
+
estimatedTokens: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ContextPackResult {
|
|
18
|
+
items: ContextItem[];
|
|
19
|
+
totalTokens: number;
|
|
20
|
+
budget: number;
|
|
21
|
+
filesIncluded: number;
|
|
22
|
+
filesSkipped: number;
|
|
23
|
+
strategy: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Pack the most relevant context for a given question within a token budget.
|
|
27
|
+
* @param cwd - The working directory to scan.
|
|
28
|
+
* @param options - Configuration options.
|
|
29
|
+
* @param options.query - The search query.
|
|
30
|
+
* @param options.maxTokens - Maximum token budget.
|
|
31
|
+
* @param options.includeImports - Whether to include imported files.
|
|
32
|
+
* @param options.includeSymbols - Whether to include symbols.
|
|
33
|
+
* @param options.maxFiles - Maximum number of files to include.
|
|
34
|
+
* @returns The packed context result.
|
|
35
|
+
*/
|
|
36
|
+
export declare function packContext(cwd: string, options: {
|
|
37
|
+
query: string;
|
|
38
|
+
maxTokens?: number;
|
|
39
|
+
includeImports?: boolean;
|
|
40
|
+
includeSymbols?: boolean;
|
|
41
|
+
maxFiles?: number;
|
|
42
|
+
}): Promise<ContextPackResult>;
|
|
43
|
+
//# sourceMappingURL=context-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-pack.d.ts","sourceRoot":"","sources":["../../src/analyzers/context-pack.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuCD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,iBAAiB,CAAC,CA+I5B"}
|