@icex-labs/icex-flow 0.3.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 (85) hide show
  1. package/README.md +158 -0
  2. package/SKILL.md +141 -0
  3. package/bin/icex-flow.mjs +3 -0
  4. package/dist/src/adapters/index.d.ts +1 -0
  5. package/dist/src/adapters/index.js +2 -0
  6. package/dist/src/adapters/index.js.map +1 -0
  7. package/dist/src/adapters/openclaw.d.ts +31 -0
  8. package/dist/src/adapters/openclaw.js +118 -0
  9. package/dist/src/adapters/openclaw.js.map +1 -0
  10. package/dist/src/cli.d.ts +1 -0
  11. package/dist/src/cli.js +95 -0
  12. package/dist/src/cli.js.map +1 -0
  13. package/dist/src/commands/context.d.ts +1 -0
  14. package/dist/src/commands/context.js +40 -0
  15. package/dist/src/commands/context.js.map +1 -0
  16. package/dist/src/commands/generate.d.ts +2 -0
  17. package/dist/src/commands/generate.js +230 -0
  18. package/dist/src/commands/generate.js.map +1 -0
  19. package/dist/src/commands/init.d.ts +1 -0
  20. package/dist/src/commands/init.js +104 -0
  21. package/dist/src/commands/init.js.map +1 -0
  22. package/dist/src/commands/learn.d.ts +13 -0
  23. package/dist/src/commands/learn.js +108 -0
  24. package/dist/src/commands/learn.js.map +1 -0
  25. package/dist/src/commands/list.d.ts +1 -0
  26. package/dist/src/commands/list.js +104 -0
  27. package/dist/src/commands/list.js.map +1 -0
  28. package/dist/src/commands/plan.d.ts +1 -0
  29. package/dist/src/commands/plan.js +88 -0
  30. package/dist/src/commands/plan.js.map +1 -0
  31. package/dist/src/commands/projects.d.ts +1 -0
  32. package/dist/src/commands/projects.js +69 -0
  33. package/dist/src/commands/projects.js.map +1 -0
  34. package/dist/src/commands/route.d.ts +1 -0
  35. package/dist/src/commands/route.js +38 -0
  36. package/dist/src/commands/route.js.map +1 -0
  37. package/dist/src/commands/validate.d.ts +1 -0
  38. package/dist/src/commands/validate.js +194 -0
  39. package/dist/src/commands/validate.js.map +1 -0
  40. package/dist/src/commands/verify.d.ts +1 -0
  41. package/dist/src/commands/verify.js +50 -0
  42. package/dist/src/commands/verify.js.map +1 -0
  43. package/dist/src/engine/architecture.d.ts +12 -0
  44. package/dist/src/engine/architecture.js +367 -0
  45. package/dist/src/engine/architecture.js.map +1 -0
  46. package/dist/src/engine/config.d.ts +24 -0
  47. package/dist/src/engine/config.js +164 -0
  48. package/dist/src/engine/config.js.map +1 -0
  49. package/dist/src/engine/context.d.ts +12 -0
  50. package/dist/src/engine/context.js +171 -0
  51. package/dist/src/engine/context.js.map +1 -0
  52. package/dist/src/engine/detect.d.ts +6 -0
  53. package/dist/src/engine/detect.js +300 -0
  54. package/dist/src/engine/detect.js.map +1 -0
  55. package/dist/src/engine/environment.d.ts +12 -0
  56. package/dist/src/engine/environment.js +399 -0
  57. package/dist/src/engine/environment.js.map +1 -0
  58. package/dist/src/engine/planner.d.ts +12 -0
  59. package/dist/src/engine/planner.js +130 -0
  60. package/dist/src/engine/planner.js.map +1 -0
  61. package/dist/src/engine/router.d.ts +7 -0
  62. package/dist/src/engine/router.js +56 -0
  63. package/dist/src/engine/router.js.map +1 -0
  64. package/dist/src/engine/verifier.d.ts +8 -0
  65. package/dist/src/engine/verifier.js +55 -0
  66. package/dist/src/engine/verifier.js.map +1 -0
  67. package/dist/src/index.d.ts +14 -0
  68. package/dist/src/index.js +13 -0
  69. package/dist/src/index.js.map +1 -0
  70. package/dist/src/presets/index.d.ts +11 -0
  71. package/dist/src/presets/index.js +352 -0
  72. package/dist/src/presets/index.js.map +1 -0
  73. package/dist/src/types.d.ts +161 -0
  74. package/dist/src/types.js +8 -0
  75. package/dist/src/types.js.map +1 -0
  76. package/dist/src/utils.d.ts +8 -0
  77. package/dist/src/utils.js +65 -0
  78. package/dist/src/utils.js.map +1 -0
  79. package/package.json +48 -0
  80. package/schemas/context.schema.json +38 -0
  81. package/schemas/routes.schema.json +33 -0
  82. package/schemas/workflow.schema.json +84 -0
  83. package/templates/context.manifest.json +21 -0
  84. package/templates/dev-chain.flow.json +112 -0
  85. package/templates/routes.json +37 -0
