@synergenius/flow-weaver 0.22.0 → 0.22.3

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.
package/dist/cli/index.js CHANGED
@@ -10,35 +10,6 @@ import './env-setup.js';
10
10
  // Load built-in extensions (CI/CD, etc.) before any commands run
11
11
  import '../extensions/index.js';
12
12
  import { Command, Option } from 'commander';
13
- import { compileCommand } from './commands/compile.js';
14
- import { createWorkflowCommand, createNodeCommand } from './commands/create.js';
15
- import { describeCommand } from './commands/describe.js';
16
- import { diagramCommand } from './commands/diagram.js';
17
- import { diffCommand } from './commands/diff.js';
18
- import { patternListCommand, patternApplyCommand, patternExtractCommand, } from './commands/pattern.js';
19
- import { templatesCommand } from './commands/templates.js';
20
- import { validateCommand } from './commands/validate.js';
21
- import { doctorCommand } from './commands/doctor.js';
22
- import { initCommand } from './commands/init.js';
23
- import { watchCommand } from './commands/watch.js';
24
- import { devCommand } from './commands/dev.js';
25
- import { mcpServerCommand } from '../mcp/server.js';
26
- import { grammarCommand } from './commands/grammar.js';
27
- import { runCommand } from './commands/run.js';
28
- import { serveCommand } from './commands/serve.js';
29
- import { exportCommand } from './commands/export.js';
30
- import { openapiCommand } from './commands/openapi.js';
31
- import { pluginInitCommand } from './commands/plugin.js';
32
- import { migrateCommand } from './commands/migrate.js';
33
- import { changelogCommand } from './commands/changelog.js';
34
- import { stripCommand } from './commands/strip.js';
35
- import { docsListCommand, docsReadCommand, docsSearchCommand } from './commands/docs.js';
36
- import { contextCommand } from './commands/context.js';
37
- import { statusCommand } from './commands/status.js';
38
- import { implementCommand } from './commands/implement.js';
39
- import { modifyAddNodeCommand, modifyRemoveNodeCommand, modifyAddConnectionCommand, modifyRemoveConnectionCommand, modifyRenameNodeCommand, modifySetPositionCommand, modifySetLabelCommand, } from './commands/modify.js';
40
- import { marketInitCommand, marketPackCommand, marketPublishCommand, marketInstallCommand, marketSearchCommand, marketListCommand, } from './commands/market.js';
41
- import { mcpSetupCommand } from './commands/mcp-setup.js';
42
13
  import { logger } from './utils/logger.js';
43
14
  import { getErrorMessage } from '../utils/error-utils.js';
44
15
  const version = typeof __CLI_VERSION__ !== 'undefined' ? __CLI_VERSION__ : '0.0.0-dev';
@@ -109,6 +80,7 @@ program
109
80
  .option('--retries <n>', 'Number of retries per function', parseInt)
110
81
  .option('--timeout <duration>', 'Function timeout (e.g. "30m", "1h")')
