@planu/cli 0.37.0 → 0.39.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.
Files changed (108) hide show
  1. package/dist/config/license-plans.json +2 -1
  2. package/dist/engine/reverse-engineer/api-detector.d.ts +3 -0
  3. package/dist/engine/reverse-engineer/api-detector.d.ts.map +1 -0
  4. package/dist/engine/reverse-engineer/api-detector.js +170 -0
  5. package/dist/engine/reverse-engineer/api-detector.js.map +1 -0
  6. package/dist/engine/reverse-engineer/complexity-analyzer.d.ts +3 -0
  7. package/dist/engine/reverse-engineer/complexity-analyzer.d.ts.map +1 -0
  8. package/dist/engine/reverse-engineer/complexity-analyzer.js +230 -0
  9. package/dist/engine/reverse-engineer/complexity-analyzer.js.map +1 -0
  10. package/dist/engine/reverse-engineer/config-analyzer.d.ts +3 -0
  11. package/dist/engine/reverse-engineer/config-analyzer.d.ts.map +1 -0
  12. package/dist/engine/reverse-engineer/config-analyzer.js +247 -0
  13. package/dist/engine/reverse-engineer/config-analyzer.js.map +1 -0
  14. package/dist/engine/reverse-engineer/dependency-graph.d.ts +3 -0
  15. package/dist/engine/reverse-engineer/dependency-graph.d.ts.map +1 -0
  16. package/dist/engine/reverse-engineer/dependency-graph.js +197 -0
  17. package/dist/engine/reverse-engineer/dependency-graph.js.map +1 -0
  18. package/dist/engine/reverse-engineer/index.d.ts +7 -0
  19. package/dist/engine/reverse-engineer/index.d.ts.map +1 -0
  20. package/dist/engine/reverse-engineer/index.js +7 -0
  21. package/dist/engine/reverse-engineer/index.js.map +1 -0
  22. package/dist/engine/reverse-engineer/orchestrator.d.ts +5 -0
  23. package/dist/engine/reverse-engineer/orchestrator.d.ts.map +1 -0
  24. package/dist/engine/reverse-engineer/orchestrator.js +200 -0
  25. package/dist/engine/reverse-engineer/orchestrator.js.map +1 -0
  26. package/dist/engine/reverse-engineer/test-analyzer.d.ts +4 -0
  27. package/dist/engine/reverse-engineer/test-analyzer.d.ts.map +1 -0
  28. package/dist/engine/reverse-engineer/test-analyzer.js +130 -0
  29. package/dist/engine/reverse-engineer/test-analyzer.js.map +1 -0
  30. package/dist/engine/spec-kit-exporter.d.ts +6 -0
  31. package/dist/engine/spec-kit-exporter.d.ts.map +1 -0
  32. package/dist/engine/spec-kit-exporter.js +227 -0
  33. package/dist/engine/spec-kit-exporter.js.map +1 -0
  34. package/dist/engine/spec-migrator.d.ts +9 -0
  35. package/dist/engine/spec-migrator.d.ts.map +1 -1
  36. package/dist/engine/spec-migrator.js +70 -0
  37. package/dist/engine/spec-migrator.js.map +1 -1
  38. package/dist/index.js +4 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/tools/create-spec/spec-builder.js +1 -1
  41. package/dist/tools/create-spec/spec-builder.js.map +1 -1
  42. package/dist/tools/create-spec.d.ts.map +1 -1
  43. package/dist/tools/create-spec.js +28 -0
  44. package/dist/tools/create-spec.js.map +1 -1
  45. package/dist/tools/export-spec.d.ts +3 -0
  46. package/dist/tools/export-spec.d.ts.map +1 -0
  47. package/dist/tools/export-spec.js +110 -0
  48. package/dist/tools/export-spec.js.map +1 -0
  49. package/dist/tools/init-project/handler.d.ts.map +1 -1
  50. package/dist/tools/init-project/handler.js +11 -1
  51. package/dist/tools/init-project/handler.js.map +1 -1
  52. package/dist/tools/init-project/result-builder.d.ts.map +1 -1
  53. package/dist/tools/init-project/result-builder.js +1 -0
  54. package/dist/tools/init-project/result-builder.js.map +1 -1
  55. package/dist/tools/register-export-tools.d.ts +3 -0
  56. package/dist/tools/register-export-tools.d.ts.map +1 -0
  57. package/dist/tools/register-export-tools.js +21 -0
  58. package/dist/tools/register-export-tools.js.map +1 -0
  59. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  60. package/dist/tools/register-spec-tools/core-spec-tools.js +4 -1
  61. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  62. package/dist/tools/reverse-engineer/handler.d.ts.map +1 -1
  63. package/dist/tools/reverse-engineer/handler.js +156 -128
  64. package/dist/tools/reverse-engineer/handler.js.map +1 -1
  65. package/dist/tools/update-status-actions.d.ts +14 -0
  66. package/dist/tools/update-status-actions.d.ts.map +1 -0
  67. package/dist/tools/update-status-actions.js +91 -0
  68. package/dist/tools/update-status-actions.js.map +1 -0
  69. package/dist/tools/update-status.d.ts.map +1 -1
  70. package/dist/tools/update-status.js +36 -89
  71. package/dist/tools/update-status.js.map +1 -1
  72. package/dist/tools/validate.d.ts.map +1 -1
  73. package/dist/tools/validate.js +34 -1
  74. package/dist/tools/validate.js.map +1 -1
  75. package/dist/transports/http-transport.d.ts +7 -0
  76. package/dist/transports/http-transport.d.ts.map +1 -0
  77. package/dist/transports/http-transport.js +170 -0
  78. package/dist/transports/http-transport.js.map +1 -0
  79. package/dist/transports/index.d.ts +4 -0
  80. package/dist/transports/index.d.ts.map +1 -0
  81. package/dist/transports/index.js +4 -0
  82. package/dist/transports/index.js.map +1 -0
  83. package/dist/transports/transport-factory.d.ts +5 -0
  84. package/dist/transports/transport-factory.d.ts.map +1 -0
  85. package/dist/transports/transport-factory.js +48 -0
  86. package/dist/transports/transport-factory.js.map +1 -0
  87. package/dist/types/estimation.d.ts +1 -1
  88. package/dist/types/estimation.d.ts.map +1 -1
  89. package/dist/types/export.d.ts +24 -0
  90. package/dist/types/export.d.ts.map +1 -0
  91. package/dist/types/export.js +3 -0
  92. package/dist/types/export.js.map +1 -0
  93. package/dist/types/index.d.ts +3 -0
  94. package/dist/types/index.d.ts.map +1 -1
  95. package/dist/types/index.js +3 -0
  96. package/dist/types/index.js.map +1 -1
  97. package/dist/types/project/planu-config.d.ts +4 -0
  98. package/dist/types/project/planu-config.d.ts.map +1 -1
  99. package/dist/types/reverse-engineer.d.ts +90 -0
  100. package/dist/types/reverse-engineer.d.ts.map +1 -0
  101. package/dist/types/reverse-engineer.js +3 -0
  102. package/dist/types/reverse-engineer.js.map +1 -0
  103. package/dist/types/transport.d.ts +14 -0
  104. package/dist/types/transport.d.ts.map +1 -0
  105. package/dist/types/transport.js +2 -0
  106. package/dist/types/transport.js.map +1 -0
  107. package/package.json +11 -2
  108. package/src/config/license-plans.json +2 -1