@@ -0,0 +1,171 @@
1
+ import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { resolveTemplate } from '../utils.js';
4
+ /**
5
+ * Mechanical context assembly — reads manifest, injects files, no LLM discretion.
6
+ *
7
+ * Returns concatenated file contents with section headers.
8
+ * Missing required files throw. Missing optional files are silently skipped.
9
+ */
10
+ export function assembleContext(manifest, baseDir, workflow, step, vars) {
11
+ const root = manifest.base_dir
12
+ ? resolve(baseDir, manifest.base_dir)
13
+ : resolve(baseDir);
14
+ const parts = [];
15
+ // Global always (required)
16
+ for (const file of manifest.global.always_inject) {
17
+ const resolved = vars ? resolveTemplate(file, vars) : file;
18
+ const expanded = resolveFiles(root, resolved);
19
+ for (const f of expanded) {
20
+ const content = readRequired(join(root, f), f);
21
+ parts.push(section(f, content));
22
+ }
23
+ }
24
+ // Global if-exists (optional)
25
+ if (manifest.global.inject_if_exists) {
26
+ for (const file of manifest.global.inject_if_exists) {
27
+ const resolved = vars ? resolveTemplate(file, vars) : file;
28
+ const expanded = resolveFiles(root, resolved);
29
+ for (const f of expanded) {
30
+ const fullPath = join(root, f);
31
+ if (existsSync(fullPath)) {
32
+ const content = readFileSync(fullPath, 'utf-8');
33
+ parts.push(section(f, content));
34
+ }
35
+ }
36
+ }
37
+ }
38
+ // Workflow-specific
39
+ if (workflow && manifest.workflows?.[workflow]) {
40
+ const wf = manifest.workflows[workflow];
41
+ if (wf.always_inject) {
42
+ for (const file of wf.always_inject) {
43
+ const resolved = vars ? resolveTemplate(file, vars) : file;
44
+ const expanded = resolveFiles(root, resolved);
45
+ for (const f of expanded) {
46
+ const content = readRequired(join(root, f), f);
47
+ parts.push(section(f, content));
48
+ }
49
+ }
50
+ }
51
+ if (wf.inject_if_exists) {
52
+ for (const file of wf.inject_if_exists) {
53
+ const resolved = vars ? resolveTemplate(file, vars) : file;
54
+ const expanded = resolveFiles(root, resolved);
55
+ for (const f of expanded) {
56
+ const fullPath = join(root, f);
57
+ if (existsSync(fullPath)) {
58
+ const content = readFileSync(fullPath, 'utf-8');
59
+ parts.push(section(f, content));
60
+ }
61
+ }
62
+ }
63
+ }
64
+ // Step-specific
65
+ if (step && wf.steps?.[step]?.inject) {
66
+ for (const file of wf.steps[step].inject) {
67
+ const resolved = vars ? resolveTemplate(file, vars) : file;
68
+ const expanded = resolveFiles(root, resolved);
69
+ for (const f of expanded) {
70
+ const content = readRequired(join(root, f), f);
71
+ parts.push(section(f, content));
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return parts.join('\n\n');
77
+ }
78
+ /**
79
+ * List all files that would be injected (dry-run mode).
80
+ */
81
+ export function listContextFiles(manifest, baseDir, workflow, step, vars) {
82
+ const root = manifest.base_dir
83
+ ? resolve(baseDir, manifest.base_dir)
84
+ : resolve(baseDir);
85
+ const files = [];
86
+ for (const f of manifest.global.always_inject) {
87
+ const resolved = vars ? resolveTemplate(f, vars) : f;
88
+ files.push(...resolveFiles(root, resolved));
89
+ }
90
+ if (manifest.global.inject_if_exists) {
91
+ for (const f of manifest.global.inject_if_exists) {
92
+ const resolved = vars ? resolveTemplate(f, vars) : f;
93
+ const expanded = resolveFiles(root, resolved);
94
+ for (const ef of expanded) {
95
+ if (existsSync(join(root, ef)))
96
+ files.push(ef);
97
+ }
98
+ }
99
+ }
100
+ if (workflow && manifest.workflows?.[workflow]) {
101
+ const wf = manifest.workflows[workflow];
102
+ if (wf.always_inject) {
103
+ for (const f of wf.always_inject) {
104
+ const resolved = vars ? resolveTemplate(f, vars) : f;
105
+ files.push(...resolveFiles(root, resolved));
106
+ }
107
+ }
108
+ if (wf.inject_if_exists) {
109
+ for (const f of wf.inject_if_exists) {
110
+ const resolved = vars ? resolveTemplate(f, vars) : f;
111
+ const expanded = resolveFiles(root, resolved);
112
+ for (const ef of expanded) {
113
+ if (existsSync(join(root, ef)))
114
+ files.push(ef);
115
+ }
116
+ }
117
+ }
118
+ if (step && wf.steps?.[step]?.inject) {
119
+ for (const f of wf.steps[step].inject) {
120
+ const resolved = vars ? resolveTemplate(f, vars) : f;
121
+ files.push(...resolveFiles(root, resolved));
122
+ }
123
+ }
124
+ }
125
+ return files;
126
+ }
127
+ /**
128
+ * Resolve a path pattern to concrete file paths.
129
+ *
130
+ * Supports:
131
+ * - Plain file path: returns as-is
132
+ * - Directory path (trailing slash or is a directory): returns all .md files in it
133
+ * - Glob-like pattern with `*`: expands to matching .md files in the parent dir
134
+ */
135
+ function resolveFiles(root, pattern) {
136
+ const fullPath = join(root, pattern);
137
+ // Glob pattern: "some/dir/*" — list .md files in the directory portion
138
+ if (pattern.endsWith('/*') || pattern.endsWith('/*.*')) {
139
+ const dirPath = join(root, pattern.replace(/\/\*(\.\*)?$/, ''));
140
+ return listMdFiles(dirPath, pattern.replace(/\/\*(\.\*)?$/, ''));
141
+ }
142
+ // Directory: trailing slash or an existing directory
143
+ if (pattern.endsWith('/') || (existsSync(fullPath) && statSync(fullPath).isDirectory())) {
144
+ const dirPattern = pattern.endsWith('/') ? pattern.slice(0, -1) : pattern;
145
+ return listMdFiles(fullPath.endsWith('/') ? fullPath.slice(0, -1) : fullPath, dirPattern);
146
+ }
147
+ // Plain file
148
+ return [pattern];
149
+ }
150
+ /**
151
+ * List all .md files in a directory, returning paths relative to root.
152
+ */
153
+ function listMdFiles(dirPath, relativeDir) {
154
+ if (!existsSync(dirPath) || !statSync(dirPath).isDirectory()) {
155
+ return [];
156
+ }
157
+ return readdirSync(dirPath)
158
+ .filter((f) => f.endsWith('.md'))
159
+ .sort()
160
+ .map((f) => `${relativeDir}/${f}`);
161
+ }
162
+ function readRequired(path, label) {
163
+ if (!existsSync(path)) {
164
+ throw new Error(`Required context file not found: ${label} (${path})`);
165
+ }
166
+ return readFileSync(path, 'utf-8');
167
+ }
168
+ function section(label, content) {
169
+ return `--- ${label} ---\n${content}`;
170
+ }
171
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/engine/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DetectedProject } from '../types.js';
2
+ /**
3
+ * Auto-detect project characteristics by scanning directory contents.
4
+ * Pure filesystem inspection — no network calls, no prompts.
5
+ */
6
+ export declare function detectProject(dir: string): DetectedProject;
@@ -0,0 +1,300 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, basename } from 'node:path';
3
+ /**
4
+ * Auto-detect project characteristics by scanning directory contents.
5
+ * Pure filesystem inspection — no network calls, no prompts.
6
+ */
7
+ export function detectProject(dir) {
8
+ const features = [];
9
+ const languages = [];
10
+ let ci;
11
+ let deployment;
12
+ let testCommand;
13
+ let buildCommand;
14
+ let hasMigrations = false;
15
+ let containerized = false;
16
+ let isClaudeCode = false;
17
+ let isMonorepo = false;
18
+ let repoUrl;
19
+ // --- Git repo URL ---
20
+ const gitConfigPath = join(dir, '.git', 'config');
21
+ if (existsSync(gitConfigPath)) {
22
+ features.push('git');
23
+ const gitConfig = readFileSync(gitConfigPath, 'utf-8');
24
+ const urlMatch = gitConfig.match(/url\s*=\s*(.+)/);
25
+ if (urlMatch) {
26
+ repoUrl = urlMatch[1].trim();
27
+ // Normalize SSH URL to HTTPS
28
+ if (repoUrl.startsWith('git@')) {
29
+ repoUrl = repoUrl
30
+ .replace(/^git@([^:]+):/, 'https://$1/')
31
+ .replace(/\.git$/, '');
32
+ }
33
+ else if (repoUrl.endsWith('.git')) {
34
+ repoUrl = repoUrl.replace(/\.git$/, '');
35
+ }
36
+ }
37
+ }
38
+ // --- CI detection ---
39
+ if (existsSync(join(dir, '.github', 'workflows'))) {
40
+ ci = 'github-actions';
41
+ features.push('ci:github-actions');
42
+ }
43
+ else if (existsSync(join(dir, '.gitlab-ci.yml'))) {
44
+ ci = 'gitlab-ci';
45
+ features.push('ci:gitlab-ci');
46
+ }
47
+ else if (existsSync(join(dir, 'Jenkinsfile'))) {
48
+ ci = 'jenkins';
49
+ features.push('ci:jenkins');
50
+ }
51
+ else if (existsSync(join(dir, '.circleci'))) {
52
+ ci = 'circleci';
53
+ features.push('ci:circleci');
54
+ }
55
+ // --- Deployment detection ---
56
+ if (existsSync(join(dir, 'helm')) || existsSync(join(dir, 'Chart.yaml'))) {
57
+ deployment = 'helm';
58
+ features.push('deploy:helm');
59
+ }
60
+ else if (existsSync(join(dir, 'k8s')) || existsSync(join(dir, 'kubernetes'))) {
61
+ deployment = 'kubernetes';
62
+ features.push('deploy:kubernetes');
63
+ }
64
+ else if (existsSync(join(dir, 'terraform'))) {
65
+ deployment = 'terraform';
66
+ features.push('deploy:terraform');
67
+ }
68
+ else if (existsSync(join(dir, 'serverless.yml')) || existsSync(join(dir, 'serverless.ts'))) {
69
+ deployment = 'serverless';
70
+ features.push('deploy:serverless');
71
+ }
72
+ // --- Language / package detection ---
73
+ if (existsSync(join(dir, 'package.json'))) {
74
+ languages.push('node');
75
+ features.push('lang:node');
76
+ try {
77
+ const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));
78
+ // Detect test command
79
+ if (pkg.scripts?.test && pkg.scripts.test !== 'echo "Error: no test specified" && exit 1') {
80
+ testCommand = `npm test`;
81
+ features.push('test:npm');
82
+ }
83
+ if (pkg.scripts?.build) {
84
+ buildCommand = 'npm run build';
85
+ features.push('build:npm');
86
+ }
87
+ // Detect frontend frameworks
88
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
89
+ if (allDeps?.react || allDeps?.['react-dom']) {
90
+ languages.push('react');
91
+ features.push('framework:react');
92
+ }
93
+ if (allDeps?.next) {
94
+ languages.push('nextjs');
95
+ features.push('framework:nextjs');
96
+ }
97
+ if (allDeps?.vue) {
98
+ languages.push('vue');
99
+ features.push('framework:vue');
100
+ }
101
+ if (allDeps?.angular || allDeps?.['@angular/core']) {
102
+ languages.push('angular');
103
+ features.push('framework:angular');
104
+ }
105
+ // Detect monorepo tools
106
+ if (pkg.workspaces || existsSync(join(dir, 'lerna.json')) || existsSync(join(dir, 'nx.json')) || existsSync(join(dir, 'turbo.json')) || existsSync(join(dir, 'pnpm-workspace.yaml'))) {
107
+ isMonorepo = true;
108
+ features.push('monorepo');
109
+ }
110
+ }
111
+ catch {
112
+ // Invalid package.json — continue
113
+ }
114
+ }
115
+ if (existsSync(join(dir, 'tsconfig.json'))) {
116
+ languages.push('typescript');
117
+ features.push('lang:typescript');
118
+ }
119
+ if (existsSync(join(dir, 'pom.xml'))) {
120
+ languages.push('java');
121
+ features.push('lang:java');
122
+ testCommand = testCommand ?? 'mvn test';
123
+ buildCommand = buildCommand ?? 'mvn package';
124
+ }
125
+ if (existsSync(join(dir, 'build.gradle')) || existsSync(join(dir, 'build.gradle.kts'))) {
126
+ languages.push('java');
127
+ features.push('lang:java');
128
+ testCommand = testCommand ?? './gradlew test';
129
+ buildCommand = buildCommand ?? './gradlew build';
130
+ }
131
+ if (existsSync(join(dir, 'go.mod'))) {
132
+ languages.push('go');
133
+ features.push('lang:go');
134
+ testCommand = testCommand ?? 'go test ./...';
135
+ buildCommand = buildCommand ?? 'go build ./...';
136
+ }
137
+ if (existsSync(join(dir, 'Cargo.toml'))) {
138
+ languages.push('rust');
139
+ features.push('lang:rust');
140
+ testCommand = testCommand ?? 'cargo test';
141
+ buildCommand = buildCommand ?? 'cargo build';
142
+ }
143
+ const hasPyProject = existsSync(join(dir, 'pyproject.toml'));
144
+ const hasSetupPy = existsSync(join(dir, 'setup.py'));
145
+ const hasRequirements = existsSync(join(dir, 'requirements.txt'));
146
+ if (hasPyProject || hasSetupPy || hasRequirements) {
147
+ languages.push('python');
148
+ features.push('lang:python');
149
+ testCommand = testCommand ?? 'pytest';
150
+ }
151
+ // --- Deep scan: services/*/ or packages/*/ subdirectories ---
152
+ const servicesDirs = ['services', 'packages', 'apps', 'modules'];
153
+ let serviceCount = 0;
154
+ for (const svcDir of servicesDirs) {
155
+ const svcPath = join(dir, svcDir);
156
+ if (existsSync(svcPath) && statSync(svcPath).isDirectory()) {
157
+ const subs = readdirSync(svcPath).filter(f => {
158
+ try {
159
+ return statSync(join(svcPath, f)).isDirectory();
160
+ }
161
+ catch {
162
+ return false;
163
+ }
164
+ });
165
+ serviceCount += subs.length;
166
+ for (const sub of subs) {
167
+ const subPath = join(svcPath, sub);
168
+ // Detect languages in subdirectories
169
+ if (!languages.includes('python') && (existsSync(join(subPath, 'pyproject.toml')) || existsSync(join(subPath, 'requirements.txt')) || existsSync(join(subPath, 'setup.py')))) {
170
+ languages.push('python');
171
+ features.push('lang:python');
172
+ testCommand = testCommand ?? 'pytest';
173
+ }
174
+ if (!languages.includes('node') && existsSync(join(subPath, 'package.json'))) {
175
+ languages.push('node');
176
+ features.push('lang:node');
177
+ }
178
+ if (!languages.includes('go') && existsSync(join(subPath, 'go.mod'))) {
179
+ languages.push('go');
180
+ features.push('lang:go');
181
+ }
182
+ if (!languages.includes('java') && (existsSync(join(subPath, 'pom.xml')) || existsSync(join(subPath, 'build.gradle')))) {
183
+ languages.push('java');
184
+ features.push('lang:java');
185
+ }
186
+ // Detect containerization in subdirectories
187
+ if (!containerized && existsSync(join(subPath, 'Dockerfile'))) {
188
+ containerized = true;
189
+ features.push('container:docker');
190
+ }
191
+ // Detect DB migrations in subdirectories
192
+ if (!hasMigrations && (existsSync(join(subPath, 'liquibase')) || existsSync(join(subPath, 'migrations')) || existsSync(join(subPath, 'alembic')))) {
193
+ hasMigrations = true;
194
+ features.push('db:migrations');
195
+ }
196
+ }
197
+ if (subs.length >= 2) {
198
+ isMonorepo = true;
199
+ if (!features.includes('monorepo'))
200
+ features.push('monorepo');
201
+ features.push(`${svcDir}:${subs.length}`);
202
+ }
203
+ }
204
+ }
205
+ // --- Helm charts deep scan ---
206
+ const chartsDir = join(dir, 'charts');
207
+ if (!deployment && existsSync(chartsDir) && statSync(chartsDir).isDirectory()) {
208
+ const chartSubs = readdirSync(chartsDir).filter(f => {
209
+ try {
210
+ return statSync(join(chartsDir, f)).isDirectory();
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ });
216
+ if (chartSubs.length > 0) {
217
+ deployment = 'helm';
218
+ features.push('deploy:helm');
219
+ features.push(`charts:${chartSubs.length}`);
220
+ }
221
+ }
222
+ // --- DB migrations (root level) ---
223
+ if (!hasMigrations && (existsSync(join(dir, 'liquibase')) ||
224
+ existsSync(join(dir, 'migrations')) ||
225
+ existsSync(join(dir, 'db', 'migrations')) ||
226
+ existsSync(join(dir, 'alembic')) ||
227
+ existsSync(join(dir, 'prisma')))) {
228
+ hasMigrations = true;
229
+ features.push('db:migrations');
230
+ }
231
+ // --- Containerized (root level) ---
232
+ if (!containerized && (existsSync(join(dir, 'Dockerfile')) || existsSync(join(dir, 'docker-compose.yml')) || existsSync(join(dir, 'docker-compose.yaml')))) {
233
+ containerized = true;
234
+ features.push('container:docker');
235
+ }
236
+ // --- Claude Code ---
237
+ if (existsSync(join(dir, 'CLAUDE.md'))) {
238
+ isClaudeCode = true;
239
+ features.push('claude-code');
240
+ }
241
+ // --- Data pipeline indicators ---
242
+ const hasAirflow = existsSync(join(dir, 'dags'));
243
+ const hasDBT = existsSync(join(dir, 'dbt_project.yml'));
244
+ if (hasAirflow)
245
+ features.push('data:airflow');
246
+ if (hasDBT)
247
+ features.push('data:dbt');
248
+ // --- Determine preset ---
249
+ const preset = selectPreset({
250
+ languages,
251
+ features,
252
+ isMonorepo,
253
+ hasMigrations,
254
+ containerized,
255
+ deployment,
256
+ hasAirflow,
257
+ hasDBT,
258
+ });
259
+ // --- Determine primary language ---
260
+ const primaryLang = languages[0] ?? 'unknown';
261
+ return {
262
+ name: basename(dir) || 'project',
263
+ repo_url: repoUrl,
264
+ language: primaryLang,
265
+ languages,
266
+ ci,
267
+ deployment,
268
+ test_command: testCommand,
269
+ build_command: buildCommand,
270
+ has_db_migrations: hasMigrations,
271
+ containerized,
272
+ is_claude_code: isClaudeCode,
273
+ is_monorepo: isMonorepo,
274
+ preset,
275
+ detected_features: features,
276
+ };
277
+ }
278
+ function selectPreset(input) {
279
+ // Monorepo takes top priority
280
+ if (input.isMonorepo)
281
+ return 'monorepo';
282
+ // Data pipeline
283
+ if (input.hasAirflow || input.hasDBT)
284
+ return 'data-pipeline';
285
+ // Frontend detection
286
+ const frontendFrameworks = ['react', 'nextjs', 'vue', 'angular'];
287
+ const hasFrontend = input.languages.some((l) => frontendFrameworks.includes(l));
288
+ const hasBackendSignals = input.containerized || !!input.deployment || input.hasMigrations;
289
+ if (hasFrontend && !hasBackendSignals)
290
+ return 'frontend';
291
+ // Microservice: has backend language + containerized/deployable/has DB
292
+ if (hasBackendSignals && input.languages.length > 0)
293
+ return 'microservice';
294
+ // Library: has a language but no deployment/container signals
295
+ const hasLang = input.languages.length > 0;
296
+ if (hasLang && !input.containerized && !input.deployment)
297
+ return 'library';
298
+ return 'generic';
299
+ }
300
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/engine/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface DiscoveredEnvironment {
2
+ name: string;
3
+ type: 'kubernetes' | 'docker-compose' | 'terraform' | 'pulumi' | 'helm' | 'argocd' | 'flux' | 'env-file' | 'container';
4
+ endpoint?: string;
5
+ namespace?: string;
6
+ isProduction: boolean;
7
+ details?: Record<string, unknown>;
8
+ }
9
+ export interface EnvironmentDiscoveryResult {
10
+ environments: DiscoveredEnvironment[];
11
+ }
12
+ export declare function discoverEnvironments(dir: string): EnvironmentDiscoveryResult;