@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,367 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, basename } from 'node:path';
3
+ // ── Helpers ──────────────────────────────────────────────────────────
4
+ function readFileSafe(path) {
5
+ try {
6
+ return readFileSync(path, 'utf-8');
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ function detectLanguage(dir) {
13
+ if (existsSync(join(dir, 'package.json'))) {
14
+ if (existsSync(join(dir, 'tsconfig.json')))
15
+ return 'typescript';
16
+ return 'node';
17
+ }
18
+ if (existsSync(join(dir, 'pyproject.toml')) || existsSync(join(dir, 'requirements.txt')) || existsSync(join(dir, 'setup.py')))
19
+ return 'python';
20
+ if (existsSync(join(dir, 'go.mod')))
21
+ return 'go';
22
+ if (existsSync(join(dir, 'Cargo.toml')))
23
+ return 'rust';
24
+ if (existsSync(join(dir, 'pom.xml')) || existsSync(join(dir, 'build.gradle')) || existsSync(join(dir, 'build.gradle.kts')))
25
+ return 'java';
26
+ return undefined;
27
+ }
28
+ function detectDatabaseFromContent(content) {
29
+ const lower = content.toLowerCase();
30
+ if (/postgres(ql)?|pg_|psycopg|DATABASE_URL.*postgres/i.test(content))
31
+ return 'postgresql';
32
+ if (/mysql|mariadb/i.test(content))
33
+ return 'mysql';
34
+ if (/mongodb|mongo_uri|mongoose/i.test(content))
35
+ return 'mongodb';
36
+ if (/redis|REDIS_URL|ioredis/i.test(content))
37
+ return 'redis';
38
+ if (/sqlite/i.test(content))
39
+ return 'sqlite';
40
+ if (/cassandra|cql/i.test(content))
41
+ return 'cassandra';
42
+ if (/elasticsearch|elastic/i.test(content))
43
+ return 'elasticsearch';
44
+ return undefined;
45
+ }
46
+ function detectPortFromDockerfile(dir) {
47
+ const content = readFileSafe(join(dir, 'Dockerfile')) || readFileSafe(join(dir, 'Containerfile'));
48
+ if (!content)
49
+ return undefined;
50
+ const match = content.match(/EXPOSE\s+(\d+)/);
51
+ return match ? parseInt(match[1], 10) : undefined;
52
+ }
53
+ function detectDatabaseInDir(dir) {
54
+ // Check common config files for DB references
55
+ const configFiles = [
56
+ 'docker-compose.yml', 'docker-compose.yaml',
57
+ '.env', '.env.local', '.env.development',
58
+ 'config.yaml', 'config.yml', 'config.json',
59
+ 'application.yml', 'application.yaml', 'application.properties',
60
+ 'settings.py', 'database.yml',
61
+ ];
62
+ for (const file of configFiles) {
63
+ const content = readFileSafe(join(dir, file));
64
+ if (content) {
65
+ const db = detectDatabaseFromContent(content);
66
+ if (db)
67
+ return db;
68
+ }
69
+ }
70
+ // Check package.json dependencies
71
+ const pkgContent = readFileSafe(join(dir, 'package.json'));
72
+ if (pkgContent) {
73
+ try {
74
+ const pkg = JSON.parse(pkgContent);
75
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
76
+ if (allDeps['pg'] || allDeps['postgres'] || allDeps['knex'] || allDeps['typeorm'] || allDeps['prisma'] || allDeps['@prisma/client'])
77
+ return 'postgresql';
78
+ if (allDeps['mysql'] || allDeps['mysql2'])
79
+ return 'mysql';
80
+ if (allDeps['mongodb'] || allDeps['mongoose'])
81
+ return 'mongodb';
82
+ if (allDeps['redis'] || allDeps['ioredis'])
83
+ return 'redis';
84
+ if (allDeps['better-sqlite3'] || allDeps['sqlite3'])
85
+ return 'sqlite';
86
+ }
87
+ catch { /* skip */ }
88
+ }
89
+ // Check pyproject.toml / requirements.txt
90
+ const pyContent = readFileSafe(join(dir, 'requirements.txt'));
91
+ if (pyContent) {
92
+ const db = detectDatabaseFromContent(pyContent);
93
+ if (db)
94
+ return db;
95
+ }
96
+ return undefined;
97
+ }
98
+ // ── Scanners ─────────────────────────────────────────────────────────
99
+ function scanServiceDirs(dir) {
100
+ const services = [];
101
+ const serviceDirs = ['services', 'packages', 'apps', 'modules'];
102
+ for (const svcDir of serviceDirs) {
103
+ const svcPath = join(dir, svcDir);
104
+ if (!existsSync(svcPath))
105
+ continue;
106
+ try {
107
+ if (!statSync(svcPath).isDirectory())
108
+ continue;
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ const subs = readdirSync(svcPath).filter(f => {
114
+ try {
115
+ return statSync(join(svcPath, f)).isDirectory();
116
+ }
117
+ catch {
118
+ return false;
119
+ }
120
+ });
121
+ for (const sub of subs) {
122
+ const subPath = join(svcPath, sub);
123
+ const svc = {
124
+ name: sub,
125
+ language: detectLanguage(subPath),
126
+ port: detectPortFromDockerfile(subPath),
127
+ database: detectDatabaseInDir(subPath),
128
+ };
129
+ // Try to find port from package.json scripts (e.g., --port 3000)
130
+ if (!svc.port) {
131
+ const pkg = readFileSafe(join(subPath, 'package.json'));
132
+ if (pkg) {
133
+ try {
134
+ const parsed = JSON.parse(pkg);
135
+ const startScript = parsed.scripts?.start || parsed.scripts?.dev || '';
136
+ const portMatch = startScript.match(/(?:--port|PORT=|-p)\s*(\d+)/);
137
+ if (portMatch)
138
+ svc.port = parseInt(portMatch[1], 10);
139
+ }
140
+ catch { /* skip */ }
141
+ }
142
+ }
143
+ services.push(svc);
144
+ }
145
+ }
146
+ return services;
147
+ }
148
+ function scanDockerCompose(dir) {
149
+ const services = [];
150
+ const dataFlow = [];
151
+ const composeFiles = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];
152
+ for (const file of composeFiles) {
153
+ const content = readFileSafe(join(dir, file));
154
+ if (!content)
155
+ continue;
156
+ const lines = content.split('\n');
157
+ let inServices = false;
158
+ let currentService = null;
159
+ let currentIndent = 0;
160
+ for (const line of lines) {
161
+ if (/^services:\s*$/.test(line)) {
162
+ inServices = true;
163
+ continue;
164
+ }
165
+ if (inServices) {
166
+ // New top-level key ends services section
167
+ if (/^\S/.test(line) && line.trim() !== '' && !/^services:/.test(line)) {
168
+ inServices = false;
169
+ currentService = null;
170
+ continue;
171
+ }
172
+ // Service name (2-space indent)
173
+ const svcMatch = line.match(/^(\s{2})(\w[\w.-]*):\s*$/);
174
+ if (svcMatch) {
175
+ currentService = svcMatch[2];
176
+ // Skip known infra services for architecture but still track dependencies
177
+ const svc = { name: currentService };
178
+ // Detect database services
179
+ const lower = currentService.toLowerCase();
180
+ if (/postgres/.test(lower))
181
+ svc.database = 'postgresql';
182
+ else if (/mysql|mariadb/.test(lower))
183
+ svc.database = 'mysql';
184
+ else if (/mongo/.test(lower))
185
+ svc.database = 'mongodb';
186
+ else if (/redis/.test(lower))
187
+ svc.database = 'redis';
188
+ else if (/elasticsearch|elastic/.test(lower))
189
+ svc.database = 'elasticsearch';
190
+ services.push(svc);
191
+ continue;
192
+ }
193
+ // Detect ports within a service
194
+ if (currentService) {
195
+ const portMatch = line.match(/["']?(\d+):(\d+)["']?/);
196
+ if (portMatch) {
197
+ const svc = services.find(s => s.name === currentService);
198
+ if (svc && !svc.port) {
199
+ svc.port = parseInt(portMatch[2], 10);
200
+ }
201
+ }
202
+ // Detect depends_on
203
+ const depMatch = line.match(/^\s+-\s+(\w[\w.-]*)\s*$/);
204
+ if (depMatch && currentService) {
205
+ const svc = services.find(s => s.name === currentService);
206
+ if (svc) {
207
+ svc.dependencies = svc.dependencies || [];
208
+ svc.dependencies.push(depMatch[1]);
209
+ dataFlow.push(`${currentService} -> ${depMatch[1]}`);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ break; // Only process first found compose file
216
+ }
217
+ return { services, dataFlow };
218
+ }
219
+ function scanHelmCharts(dir) {
220
+ const services = [];
221
+ const chartDirs = ['charts', 'helm'];
222
+ for (const chartDir of chartDirs) {
223
+ const chartsPath = join(dir, chartDir);
224
+ if (!existsSync(chartsPath))
225
+ continue;
226
+ try {
227
+ if (!statSync(chartsPath).isDirectory())
228
+ continue;
229
+ }
230
+ catch {
231
+ continue;
232
+ }
233
+ const subs = readdirSync(chartsPath).filter(f => {
234
+ try {
235
+ return statSync(join(chartsPath, f)).isDirectory();
236
+ }
237
+ catch {
238
+ return false;
239
+ }
240
+ });
241
+ for (const sub of subs) {
242
+ const chartYaml = readFileSafe(join(chartsPath, sub, 'Chart.yaml')) ||
243
+ readFileSafe(join(chartsPath, sub, 'Chart.yml'));
244
+ if (chartYaml) {
245
+ services.push({ name: sub });
246
+ }
247
+ }
248
+ }
249
+ // Single chart at root
250
+ if (existsSync(join(dir, 'Chart.yaml')) || existsSync(join(dir, 'Chart.yml'))) {
251
+ const name = basename(dir) || 'chart';
252
+ if (!services.some(s => s.name === name)) {
253
+ services.push({ name });
254
+ }
255
+ }
256
+ return services;
257
+ }
258
+ function scanK8sManifests(dir) {
259
+ const services = [];
260
+ const dataFlow = [];
261
+ const k8sDirs = ['k8s', 'kubernetes', 'manifests', 'deploy'];
262
+ for (const k8sDir of k8sDirs) {
263
+ const k8sPath = join(dir, k8sDir);
264
+ if (!existsSync(k8sPath))
265
+ continue;
266
+ try {
267
+ if (!statSync(k8sPath).isDirectory())
268
+ continue;
269
+ }
270
+ catch {
271
+ continue;
272
+ }
273
+ const files = readdirSync(k8sPath).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
274
+ for (const file of files) {
275
+ const content = readFileSafe(join(k8sPath, file));
276
+ if (!content)
277
+ continue;
278
+ // Extract service/deployment names
279
+ if (content.includes('kind: Deployment') || content.includes('kind: Service') || content.includes('kind: StatefulSet')) {
280
+ const nameMatch = content.match(/^\s*name:\s*(.+)$/m);
281
+ if (nameMatch) {
282
+ const name = nameMatch[1].trim();
283
+ const existing = services.find(s => s.name === name);
284
+ if (!existing) {
285
+ const svc = { name };
286
+ // Extract containerPort
287
+ const portMatch = content.match(/containerPort:\s*(\d+)/);
288
+ if (portMatch)
289
+ svc.port = parseInt(portMatch[1], 10);
290
+ services.push(svc);
291
+ }
292
+ }
293
+ }
294
+ }
295
+ }
296
+ return { services, dataFlow };
297
+ }
298
+ // ── Main ─────────────────────────────────────────────────────────────
299
+ export function extractArchitecture(dir) {
300
+ const allServices = new Map();
301
+ const allDataFlow = [];
302
+ // 1. Scan service directories
303
+ for (const svc of scanServiceDirs(dir)) {
304
+ allServices.set(svc.name, svc);
305
+ }
306
+ // 2. Scan docker-compose
307
+ const compose = scanDockerCompose(dir);
308
+ for (const svc of compose.services) {
309
+ const existing = allServices.get(svc.name);
310
+ if (existing) {
311
+ // Merge: compose adds ports/deps, dir scan adds language
312
+ existing.port = existing.port || svc.port;
313
+ existing.database = existing.database || svc.database;
314
+ existing.dependencies = existing.dependencies || svc.dependencies;
315
+ }
316
+ else {
317
+ allServices.set(svc.name, svc);
318
+ }
319
+ }
320
+ allDataFlow.push(...compose.dataFlow);
321
+ // 3. Scan Helm charts
322
+ for (const svc of scanHelmCharts(dir)) {
323
+ if (!allServices.has(svc.name)) {
324
+ allServices.set(svc.name, svc);
325
+ }
326
+ }
327
+ // 4. Scan k8s manifests
328
+ const k8s = scanK8sManifests(dir);
329
+ for (const svc of k8s.services) {
330
+ const existing = allServices.get(svc.name);
331
+ if (existing) {
332
+ existing.port = existing.port || svc.port;
333
+ }
334
+ else {
335
+ allServices.set(svc.name, svc);
336
+ }
337
+ }
338
+ allDataFlow.push(...k8s.dataFlow);
339
+ // 5. If no services found, treat root as single service
340
+ if (allServices.size === 0) {
341
+ const lang = detectLanguage(dir);
342
+ const port = detectPortFromDockerfile(dir);
343
+ const db = detectDatabaseInDir(dir);
344
+ if (lang || port || db) {
345
+ allServices.set(basename(dir) || 'app', {
346
+ name: basename(dir) || 'app',
347
+ language: lang,
348
+ port,
349
+ database: db,
350
+ });
351
+ }
352
+ }
353
+ // 6. Try to detect root-level database if services don't have one
354
+ const rootDb = detectDatabaseInDir(dir);
355
+ if (rootDb) {
356
+ for (const svc of allServices.values()) {
357
+ if (!svc.database) {
358
+ svc.database = rootDb;
359
+ }
360
+ }
361
+ }
362
+ return {
363
+ services: Array.from(allServices.values()),
364
+ dataFlow: allDataFlow.length > 0 ? allDataFlow : undefined,
365
+ };
366
+ }
367
+ //# sourceMappingURL=architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../../src/engine/architecture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ProjectRegistry, ProjectRegistryEntry, RoutesConfig, ContextManifest, WorkflowDefinition } from '../types.js';
2
+ export declare const GLOBAL_DIR: string;
3
+ export declare const GLOBAL_CONFIG_PATH: string;
4
+ export declare const GLOBAL_REGISTRY_PATH: string;
5
+ export declare const GLOBAL_CONTEXT_DIR: string;
6
+ export declare const GLOBAL_WORKFLOWS_DIR: string;
7
+ export declare function ensureGlobalDir(): void;
8
+ export declare function loadRegistry(): ProjectRegistry;
9
+ export declare function saveRegistry(registry: ProjectRegistry): void;
10
+ export declare function registerProject(entry: ProjectRegistryEntry): void;
11
+ export declare function unregisterProject(path: string): boolean;
12
+ /**
13
+ * Merge global + project routes. Project routes override global routes
14
+ * when they share the same workflow+agent combination.
15
+ */
16
+ export declare function mergeRoutes(projectDir: string): RoutesConfig | null;
17
+ /**
18
+ * Merge global + project workflows. Project workflows override global by name.
19
+ */
20
+ export declare function mergeWorkflows(projectDir: string): WorkflowDefinition[];
21
+ /**
22
+ * Merge context: L0 from global, L1+L2 from project, produce unified manifest.
23
+ */
24
+ export declare function mergeContextManifest(projectDir: string): ContextManifest | null;
@@ -0,0 +1,164 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ // ── Paths ────────────────────────────────────────────────────────────
5
+ export const GLOBAL_DIR = join(homedir(), '.icex-flow');
6
+ export const GLOBAL_CONFIG_PATH = join(GLOBAL_DIR, 'config.json');
7
+ export const GLOBAL_REGISTRY_PATH = join(GLOBAL_DIR, 'projects.json');
8
+ export const GLOBAL_CONTEXT_DIR = join(GLOBAL_DIR, 'context', 'L0-global');
9
+ export const GLOBAL_WORKFLOWS_DIR = join(GLOBAL_DIR, 'workflows');
10
+ // ── Global directory init ────────────────────────────────────────────
11
+ export function ensureGlobalDir() {
12
+ mkdirSync(GLOBAL_DIR, { recursive: true });
13
+ mkdirSync(GLOBAL_CONTEXT_DIR, { recursive: true });
14
+ mkdirSync(GLOBAL_WORKFLOWS_DIR, { recursive: true });
15
+ if (!existsSync(GLOBAL_CONFIG_PATH)) {
16
+ const config = {
17
+ version: '1.0.0',
18
+ };
19
+ writeFileSync(GLOBAL_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
20
+ }
21
+ if (!existsSync(GLOBAL_REGISTRY_PATH)) {
22
+ const registry = {
23
+ version: '1.0.0',
24
+ projects: [],
25
+ };
26
+ writeFileSync(GLOBAL_REGISTRY_PATH, JSON.stringify(registry, null, 2), 'utf-8');
27
+ }
28
+ }
29
+ // ── Registry operations ──────────────────────────────────────────────
30
+ export function loadRegistry() {
31
+ ensureGlobalDir();
32
+ try {
33
+ return JSON.parse(readFileSync(GLOBAL_REGISTRY_PATH, 'utf-8'));
34
+ }
35
+ catch {
36
+ return { version: '1.0.0', projects: [] };
37
+ }
38
+ }
39
+ export function saveRegistry(registry) {
40
+ ensureGlobalDir();
41
+ writeFileSync(GLOBAL_REGISTRY_PATH, JSON.stringify(registry, null, 2), 'utf-8');
42
+ }
43
+ export function registerProject(entry) {
44
+ const registry = loadRegistry();
45
+ const absPath = resolve(entry.path);
46
+ // Upsert by path
47
+ const idx = registry.projects.findIndex((p) => resolve(p.path) === absPath);
48
+ if (idx >= 0) {
49
+ registry.projects[idx] = { ...entry, path: absPath };
50
+ }
51
+ else {
52
+ registry.projects.push({ ...entry, path: absPath });
53
+ }
54
+ saveRegistry(registry);
55
+ }
56
+ export function unregisterProject(path) {
57
+ const registry = loadRegistry();
58
+ const absPath = resolve(path);
59
+ const before = registry.projects.length;
60
+ registry.projects = registry.projects.filter((p) => resolve(p.path) !== absPath);
61
+ saveRegistry(registry);
62
+ return registry.projects.length < before;
63
+ }
64
+ // ── Config merging ───────────────────────────────────────────────────
65
+ /**
66
+ * Merge global + project routes. Project routes override global routes
67
+ * when they share the same workflow+agent combination.
68
+ */
69
+ export function mergeRoutes(projectDir) {
70
+ const projectRoutesPath = join(projectDir, '.icex-flow', 'routes.json');
71
+ const globalRoutesPath = join(GLOBAL_DIR, 'routes.json');
72
+ let projectRoutes = null;
73
+ let globalRoutes = null;
74
+ if (existsSync(projectRoutesPath)) {
75
+ try {
76
+ projectRoutes = JSON.parse(readFileSync(projectRoutesPath, 'utf-8'));
77
+ }
78
+ catch { /* skip */ }
79
+ }
80
+ if (existsSync(globalRoutesPath)) {
81
+ try {
82
+ globalRoutes = JSON.parse(readFileSync(globalRoutesPath, 'utf-8'));
83
+ }
84
+ catch { /* skip */ }
85
+ }
86
+ if (!projectRoutes && !globalRoutes)
87
+ return null;
88
+ if (!projectRoutes)
89
+ return globalRoutes;
90
+ if (!globalRoutes)
91
+ return projectRoutes;
92
+ // Project routes take priority; add global routes that don't conflict
93
+ const projectKeys = new Set(projectRoutes.routes.map((r) => routeKey(r)));
94
+ const mergedRoutes = [
95
+ ...projectRoutes.routes,
96
+ ...globalRoutes.routes.filter((r) => !projectKeys.has(routeKey(r))),
97
+ ];
98
+ return {
99
+ version: projectRoutes.version,
100
+ default_agent: projectRoutes.default_agent ?? globalRoutes.default_agent,
101
+ default_workflow: projectRoutes.default_workflow ?? globalRoutes.default_workflow,
102
+ routes: mergedRoutes,
103
+ };
104
+ }
105
+ function routeKey(r) {
106
+ return `${r.workflow}:${r.agent}`;
107
+ }
108
+ /**
109
+ * Merge global + project workflows. Project workflows override global by name.
110
+ */
111
+ export function mergeWorkflows(projectDir) {
112
+ const projectWfDir = join(projectDir, '.icex-flow', 'workflows');
113
+ const workflows = new Map();
114
+ // Load global workflows first
115
+ if (existsSync(GLOBAL_WORKFLOWS_DIR)) {
116
+ for (const file of readdirSync(GLOBAL_WORKFLOWS_DIR).filter((f) => f.endsWith('.flow.json'))) {
117
+ try {
118
+ const wf = JSON.parse(readFileSync(join(GLOBAL_WORKFLOWS_DIR, file), 'utf-8'));
119
+ workflows.set(wf.name, wf);
120
+ }
121
+ catch { /* skip */ }
122
+ }
123
+ }
124
+ // Project workflows override by name
125
+ if (existsSync(projectWfDir)) {
126
+ for (const file of readdirSync(projectWfDir).filter((f) => f.endsWith('.flow.json'))) {
127
+ try {
128
+ const wf = JSON.parse(readFileSync(join(projectWfDir, file), 'utf-8'));
129
+ workflows.set(wf.name, wf);
130
+ }
131
+ catch { /* skip */ }
132
+ }
133
+ }
134
+ return Array.from(workflows.values());
135
+ }
136
+ /**
137
+ * Merge context: L0 from global, L1+L2 from project, produce unified manifest.
138
+ */
139
+ export function mergeContextManifest(projectDir) {
140
+ const projectManifestPath = join(projectDir, '.icex-flow', 'context.manifest.json');
141
+ if (!existsSync(projectManifestPath))
142
+ return null;
143
+ try {
144
+ const manifest = JSON.parse(readFileSync(projectManifestPath, 'utf-8'));
145
+ // Inject global L0 context files if the global context dir has content
146
+ if (existsSync(GLOBAL_CONTEXT_DIR)) {
147
+ const globalFiles = readdirSync(GLOBAL_CONTEXT_DIR).filter((f) => f.endsWith('.md'));
148
+ if (globalFiles.length > 0) {
149
+ // Ensure global L0 is in the inject_if_exists (optional, don't break if missing)
150
+ const globalPath = GLOBAL_CONTEXT_DIR + '/';
151
+ if (!manifest.global.always_inject.includes(globalPath) &&
152
+ !(manifest.global.inject_if_exists ?? []).includes(globalPath)) {
153
+ manifest.global.inject_if_exists = manifest.global.inject_if_exists ?? [];
154
+ manifest.global.inject_if_exists.push(globalPath);
155
+ }
156
+ }
157
+ }
158
+ return manifest;
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/engine/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ContextManifest } from '../types.js';
2
+ /**
3
+ * Mechanical context assembly — reads manifest, injects files, no LLM discretion.
4
+ *
5
+ * Returns concatenated file contents with section headers.
6
+ * Missing required files throw. Missing optional files are silently skipped.
7
+ */
8
+ export declare function assembleContext(manifest: ContextManifest, baseDir: string, workflow?: string, step?: string, vars?: Record<string, string>): string;
9
+ /**
10
+ * List all files that would be injected (dry-run mode).
11
+ */
12
+ export declare function listContextFiles(manifest: ContextManifest, baseDir: string, workflow?: string, step?: string, vars?: Record<string, string>): string[];