@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
@@ -0,0 +1,247 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const ENV_VAR_PATTERNS = [
4
+ // JS/TS: process.env.VAR_NAME
5
+ /process\.env\.([A-Z_][A-Z0-9_]*)/g,
6
+ // Python: os.environ['VAR'] or os.environ.get('VAR')
7
+ /os\.environ(?:\.get)?\s*\(\s*['"]([A-Z_][A-Z0-9_]*)['"]/g,
8
+ // Python: os.getenv('VAR')
9
+ /os\.getenv\s*\(\s*['"]([A-Z_][A-Z0-9_]*)['"]/g,
10
+ // Go: os.Getenv("VAR")
11
+ /os\.Getenv\s*\(\s*['"]([A-Z_][A-Z0-9_]*)['"]/g,
12
+ // Rust: std::env::var("VAR")
13
+ /env::var\s*\(\s*['"]([A-Z_][A-Z0-9_]*)['"]/g,
14
+ ];
15
+ const FEATURE_FLAG_PATTERNS = [
16
+ // FEATURE_* env vars
17
+ /\b(FEATURE_[A-Z0-9_]+)\b/g,
18
+ // FF_* env vars
19
+ /\b(FF_[A-Z0-9_]+)\b/g,
20
+ // LaunchDarkly
21
+ /ldClient\.(?:variation|boolVariation|stringVariation)\s*\(\s*['"]([^'"]+)['"]/g,
22
+ // Unleash
23
+ /unleash\.isEnabled\s*\(\s*['"]([^'"]+)['"]/g,
24
+ // Generic: isFeatureEnabled('name')
25
+ /isFeatureEnabled\s*\(\s*['"]([^'"]+)['"]/g,
26
+ // flagsmith
27
+ /flagsmith\.hasFeature\s*\(\s*['"]([^'"]+)['"]/g,
28
+ ];
29
+ const INFRA_INDICATORS = {
30
+ Dockerfile: 'Docker',
31
+ 'docker-compose.yml': 'Docker Compose',
32
+ 'docker-compose.yaml': 'Docker Compose',
33
+ kubernetes: 'Kubernetes',
34
+ k8s: 'Kubernetes',
35
+ helm: 'Helm',
36
+ terraform: 'Terraform',
37
+ '.terraform': 'Terraform',
38
+ pulumi: 'Pulumi',
39
+ 'serverless.yml': 'Serverless Framework',
40
+ 'serverless.yaml': 'Serverless Framework',
41
+ 'vercel.json': 'Vercel',
42
+ 'netlify.toml': 'Netlify',
43
+ 'fly.toml': 'Fly.io',
44
+ 'render.yaml': 'Render',
45
+ 'railway.json': 'Railway',
46
+ Procfile: 'Heroku',
47
+ 'app.yaml': 'Google App Engine',
48
+ '.github/workflows': 'GitHub Actions',
49
+ '.gitlab-ci.yml': 'GitLab CI',
50
+ Jenkinsfile: 'Jenkins',
51
+ '.circleci': 'CircleCI',
52
+ '.travis.yml': 'Travis CI',
53
+ 'bitbucket-pipelines.yml': 'Bitbucket Pipelines',
54
+ 'azure-pipelines.yml': 'Azure Pipelines',
55
+ 'cloudbuild.yaml': 'Google Cloud Build',
56
+ };
57
+ const IGNORE_DIRS = new Set([
58
+ 'node_modules',
59
+ '.git',
60
+ 'dist',
61
+ 'build',
62
+ 'out',
63
+ '.next',
64
+ '.nuxt',
65
+ 'coverage',
66
+ 'vendor',
67
+ '__pycache__',
68
+ ]);
69
+ const SOURCE_EXTENSIONS = new Set([
70
+ '.ts',
71
+ '.tsx',
72
+ '.js',
73
+ '.jsx',
74
+ '.mjs',
75
+ '.cjs',
76
+ '.py',
77
+ '.go',
78
+ '.java',
79
+ '.kt',
80
+ '.rs',
81
+ '.rb',
82
+ ]);
83
+ function collectAllFiles(dir) {
84
+ const results = [];
85
+ const queue = [dir];
86
+ while (queue.length > 0) {
87
+ const current = queue.pop();
88
+ if (!current) {
89
+ continue;
90
+ }
91
+ let entries;
92
+ try {
93
+ entries = fs.readdirSync(current, { withFileTypes: true });
94
+ }
95
+ catch {
96
+ continue;
97
+ }
98
+ for (const entry of entries) {
99
+ if (IGNORE_DIRS.has(entry.name)) {
100
+ continue;
101
+ }
102
+ const full = path.join(current, entry.name);
103
+ if (entry.isDirectory()) {
104
+ queue.push(full);
105
+ }
106
+ else if (entry.isFile()) {
107
+ results.push(full);
108
+ }
109
+ }
110
+ }
111
+ return results;
112
+ }
113
+ function isConfigFile(filePath) {
114
+ const basename = path.basename(filePath);
115
+ const ext = path.extname(filePath);
116
+ if (basename.startsWith('.env')) {
117
+ return true;
118
+ }
119
+ if (basename.includes('.config.')) {
120
+ return true;
121
+ }
122
+ if (['.conf', '.cfg', '.ini', '.toml', '.yaml', '.yml'].includes(ext)) {
123
+ return true;
124
+ }
125
+ if (['Dockerfile', 'Makefile', 'Procfile', 'Jenkinsfile'].includes(basename)) {
126
+ return true;
127
+ }
128
+ if (basename === 'docker-compose.yml' || basename === 'docker-compose.yaml') {
129
+ return true;
130
+ }
131
+ if (basename.endsWith('.json') &&
132
+ (basename.startsWith('tsconfig') || basename === 'package.json')) {
133
+ return true;
134
+ }
135
+ if (basename === 'go.mod' || basename === 'Cargo.toml') {
136
+ return true;
137
+ }
138
+ if (basename === 'pyproject.toml' ||
139
+ basename.startsWith('build.gradle') ||
140
+ basename === 'pom.xml') {
141
+ return true;
142
+ }
143
+ return false;
144
+ }
145
+ function extractEnvVarsFromEnvFile(filePath) {
146
+ const vars = [];
147
+ try {
148
+ const content = fs.readFileSync(filePath, 'utf-8');
149
+ const lines = content.split('\n');
150
+ for (const line of lines) {
151
+ const trimmed = line.trim();
152
+ if (trimmed.startsWith('#') || !trimmed) {
153
+ continue;
154
+ }
155
+ const match = /^([A-Z_][A-Z0-9_]*)\s*=/.exec(trimmed);
156
+ if (match?.[1]) {
157
+ vars.push(match[1]);
158
+ }
159
+ }
160
+ }
161
+ catch {
162
+ // ignore
163
+ }
164
+ return vars;
165
+ }
166
+ function extractEnvVarsFromSource(content) {
167
+ const vars = [];
168
+ for (const pattern of ENV_VAR_PATTERNS) {
169
+ const regex = new RegExp(pattern.source, pattern.flags);
170
+ let match;
171
+ while ((match = regex.exec(content)) !== null) {
172
+ const v = match[1];
173
+ if (v) {
174
+ vars.push(v);
175
+ }
176
+ }
177
+ }
178
+ return vars;
179
+ }
180
+ function extractFeatureFlags(content) {
181
+ const flags = [];
182
+ for (const pattern of FEATURE_FLAG_PATTERNS) {
183
+ const regex = new RegExp(pattern.source, pattern.flags);
184
+ let match;
185
+ while ((match = regex.exec(content)) !== null) {
186
+ const f = match[1];
187
+ if (f) {
188
+ flags.push(f);
189
+ }
190
+ }
191
+ }
192
+ return flags;
193
+ }
194
+ function detectInfrastructure(files, rootDir) {
195
+ const detected = new Set();
196
+ for (const file of files) {
197
+ const rel = path.relative(rootDir, file);
198
+ const basename = path.basename(file);
199
+ for (const [indicator, name] of Object.entries(INFRA_INDICATORS)) {
200
+ if (basename === indicator || rel.includes(indicator)) {
201
+ detected.add(name);
202
+ }
203
+ }
204
+ }
205
+ return [...detected].sort();
206
+ }
207
+ export function analyzeConfig(rootDir) {
208
+ const allFiles = collectAllFiles(rootDir);
209
+ const configFiles = [];
210
+ const envVarSet = new Set();
211
+ const flagSet = new Set();
212
+ for (const file of allFiles) {
213
+ const rel = path.relative(rootDir, file);
214
+ if (isConfigFile(file)) {
215
+ configFiles.push(rel);
216
+ }
217
+ // Extract env vars from .env files
218
+ if (path.basename(file).startsWith('.env')) {
219
+ for (const v of extractEnvVarsFromEnvFile(file)) {
220
+ envVarSet.add(v);
221
+ }
222
+ }
223
+ // Extract env vars and flags from source files
224
+ if (SOURCE_EXTENSIONS.has(path.extname(file))) {
225
+ try {
226
+ const content = fs.readFileSync(file, 'utf-8');
227
+ for (const v of extractEnvVarsFromSource(content)) {
228
+ envVarSet.add(v);
229
+ }
230
+ for (const f of extractFeatureFlags(content)) {
231
+ flagSet.add(f);
232
+ }
233
+ }
234
+ catch {
235
+ // ignore
236
+ }
237
+ }
238
+ }
239
+ const infrastructure = detectInfrastructure(allFiles, rootDir);
240
+ return {
241
+ configFiles: configFiles.sort(),
242
+ envVars: [...envVarSet].sort(),
243
+ featureFlags: [...flagSet].sort(),
244
+ infrastructure,
245
+ };
246
+ }
247
+ //# sourceMappingURL=config-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-analyzer.js","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/config-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DependencyGraph } from '../../types/reverse-engineer.js';
2
+ export declare function buildDependencyGraph(rootDir: string): DependencyGraph;
3
+ //# sourceMappingURL=dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/dependency-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,iCAAiC,CAAC;AA2JvF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CA+DrE"}
@@ -0,0 +1,197 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const IMPORT_PATTERNS = [
4
+ // ES import: import ... from './foo'
5
+ /(?:import\s+(?:[\s\S]*?)\s+from\s+['"]([^'"]+)['"])/g,
6
+ // ES dynamic import: import('./foo')
7
+ /import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
8
+ // CommonJS require: require('./foo')
9
+ /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
10
+ ];
11
+ const SOURCE_EXTENSIONS = new Set([
12
+ '.ts',
13
+ '.tsx',
14
+ '.js',
15
+ '.jsx',
16
+ '.mjs',
17
+ '.cjs',
18
+ '.py',
19
+ '.go',
20
+ '.java',
21
+ '.kt',
22
+ '.rs',
23
+ '.rb',
24
+ ]);
25
+ const IGNORE_DIRS = new Set([
26
+ 'node_modules',
27
+ '.git',
28
+ 'dist',
29
+ 'build',
30
+ 'out',
31
+ '.next',
32
+ '.nuxt',
33
+ 'coverage',
34
+ 'vendor',
35
+ '__pycache__',
36
+ ]);
37
+ const HUB_THRESHOLD = 10;
38
+ function collectSourceFiles(dir) {
39
+ const results = [];
40
+ const queue = [dir];
41
+ while (queue.length > 0) {
42
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
43
+ const current = queue.pop();
44
+ let entries;
45
+ try {
46
+ entries = fs.readdirSync(current, { withFileTypes: true });
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ for (const entry of entries) {
52
+ if (IGNORE_DIRS.has(entry.name)) {
53
+ continue;
54
+ }
55
+ const full = path.join(current, entry.name);
56
+ if (entry.isDirectory()) {
57
+ queue.push(full);
58
+ }
59
+ else if (entry.isFile() && SOURCE_EXTENSIONS.has(path.extname(entry.name))) {
60
+ results.push(full);
61
+ }
62
+ }
63
+ }
64
+ return results;
65
+ }
66
+ function extractImports(content) {
67
+ const imports = [];
68
+ for (const pattern of IMPORT_PATTERNS) {
69
+ const regex = new RegExp(pattern.source, pattern.flags);
70
+ let match;
71
+ while ((match = regex.exec(content)) !== null) {
72
+ const spec = match[1] ?? '';
73
+ // Only internal (relative) imports
74
+ if (spec.startsWith('.') || spec.startsWith('/')) {
75
+ imports.push(spec);
76
+ }
77
+ }
78
+ }
79
+ return imports;
80
+ }
81
+ function resolveImport(fromFile, importSpec, allFiles) {
82
+ const dir = path.dirname(fromFile);
83
+ const resolved = path.resolve(dir, importSpec);
84
+ // Try exact match
85
+ if (allFiles.has(resolved)) {
86
+ return resolved;
87
+ }
88
+ // Try with extensions
89
+ for (const ext of SOURCE_EXTENSIONS) {
90
+ const withExt = resolved.replace(/\.js$/, '') + ext;
91
+ if (allFiles.has(withExt)) {
92
+ return withExt;
93
+ }
94
+ // Without .js replacement
95
+ if (allFiles.has(resolved + ext)) {
96
+ return resolved + ext;
97
+ }
98
+ }
99
+ // Try index files
100
+ for (const ext of SOURCE_EXTENSIONS) {
101
+ const indexFile = path.join(resolved, `index${ext}`);
102
+ if (allFiles.has(indexFile)) {
103
+ return indexFile;
104
+ }
105
+ }
106
+ return undefined;
107
+ }
108
+ function detectCycles(adjacency) {
109
+ const cycles = [];
110
+ const visited = new Set();
111
+ const inStack = new Set();
112
+ const stack = [];
113
+ function dfs(node) {
114
+ if (inStack.has(node)) {
115
+ const cycleStart = stack.indexOf(node);
116
+ /* v8 ignore next 3 */
117
+ if (cycleStart !== -1) {
118
+ cycles.push(stack.slice(cycleStart));
119
+ }
120
+ return;
121
+ }
122
+ if (visited.has(node)) {
123
+ return;
124
+ }
125
+ visited.add(node);
126
+ inStack.add(node);
127
+ stack.push(node);
128
+ for (const neighbor of /* v8 ignore next */ adjacency.get(node) ?? []) {
129
+ dfs(neighbor);
130
+ }
131
+ stack.pop();
132
+ inStack.delete(node);
133
+ }
134
+ for (const node of adjacency.keys()) {
135
+ dfs(node);
136
+ }
137
+ return cycles;
138
+ }
139
+ export function buildDependencyGraph(rootDir) {
140
+ const files = collectSourceFiles(rootDir);
141
+ const fileSet = new Set(files);
142
+ const adjacency = new Map();
143
+ const fanInCount = new Map();
144
+ // Initialize all nodes
145
+ for (const file of files) {
146
+ const rel = path.relative(rootDir, file);
147
+ adjacency.set(rel, []);
148
+ fanInCount.set(rel, 0);
149
+ }
150
+ // Build adjacency
151
+ for (const file of files) {
152
+ const rel = path.relative(rootDir, file);
153
+ let content;
154
+ try {
155
+ content = fs.readFileSync(file, 'utf-8');
156
+ }
157
+ catch {
158
+ continue;
159
+ }
160
+ const imports = extractImports(content);
161
+ const resolvedImports = [];
162
+ for (const imp of imports) {
163
+ const resolved = resolveImport(file, imp, fileSet);
164
+ if (resolved) {
165
+ const resolvedRel = path.relative(rootDir, resolved);
166
+ if (resolvedRel !== rel) {
167
+ resolvedImports.push(resolvedRel);
168
+ fanInCount.set(resolvedRel, /* v8 ignore next */ (fanInCount.get(resolvedRel) ?? 0) + 1);
169
+ }
170
+ }
171
+ }
172
+ adjacency.set(rel, resolvedImports);
173
+ }
174
+ // Build nodes
175
+ const nodes = [];
176
+ for (const [file, imports] of adjacency) {
177
+ nodes.push({
178
+ file,
179
+ imports,
180
+ fanIn: /* v8 ignore next */ fanInCount.get(file) ?? 0,
181
+ fanOut: imports.length,
182
+ });
183
+ }
184
+ // Detect cycles
185
+ const cycles = detectCycles(adjacency);
186
+ // Identify hubs and orphans
187
+ const hubs = nodes
188
+ .filter((n) => n.fanIn > HUB_THRESHOLD)
189
+ .map((n) => n.file)
190
+ .sort();
191
+ const orphans = nodes
192
+ .filter((n) => n.fanIn === 0 && n.fanOut === 0)
193
+ .map((n) => n.file)
194
+ .sort();
195
+ return { nodes, cycles, hubs, orphans };
196
+ }
197
+ //# sourceMappingURL=dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/dependency-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { analyzeTestCoverage, isTestFile } from './test-analyzer.js';
2
+ export { buildDependencyGraph } from './dependency-graph.js';
3
+ export { detectApiRoutes } from './api-detector.js';
4
+ export { analyzeComplexity } from './complexity-analyzer.js';
5
+ export { analyzeConfig } from './config-analyzer.js';
6
+ export { runDeepAnalysis, enrichSpecFromAnalysis, generateAnalysisSummary, } from './orchestrator.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { analyzeTestCoverage, isTestFile } from './test-analyzer.js';
2
+ export { buildDependencyGraph } from './dependency-graph.js';
3
+ export { detectApiRoutes } from './api-detector.js';
4
+ export { analyzeComplexity } from './complexity-analyzer.js';
5
+ export { analyzeConfig } from './config-analyzer.js';
6
+ export { runDeepAnalysis, enrichSpecFromAnalysis, generateAnalysisSummary, } from './orchestrator.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AnalyzerOptions, DeepAnalysisResult, SpecEnrichment } from '../../types/reverse-engineer.js';
2
+ export declare function runDeepAnalysis(projectPath: string, options?: AnalyzerOptions): Promise<DeepAnalysisResult>;
3
+ export declare function enrichSpecFromAnalysis(result: DeepAnalysisResult): SpecEnrichment;
4
+ export declare function generateAnalysisSummary(result: DeepAnalysisResult): string;
5
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/engine/reverse-engineer/orchestrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAIlB,cAAc,EACf,MAAM,iCAAiC,CAAC;AAiBzC,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,kBAAkB,CAAC,CA4B7B;AAyED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAQjF;AAwBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA0E1E"}