111
82
  .action(wrapAction(async (input, options) => {
83
+ const { compileCommand } = await import('./commands/compile.js');
112
84
  if (options.workflow)
113
85
  options.workflowName = options.workflow;
114
86
  await compileCommand(input, options);
@@ -121,6 +93,7 @@ program
121
93
  .option('--dry-run', 'Preview without writing', false)
122
94
  .option('--verbose', 'Verbose output', false)
123
95
  .action(wrapAction(async (input, options) => {
96
+ const { stripCommand } = await import('./commands/strip.js');
124
97
  await stripCommand(input, options);
125
98
  }));
126
99
  // Describe command
@@ -132,6 +105,7 @@ program
132
105
  .option('--compile', 'Also update runtime markers in the source file')
133
106
  .option('-w, --workflow <name>', 'Specific workflow name to describe')
134
107
  .action(wrapAction(async (input, options) => {
108
+ const { describeCommand } = await import('./commands/describe.js');
135
109
  if (options.workflow)
136
110
  options.workflowName = options.workflow;
137
111
  await describeCommand(input, options);
@@ -155,6 +129,7 @@ program
155
129
  options.showPortLabels = options.portLabels;
156
130
  if (options.workflow)
157
131
  options.workflowName = options.workflow;
132
+ const { diagramCommand } = await import('./commands/diagram.js');
158
133
  await diagramCommand(input, options);
159
134
  }));
160
135
  // Diff command
@@ -165,6 +140,7 @@ program
165
140
  .option('-w, --workflow <name>', 'Specific workflow name to compare')
166
141
  .option('--exit-zero', 'Exit 0 even when differences are found', false)
167
142
  .action(wrapAction(async (file1, file2, options) => {
143
+ const { diffCommand } = await import('./commands/diff.js');
168
144
  if (options.workflow)
169
145
  options.workflowName = options.workflow;
170
146
  await diffCommand(file1, file2, options);
@@ -179,6 +155,7 @@ program
179
155
  .option('-w, --workflow <name>', 'Specific workflow name to validate')
180
156
  .option('--strict', 'Treat type coercion warnings as errors', false)
181
157
  .action(wrapAction(async (input, options) => {
158
+ const { validateCommand } = await import('./commands/validate.js');
182
159
  if (options.workflow)
183
160
  options.workflowName = options.workflow;
184
161
  await validateCommand(input, options);
@@ -189,6 +166,7 @@ program
189
166
  .description('Check project environment and configuration for flow-weaver compatibility')
190
167
  .option('--json', 'Output results as JSON', false)
191
168
  .action(wrapAction(async (options) => {
169
+ const { doctorCommand } = await import('./commands/doctor.js');
192
170
  await doctorCommand(options);
193
171
  }));
194
172
  // Init command
@@ -211,6 +189,7 @@ program
211
189
  .option('--force', 'Overwrite existing files', false)
212
190
  .option('--json', 'Output results as JSON', false)
213
191
  .action(wrapAction(async (directory, options) => {
192
+ const { initCommand } = await import('./commands/init.js');
214
193
  await initCommand(directory, options);
215
194
  }));
216
195
  // Watch command
@@ -224,6 +203,7 @@ program
224
203
  .option('-w, --workflow <name>', 'Specific workflow name to compile')
225
204
  .option('-f, --format <format>', 'Module format: esm, cjs, or auto', 'auto')
226
205
  .action(wrapAction(async (input, options) => {
206
+ const { watchCommand } = await import('./commands/watch.js');
227
207
  if (options.workflow)
228
208
  options.workflowName = options.workflow;
229
209
  await watchCommand(input, options);
@@ -244,6 +224,7 @@ program
244
224
  .option('--framework <framework>', 'Framework for serve handler', 'express')
245
225
  .option('--port <port>', 'Port for dev server', (v) => parseInt(v, 10), 3000)
246
226
  .action(wrapAction(async (input, options) => {
227
+ const { devCommand } = await import('./commands/dev.js');
247
228
  await devCommand(input, options);
248
229
  }));
249
230
  // MCP server command
@@ -252,6 +233,7 @@ program
252
233
  .description('Start MCP server for Claude Code integration')
253
234
  .option('--stdio', 'Run in MCP stdio mode (skip interactive registration)')
254
235
  .action(wrapAction(async (options) => {
236
+ const { mcpServerCommand } = await import('../mcp/server.js');
255
237
  await mcpServerCommand(options);
256
238
  }));
257
239
  // MCP setup command
@@ -262,6 +244,7 @@ program
262
244
  .option('--all', 'Configure all detected tools without prompting')
263
245
  .option('--list', 'List detected tools without configuring')
264
246
  .action(wrapAction(async (options) => {
247
+ const { mcpSetupCommand } = await import('./commands/mcp-setup.js');
265
248
  await mcpSetupCommand(options);
266
249
  }));
267
250
  // Create command (with subcommands)
@@ -280,6 +263,7 @@ createCmd
280
263
  .option('--input <name>', 'Custom input port name (default: "data")')
281
264
  .option('--output <name>', 'Custom output port name (default: "result")')
282
265
  .action(wrapAction(async (template, file, options) => {
266
+ const { createWorkflowCommand } = await import('./commands/create.js');
283
267
  await createWorkflowCommand(template, file, options);
284
268
  }));
285
269
  createCmd
@@ -291,6 +275,7 @@ createCmd
291
275
  .option('--strategy <strategy>', 'Template strategy (e.g. mock, callback, webhook)')
292
276
  .option('--config <json>', 'Additional configuration (JSON)')
293
277
  .action(wrapAction(async (name, file, options) => {
278
+ const { createNodeCommand } = await import('./commands/create.js');
294
279
  await createNodeCommand(name, file, options);
295
280
  }));
296
281
  // Modify command (with subcommands)
@@ -302,6 +287,7 @@ modifyCmd
302
287
  .requiredOption('--nodeId <id>', 'Node instance ID')
303
288
  .requiredOption('--nodeType <type>', 'Node type name')
304
289
  .action(wrapAction(async (options) => {
290
+ const { modifyAddNodeCommand } = await import('./commands/modify.js');
305
291
  await modifyAddNodeCommand(options.file, options);
306
292
  }));
307
293
  modifyCmd
@@ -310,6 +296,7 @@ modifyCmd
310
296
  .requiredOption('--file <path>', 'Workflow file')
311
297
  .requiredOption('--nodeId <id>', 'Node instance ID')
312
298
  .action(wrapAction(async (options) => {
299
+ const { modifyRemoveNodeCommand } = await import('./commands/modify.js');
313
300
  await modifyRemoveNodeCommand(options.file, options);
314
301
  }));
315
302
  modifyCmd
@@ -319,6 +306,7 @@ modifyCmd
319
306
  .requiredOption('--from <node.port>', 'Source (e.g. nodeA.output)')
320
307
  .requiredOption('--to <node.port>', 'Target (e.g. nodeB.input)')
321
308
  .action(wrapAction(async (options) => {
309
+ const { modifyAddConnectionCommand } = await import('./commands/modify.js');
322
310
  await modifyAddConnectionCommand(options.file, options);
323
311
  }));
324
312
  modifyCmd
@@ -328,6 +316,7 @@ modifyCmd
328
316
  .requiredOption('--from <node.port>', 'Source (e.g. nodeA.output)')
329
317
  .requiredOption('--to <node.port>', 'Target (e.g. nodeB.input)')
330
318
  .action(wrapAction(async (options) => {
319
+ const { modifyRemoveConnectionCommand } = await import('./commands/modify.js');
331
320
  await modifyRemoveConnectionCommand(options.file, options);
332
321
  }));
333
322
  modifyCmd
@@ -337,6 +326,7 @@ modifyCmd
337
326
  .requiredOption('--oldId <id>', 'Current node ID')
338
327
  .requiredOption('--newId <id>', 'New node ID')
339
328
  .action(wrapAction(async (options) => {
329
+ const { modifyRenameNodeCommand } = await import('./commands/modify.js');
340
330
  await modifyRenameNodeCommand(options.file, options);
341
331
  }));
342
332
  modifyCmd
@@ -347,6 +337,7 @@ modifyCmd
347
337
  .requiredOption('--x <number>', 'X coordinate')
348
338
  .requiredOption('--y <number>', 'Y coordinate')
349
339
  .action(wrapAction(async (options) => {
340
+ const { modifySetPositionCommand } = await import('./commands/modify.js');
350
341
  await modifySetPositionCommand(options.file, options);
351
342
  }));
352
343
  modifyCmd
@@ -356,6 +347,7 @@ modifyCmd
356
347
  .requiredOption('--nodeId <id>', 'Node instance ID')
357
348
  .requiredOption('--label <text>', 'Display label')
358
349
  .action(wrapAction(async (options) => {
350
+ const { modifySetLabelCommand } = await import('./commands/modify.js');
359
351
  await modifySetLabelCommand(options.file, options);
360
352
  }));
361
353
  // Templates command
@@ -364,6 +356,7 @@ program
364
356
  .description('List available templates')
365
357
  .option('--json', 'Output as JSON', false)
366
358
  .action(wrapAction(async (options) => {
359
+ const { templatesCommand } = await import('./commands/templates.js');
367
360
  await templatesCommand(options);
368
361
  }));
369
362
  // Grammar command
@@ -373,6 +366,7 @@ program
373
366
  .addOption(new Option('-f, --format <format>', 'Output format').choices(['html', 'ebnf']))
374
367
  .option('-o, --output <path>', 'Write output to file instead of stdout')
375
368
  .action(wrapAction(async (options) => {
369
+ const { grammarCommand } = await import('./commands/grammar.js');
376
370
  await grammarCommand(options);
377
371
  }));
378
372
  // Pattern command (with subcommands)
@@ -382,6 +376,7 @@ patternCmd
382
376
  .description('List patterns in a file or directory')
383
377
  .option('--json', 'Output as JSON', false)
384
378
  .action(wrapAction(async (inputPath, options) => {
379
+ const { patternListCommand } = await import('./commands/pattern.js');
385
380
  await patternListCommand(inputPath, options);
386
381
  }));
387
382
  patternCmd
@@ -391,6 +386,7 @@ patternCmd
391
386
  .option('--prefix <prefix>', 'Prefix for node instance IDs')
392
387
  .option('-n, --name <name>', 'Specific pattern name to apply')
393
388
  .action(wrapAction(async (patternFile, targetFile, options) => {
389
+ const { patternApplyCommand } = await import('./commands/pattern.js');
394
390
  await patternApplyCommand(patternFile, targetFile, options);
395
391
  }));
396
392
  patternCmd
@@ -401,6 +397,7 @@ patternCmd
401
397
  .option('-n, --name <name>', 'Pattern name')
402
398
  .option('-p, --preview', 'Preview pattern without writing', false)
403
399
  .action(wrapAction(async (sourceFile, options) => {
400
+ const { patternExtractCommand } = await import('./commands/pattern.js');
404
401
  await patternExtractCommand(sourceFile, options);
405
402
  }));
406
403
  // Run command
@@ -422,6 +419,7 @@ program
422
419
  .option('--resume [file]', 'Resume from a checkpoint file (auto-detects latest if no file)')
423
420
  .option('-b, --breakpoint <nodeIds...>', 'Set initial breakpoints (repeatable)')
424
421
  .action(wrapAction(async (input, options) => {
422
+ const { runCommand } = await import('./commands/run.js');
425
423
  await runCommand(input, options);
426
424
  }));
427
425
  // Serve command
@@ -436,6 +434,7 @@ program
436
434
  .option('--cors <origin>', 'CORS origin', '*')
437
435
  .option('--swagger', 'Enable Swagger UI at /docs', false)
438
436
  .action(wrapAction(async (directory, options) => {
437
+ const { serveCommand } = await import('./commands/serve.js');
439
438
  await serveCommand(directory, {
440
439
  port: parseInt(options.port, 10),
441
440
  host: options.host,
@@ -460,6 +459,7 @@ program
460
459
  .option('--docs', 'Include API documentation routes (/docs and /openapi.json)', false)
461
460
  .option('--durable-steps', 'Use deep generator with per-node durable steps', false)
462
461
  .action(wrapAction(async (input, options) => {
462
+ const { exportCommand } = await import('./commands/export.js');
463
463
  await exportCommand(input, options);
464
464
  }));
465
465
  // OpenAPI command
@@ -473,6 +473,7 @@ program
473
473
  .option('-f, --format <format>', 'Output format: json, yaml', 'json')
474
474
  .option('--server <url>', 'Server URL')
475
475
  .action(wrapAction(async (directory, options) => {
476
+ const { openapiCommand } = await import('./commands/openapi.js');
476
477
  await openapiCommand(directory, options);
477
478
  }));
478
479
  // Plugin command group
@@ -485,6 +486,7 @@ pluginCmd
485
486
  .option('-p, --preview', 'Preview generated files without writing', false)
486
487
  .option('--force', 'Overwrite existing files', false)
487
488
  .action(wrapAction(async (name, options) => {
489
+ const { pluginInitCommand } = await import('./commands/plugin.js');
488
490
  await pluginInitCommand(name, options);
489
491
  }));
490
492
  // Migrate command
@@ -494,6 +496,7 @@ program
494
496
  .option('--dry-run', 'Preview changes without writing files', false)
495
497
  .option('--diff', 'Show semantic diff before/after', false)
496
498
  .action(wrapAction(async (glob, options) => {
499
+ const { migrateCommand } = await import('./commands/migrate.js');
497
500
  await migrateCommand(glob, options);
498
501
  }));
499
502
  // Status command
@@ -503,6 +506,7 @@ program
503
506
  .option('-w, --workflow <name>', 'Specific workflow name')
504
507
  .option('--json', 'Output as JSON', false)
505
508
  .action(wrapAction(async (input, options) => {
509
+ const { statusCommand } = await import('./commands/status.js');
506
510
  if (options.workflow)
507
511
  options.workflowName = options.workflow;
508
512
  await statusCommand(input, options);
@@ -519,6 +523,7 @@ program
519
523
  if (!nodeName) {
520
524
  throw new Error('Node name is required (as positional arg or --nodeId flag)');
521
525
  }
526
+ const { implementCommand } = await import('./commands/implement.js');
522
527
  if (options.workflow)
523
528
  options.workflowName = options.workflow;
524
529
  await implementCommand(input, nodeName, options);
@@ -531,6 +536,7 @@ program
531
536
  .option('--since <date>', 'Date-based range (e.g., "2024-01-01")')
532
537
  .option('-r, --range <range>', 'Custom git range (e.g., "v0.1.0..HEAD")')
533
538
  .action(wrapAction(async (options) => {
539
+ const { changelogCommand } = await import('./commands/changelog.js');
534
540
  await changelogCommand(options);
535
541
  }));
536
542
  // Docs command: fw docs [topic] | fw docs search <query>
@@ -540,6 +546,7 @@ program
540
546
  .option('--json', 'Output as JSON', false)
541
547
  .option('--compact', 'Return compact LLM-friendly version', false)
542
548
  .action(wrapAction(async (args, options) => {
549
+ const { docsListCommand, docsReadCommand, docsSearchCommand } = await import('./commands/docs.js');
543
550
  if (args.length === 0 || args[0] === 'list') {
544
551
  await docsListCommand(options);
545
552
  }
@@ -566,6 +573,7 @@ program
566
573
  .option('-o, --output <path>', 'Write to file instead of stdout')
567
574
  .option('--list', 'List available presets and exit')
568
575
  .action(wrapAction(async (preset, options) => {
576
+ const { contextCommand } = await import('./commands/context.js');
569
577
  await contextCommand(preset, options);
570
578
  }));
571
579
  // Marketplace command group
@@ -577,6 +585,7 @@ marketCmd
577
585
  .option('-a, --author <author>', 'Author name')
578
586
  .option('-y, --yes', 'Skip prompts and use defaults', false)
579
587
  .action(wrapAction(async (name, options) => {
588
+ const { marketInitCommand } = await import('./commands/market.js');
580
589
  await marketInitCommand(name, options);
581
590
  }));
582
591
  marketCmd
@@ -585,6 +594,7 @@ marketCmd
585
594
  .option('--json', 'Output results as JSON', false)
586
595
  .option('--verbose', 'Show parse warnings', false)
587
596
  .action(wrapAction(async (directory, options) => {
597
+ const { marketPackCommand } = await import('./commands/market.js');
588
598
  await marketPackCommand(directory, options);
589
599
  }));
590
600
  marketCmd
@@ -593,6 +603,7 @@ marketCmd
593
603
  .option('--dry-run', 'Preview without publishing', false)
594
604
  .option('--tag <tag>', 'npm dist-tag')
595
605
  .action(wrapAction(async (directory, options) => {
606
+ const { marketPublishCommand } = await import('./commands/market.js');
596
607
  await marketPublishCommand(directory, options);
597
608
  }));
598
609
  marketCmd
@@ -600,6 +611,7 @@ marketCmd
600
611
  .description('Install a marketplace package')
601
612
  .option('--json', 'Output results as JSON', false)
602
613
  .action(wrapAction(async (packageSpec, options) => {
614
+ const { marketInstallCommand } = await import('./commands/market.js');
603
615
  await marketInstallCommand(packageSpec, options);
604
616
  }));
605
617
  marketCmd
@@ -609,6 +621,7 @@ marketCmd
609
621
  .option('-r, --registry <url>', 'Custom registry search URL (e.g., private npm registry)')
610
622
  .option('--json', 'Output as JSON', false)
611
623
  .action(wrapAction(async (query, options) => {
624
+ const { marketSearchCommand } = await import('./commands/market.js');
612
625
  await marketSearchCommand(query, { ...options, limit: parseInt(options.limit, 10) });
613
626
  }));
614
627
  marketCmd
@@ -616,6 +629,7 @@ marketCmd
616
629
  .description('List installed marketplace packages')
617
630
  .option('--json', 'Output as JSON', false)
618
631
  .action(wrapAction(async (options) => {
632
+ const { marketListCommand } = await import('./commands/market.js');
619
633
  await marketListCommand(options);
620
634
  }));
621
635
  // Concise examples appended to --help
@@ -48,7 +48,7 @@ const documentStore: Document[] = [
48
48
  * @input query [order:1] - Search query
49
49
  * @input [topK] [order:2] - Number of results (default 3)
50
50
  * @input execute [order:0] - Execute
51
- * @output documents [order:2] - Retrieved documents
51
+ * @output documents [order:2] [hidden] - Retrieved documents
52
52
  * @output context [order:3] - Combined document text
53
53
  * @output onSuccess [order:0] - On Success
54
54
  * @output onFailure [order:1] - On Failure
@@ -2,6 +2,25 @@
2
2
  * Human-readable diff formatter for workflow diffs.
3
3
  */
4
4
  import { IMPACT_DESCRIPTIONS, getImpactReasons } from './impact.js';
5
+ import pc from 'picocolors';
6
+ // Colorize diff symbols: green for added, red for removed, yellow for modified
7
+ function colorSymbol(symbol, text) {
8
+ switch (symbol) {
9
+ case '+': return pc.green(`${symbol} ${text}`);
10
+ case '-': return pc.red(`${symbol} ${text}`);
11
+ case '~': return pc.yellow(`${symbol} ${text}`);
12
+ default: return `${symbol} ${text}`;
13
+ }
14
+ }
15
+ function impactColor(impact) {
16
+ switch (impact) {
17
+ case 'CRITICAL': return pc.red(pc.bold(impact));
18
+ case 'BREAKING': return pc.red(impact);
19
+ case 'MINOR': return pc.yellow(impact);
20
+ case 'COSMETIC': return pc.dim(impact);
21
+ default: return impact;
22
+ }
23
+ }
5
24
  /**
6
25
  * Format a workflow diff for display
7
26
  */
@@ -41,7 +60,7 @@ function formatCompact(diff) {
41
60
  parts.push(`+${summary.connectionsAdded} conns`);
42
61
  if (summary.connectionsRemoved > 0)
43
62
  parts.push(`-${summary.connectionsRemoved} conns`);
44
- return `[${diff.impact}] ${parts.join(', ')}`;
63
+ return `[${impactColor(diff.impact)}] ${parts.join(', ')}`;
45
64
  }
46
65
  /**
47
66
  * Full text format
@@ -50,11 +69,11 @@ function formatText(diff) {
50
69
  const lines = [];
51
70
  // Header
52
71
  lines.push('═══════════════════════════════════════════════════════════════');
53
- lines.push(` WORKFLOW DIFF - Impact: ${diff.impact}`);
72
+ lines.push(` WORKFLOW DIFF - Impact: ${impactColor(diff.impact)}`);
54
73
  lines.push('═══════════════════════════════════════════════════════════════');
55
74
  lines.push('');
56
75
  if (diff.identical) {
57
- lines.push(' ✓ Workflows are semantically identical');
76
+ lines.push(pc.green(' ✓ Workflows are semantically identical'));
58
77
  lines.push('');
59
78
  return lines.join('\n');
60
79
  }
@@ -106,22 +125,22 @@ function formatText(diff) {
106
125
  lines.push(' WORKFLOW PORTS');
107
126
  lines.push(' ───────────────────────────────────────────────────────────');
108
127
  if (diff.startPorts.added.length > 0) {
109
- lines.push(` + Start ports added: ${diff.startPorts.added.map(p => p.name).join(', ')}`);
128
+ lines.push(' ' + colorSymbol('+', `Start ports added: ${diff.startPorts.added.map(p => p.name).join(', ')}`));
110
129
  }
111
130
  if (diff.startPorts.removed.length > 0) {
112
- lines.push(` - Start ports removed: ${diff.startPorts.removed.map(p => p.name).join(', ')}`);
131
+ lines.push(' ' + colorSymbol('-', `Start ports removed: ${diff.startPorts.removed.map(p => p.name).join(', ')}`));
113
132
  }
114
133
  if (diff.startPorts.modified.length > 0) {
115
- lines.push(` ~ Start ports modified: ${diff.startPorts.modified.map(p => p.name).join(', ')}`);
134
+ lines.push(' ' + colorSymbol('~', `Start ports modified: ${diff.startPorts.modified.map(p => p.name).join(', ')}`));
116
135
  }
117
136
  if (diff.exitPorts.added.length > 0) {
118
- lines.push(` + Exit ports added: ${diff.exitPorts.added.map(p => p.name).join(', ')}`);
137
+ lines.push(' ' + colorSymbol('+', `Exit ports added: ${diff.exitPorts.added.map(p => p.name).join(', ')}`));
119
138
  }
120
139
  if (diff.exitPorts.removed.length > 0) {
121
- lines.push(` - Exit ports removed: ${diff.exitPorts.removed.map(p => p.name).join(', ')}`);
140
+ lines.push(' ' + colorSymbol('-', `Exit ports removed: ${diff.exitPorts.removed.map(p => p.name).join(', ')}`));
122
141
  }
123
142
  if (diff.exitPorts.modified.length > 0) {
124
- lines.push(` ~ Exit ports modified: ${diff.exitPorts.modified.map(p => p.name).join(', ')}`);
143
+ lines.push(' ' + colorSymbol('~', `Exit ports modified: ${diff.exitPorts.modified.map(p => p.name).join(', ')}`));
125
144
  }
126
145
  lines.push('');
127
146
  }
@@ -131,7 +150,7 @@ function formatText(diff) {
131
150
  lines.push(' ───────────────────────────────────────────────────────────');
132
151
  for (const scope of diff.scopes) {
133
152
  const symbol = scope.changeType === 'ADDED' ? '+' : scope.changeType === 'REMOVED' ? '-' : '~';
134
- lines.push(` ${symbol} ${scope.name}`);
153
+ lines.push(' ' + colorSymbol(symbol, scope.name));
135
154
  }
136
155
  lines.push('');
137
156
  }
@@ -149,7 +168,7 @@ function formatText(diff) {
149
168
  }
150
169
  function formatNodeType(nt) {
151
170
  const symbol = nt.changeType === 'ADDED' ? '+' : nt.changeType === 'REMOVED' ? '-' : '~';
152
- let line = ` ${symbol} ${nt.name}`;
171
+ let text = nt.name;
153
172
  if (nt.changeType === 'MODIFIED') {
154
173
  const details = [];
155
174
  if (nt.changes.functionName)
@@ -181,14 +200,14 @@ function formatNodeType(nt) {
181
200
  details.push(`~outputs: ${modified.join(', ')}`);
182
201
  }
183
202
  if (details.length > 0) {
184
- line += ` (${details.join('; ')})`;
203
+ text += ` (${details.join('; ')})`;
185
204
  }
186
205
  }
187
- return line;
206
+ return ' ' + colorSymbol(symbol, text);
188
207
  }
189
208
  function formatInstance(inst) {
190
209
  const symbol = inst.changeType === 'ADDED' ? '+' : inst.changeType === 'REMOVED' ? '-' : '~';
191
- let line = ` ${symbol} ${inst.id}`;
210
+ let text = inst.id;
192
211
  if (inst.changeType === 'MODIFIED') {
193
212
  const details = [];
194
213
  if (inst.changes.nodeType) {
@@ -206,15 +225,15 @@ function formatInstance(inst) {
206
225
  details.push(`portConfigs changed`);
207
226
  }
208
227
  if (details.length > 0) {
209
- line += ` (${details.join('; ')})`;
228
+ text += ` (${details.join('; ')})`;
210
229
  }
211
230
  }
212
- return line;
231
+ return ' ' + colorSymbol(symbol, text);
213
232
  }
214
233
  function formatConnection(conn) {
215
234
  const symbol = conn.changeType === 'ADDED' ? '+' : '-';
216
235
  const fromScope = conn.from.scope ? `:${conn.from.scope}` : '';
217
236
  const toScope = conn.to.scope ? `:${conn.to.scope}` : '';
218
- return ` ${symbol} ${conn.from.node}.${conn.from.port}${fromScope} → ${conn.to.node}.${conn.to.port}${toScope}`;
237
+ return ' ' + colorSymbol(symbol, `${conn.from.node}.${conn.from.port}${fromScope} → ${conn.to.node}.${conn.to.port}${toScope}`);
219
238
  }
220
239
  //# sourceMappingURL=formatDiff.js.map
@@ -179,7 +179,7 @@ export const CLI_COMMANDS = [
179
179
  description: 'Create a new flow-weaver project with templates and config',
180
180
  options: [
181
181
  { flags: '-n, --name', arg: '<name>', description: 'Project name (defaults to directory name)' },
182
- { flags: '-t, --template', arg: workflowTemplates.map(t => t.id).join('|'), description: 'Workflow template', defaultValue: 'simple' },
182
+ { flags: '-t, --template', arg: workflowTemplates.map(t => t.id).join('|'), description: 'Workflow template', defaultValue: 'sequential' },
183
183
  { flags: '-f, --format', arg: 'esm|cjs', description: 'Module format', defaultValue: 'esm' },
184
184
  { flags: '-y, --yes', description: 'Skip prompts, use defaults' },
185
185
  { flags: '--install / --no-install', description: 'Run npm install after scaffolding' },
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Core metadata extractor.
3
+ *
4
+ * Provides runtime-accessible arrays and objects for data types, strategies,
5
+ * reserved names, templates, and package exports — derived from the actual
6
+ * source constants so documentation stays in sync automatically.
7
+ */
8
+ import { RESERVED_NODE_NAMES, RESERVED_PORT_NAMES, SCOPED_PORT_NAMES, EXECUTION_STRATEGIES, BRANCHING_STRATEGIES, VALID_NODE_COLORS } from '../../constants.js';
9
+ import { type WorkflowTemplate, type NodeTemplate } from '../../cli/templates/index.js';
10
+ /** All supported port data types (runtime array, mirrors TDataType union). */
11
+ export declare const DATA_TYPES: readonly ["STRING", "NUMBER", "BOOLEAN", "OBJECT", "ARRAY", "FUNCTION", "STEP", "ANY"];
12
+ /** All supported merge strategies (runtime array, mirrors TMergeStrategy union). */
13
+ export declare const MERGE_STRATEGIES: readonly ["FIRST", "LAST", "COLLECT", "MERGE", "CONCAT"];
14
+ /** All supported branching strategies (runtime array, mirrors TBranchingStrategy union). */
15
+ export declare const BRANCHING_STRATEGY_VALUES: readonly ["value-based", "exception-based", "none"];
16
+ /** All supported execution strategies (runtime array, mirrors TExecuteWhen union). */
17
+ export declare const EXECUTION_STRATEGY_VALUES: readonly ["CONJUNCTION", "DISJUNCTION", "CUSTOM"];
18
+ export { RESERVED_NODE_NAMES, RESERVED_PORT_NAMES, SCOPED_PORT_NAMES };
19
+ export { EXECUTION_STRATEGIES, BRANCHING_STRATEGIES, VALID_NODE_COLORS };
20
+ /** Summary of a workflow template (without the generate function). */
21
+ export interface TemplateSummary {
22
+ id: string;
23
+ name: string;
24
+ description: string;
25
+ category: string;
26
+ }
27
+ /** All registered workflow templates (id, name, description, category). */
28
+ export declare const WORKFLOW_TEMPLATES: TemplateSummary[];
29
+ /** All registered node templates (id, name, description, category). */
30
+ export declare const NODE_TEMPLATES: TemplateSummary[];
31
+ export type { WorkflowTemplate, NodeTemplate };
32
+ /** All named export subpaths from @synergenius/flow-weaver/package.json. */
33
+ export declare const PACKAGE_EXPORTS: readonly [{
34
+ readonly subpath: ".";
35
+ readonly description: "Core library (parser, validator, compiler)";
36
+ }, {
37
+ readonly subpath: "./runtime";
38
+ readonly description: "Workflow runtime executor";
39
+ }, {
40
+ readonly subpath: "./built-in-nodes";
41
+ readonly description: "Standard node type library";
42
+ }, {
43
+ readonly subpath: "./diagram";
44
+ readonly description: "Diagram rendering (SVG/Mermaid)";
45
+ }, {
46
+ readonly subpath: "./describe";
47
+ readonly description: "Workflow description formatter";
48
+ }, {
49
+ readonly subpath: "./doc-metadata";
50
+ readonly description: "Documentation metadata extractors";
51
+ }, {
52
+ readonly subpath: "./docs";
53
+ readonly description: "Documentation generation utilities";
54
+ }, {
55
+ readonly subpath: "./ast";
56
+ readonly description: "AST type definitions and builders";
57
+ }, {
58
+ readonly subpath: "./api";
59
+ readonly description: "Public API (parseWorkflow, validateWorkflow, etc.)";
60
+ }, {
61
+ readonly subpath: "./diff";
62
+ readonly description: "Workflow semantic diff engine";
63
+ }, {
64
+ readonly subpath: "./editor";
65
+ readonly description: "Editor completions and diagnostics";
66
+ }, {
67
+ readonly subpath: "./browser";
68
+ readonly description: "Browser-compatible JSDoc port sync";
69
+ }, {
70
+ readonly subpath: "./generated-branding";
71
+ readonly description: "Generated branding configuration";
72
+ }, {
73
+ readonly subpath: "./npm-packages";
74
+ readonly description: "NPM package metadata";
75
+ }, {
76
+ readonly subpath: "./deployment";
77
+ readonly description: "Deployment target configurations";
78
+ }, {
79
+ readonly subpath: "./marketplace";
80
+ readonly description: "Extension/pack marketplace APIs";
81
+ }, {
82
+ readonly subpath: "./testing";
83
+ readonly description: "Testing utilities";
84
+ }, {
85
+ readonly subpath: "./generator";
86
+ readonly description: "Code generation";
87
+ }, {
88
+ readonly subpath: "./constants";
89
+ readonly description: "Constants and reserved names";
90
+ }, {
91
+ readonly subpath: "./cli";
92
+ readonly description: "CLI command definitions";
93
+ }, {
94
+ readonly subpath: "./executor";
95
+ readonly description: "MCP workflow executor";
96
+ }, {
97
+ readonly subpath: "./context";
98
+ readonly description: "LLM context generation";
99
+ }];
100
+ //# sourceMappingURL=core-metadata.d.ts.map