@mrpatronz/nexusflow 0.1.12 → 0.2.1

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 (85) hide show
  1. package/dist/analyzers/detect-apis.d.ts.map +1 -1
  2. package/dist/analyzers/detect-apis.js +168 -39
  3. package/dist/analyzers/detect-apis.js.map +1 -1
  4. package/dist/analyzers/detect-deps.d.ts +26 -4
  5. package/dist/analyzers/detect-deps.d.ts.map +1 -1
  6. package/dist/analyzers/detect-deps.js +228 -66
  7. package/dist/analyzers/detect-deps.js.map +1 -1
  8. package/dist/analyzers/index.d.ts +1 -1
  9. package/dist/analyzers/index.d.ts.map +1 -1
  10. package/dist/analyzers/index.js +7 -3
  11. package/dist/analyzers/index.js.map +1 -1
  12. package/dist/analyzers/readme-summarizer.d.ts +3 -1
  13. package/dist/analyzers/readme-summarizer.d.ts.map +1 -1
  14. package/dist/analyzers/readme-summarizer.js +43 -19
  15. package/dist/analyzers/readme-summarizer.js.map +1 -1
  16. package/dist/analyzers/tech-stack.d.ts +2 -2
  17. package/dist/analyzers/tech-stack.d.ts.map +1 -1
  18. package/dist/analyzers/tech-stack.js +257 -232
  19. package/dist/analyzers/tech-stack.js.map +1 -1
  20. package/dist/commands/create.d.ts.map +1 -1
  21. package/dist/commands/create.js +15 -8
  22. package/dist/commands/create.js.map +1 -1
  23. package/dist/commands/sync.d.ts.map +1 -1
  24. package/dist/commands/sync.js +31 -0
  25. package/dist/commands/sync.js.map +1 -1
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +25 -0
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/graph.d.ts.map +1 -1
  30. package/dist/core/graph.js +1 -2
  31. package/dist/core/graph.js.map +1 -1
  32. package/dist/core/packer.d.ts +2 -1
  33. package/dist/core/packer.d.ts.map +1 -1
  34. package/dist/core/packer.js +36 -30
  35. package/dist/core/packer.js.map +1 -1
  36. package/dist/core/packer.test.js +4 -5
  37. package/dist/core/packer.test.js.map +1 -1
  38. package/dist/core/workspace.d.ts.map +1 -1
  39. package/dist/core/workspace.js +22 -12
  40. package/dist/core/workspace.js.map +1 -1
  41. package/dist/generators/base.d.ts.map +1 -1
  42. package/dist/generators/base.js +63 -31
  43. package/dist/generators/base.js.map +1 -1
  44. package/dist/generators/index.d.ts.map +1 -1
  45. package/dist/generators/index.js +17 -0
  46. package/dist/generators/index.js.map +1 -1
  47. package/dist/generators/map-generator.d.ts +15 -0
  48. package/dist/generators/map-generator.d.ts.map +1 -0
  49. package/dist/generators/map-generator.js +385 -0
  50. package/dist/generators/map-generator.js.map +1 -0
  51. package/dist/generators/map-generator.test.d.ts +2 -0
  52. package/dist/generators/map-generator.test.d.ts.map +1 -0
  53. package/dist/generators/map-generator.test.js +74 -0
  54. package/dist/generators/map-generator.test.js.map +1 -0
  55. package/dist/generators/plan-generator.d.ts +2 -0
  56. package/dist/generators/plan-generator.d.ts.map +1 -1
  57. package/dist/generators/plan-generator.js +104 -8
  58. package/dist/generators/plan-generator.js.map +1 -1
  59. package/dist/server.d.ts +0 -5
  60. package/dist/server.d.ts.map +1 -1
  61. package/dist/server.js +9 -6
  62. package/dist/server.js.map +1 -1
  63. package/dist/types.d.ts +18 -0
  64. package/dist/types.d.ts.map +1 -1
  65. package/package.json +2 -1
  66. package/src/analyzers/detect-apis.ts +192 -40
  67. package/src/analyzers/detect-deps.ts +246 -69
  68. package/src/analyzers/index.ts +7 -3
  69. package/src/analyzers/readme-summarizer.ts +48 -19
  70. package/src/analyzers/tech-stack.ts +222 -194
  71. package/src/commands/create.ts +16 -10
  72. package/src/commands/sync.ts +35 -0
  73. package/src/core/config.ts +25 -0
  74. package/src/core/graph.ts +1 -2
  75. package/src/core/packer.test.ts +4 -6
  76. package/src/core/packer.ts +42 -43
  77. package/src/core/workspace.ts +23 -13
  78. package/src/generators/base.ts +67 -30
  79. package/src/generators/index.ts +17 -0
  80. package/src/generators/map-generator.test.ts +81 -0
  81. package/src/generators/map-generator.ts +405 -0
  82. package/src/generators/plan-generator.ts +117 -7
  83. package/src/server.ts +9 -6
  84. package/src/types.ts +13 -0
  85. package/vitest.config.ts +13 -0