@@ -123,7 +123,8 @@
123
123
  "generate_changelog",
124
124
  "validate_team_results",
125
125
  "audit_claude_config",
126
- "generate_docs_site"
126
+ "generate_docs_site",
127
+ "export_spec"
127
128
  ],
128
129
  "alwaysAllowed": [
129
130
  "activate_license",
@@ -0,0 +1,3 @@
1
+ import type { ApiRoute } from '../../types/reverse-engineer.js';
2
+ export declare function detectApiRoutes(rootDir: string): ApiRoute[];
3
+ //# sourceMappingURL=api-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-detector.d.ts","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/api-detector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,iCAAiC,CAAC;AA4I9E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA8C3D"}
@@ -0,0 +1,170 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const ROUTE_PATTERNS = [
4
+ // Express/Koa/Hono: app.get('/path', handler) or router.post(...)
5
+ {
6
+ regex: /(?:app|router|server)\.(get|post|put|patch|delete|head|options|all)\s*\(\s*['"`]([^'"`]+)['"`](?:\s*,\s*(\w+))?/gi,
7
+ methodGroup: 1,
8
+ pathGroup: 2,
9
+ handlerGroup: 3,
10
+ },
11
+ // Fastify: fastify.get('/path', opts, handler)
12
+ {
13
+ regex: /fastify\.(get|post|put|patch|delete|head|options)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
14
+ methodGroup: 1,
15
+ pathGroup: 2,
16
+ },
17
+ // Next.js App Router: export async function GET/POST/PUT/DELETE
18
+ {
19
+ regex: /export\s+(?:async\s+)?function\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s*\(/gi,
20
+ methodGroup: 1,
21
+ pathGroup: -1, // derived from file path
22
+ },
23
+ // Django: path('url/', view)
24
+ {
25
+ regex: /path\s*\(\s*['"]([^'"]+)['"](?:\s*,\s*(\w+))?/gi,
26
+ methodGroup: -1,
27
+ pathGroup: 1,
28
+ handlerGroup: 2,
29
+ defaultMethod: 'ALL',
30
+ },
31
+ // Flask: @app.route('/path', methods=['GET'])
32
+ {
33
+ regex: /@(?:app|bp|blueprint)\.route\s*\(\s*['"]([^'"]+)['"]\s*(?:,\s*methods\s*=\s*\[['"](\w+)['"])?/gi,
34
+ methodGroup: 2,
35
+ pathGroup: 1,
36
+ },
37
+ // Go net/http: http.HandleFunc("/path", handler)
38
+ {
39
+ regex: /http\.(?:HandleFunc|Handle)\s*\(\s*['"]([^'"]+)['"](?:\s*,\s*(\w+))?/gi,
40
+ methodGroup: -1,
41
+ pathGroup: 1,
42
+ handlerGroup: 2,
43
+ defaultMethod: 'ALL',
44
+ },
45
+ // Gin: r.GET("/path", handler)
46
+ {
47
+ regex: /(?:r|g|router|group)\.(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s*\(\s*['"]([^'"]+)['"](?:\s*,\s*(\w+))?/gi,
48
+ methodGroup: 1,
49
+ pathGroup: 2,
50
+ handlerGroup: 3,
51
+ },
52
+ // Spring Boot: @GetMapping("/path"), @RequestMapping
53
+ {
54
+ regex: /@(Get|Post|Put|Patch|Delete|Request)Mapping\s*\(\s*(?:value\s*=\s*)?['"]([^'"]+)['"]/gi,
55
+ methodGroup: 1,
56
+ pathGroup: 2,
57
+ },
58
+ ];
59
+ const SOURCE_EXTENSIONS = new Set([
60
+ '.ts',
61
+ '.tsx',
62
+ '.js',
63
+ '.jsx',
64
+ '.mjs',
65
+ '.cjs',
66
+ '.py',
67
+ '.go',
68
+ '.java',
69
+ '.kt',
70
+ '.rb',
71
+ ]);
72
+ const IGNORE_DIRS = new Set([
73
+ 'node_modules',
74
+ '.git',
75
+ 'dist',
76
+ 'build',
77
+ 'out',
78
+ '.next',
79
+ '.nuxt',
80
+ 'coverage',
81
+ 'vendor',
82
+ '__pycache__',
83
+ ]);
84
+ function collectSourceFiles(dir) {
85
+ const results = [];
86
+ const queue = [dir];
87
+ while (queue.length > 0) {
88
+ const current = queue.pop();
89
+ if (!current) {
90
+ continue;
91
+ }
92
+ let entries;
93
+ try {
94
+ entries = fs.readdirSync(current, { withFileTypes: true });
95
+ }
96
+ catch {
97
+ continue;
98
+ }
99
+ for (const entry of entries) {
100
+ if (IGNORE_DIRS.has(entry.name)) {
101
+ continue;
102
+ }
103
+ const full = path.join(current, entry.name);
104
+ if (entry.isDirectory()) {
105
+ queue.push(full);
106
+ }
107
+ else if (entry.isFile() && SOURCE_EXTENSIONS.has(path.extname(entry.name))) {
108
+ results.push(full);
109
+ }
110
+ }
111
+ }
112
+ return results;
113
+ }
114
+ function extractResource(routePath) {
115
+ const segments = routePath.replace(/^\//, '').split('/');
116
+ const first = segments[0] ?? '';
117
+ // Strip params like :id or {id}
118
+ return first.replace(/[:{].*$/, '') || 'root';
119
+ }
120
+ function normalizeMethod(raw) {
121
+ const upper = raw.toUpperCase();
122
+ if (upper === 'REQUEST') {
123
+ return 'ALL';
124
+ }
125
+ return upper;
126
+ }
127
+ function derivePathFromFile(filePath, rootDir) {
128
+ // Next.js convention: app/api/users/route.ts -> /api/users
129
+ const rel = path.relative(rootDir, filePath);
130
+ const dir = path.dirname(rel);
131
+ return '/' + dir.replace(/\\/g, '/');
132
+ }
133
+ export function detectApiRoutes(rootDir) {
134
+ const files = collectSourceFiles(rootDir);
135
+ const routes = [];
136
+ for (const file of files) {
137
+ let content;
138
+ try {
139
+ content = fs.readFileSync(file, 'utf-8');
140
+ }
141
+ catch {
142
+ continue;
143
+ }
144
+ for (const pattern of ROUTE_PATTERNS) {
145
+ const regex = new RegExp(pattern.regex.source, pattern.regex.flags);
146
+ let match;
147
+ while ((match = regex.exec(content)) !== null) {
148
+ const methodRaw = pattern.methodGroup === -1
149
+ ? (pattern.defaultMethod ?? 'ALL')
150
+ : (match[pattern.methodGroup] ?? 'ALL');
151
+ const routePath = pattern.pathGroup === -1
152
+ ? derivePathFromFile(file, rootDir)
153
+ : (match[pattern.pathGroup] ?? '/');
154
+ const handler = pattern.handlerGroup
155
+ ? (match[pattern.handlerGroup] ?? 'anonymous')
156
+ : 'anonymous';
157
+ routes.push({
158
+ method: normalizeMethod(methodRaw),
159
+ path: routePath,
160
+ handler,
161
+ resource: extractResource(routePath),
162
+ });
163
+ }
164
+ }
165
+ }
166
+ return routes.sort((a, b) => a.resource.localeCompare(b.resource) ||
167
+ a.path.localeCompare(b.path) ||
168
+ a.method.localeCompare(b.method));
169
+ }
170
+ //# sourceMappingURL=api-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-detector.js","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/api-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ComplexityMetric } from '../../types/reverse-engineer.js';
2
+ export declare function analyzeComplexity(rootDir: string): ComplexityMetric[];
3
+ //# sourceMappingURL=complexity-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/complexity-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,iCAAiC,CAAC;AA+MzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAyCrE"}
@@ -0,0 +1,230 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const SOURCE_EXTENSIONS = new Set([
4
+ '.ts',
5
+ '.tsx',
6
+ '.js',
7
+ '.jsx',
8
+ '.mjs',
9
+ '.cjs',
10
+ '.py',
11
+ '.go',
12
+ '.java',
13
+ '.kt',
14
+ '.rs',
15
+ '.rb',
16
+ ]);
17
+ const IGNORE_DIRS = new Set([
18
+ 'node_modules',
19
+ '.git',
20
+ 'dist',
21
+ 'build',
22
+ 'out',
23
+ '.next',
24
+ '.nuxt',
25
+ 'coverage',
26
+ 'vendor',
27
+ '__pycache__',
28
+ ]);
29
+ // Patterns that increase cyclomatic complexity
30
+ const BRANCH_PATTERNS = [
31
+ /\bif\s*\(/g,
32
+ /\belse\s+if\s*\(/g,
33
+ /\belse\s*\{/g,
34
+ /\bswitch\s*\(/g,
35
+ /\bcase\s+/g,
36
+ /\bfor\s*\(/g,
37
+ /\bfor\s+\w+/g, // Go/Python for
38
+ /\bwhile\s*\(/g,
39
+ /\bcatch\s*\(/g,
40
+ /\?\?/g, // nullish coalescing
41
+ /&&/g,
42
+ /\|\|/g,
43
+ /\?\s*[^:?]/g, // ternary (approximate)
44
+ ];
45
+ // Function declaration patterns
46
+ const FUNCTION_PATTERNS = [
47
+ // JS/TS: function name(, async function name(, export function
48
+ /(?:export\s+)?(?:async\s+)?function\s+\w+\s*\(/g,
49
+ // Arrow functions assigned: const name = (...) =>
50
+ /(?:const|let|var)\s+\w+\s*=\s*(?:async\s+)?\([^)]*\)\s*=>/g,
51
+ // Method definitions: name( or async name(
52
+ /^\s+(?:async\s+)?(?:static\s+)?(?:get\s+|set\s+)?\w+\s*\([^)]*\)\s*(?::\s*\w[^{]*)?{/gm,
53
+ // Python: def name(
54
+ /\bdef\s+\w+\s*\(/g,
55
+ // Go: func name(
56
+ /\bfunc\s+(?:\([^)]*\)\s*)?\w+\s*\(/g,
57
+ // Java: public/private/protected ... name(
58
+ /(?:public|private|protected)\s+(?:static\s+)?[\w<>[\]]+\s+\w+\s*\(/g,
59
+ ];
60
+ function collectSourceFiles(dir) {
61
+ const results = [];
62
+ const queue = [dir];
63
+ while (queue.length > 0) {
64
+ const current = queue.pop();
65
+ if (!current) {
66
+ continue;
67
+ }
68
+ let entries;
69
+ try {
70
+ entries = fs.readdirSync(current, { withFileTypes: true });
71
+ }
72
+ catch {
73
+ continue;
74
+ }
75
+ for (const entry of entries) {
76
+ if (IGNORE_DIRS.has(entry.name)) {
77
+ continue;
78
+ }
79
+ const full = path.join(current, entry.name);
80
+ if (entry.isDirectory()) {
81
+ queue.push(full);
82
+ }
83
+ else if (entry.isFile() && SOURCE_EXTENSIONS.has(path.extname(entry.name))) {
84
+ results.push(full);
85
+ }
86
+ }
87
+ }
88
+ return results;
89
+ }
90
+ function countBranches(content) {
91
+ let count = 0;
92
+ for (const pattern of BRANCH_PATTERNS) {
93
+ const regex = new RegExp(pattern.source, pattern.flags);
94
+ while (regex.exec(content) !== null) {
95
+ count++;
96
+ }
97
+ }
98
+ return count + 1; // base complexity of 1
99
+ }
100
+ function extractFunctions(content) {
101
+ const lines = content.split('\n');
102
+ const functions = [];
103
+ for (const pattern of FUNCTION_PATTERNS) {
104
+ const regex = new RegExp(pattern.source, pattern.flags);
105
+ let match;
106
+ while ((match = regex.exec(content)) !== null) {
107
+ const startOffset = match.index;
108
+ const startLine = content.substring(0, startOffset).split('\n').length;
109
+ const name = extractFunctionName(match[0]);
110
+ // Estimate function end by counting braces
111
+ const endLine = findFunctionEnd(lines, startLine - 1);
112
+ const funcLines = endLine - startLine + 1;
113
+ const funcContent = lines.slice(startLine - 1, endLine).join('\n');
114
+ const complexity = countBranches(funcContent);
115
+ functions.push({
116
+ name,
117
+ startLine,
118
+ endLine,
119
+ lines: funcLines,
120
+ complexity,
121
+ });
122
+ }
123
+ }
124
+ // Deduplicate overlapping detections (keep longest)
125
+ return deduplicateFunctions(functions);
126
+ }
127
+ function extractFunctionName(declaration) {
128
+ const patterns = [
129
+ /function\s+(\w+)/,
130
+ /(?:const|let|var)\s+(\w+)/,
131
+ /def\s+(\w+)/,
132
+ /func\s+(?:\([^)]*\)\s*)?(\w+)/,
133
+ /\s(\w+)\s*\(/,
134
+ ];
135
+ for (const p of patterns) {
136
+ const m = declaration.match(p);
137
+ if (m?.[1]) {
138
+ return m[1];
139
+ }
140
+ }
141
+ return 'anonymous';
142
+ }
143
+ function findFunctionEnd(lines, startIdx) {
144
+ let braceCount = 0;
145
+ let foundOpen = false;
146
+ for (let i = startIdx; i < lines.length; i++) {
147
+ const line = lines[i] ?? '';
148
+ for (const ch of line) {
149
+ if (ch === '{') {
150
+ braceCount++;
151
+ foundOpen = true;
152
+ }
153
+ else if (ch === '}') {
154
+ braceCount--;
155
+ }
156
+ }
157
+ if (foundOpen && braceCount <= 0) {
158
+ return i + 1;
159
+ }
160
+ }
161
+ // For Python/other non-brace languages, estimate ~20 lines
162
+ return Math.min(startIdx + 20, lines.length);
163
+ }
164
+ function deduplicateFunctions(functions) {
165
+ if (functions.length === 0) {
166
+ return [];
167
+ }
168
+ // Sort by start line
169
+ const sorted = [...functions].sort((a, b) => a.startLine - b.startLine);
170
+ const first = sorted[0];
171
+ if (!first) {
172
+ return [];
173
+ }
174
+ const result = [first];
175
+ for (let i = 1; i < sorted.length; i++) {
176
+ const prev = result[result.length - 1];
177
+ const curr = sorted[i];
178
+ if (!prev || !curr) {
179
+ continue;
180
+ }
181
+ // If overlapping, keep the one with more lines
182
+ if (curr.startLine <= prev.endLine) {
183
+ if (curr.lines > prev.lines) {
184
+ result[result.length - 1] = curr;
185
+ }
186
+ }
187
+ else {
188
+ result.push(curr);
189
+ }
190
+ }
191
+ return result;
192
+ }
193
+ export function analyzeComplexity(rootDir) {
194
+ const files = collectSourceFiles(rootDir);
195
+ const metrics = [];
196
+ for (const file of files) {
197
+ let content;
198
+ try {
199
+ content = fs.readFileSync(file, 'utf-8');
200
+ }
201
+ catch {
202
+ continue;
203
+ }
204
+ const lines = content.split('\n');
205
+ const lineCount = lines.length;
206
+ const functions = extractFunctions(content);
207
+ const functionCount = functions.length;
208
+ const maxFunctionLength = functions.reduce((max, f) => Math.max(max, f.lines), 0);
209
+ const avgComplexity = functionCount > 0
210
+ ? Math.round((functions.reduce((sum, f) => sum + f.complexity, 0) / functionCount) * 100) /
211
+ 100
212
+ : 0;
213
+ // Flag hotspots: functions > 80 lines or > 15 complexity
214
+ const hotspots = functions
215
+ .filter((f) => f.lines > 80 || f.complexity > 15)
216
+ .map((f) => ({ name: f.name, complexity: f.complexity, lines: f.lines }))
217
+ .sort((a, b) => b.complexity - a.complexity);
218
+ metrics.push({
219
+ file: path.relative(rootDir, file),
220
+ lineCount,
221
+ functionCount,
222
+ maxFunctionLength,
223
+ avgComplexity,
224
+ hotspots,
225
+ });
226
+ }
227
+ // Return top 10 by complexity
228
+ return metrics.sort((a, b) => b.avgComplexity - a.avgComplexity).slice(0, 10);
229
+ }
230
+ //# sourceMappingURL=complexity-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-analyzer.js","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/complexity-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ConfigReport } from '../../types/reverse-engineer.js';
2
+ export declare function analyzeConfig(rootDir: string): ConfigReport;
3
+ //# sourceMappingURL=config-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/config-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AA+NpE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CA4C3D"}