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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jupyter Notebook (.ipynb) parser.
|
|
3
|
+
* Extracts code cells, markdown cells, outputs, and dependencies.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
/**
|
|
8
|
+
* Parse a Jupyter notebook file.
|
|
9
|
+
* @param filePath - Path to the .ipynb file
|
|
10
|
+
* @returns Parsed notebook information including cells, imports, and execution state
|
|
11
|
+
*/
|
|
12
|
+
export async function parseNotebook(filePath) {
|
|
13
|
+
const content = await readFile(filePath, 'utf-8');
|
|
14
|
+
const notebook = JSON.parse(content);
|
|
15
|
+
const kernelSpec = notebook.metadata?.kernelspec || {};
|
|
16
|
+
const kernelLanguage = kernelSpec.language || notebook.metadata?.language_info?.name || 'unknown';
|
|
17
|
+
const kernelDisplayName = kernelSpec.display_name || kernelLanguage;
|
|
18
|
+
const cells = [];
|
|
19
|
+
const imports = [];
|
|
20
|
+
const functions = [];
|
|
21
|
+
let lastExecCount = 0;
|
|
22
|
+
let executedInOrder = true;
|
|
23
|
+
let hasUnexecutedCells = false;
|
|
24
|
+
for (let i = 0; i < (notebook.cells || []).length; i++) {
|
|
25
|
+
const cell = notebook.cells[i];
|
|
26
|
+
const cellType = cell.cell_type;
|
|
27
|
+
const source = Array.isArray(cell.source) ? cell.source.join('') : cell.source || '';
|
|
28
|
+
const outputs = [];
|
|
29
|
+
let hasError = false;
|
|
30
|
+
if (cell.outputs) {
|
|
31
|
+
for (const output of cell.outputs) {
|
|
32
|
+
if (output.output_type === 'error') {
|
|
33
|
+
hasError = true;
|
|
34
|
+
outputs.push(`Error: ${output.ename}: ${output.evalue}`);
|
|
35
|
+
}
|
|
36
|
+
else if (output.output_type === 'stream') {
|
|
37
|
+
const text = Array.isArray(output.text) ? output.text.join('') : output.text || '';
|
|
38
|
+
if (text.trim())
|
|
39
|
+
outputs.push(text.trim().slice(0, 200));
|
|
40
|
+
}
|
|
41
|
+
else if (output.output_type === 'execute_result' || output.output_type === 'display_data') {
|
|
42
|
+
const textData = output.data?.['text/plain'];
|
|
43
|
+
if (textData) {
|
|
44
|
+
const text = Array.isArray(textData) ? textData.join('') : textData;
|
|
45
|
+
outputs.push(text.slice(0, 200));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const execCount = cell.execution_count;
|
|
51
|
+
if (cellType === 'code') {
|
|
52
|
+
if (execCount === null || execCount === undefined) {
|
|
53
|
+
hasUnexecutedCells = true;
|
|
54
|
+
}
|
|
55
|
+
else if (execCount <= lastExecCount) {
|
|
56
|
+
executedInOrder = false;
|
|
57
|
+
}
|
|
58
|
+
lastExecCount = execCount || lastExecCount;
|
|
59
|
+
// Extract imports
|
|
60
|
+
const importLines = source
|
|
61
|
+
.split('\n')
|
|
62
|
+
.filter((l) => /^(?:import |from |require\(|const .+ = require)/.test(l.trim()));
|
|
63
|
+
imports.push(...importLines.map((l) => l.trim()));
|
|
64
|
+
// Extract function definitions
|
|
65
|
+
const funcLines = source
|
|
66
|
+
.split('\n')
|
|
67
|
+
.filter((l) => /^(?:def |async def |function |class )/.test(l.trim()));
|
|
68
|
+
functions.push(...funcLines.map((l) => l.trim()));
|
|
69
|
+
}
|
|
70
|
+
cells.push({
|
|
71
|
+
cellType,
|
|
72
|
+
source,
|
|
73
|
+
index: i,
|
|
74
|
+
executionCount: execCount,
|
|
75
|
+
outputs: outputs.length > 0 ? outputs : undefined,
|
|
76
|
+
hasError,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
file: filePath,
|
|
81
|
+
kernelLanguage,
|
|
82
|
+
kernelDisplayName,
|
|
83
|
+
totalCells: cells.length,
|
|
84
|
+
codeCells: cells.filter((c) => c.cellType === 'code').length,
|
|
85
|
+
markdownCells: cells.filter((c) => c.cellType === 'markdown').length,
|
|
86
|
+
cells,
|
|
87
|
+
imports: [...new Set(imports)],
|
|
88
|
+
functions,
|
|
89
|
+
executedInOrder,
|
|
90
|
+
hasUnexecutedCells,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find all notebooks in a directory.
|
|
95
|
+
* @param cwd - The working directory to search
|
|
96
|
+
* @returns Array of notebook file paths
|
|
97
|
+
*/
|
|
98
|
+
export async function findNotebooks(cwd) {
|
|
99
|
+
return glob('**/*.ipynb', {
|
|
100
|
+
cwd,
|
|
101
|
+
ignore: ['node_modules/**', '.ipynb_checkpoints/**', 'dist/**', 'build/**'],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract just the code from a notebook (for analysis).
|
|
106
|
+
* @param notebook - Parsed notebook information
|
|
107
|
+
* @returns Concatenated code from all code cells
|
|
108
|
+
*/
|
|
109
|
+
export function extractCode(notebook) {
|
|
110
|
+
return notebook.cells
|
|
111
|
+
.filter((c) => c.cellType === 'code')
|
|
112
|
+
.map((c) => `# Cell ${c.index} [${c.executionCount || '?'}]\n${c.source}`)
|
|
113
|
+
.join('\n\n');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get notebook health summary.
|
|
117
|
+
* @param notebook - Parsed notebook information
|
|
118
|
+
* @returns Health issues and overall score
|
|
119
|
+
*/
|
|
120
|
+
export function notebookHealth(notebook) {
|
|
121
|
+
const issues = [];
|
|
122
|
+
let score = 100;
|
|
123
|
+
if (notebook.hasUnexecutedCells) {
|
|
124
|
+
issues.push('Has unexecuted code cells');
|
|
125
|
+
score -= 10;
|
|
126
|
+
}
|
|
127
|
+
if (!notebook.executedInOrder) {
|
|
128
|
+
issues.push('Cells not executed in order (may have hidden state)');
|
|
129
|
+
score -= 20;
|
|
130
|
+
}
|
|
131
|
+
if (notebook.cells.some((c) => c.hasError)) {
|
|
132
|
+
issues.push('Contains cells with execution errors');
|
|
133
|
+
score -= 15;
|
|
134
|
+
}
|
|
135
|
+
if (notebook.markdownCells === 0) {
|
|
136
|
+
issues.push('No markdown documentation cells');
|
|
137
|
+
score -= 10;
|
|
138
|
+
}
|
|
139
|
+
if (notebook.codeCells > 30) {
|
|
140
|
+
issues.push(`Large notebook (${notebook.codeCells} code cells) — consider splitting`);
|
|
141
|
+
score -= 10;
|
|
142
|
+
}
|
|
143
|
+
if (notebook.imports.length === 0 && notebook.codeCells > 3) {
|
|
144
|
+
issues.push('No imports found — may be missing dependencies');
|
|
145
|
+
score -= 5;
|
|
146
|
+
}
|
|
147
|
+
return { issues, score: Math.max(0, score) };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=notebook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook.js","sourceRoot":"","sources":["../../src/analyzers/notebook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Profiling Integration
|
|
3
|
+
* Parses common profiling output: Node.js CPU profiles (.cpuprofile),
|
|
4
|
+
* webpack bundle stats, and performs heuristic analysis on file/dep sizes.
|
|
5
|
+
*/
|
|
6
|
+
export interface PerfEntry {
|
|
7
|
+
type: 'hot_function' | 'large_bundle' | 'slow_module' | 'large_file' | 'heavy_dep';
|
|
8
|
+
name: string;
|
|
9
|
+
file?: string;
|
|
10
|
+
metric: string;
|
|
11
|
+
value: number;
|
|
12
|
+
unit: string;
|
|
13
|
+
severity: 'critical' | 'warning' | 'info';
|
|
14
|
+
recommendation?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PerfResult {
|
|
17
|
+
entries: PerfEntry[];
|
|
18
|
+
sources: string[];
|
|
19
|
+
profFiles: string[];
|
|
20
|
+
summary: {
|
|
21
|
+
critical: number;
|
|
22
|
+
warning: number;
|
|
23
|
+
info: number;
|
|
24
|
+
};
|
|
25
|
+
bundleSize?: {
|
|
26
|
+
total: number;
|
|
27
|
+
largest: {
|
|
28
|
+
name: string;
|
|
29
|
+
size: number;
|
|
30
|
+
}[];
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Main performance analysis function.
|
|
35
|
+
* @param cwd - The working directory
|
|
36
|
+
* @returns Performance analysis results with entries and summary
|
|
37
|
+
*/
|
|
38
|
+
export declare function analyzePerformance(cwd: string): Promise<PerfResult>;
|
|
39
|
+
//# sourceMappingURL=perf-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-profile.d.ts","sourceRoot":"","sources":["../../src/analyzers/perf-profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,CAAC;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;CAC3E;AAuJD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkEzE"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Profiling Integration
|
|
3
|
+
* Parses common profiling output: Node.js CPU profiles (.cpuprofile),
|
|
4
|
+
* webpack bundle stats, and performs heuristic analysis on file/dep sizes.
|
|
5
|
+
*/
|
|
6
|
+
import { listFiles } from '../search/fast-search.js';
|
|
7
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
/**
|
|
10
|
+
* Parse Node.js .cpuprofile files (V8 CPU profile format).
|
|
11
|
+
* @param content - The raw CPU profile JSON content
|
|
12
|
+
* @returns Array of performance entries for hot functions
|
|
13
|
+
*/
|
|
14
|
+
function parseCPUProfile(content) {
|
|
15
|
+
const entries = [];
|
|
16
|
+
try {
|
|
17
|
+
const profile = JSON.parse(content);
|
|
18
|
+
const nodes = profile.nodes || [];
|
|
19
|
+
const funcHits = [];
|
|
20
|
+
for (const node of nodes) {
|
|
21
|
+
if (node.hitCount > 0 && node.callFrame) {
|
|
22
|
+
funcHits.push({
|
|
23
|
+
name: node.callFrame.functionName || '(anonymous)',
|
|
24
|
+
url: node.callFrame.url || '',
|
|
25
|
+
hitCount: node.hitCount,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
funcHits.sort((a, b) => b.hitCount - a.hitCount);
|
|
30
|
+
const totalHits = funcHits.reduce((sum, f) => sum + f.hitCount, 0);
|
|
31
|
+
for (const func of funcHits.slice(0, 20)) {
|
|
32
|
+
const pct = totalHits > 0 ? ((func.hitCount / totalHits) * 100).toFixed(1) : '0';
|
|
33
|
+
const severity = parseFloat(pct) > 10 ? 'critical' : parseFloat(pct) > 3 ? 'warning' : 'info';
|
|
34
|
+
entries.push({
|
|
35
|
+
type: 'hot_function',
|
|
36
|
+
name: func.name,
|
|
37
|
+
file: func.url.replace(/^file:\/\//, ''),
|
|
38
|
+
metric: 'CPU time',
|
|
39
|
+
value: parseFloat(pct),
|
|
40
|
+
unit: '%',
|
|
41
|
+
severity,
|
|
42
|
+
recommendation: parseFloat(pct) > 10 ? `Hot function taking ${pct}% CPU` : undefined,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
/* skip */
|
|
48
|
+
}
|
|
49
|
+
return entries;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse webpack stats.json for bundle analysis.
|
|
53
|
+
* @param content - The raw webpack stats JSON content
|
|
54
|
+
* @param file - The stats file path
|
|
55
|
+
* @returns Array of performance entries for bundle sizes
|
|
56
|
+
*/
|
|
57
|
+
function parseWebpackStats(content, file) {
|
|
58
|
+
const entries = [];
|
|
59
|
+
try {
|
|
60
|
+
const stats = JSON.parse(content);
|
|
61
|
+
const assets = stats.assets || [];
|
|
62
|
+
const sorted = assets
|
|
63
|
+
.sort((a, b) => b.size - a.size)
|
|
64
|
+
.slice(0, 15);
|
|
65
|
+
for (const asset of sorted) {
|
|
66
|
+
const sizeMB = (asset.size / (1024 * 1024)).toFixed(2);
|
|
67
|
+
const severity = asset.size > 500_000 ? 'critical' : asset.size > 200_000 ? 'warning' : 'info';
|
|
68
|
+
entries.push({
|
|
69
|
+
type: 'large_bundle',
|
|
70
|
+
name: asset.name,
|
|
71
|
+
file,
|
|
72
|
+
metric: 'Bundle size',
|
|
73
|
+
value: asset.size,
|
|
74
|
+
unit: 'bytes',
|
|
75
|
+
severity,
|
|
76
|
+
recommendation: asset.size > 500_000 ? `Bundle ${asset.name} is ${sizeMB}MB — consider code splitting` : undefined,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
/* skip */
|
|
82
|
+
}
|
|
83
|
+
return entries;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Analyze source file sizes.
|
|
87
|
+
* @param cwd - The working directory
|
|
88
|
+
* @returns Array of performance entries for large files
|
|
89
|
+
*/
|
|
90
|
+
async function analyzeFileSizes(cwd) {
|
|
91
|
+
const entries = [];
|
|
92
|
+
const files = await listFiles(cwd, { glob: '**/*.{ts,tsx,js,jsx,py,java,go,rs}' });
|
|
93
|
+
for (const file of files.slice(0, 500)) {
|
|
94
|
+
try {
|
|
95
|
+
const st = await stat(path.join(cwd, file));
|
|
96
|
+
const sizeKB = st.size / 1024;
|
|
97
|
+
if (sizeKB > 100) {
|
|
98
|
+
entries.push({
|
|
99
|
+
type: 'large_file',
|
|
100
|
+
name: file,
|
|
101
|
+
file,
|
|
102
|
+
metric: 'File size',
|
|
103
|
+
value: Math.round(sizeKB),
|
|
104
|
+
unit: 'KB',
|
|
105
|
+
severity: sizeKB > 500 ? 'critical' : sizeKB > 200 ? 'warning' : 'info',
|
|
106
|
+
recommendation: sizeKB > 200 ? `File is ${Math.round(sizeKB)}KB — consider splitting` : undefined,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
/* skip */
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return entries.sort((a, b) => b.value - a.value).slice(0, 15);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Analyze heavy dependencies from package.json.
|
|
118
|
+
* @param cwd - The working directory
|
|
119
|
+
* @returns Array of performance entries for heavy dependencies
|
|
120
|
+
*/
|
|
121
|
+
async function analyzeHeavyDeps(cwd) {
|
|
122
|
+
const entries = [];
|
|
123
|
+
const HEAVY_DEPS = {
|
|
124
|
+
moment: { sizeEstKB: 290, alternative: 'date-fns or dayjs (2-7KB)' },
|
|
125
|
+
lodash: { sizeEstKB: 530, alternative: 'lodash-es with tree-shaking' },
|
|
126
|
+
'aws-sdk': { sizeEstKB: 7500, alternative: '@aws-sdk/* v3 modular packages' },
|
|
127
|
+
firebase: { sizeEstKB: 600, alternative: 'firebase/app + only needed modules' },
|
|
128
|
+
antd: { sizeEstKB: 1200, alternative: 'Import individual antd components' },
|
|
129
|
+
'@mui/material': { sizeEstKB: 800, alternative: 'Import individual @mui components' },
|
|
130
|
+
'core-js': { sizeEstKB: 500, alternative: 'Use browserslist for targeted polyfills' },
|
|
131
|
+
};
|
|
132
|
+
try {
|
|
133
|
+
const pkgContent = await readFile(path.join(cwd, 'package.json'), 'utf-8');
|
|
134
|
+
const pkg = JSON.parse(pkgContent);
|
|
135
|
+
const allDeps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
|
|
136
|
+
for (const [name, info] of Object.entries(HEAVY_DEPS)) {
|
|
137
|
+
if (allDeps[name]) {
|
|
138
|
+
entries.push({
|
|
139
|
+
type: 'heavy_dep',
|
|
140
|
+
name,
|
|
141
|
+
metric: 'Estimated bundle impact',
|
|
142
|
+
value: info.sizeEstKB,
|
|
143
|
+
unit: 'KB',
|
|
144
|
+
severity: info.sizeEstKB > 500 ? 'warning' : 'info',
|
|
145
|
+
recommendation: info.alternative ? `Consider: ${info.alternative}` : undefined,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* skip */
|
|
152
|
+
}
|
|
153
|
+
return entries.sort((a, b) => b.value - a.value);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Main performance analysis function.
|
|
157
|
+
* @param cwd - The working directory
|
|
158
|
+
* @returns Performance analysis results with entries and summary
|
|
159
|
+
*/
|
|
160
|
+
export async function analyzePerformance(cwd) {
|
|
161
|
+
const allEntries = [];
|
|
162
|
+
const sources = [];
|
|
163
|
+
const profFiles = [];
|
|
164
|
+
// CPU profiles
|
|
165
|
+
const cpuProfiles = await listFiles(cwd, { glob: '**/*.cpuprofile' });
|
|
166
|
+
for (const f of cpuProfiles.slice(0, 5)) {
|
|
167
|
+
try {
|
|
168
|
+
const content = await readFile(path.join(cwd, f), 'utf-8');
|
|
169
|
+
const entries = parseCPUProfile(content);
|
|
170
|
+
if (entries.length > 0) {
|
|
171
|
+
allEntries.push(...entries);
|
|
172
|
+
profFiles.push(f);
|
|
173
|
+
sources.push('cpuprofile');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* skip */
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Webpack stats
|
|
181
|
+
const statsFiles = await listFiles(cwd, { glob: '**/*stats*.json' });
|
|
182
|
+
for (const f of statsFiles.filter((f) => /stats|bundle/i.test(f)).slice(0, 3)) {
|
|
183
|
+
try {
|
|
184
|
+
const content = await readFile(path.join(cwd, f), 'utf-8');
|
|
185
|
+
if (content.includes('"assets"') || content.includes('"modules"')) {
|
|
186
|
+
const entries = parseWebpackStats(content, f);
|
|
187
|
+
if (entries.length > 0) {
|
|
188
|
+
allEntries.push(...entries);
|
|
189
|
+
profFiles.push(f);
|
|
190
|
+
sources.push('webpack-stats');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
/* skip */
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// File size analysis
|
|
199
|
+
const fileSizeEntries = await analyzeFileSizes(cwd);
|
|
200
|
+
if (fileSizeEntries.length > 0) {
|
|
201
|
+
allEntries.push(...fileSizeEntries);
|
|
202
|
+
sources.push('file-sizes');
|
|
203
|
+
}
|
|
204
|
+
// Heavy deps
|
|
205
|
+
const heavyDepEntries = await analyzeHeavyDeps(cwd);
|
|
206
|
+
if (heavyDepEntries.length > 0) {
|
|
207
|
+
allEntries.push(...heavyDepEntries);
|
|
208
|
+
sources.push('dep-weight');
|
|
209
|
+
}
|
|
210
|
+
const summary = { critical: 0, warning: 0, info: 0 };
|
|
211
|
+
for (const e of allEntries)
|
|
212
|
+
summary[e.severity]++;
|
|
213
|
+
const bundleEntries = allEntries.filter((e) => e.type === 'large_bundle');
|
|
214
|
+
const bundleSize = bundleEntries.length > 0
|
|
215
|
+
? {
|
|
216
|
+
total: bundleEntries.reduce((sum, e) => sum + e.value, 0),
|
|
217
|
+
largest: bundleEntries.slice(0, 5).map((e) => ({ name: e.name, size: e.value })),
|
|
218
|
+
}
|
|
219
|
+
: undefined;
|
|
220
|
+
return { entries: allEntries, sources: [...new Set(sources)], profFiles, summary, bundleSize };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=perf-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-profile.js","sourceRoot":"","sources":["../../src/analyzers/perf-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Generation Templates / Scaffolding
|
|
3
|
+
* Generates boilerplate code from symbol signatures.
|
|
4
|
+
* Supports: React components, Express routes, test files, API handlers,
|
|
5
|
+
* class stubs, and module scaffolds based on project conventions.
|
|
6
|
+
*/
|
|
7
|
+
export interface ScaffoldTemplate {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
language: string;
|
|
11
|
+
category: 'component' | 'route' | 'test' | 'model' | 'service' | 'util' | 'hook';
|
|
12
|
+
}
|
|
13
|
+
export interface ScaffoldResult {
|
|
14
|
+
template: string;
|
|
15
|
+
generatedCode: string;
|
|
16
|
+
fileName: string;
|
|
17
|
+
language: string;
|
|
18
|
+
/** Detected project conventions applied */
|
|
19
|
+
conventions: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ConventionResult {
|
|
22
|
+
templates: ScaffoldTemplate[];
|
|
23
|
+
detectedPatterns: string[];
|
|
24
|
+
projectType: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* List available scaffold templates based on project conventions.
|
|
28
|
+
* @param cwd - The working directory
|
|
29
|
+
* @returns Available templates, detected patterns, and project type
|
|
30
|
+
*/
|
|
31
|
+
export declare function listTemplates(cwd: string): Promise<ConventionResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Generate scaffold code for a given template and name.
|
|
34
|
+
* @param cwd - The working directory
|
|
35
|
+
* @param options - Scaffold options
|
|
36
|
+
* @param options.template - Template type to generate
|
|
37
|
+
* @param options.name - Name for the generated code
|
|
38
|
+
* @param options.targetFile - Optional target file path
|
|
39
|
+
* @returns Generated scaffold result with code and metadata
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateScaffold(cwd: string, options: {
|
|
42
|
+
template: string;
|
|
43
|
+
name: string;
|
|
44
|
+
targetFile?: string;
|
|
45
|
+
}): Promise<ScaffoldResult>;
|
|
46
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/analyzers/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;CAClF;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAgND;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+C1E;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,cAAc,CAAC,CA8CzB"}
|