@@ -5,16 +5,7 @@
5
5
  */
6
6
  import * as fs from 'node:fs/promises';
7
7
  import * as path from 'node:path';
8
- /** Check if a file exists in a directory. */
9
- async function fileExists(dir, filename) {
10
- try {
11
- await fs.access(path.join(dir, filename));
12
- return true;
13
- }
14
- catch {
15
- return false;
16
- }
17
- }
8
+ import { globby } from 'globby';
18
9
  /** Safely read and parse a JSON file. Returns null on failure. */
19
10
  async function readJson(filePath) {
20
11
  try {
@@ -25,260 +16,294 @@ async function readJson(filePath) {
25
16
  return null;
26
17
  }
27
18
  }
28
- /** Check if any file matching a glob-like pattern exists. */
29
- async function hasFileWithExtension(dir, ext) {
30
- try {
31
- const entries = await fs.readdir(dir);
32
- return entries.some((e) => e.endsWith(ext));
33
- }
34
- catch {
35
- return false;
36
- }
37
- }
38
19
  /**
39
- * Detects the tech stack of a repository by inspecting its root directory
40
- * for manifest files, config files, and project structures.
20
+ * Detects the tech stack of a repository by recursively inspecting its
21
+ * contents for manifest files, config files, and project structures.
41
22
  *
42
23
  * @param repoPath - Absolute path to the repository root.
43
24
  * @returns A {@link TechStack} object describing the detected stack.
44
25
  */
45
26
  export async function detectTechStack(repoPath) {
46
- const languages = [];
47
- const frameworks = [];
48
- const buildTools = [];
49
- let projectType = 'other';
50
- // ── Node.js / JavaScript / TypeScript ──────────────────────────────
51
- const hasPackageJson = await fileExists(repoPath, 'package.json');
52
- if (hasPackageJson) {
53
- const pkg = await readJson(path.join(repoPath, 'package.json'));
54
- // Detect TypeScript vs JavaScript
55
- const hasTsConfig = await fileExists(repoPath, 'tsconfig.json');
56
- if (hasTsConfig) {
57
- languages.push('typescript');
58
- }
59
- else {
60
- languages.push('javascript');
61
- }
62
- if (pkg) {
63
- const allDeps = {
64
- ...pkg.dependencies,
65
- ...pkg.devDependencies,
66
- };
67
- // Frameworks
68
- if (allDeps['next']) {
69
- frameworks.push('nextjs');
70
- projectType = 'fullstack';
71
- }
72
- if (allDeps['react'] && !allDeps['next']) {
73
- frameworks.push('react');
74
- projectType = 'frontend';
75
- }
76
- if (allDeps['@angular/core']) {
77
- frameworks.push('angular');
78
- projectType = 'frontend';
79
- }
80
- if (allDeps['vue']) {
81
- frameworks.push('vue');
82
- projectType = 'frontend';
83
- }
84
- if (allDeps['svelte']) {
85
- frameworks.push('svelte');
86
- projectType = 'frontend';
87
- }
88
- if (allDeps['express']) {
89
- frameworks.push('express');
90
- projectType = 'backend';
27
+ const languages = new Set();
28
+ const frameworks = new Set();
29
+ const buildTools = new Set();
30
+ const projectTypes = new Set();
31
+ try {
32
+ const files = await globby([
33
+ '**/package.json',
34
+ '**/tsconfig.json',
35
+ '**/*.csproj',
36
+ '**/*.sln',
37
+ '**/requirements.txt',
38
+ '**/pyproject.toml',
39
+ '**/setup.py',
40
+ '**/go.mod',
41
+ '**/pom.xml',
42
+ '**/build.gradle',
43
+ '**/build.gradle.kts',
44
+ '**/Cargo.toml',
45
+ '**/Gemfile',
46
+ '**/composer.json',
47
+ '**/Dockerfile',
48
+ '**/docker-compose.yml',
49
+ '**/docker-compose.yaml',
50
+ '**/compose.yaml',
51
+ '**/compose.yml',
52
+ ], {
53
+ cwd: repoPath,
54
+ absolute: true,
55
+ ignore: ['**/node_modules/**', '**/bin/**', '**/obj/**', '**/dist/**', '**/out/**', '**/.git/**'],
56
+ });
57
+ const fileMap = new Map();
58
+ for (const file of files) {
59
+ const name = path.basename(file);
60
+ let list = fileMap.get(name);
61
+ if (!list) {
62
+ list = [];
63
+ fileMap.set(name, list);
91
64
  }
92
- if (allDeps['@nestjs/core']) {
93
- frameworks.push('nestjs');
94
- projectType = 'backend';
65
+ list.push(file);
66
+ }
67
+ // ── Node.js / JavaScript / TypeScript ──────────────────────────────
68
+ const packageJsons = fileMap.get('package.json') || [];
69
+ if (packageJsons.length > 0) {
70
+ const tsconfigs = fileMap.get('tsconfig.json') || [];
71
+ if (tsconfigs.length > 0) {
72
+ languages.add('typescript');
95
73
  }
96
- if (allDeps['fastify']) {
97
- frameworks.push('fastify');
98
- projectType = 'backend';
74
+ else {
75
+ languages.add('javascript');
99
76
  }
100
- if (allDeps['hono']) {
101
- frameworks.push('hono');
102
- projectType = 'backend';
77
+ for (const pj of packageJsons) {
78
+ const pkg = await readJson(pj);
79
+ if (pkg) {
80
+ const allDeps = {
81
+ ...pkg.dependencies,
82
+ ...pkg.devDependencies,
83
+ };
84
+ // Frameworks
85
+ if (allDeps['next']) {
86
+ frameworks.add('nextjs');
87
+ projectTypes.add('fullstack');
88
+ }
89
+ if (allDeps['react'] && !allDeps['next']) {
90
+ frameworks.add('react');
91
+ projectTypes.add('frontend');
92
+ }
93
+ if (allDeps['@angular/core']) {
94
+ frameworks.add('angular');
95
+ projectTypes.add('frontend');
96
+ }
97
+ if (allDeps['vue']) {
98
+ frameworks.add('vue');
99
+ projectTypes.add('frontend');
100
+ }
101
+ if (allDeps['svelte']) {
102
+ frameworks.add('svelte');
103
+ projectTypes.add('frontend');
104
+ }
105
+ if (allDeps['express']) {
106
+ frameworks.add('express');
107
+ projectTypes.add('backend');
108
+ }
109
+ if (allDeps['@nestjs/core']) {
110
+ frameworks.add('nestjs');
111
+ projectTypes.add('backend');
112
+ }
113
+ if (allDeps['fastify']) {
114
+ frameworks.add('fastify');
115
+ projectTypes.add('backend');
116
+ }
117
+ if (allDeps['hono']) {
118
+ frameworks.add('hono');
119
+ projectTypes.add('backend');
120
+ }
121
+ // Build tools
122
+ if (allDeps['vite'] || allDeps['@vitejs/plugin-react'])
123
+ buildTools.add('vite');
124
+ if (allDeps['webpack'])
125
+ buildTools.add('webpack');
126
+ if (allDeps['esbuild'])
127
+ buildTools.add('esbuild');
128
+ if (allDeps['rollup'])
129
+ buildTools.add('rollup');
130
+ if (allDeps['turbo'])
131
+ buildTools.add('turborepo');
132
+ if (allDeps['nx'])
133
+ buildTools.add('nx');
134
+ // Project type heuristics
135
+ if (pkg.bin)
136
+ projectTypes.add('cli');
137
+ if (pkg.main && !pkg.bin && frameworks.size === 0)
138
+ projectTypes.add('library');
139
+ }
103
140
  }
104
- // Build tools
105
- if (allDeps['vite'] || allDeps['@vitejs/plugin-react'])
106
- buildTools.push('vite');
107
- if (allDeps['webpack'])
108
- buildTools.push('webpack');
109
- if (allDeps['esbuild'])
110
- buildTools.push('esbuild');
111
- if (allDeps['rollup'])
112
- buildTools.push('rollup');
113
- if (allDeps['turbo'])
114
- buildTools.push('turborepo');
115
- if (allDeps['nx'])
116
- buildTools.push('nx');
117
- // Project type heuristics
118
- if (pkg.bin)
119
- projectType = 'cli';
120
- if (pkg.main && !pkg.bin && frameworks.length === 0)
121
- projectType = 'library';
122
141
  }
123
- }
124
- // ── .NET / C# ─────────────────────────────────────────────────────
125
- const hasCsproj = await hasFileWithExtension(repoPath, '.csproj');
126
- const hasSln = await hasFileWithExtension(repoPath, '.sln');
127
- if (hasCsproj || hasSln) {
128
- languages.push('csharp');
129
- // Try to detect ASP.NET or Blazor from csproj content
130
- try {
131
- const entries = await fs.readdir(repoPath);
132
- const csprojFile = entries.find((e) => e.endsWith('.csproj'));
133
- if (csprojFile) {
134
- const content = await fs.readFile(path.join(repoPath, csprojFile), 'utf-8');
135
- if (content.includes('Microsoft.NET.Sdk.Web')) {
136
- frameworks.push('aspnet');
137
- projectType = 'backend';
138
- }
139
- if (content.includes('Microsoft.NET.Sdk.BlazorWebAssembly') || content.includes('Blazor')) {
140
- frameworks.push('blazor');
141
- projectType = 'frontend';
142
+ // ── .NET / C# ─────────────────────────────────────────────────────
143
+ const csprojFiles = files.filter((f) => f.endsWith('.csproj'));
144
+ const slnFiles = files.filter((f) => f.endsWith('.sln'));
145
+ if (csprojFiles.length > 0 || slnFiles.length > 0) {
146
+ languages.add('csharp');
147
+ buildTools.add('dotnet');
148
+ for (const csproj of csprojFiles) {
149
+ try {
150
+ const content = await fs.readFile(csproj, 'utf-8');
151
+ if (content.includes('Microsoft.NET.Sdk.Web')) {
152
+ frameworks.add('aspnet');
153
+ projectTypes.add('backend');
154
+ }
155
+ if (content.includes('Microsoft.NET.Sdk.BlazorWebAssembly') || content.includes('Blazor')) {
156
+ frameworks.add('blazor');
157
+ projectTypes.add('frontend');
158
+ }
142
159
  }
160
+ catch { }
143
161
  }
144
162
  }
145
- catch {
146
- // Ignore read errors
147
- }
148
- buildTools.push('dotnet');
149
- }
150
- // ── Python ────────────────────────────────────────────────────────
151
- const hasPyproject = await fileExists(repoPath, 'pyproject.toml');
152
- const hasRequirements = await fileExists(repoPath, 'requirements.txt');
153
- const hasSetupPy = await fileExists(repoPath, 'setup.py');
154
- if (hasPyproject || hasRequirements || hasSetupPy) {
155
- languages.push('python');
156
- // Try to detect frameworks from requirements
157
- try {
158
- let content = '';
159
- if (hasRequirements) {
160
- content = await fs.readFile(path.join(repoPath, 'requirements.txt'), 'utf-8');
161
- }
162
- else if (hasPyproject) {
163
- content = await fs.readFile(path.join(repoPath, 'pyproject.toml'), 'utf-8');
164
- }
165
- const lower = content.toLowerCase();
166
- if (lower.includes('django')) {
167
- frameworks.push('django');
168
- projectType = 'backend';
169
- }
170
- if (lower.includes('flask')) {
171
- frameworks.push('flask');
172
- projectType = 'backend';
173
- }
174
- if (lower.includes('fastapi')) {
175
- frameworks.push('fastapi');
176
- projectType = 'backend';
163
+ // ── Python ────────────────────────────────────────────────────────
164
+ const pyprojectTomls = fileMap.get('pyproject.toml') || [];
165
+ const requirementsTxts = fileMap.get('requirements.txt') || [];
166
+ const setupPys = fileMap.get('setup.py') || [];
167
+ if (pyprojectTomls.length > 0 || requirementsTxts.length > 0 || setupPys.length > 0) {
168
+ languages.add('python');
169
+ for (const reqFile of [...requirementsTxts, ...pyprojectTomls]) {
170
+ try {
171
+ const content = await fs.readFile(reqFile, 'utf-8');
172
+ const lower = content.toLowerCase();
173
+ if (lower.includes('django')) {
174
+ frameworks.add('django');
175
+ projectTypes.add('backend');
176
+ }
177
+ if (lower.includes('flask')) {
178
+ frameworks.add('flask');
179
+ projectTypes.add('backend');
180
+ }
181
+ if (lower.includes('fastapi')) {
182
+ frameworks.add('fastapi');
183
+ projectTypes.add('backend');
184
+ }
185
+ }
186
+ catch { }
177
187
  }
188
+ if (pyprojectTomls.length > 0)
189
+ buildTools.add('pyproject');
190
+ if (setupPys.length > 0)
191
+ buildTools.add('setuptools');
178
192
  }
179
- catch {
180
- // Ignore
193
+ // ── Go ────────────────────────────────────────────────────────────
194
+ const goMods = fileMap.get('go.mod') || [];
195
+ if (goMods.length > 0) {
196
+ languages.add('go');
197
+ buildTools.add('go');
198
+ for (const goMod of goMods) {
199
+ try {
200
+ const content = await fs.readFile(goMod, 'utf-8');
201
+ if (content.includes('github.com/gin-gonic/gin')) {
202
+ frameworks.add('gin');
203
+ projectTypes.add('backend');
204
+ }
205
+ }
206
+ catch { }
207
+ }
181
208
  }
182
- if (hasPyproject)
183
- buildTools.push('pyproject');
184
- if (hasSetupPy)
185
- buildTools.push('setuptools');
186
- }
187
- // ── Go ────────────────────────────────────────────────────────────
188
- const hasGoMod = await fileExists(repoPath, 'go.mod');
189
- if (hasGoMod) {
190
- languages.push('go');
191
- buildTools.push('go');
192
- try {
193
- const content = await fs.readFile(path.join(repoPath, 'go.mod'), 'utf-8');
194
- if (content.includes('github.com/gin-gonic/gin')) {
195
- frameworks.push('gin');
196
- projectType = 'backend';
209
+ // ── Java ──────────────────────────────────────────────────────────
210
+ const poms = fileMap.get('pom.xml') || [];
211
+ const gradles = fileMap.get('build.gradle') || [];
212
+ const gradleKts = fileMap.get('build.gradle.kts') || [];
213
+ if (poms.length > 0 || gradles.length > 0 || gradleKts.length > 0) {
214
+ languages.add('java');
215
+ if (poms.length > 0)
216
+ buildTools.add('maven');
217
+ if (gradles.length > 0 || gradleKts.length > 0)
218
+ buildTools.add('gradle');
219
+ for (const f of [...poms, ...gradles, ...gradleKts]) {
220
+ try {
221
+ const content = await fs.readFile(f, 'utf-8');
222
+ if (content.includes('spring')) {
223
+ frameworks.add('spring');
224
+ projectTypes.add('backend');
225
+ }
226
+ }
227
+ catch { }
197
228
  }
198
229
  }
199
- catch {
200
- // Ignore
230
+ // ── Rust ──────────────────────────────────────────────────────────
231
+ const cargoTomls = fileMap.get('Cargo.toml') || [];
232
+ if (cargoTomls.length > 0) {
233
+ languages.add('rust');
234
+ buildTools.add('cargo');
201
235
  }
202
- }
203
- // ── Java ──────────────────────────────────────────────────────────
204
- const hasPom = await fileExists(repoPath, 'pom.xml');
205
- const hasGradle = await fileExists(repoPath, 'build.gradle');
206
- const hasGradleKts = await fileExists(repoPath, 'build.gradle.kts');
207
- if (hasPom || hasGradle || hasGradleKts) {
208
- languages.push('java');
209
- if (hasPom)
210
- buildTools.push('maven');
211
- if (hasGradle || hasGradleKts)
212
- buildTools.push('gradle');
213
- try {
214
- let content = '';
215
- if (hasPom) {
216
- content = await fs.readFile(path.join(repoPath, 'pom.xml'), 'utf-8');
217
- }
218
- else if (hasGradle) {
219
- content = await fs.readFile(path.join(repoPath, 'build.gradle'), 'utf-8');
236
+ // ── Ruby ──────────────────────────────────────────────────────────
237
+ const gemfiles = fileMap.get('Gemfile') || [];
238
+ if (gemfiles.length > 0) {
239
+ languages.add('ruby');
240
+ buildTools.add('bundler');
241
+ for (const gemfile of gemfiles) {
242
+ try {
243
+ const content = await fs.readFile(gemfile, 'utf-8');
244
+ if (content.includes('rails')) {
245
+ frameworks.add('rails');
246
+ projectTypes.add('backend');
247
+ }
248
+ }
249
+ catch { }
220
250
  }
221
- if (content.includes('spring')) {
222
- frameworks.push('spring');
223
- projectType = 'backend';
251
+ }
252
+ // ── PHP ───────────────────────────────────────────────────────────
253
+ const composerJsons = fileMap.get('composer.json') || [];
254
+ if (composerJsons.length > 0) {
255
+ languages.add('php');
256
+ buildTools.add('composer');
257
+ for (const comp of composerJsons) {
258
+ const composer = await readJson(comp);
259
+ if (composer) {
260
+ const req = composer.require;
261
+ if (req?.['laravel/framework']) {
262
+ frameworks.add('laravel');
263
+ projectTypes.add('backend');
264
+ }
265
+ }
224
266
  }
225
267
  }
226
- catch {
227
- // Ignore
268
+ // ── Docker ────────────────────────────────────────────────────────
269
+ const dockerfiles = fileMap.get('Dockerfile') || [];
270
+ if (dockerfiles.length > 0) {
271
+ buildTools.add('docker');
272
+ }
273
+ const hasCompose = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yaml', 'compose.yml'].some((name) => (fileMap.get(name) || []).length > 0);
274
+ if (hasCompose) {
275
+ buildTools.add('docker-compose');
228
276
  }
229
277
  }
230
- // ── Rust ──────────────────────────────────────────────────────────
231
- const hasCargo = await fileExists(repoPath, 'Cargo.toml');
232
- if (hasCargo) {
233
- languages.push('rust');
234
- buildTools.push('cargo');
278
+ catch {
279
+ // Ignore errors during glob/analysis
235
280
  }
236
- // ── Ruby ──────────────────────────────────────────────────────────
237
- const hasGemfile = await fileExists(repoPath, 'Gemfile');
238
- if (hasGemfile) {
239
- languages.push('ruby');
240
- buildTools.push('bundler');
241
- try {
242
- const content = await fs.readFile(path.join(repoPath, 'Gemfile'), 'utf-8');
243
- if (content.includes('rails')) {
244
- frameworks.push('rails');
245
- projectType = 'backend';
246
- }
247
- }
248
- catch {
249
- // Ignore
250
- }
281
+ // Fallback language
282
+ if (languages.size === 0) {
283
+ languages.add('other');
251
284
  }
252
- // ── PHP ───────────────────────────────────────────────────────────
253
- const hasComposer = await fileExists(repoPath, 'composer.json');
254
- if (hasComposer) {
255
- languages.push('php');
256
- buildTools.push('composer');
257
- const composer = await readJson(path.join(repoPath, 'composer.json'));
258
- if (composer) {
259
- const req = composer.require;
260
- if (req?.['laravel/framework']) {
261
- frameworks.push('laravel');
262
- projectType = 'backend';
263
- }
264
- }
285
+ // Heuristic for overall projectType
286
+ let finalProjectType = 'other';
287
+ if (projectTypes.has('fullstack') || (projectTypes.has('frontend') && projectTypes.has('backend'))) {
288
+ finalProjectType = 'fullstack';
289
+ }
290
+ else if (projectTypes.has('frontend')) {
291
+ finalProjectType = 'frontend';
265
292
  }
266
- // ── Docker ────────────────────────────────────────────────────────
267
- if (await fileExists(repoPath, 'Dockerfile')) {
268
- buildTools.push('docker');
293
+ else if (projectTypes.has('backend')) {
294
+ finalProjectType = 'backend';
269
295
  }
270
- if (await fileExists(repoPath, 'docker-compose.yml') || await fileExists(repoPath, 'compose.yaml')) {
271
- buildTools.push('docker-compose');
296
+ else if (projectTypes.has('library')) {
297
+ finalProjectType = 'library';
272
298
  }
273
- // Fallback
274
- if (languages.length === 0) {
275
- languages.push('other');
299
+ else if (projectTypes.has('cli')) {
300
+ finalProjectType = 'cli';
276
301
  }
277
302
  return {
278
- languages,
279
- frameworks,
280
- buildTools,
281
- projectType,
303
+ languages: Array.from(languages),
304
+ frameworks: Array.from(frameworks),
305
+ buildTools: Array.from(buildTools),
306
+ projectType: finalProjectType,
282
307
  };
283
308
  }
284
309
  //# sourceMappingURL=tech-stack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/analyzers/tech-stack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/analyzers/tech-stack.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH;;;;;;;;;GASG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmJnD"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH;;;;;;;;;GASG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyJnD"}
@@ -65,7 +65,8 @@ export async function createCommand() {
65
65
  id: branchName,
66
66
  branchName,
67
67
  description,
68
- repos: selectedRepos.map((r) => r.path),
68
+ repos: selectedRepos.map((r) => path.join(workspacePath, r.name)),
69
+ originalRepos: selectedRepos.map((r) => r.path),
69
70
  assistants: selectedAI,
70
71
  workspacePath,
71
72
  createdAt: new Date().toISOString(),
@@ -93,14 +94,20 @@ export async function createCommand() {
93
94
  console.log(chalk.cyan('\nGenerating AI context files...'));
94
95
  await generateContextFiles(ctx, selectedAI, workspacePath);
95
96
  // ── 8.5. Pack codebase context ──────────────────────────────────────
96
- const packSpinner = ora('Packing codebase context with Repomix...').start();
97
- try {
98
- const packResult = await packWorkspace(workspacePath);
99
- packSpinner.succeed(`Packed codebase context (${packResult.totalFiles} files, ${(packResult.fileSize / 1024).toFixed(2)} KB)`);
97
+ if (config.packContextXml) {
98
+ const packSpinner = ora('Packing codebase context with Repomix...').start();
99
+ try {
100
+ const packResult = await packWorkspace(workspacePath);
101
+ const filesCount = packResult.outputPaths?.length || 1;
102
+ packSpinner.succeed(`Packed codebase context into ${filesCount} file(s) (${packResult.totalFiles} files total, ${(packResult.fileSize / 1024).toFixed(2)} KB)`);
103
+ }
104
+ catch (error) {
105
+ packSpinner.fail('Failed to pack codebase context');
106
+ console.error(chalk.red(` ${error}`));
107
+ }
100
108
  }
101
- catch (error) {
102
- packSpinner.fail('Failed to pack codebase context');
103
- console.error(chalk.red(` ${error}`));
109
+ else {
110
+ console.log(chalk.gray('\n ○ Skipping codebase context packing (packContextXml is disabled)'));
104
111
  }
105
112
  // ── 8. Open in editor ───────────────────────────────────────────────
106
113
  const detectedEditors = await detectEditors();