@kairos-sdk/core 0.5.0 → 0.6.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 (44) hide show
  1. package/README.md +131 -16
  2. package/dist/{chunk-KIFT5LA7.js → chunk-2ZHNO37N.js} +49 -5
  3. package/dist/chunk-2ZHNO37N.js.map +1 -0
  4. package/dist/chunk-GG4B4TYG.js +153 -0
  5. package/dist/chunk-GG4B4TYG.js.map +1 -0
  6. package/dist/{chunk-5GAY7CSJ.js → chunk-PCNW5ZUD.js} +2 -2
  7. package/dist/chunk-SC6CLQZB.js +144 -0
  8. package/dist/chunk-SC6CLQZB.js.map +1 -0
  9. package/dist/chunk-SQS4QHDH.js +44 -0
  10. package/dist/chunk-SQS4QHDH.js.map +1 -0
  11. package/dist/{chunk-EVOAYH2K.js → chunk-STG7Z2SS.js} +2 -2
  12. package/dist/{chunk-HBGZTUUZ.js → chunk-YOQTEVDB.js} +5 -7
  13. package/dist/chunk-YOQTEVDB.js.map +1 -0
  14. package/dist/cli.cjs +702 -40
  15. package/dist/cli.cjs.map +1 -1
  16. package/dist/cli.js +262 -7
  17. package/dist/cli.js.map +1 -1
  18. package/dist/index.cjs +417 -39
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +86 -4
  21. package/dist/index.d.ts +86 -4
  22. package/dist/index.js +19 -5
  23. package/dist/mcp-server.cjs +139 -24
  24. package/dist/mcp-server.cjs.map +1 -1
  25. package/dist/mcp-server.js +90 -19
  26. package/dist/mcp-server.js.map +1 -1
  27. package/dist/pack-builder-RTQWXGIS.js +9 -0
  28. package/dist/pack-builder-RTQWXGIS.js.map +1 -0
  29. package/dist/pack-exporter-KFNLSP5V.js +7 -0
  30. package/dist/pack-exporter-KFNLSP5V.js.map +1 -0
  31. package/dist/pack-validator-HZPB2XJ3.js +7 -0
  32. package/dist/pack-validator-HZPB2XJ3.js.map +1 -0
  33. package/dist/{reader-B5mV20H6.d.ts → reader-CfWGpL4V.d.cts} +2 -1
  34. package/dist/{reader-B5mV20H6.d.cts → reader-CfWGpL4V.d.ts} +2 -1
  35. package/dist/standalone.cjs +44 -4
  36. package/dist/standalone.cjs.map +1 -1
  37. package/dist/standalone.d.cts +1 -1
  38. package/dist/standalone.d.ts +1 -1
  39. package/dist/standalone.js +2 -2
  40. package/package.json +12 -5
  41. package/dist/chunk-HBGZTUUZ.js.map +0 -1
  42. package/dist/chunk-KIFT5LA7.js.map +0 -1
  43. /package/dist/{chunk-5GAY7CSJ.js.map → chunk-PCNW5ZUD.js.map} +0 -0
  44. /package/dist/{chunk-EVOAYH2K.js.map → chunk-STG7Z2SS.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Kairos
4
- } from "./chunk-HBGZTUUZ.js";
5
- import "./chunk-EVOAYH2K.js";
4
+ } from "./chunk-YOQTEVDB.js";
5
+ import "./chunk-STG7Z2SS.js";
6
6
  import {
7
7
  TemplateSyncer
8
- } from "./chunk-5GAY7CSJ.js";
8
+ } from "./chunk-PCNW5ZUD.js";
9
9
  import {
10
10
  FileLibrary,
11
11
  PatternAnalyzer
12
- } from "./chunk-KIFT5LA7.js";
12
+ } from "./chunk-2ZHNO37N.js";
13
13
 
14
14
  // src/cli.ts
15
15
  var HELP = `
@@ -18,6 +18,9 @@ Kairos SDK \u2014 LLM-powered n8n workflow generation
18
18
  Usage:
19
19
  kairos init First-time setup wizard
20
20
  kairos build <description> [options]
21
+ kairos build-pack <business context> [options]
22
+ kairos pack export <name> [--handoff]
23
+ kairos validate-pack <name>
21
24
  kairos replace <n8n-id> <description>
22
25
  kairos patterns [options]
23
26
  kairos sessions [options]
@@ -32,6 +35,17 @@ Build options:
32
35
  --dry-run Generate and validate without deploying
33
36
  --name <name> Override the generated workflow name
34
37
  --activate Activate the workflow after deployment
38
+ --smoke-test After deploy, trigger the workflow and verify it runs without error
39
+
40
+ Build-pack options:
41
+ --dry-run Plan and validate without deploying
42
+ --activate Activate each workflow after deployment (blocked if blocking assumptions exist)
43
+ --yes Skip confirmation prompt and build immediately
44
+
45
+ Pack options:
46
+ pack export <name> Print the saved pack as JSON
47
+ pack export <name> --handoff Generate a client-ready Markdown handoff document
48
+ validate-pack <name> Cross-workflow safety check before activation
35
49
 
36
50
  Patterns options:
37
51
  --days <days> Analysis window (default: 30)
@@ -125,7 +139,7 @@ function createDryRunClient() {
125
139
  async function handleBuild(positional, flags) {
126
140
  const description = positional.join(" ");
127
141
  if (!description) {
128
- console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]");
142
+ console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate] [--smoke-test]");
129
143
  process.exit(1);
130
144
  }
131
145
  const isDryRun = flags["dry-run"] === true;
@@ -135,7 +149,8 @@ async function handleBuild(positional, flags) {
135
149
  const result = await kairos.build(description, {
136
150
  dryRun: isDryRun,
137
151
  ...typeof flags["name"] === "string" ? { name: flags["name"] } : {},
138
- activate: flags["activate"] === true
152
+ activate: flags["activate"] === true || flags["smoke-test"] === true,
153
+ smokeTest: flags["smoke-test"] === true
139
154
  });
140
155
  await kairos.drain();
141
156
  const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
@@ -148,7 +163,8 @@ async function handleBuild(positional, flags) {
148
163
  activationRequired: result.activationRequired,
149
164
  dryRun: result.dryRun,
150
165
  credentialsNeeded: result.credentialsNeeded,
151
- ...result.dryRun ? { workflow: result.workflow } : {}
166
+ ...result.dryRun ? { workflow: result.workflow } : {},
167
+ ...result.smokeTest ? { smokeTest: result.smokeTest } : {}
152
168
  }, null, 2));
153
169
  }
154
170
  async function handleReplace(positional) {
@@ -362,6 +378,210 @@ Recent Sessions (last ${sessions.length})`);
362
378
  console.log(`${s.date} ${status}${nameStr}${attemptsStr}${typeTag}${rulesStr}`);
363
379
  }
364
380
  }
381
+ function printPackResult(result) {
382
+ const line = "\u2500".repeat(50);
383
+ const deployed = result.workflows.filter((w) => w.deployed).length;
384
+ const total = result.workflows.length;
385
+ console.error(`
386
+ ${result.businessContext} \u2014 Workflow Pack`);
387
+ console.error("\u2550".repeat(Math.min(result.businessContext.length + 18, 60)));
388
+ console.error(`Status: ${result.status}`);
389
+ const blocking = result.assumptions.filter((a) => a.type === "blocking");
390
+ if (blocking.length > 0) {
391
+ console.error(`
392
+ \u26A0 Blocking Issues (${blocking.length}) \u2014 resolve before activating`);
393
+ console.error(line);
394
+ for (const a of blocking) {
395
+ console.error(` \u2717 ${a.text}`);
396
+ }
397
+ }
398
+ console.error(`
399
+ Workflows Built (${deployed}/${total})`);
400
+ console.error(line);
401
+ for (const wf of result.workflows) {
402
+ const icon = wf.error ? "\u2717" : "\u2713";
403
+ const idStr = wf.workflowId ? ` [${wf.workflowId}]` : "";
404
+ const attStr = wf.generationAttempts > 1 ? ` ${wf.generationAttempts} attempts` : "";
405
+ console.error(` ${icon} ${wf.name}${idStr}${attStr}`);
406
+ console.error(` ${wf.purpose}`);
407
+ if (wf.error) console.error(` Error: ${wf.error}`);
408
+ }
409
+ if (result.allCredentials.length > 0) {
410
+ console.error(`
411
+ Credentials Needed (connect once in n8n)`);
412
+ console.error(line);
413
+ for (const cred of result.allCredentials) {
414
+ console.error(` \u25A1 ${cred.service}`);
415
+ }
416
+ }
417
+ if (result.sheetsColumns.length > 0) {
418
+ console.error(`
419
+ Google Sheets Required`);
420
+ console.error(line);
421
+ for (const sheet of result.sheetsColumns) {
422
+ console.error(` \u25A1 ${sheet.sheet}: ${sheet.columns.join(", ")}`);
423
+ }
424
+ }
425
+ const needsConfirmation = result.assumptions.filter((a) => a.type === "needs_confirmation");
426
+ if (needsConfirmation.length > 0) {
427
+ console.error(`
428
+ Needs Confirmation Before Going Live`);
429
+ console.error(line);
430
+ for (const a of needsConfirmation) {
431
+ console.error(` ? ${a.text}`);
432
+ }
433
+ }
434
+ const safe = result.assumptions.filter((a) => a.type === "safe");
435
+ if (safe.length > 0) {
436
+ console.error(`
437
+ Safe Assumptions`);
438
+ console.error(line);
439
+ for (const a of safe) {
440
+ console.error(` - ${a.text}`);
441
+ }
442
+ }
443
+ if (result.testChecklist.length > 0) {
444
+ console.error(`
445
+ Test Checklist`);
446
+ console.error(line);
447
+ for (const item of result.testChecklist) {
448
+ console.error(` ${item.workflow}`);
449
+ for (const step of item.steps) {
450
+ console.error(` \u25A1 ${step}`);
451
+ }
452
+ }
453
+ }
454
+ }
455
+ async function handleBuildPack(positional, flags) {
456
+ const businessContext = positional.join(" ");
457
+ if (!businessContext) {
458
+ console.error("Usage: kairos build-pack <business context description> [--dry-run] [--activate] [--yes]");
459
+ process.exit(1);
460
+ }
461
+ const anthropicKey = getEnvOrExit("ANTHROPIC_API_KEY");
462
+ const { PackBuilder } = await import("./pack-builder-RTQWXGIS.js");
463
+ const isDryRun = flags["dry-run"] === true;
464
+ const kairos = isDryRun ? createDryRunClient() : createClient();
465
+ const builder = new PackBuilder({ anthropicApiKey: anthropicKey, kairos });
466
+ console.error("\nPlanning workflow pack...");
467
+ const plan = await builder.plan(businessContext);
468
+ console.error(`
469
+ ${businessContext} \u2014 Planned Workflows (${plan.workflows.length})
470
+ `);
471
+ for (let i = 0; i < plan.workflows.length; i++) {
472
+ const wf = plan.workflows[i];
473
+ console.error(` ${i + 1}. ${wf.name}`);
474
+ console.error(` ${wf.purpose}`);
475
+ }
476
+ const planBlocking = plan.assumptions.filter((a) => a.type === "blocking");
477
+ const planNeedsConfirmation = plan.assumptions.filter((a) => a.type === "needs_confirmation");
478
+ if (planBlocking.length > 0) {
479
+ console.error(`
480
+ Blocking Issues (resolve before activation)`);
481
+ for (const a of planBlocking) console.error(` \u2717 ${a.text}`);
482
+ }
483
+ if (planNeedsConfirmation.length > 0) {
484
+ console.error(`
485
+ Needs Confirmation`);
486
+ for (const a of planNeedsConfirmation) console.error(` ? ${a.text}`);
487
+ }
488
+ if (flags["yes"] !== true) {
489
+ const readline = await import("readline");
490
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
491
+ const answer = await new Promise((resolve) => rl.question("\nBuild all of these? [y/N] ", resolve));
492
+ rl.close();
493
+ if (!answer.toLowerCase().startsWith("y")) {
494
+ console.error("Aborted.");
495
+ process.exit(0);
496
+ }
497
+ }
498
+ console.error("\nBuilding...\n");
499
+ const result = await builder.build(plan, {
500
+ dryRun: isDryRun,
501
+ activate: flags["activate"] === true,
502
+ onProgress: (wf, i, total) => {
503
+ console.error(` [${i + 1}/${total}] ${wf.name}...`);
504
+ }
505
+ });
506
+ printPackResult(result);
507
+ const { writeFile, mkdir } = await import("fs/promises");
508
+ const { join } = await import("path");
509
+ const { homedir } = await import("os");
510
+ const packsDir = join(homedir(), ".kairos", "packs");
511
+ await mkdir(packsDir, { recursive: true });
512
+ const packPath = join(packsDir, `${result.packName}.json`);
513
+ await writeFile(packPath, JSON.stringify(result, null, 2), "utf-8");
514
+ console.error(`
515
+ Pack saved to: ${packPath}`);
516
+ }
517
+ async function handlePackExport(positional, flags) {
518
+ const packName = positional[0];
519
+ if (!packName) {
520
+ console.error("Usage: kairos pack export <pack-name> [--handoff]");
521
+ process.exit(1);
522
+ }
523
+ const { readFile } = await import("fs/promises");
524
+ const { join } = await import("path");
525
+ const { homedir } = await import("os");
526
+ const packPath = join(homedir(), ".kairos", "packs", `${packName}.json`);
527
+ let pack;
528
+ try {
529
+ const content = await readFile(packPath, "utf-8");
530
+ pack = JSON.parse(content);
531
+ } catch {
532
+ console.error(`Pack not found: ${packPath}`);
533
+ console.error('Run "kairos build-pack <context>" to create one.');
534
+ process.exit(1);
535
+ }
536
+ if (flags["handoff"] === true) {
537
+ const { generateHandoff } = await import("./pack-exporter-KFNLSP5V.js");
538
+ console.log(generateHandoff(pack));
539
+ } else {
540
+ console.log(JSON.stringify(pack, null, 2));
541
+ }
542
+ }
543
+ async function handleValidatePack(positional) {
544
+ const packName = positional[0];
545
+ if (!packName) {
546
+ console.error("Usage: kairos validate-pack <pack-name>");
547
+ process.exit(1);
548
+ }
549
+ const { readFile } = await import("fs/promises");
550
+ const { join } = await import("path");
551
+ const { homedir } = await import("os");
552
+ const packPath = join(homedir(), ".kairos", "packs", `${packName}.json`);
553
+ let pack;
554
+ try {
555
+ const content = await readFile(packPath, "utf-8");
556
+ pack = JSON.parse(content);
557
+ } catch {
558
+ console.error(`Pack not found: ${packPath}`);
559
+ console.error('Run "kairos build-pack <context>" to create one.');
560
+ process.exit(1);
561
+ }
562
+ const { validatePack } = await import("./pack-validator-HZPB2XJ3.js");
563
+ const issues = validatePack(pack);
564
+ const packLabel = `"${packName}" (status: ${pack.status})`;
565
+ if (issues.length === 0) {
566
+ console.log(`\u2713 Pack ${packLabel} passed all cross-workflow checks`);
567
+ return;
568
+ }
569
+ const errors = issues.filter((i) => i.severity === "error");
570
+ const warnings = issues.filter((i) => i.severity === "warning");
571
+ console.log(`
572
+ ${packName} \u2014 Pack Validation`);
573
+ console.log("\u2500".repeat(50));
574
+ console.log(`Status: ${pack.status}`);
575
+ console.log(`Issues: ${errors.length} error(s), ${warnings.length} warning(s)`);
576
+ console.log("");
577
+ for (const issue of errors) {
578
+ console.log(` \u2717 [error] ${issue.message}`);
579
+ }
580
+ for (const issue of warnings) {
581
+ console.log(` \u26A0 [warning] ${issue.message}`);
582
+ }
583
+ if (errors.length > 0) process.exit(1);
584
+ }
365
585
  async function handleInit() {
366
586
  const { writeFile, readFile, mkdir } = await import("fs/promises");
367
587
  const { join } = await import("path");
@@ -439,11 +659,28 @@ async function handleInit() {
439
659
  }
440
660
  const kairosDir = join(homedir(), ".kairos");
441
661
  await mkdir(join(kairosDir, "telemetry"), { recursive: true });
662
+ const kairosPath = process.execPath ? `${process.execPath.replace(/node$/, "kairos-mcp")}` : "kairos-mcp";
442
663
  console.error("");
443
664
  console.error(" Setup complete! Try:");
444
665
  console.error("");
445
666
  console.error(' kairos build "Send a Slack message when a webhook fires" --dry-run');
446
667
  console.error("");
668
+ console.error(" \u2500\u2500\u2500 Claude Desktop MCP config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
669
+ console.error(" Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:");
670
+ console.error("");
671
+ console.error(" {");
672
+ console.error(' "mcpServers": {');
673
+ console.error(' "kairos": {');
674
+ console.error(` "command": "${kairosPath}",`);
675
+ console.error(' "env": {');
676
+ console.error(` "ANTHROPIC_API_KEY": "${process.env["ANTHROPIC_API_KEY"] ? "<set>" : "your-key-here"}",`);
677
+ console.error(` "N8N_BASE_URL": "${process.env["N8N_BASE_URL"] ?? "https://your-n8n-instance"}",`);
678
+ console.error(` "N8N_API_KEY": "${process.env["N8N_API_KEY"] ? "<set>" : "your-n8n-api-key"}"`);
679
+ console.error(" }");
680
+ console.error(" }");
681
+ console.error(" }");
682
+ console.error(" }");
683
+ console.error("");
447
684
  }
448
685
  async function main() {
449
686
  const { command, positional, flags } = parseArgs(process.argv);
@@ -458,6 +695,9 @@ async function main() {
458
695
  case "build":
459
696
  await handleBuild(positional, flags);
460
697
  break;
698
+ case "build-pack":
699
+ await handleBuildPack(positional, flags);
700
+ break;
461
701
  case "replace":
462
702
  await handleReplace(positional);
463
703
  break;
@@ -485,6 +725,21 @@ async function main() {
485
725
  case "sync-templates":
486
726
  await handleSyncTemplates(flags);
487
727
  break;
728
+ case "pack": {
729
+ const subcommand = positional[0];
730
+ const subPositional = positional.slice(1);
731
+ if (subcommand === "export") {
732
+ await handlePackExport(subPositional, flags);
733
+ } else {
734
+ console.error(`Unknown pack subcommand: ${subcommand ?? "(none)"}`);
735
+ console.error("Available: kairos pack export <name> [--handoff]");
736
+ process.exit(1);
737
+ }
738
+ break;
739
+ }
740
+ case "validate-pack":
741
+ await handleValidatePack(positional);
742
+ break;
488
743
  default:
489
744
  console.error(`Unknown command: ${command}`);
490
745
  console.log(HELP);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Kairos } from './client.js'\nimport { FileLibrary } from './library/file-library.js'\nimport { TemplateSyncer } from './templates/syncer.js'\nimport { PatternAnalyzer } from './telemetry/pattern-analyzer.js'\n\nconst HELP = `\nKairos SDK — LLM-powered n8n workflow generation\n\nUsage:\n kairos init First-time setup wizard\n kairos build <description> [options]\n kairos replace <n8n-id> <description>\n kairos patterns [options]\n kairos sessions [options]\n kairos list\n kairos get <id>\n kairos activate <id>\n kairos deactivate <id>\n kairos delete <id> --confirm\n kairos sync-templates [options]\n\nBuild options:\n --dry-run Generate and validate without deploying\n --name <name> Override the generated workflow name\n --activate Activate the workflow after deployment\n\nPatterns options:\n --days <days> Analysis window (default: 30)\n --json Output raw JSON instead of summary\n\nSessions options:\n --limit <n> Number of recent sessions to show (default: 20)\n --json Output raw JSON instead of summary\n\nSync options:\n --max <count> Maximum templates to fetch (default: 500)\n\nEnvironment variables:\n ANTHROPIC_API_KEY Anthropic API key (required)\n N8N_BASE_URL n8n instance URL (required for deploy, optional for --dry-run)\n N8N_API_KEY n8n API key (required for deploy, optional for --dry-run)\n KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)\n KAIROS_TELEMETRY Set to \"true\" or a directory path to enable telemetry logging\n KAIROS_PROMPT_PROFILE minimal | standard | rich (default: standard)\n minimal: base prompt only, no library context, top 3 patterns\n standard: full library context, top 10 patterns (default)\n rich: full library context, top 15 patterns, proactive expression guidance\n`\n\nfunction getEnvOrExit(name: string): string {\n const val = process.env[name]\n if (!val) {\n console.error(`Missing required environment variable: ${name}`)\n process.exit(1)\n }\n return val\n}\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2)\n const command = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]!\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n return { command, positional, flags }\n}\n\nconst CLI_LOGGER = {\n debug: () => {},\n info: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),\n warn: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),\n error: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`),\n}\n\nfunction getTelemetryOption(): boolean | string | undefined {\n const telemetryEnv = process.env['KAIROS_TELEMETRY']\n if (telemetryEnv === 'true') return true\n if (telemetryEnv && telemetryEnv !== 'false') return telemetryEnv\n return undefined\n}\n\nfunction createClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n n8nBaseUrl: getEnvOrExit('N8N_BASE_URL'),\n n8nApiKey: getEnvOrExit('N8N_API_KEY'),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nfunction createDryRunClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n ...(process.env['N8N_BASE_URL'] ? { n8nBaseUrl: process.env['N8N_BASE_URL'] } : {}),\n ...(process.env['N8N_API_KEY'] ? { n8nApiKey: process.env['N8N_API_KEY'] } : {}),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nasync function handleBuild(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const description = positional.join(' ')\n if (!description) {\n console.error('Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]')\n process.exit(1)\n }\n\n const isDryRun = flags['dry-run'] === true\n const kairos = isDryRun ? createDryRunClient() : createClient()\n const start = Date.now()\n\n console.error(`Generating workflow...`)\n\n const result = await kairos.build(description, {\n dryRun: isDryRun,\n ...(typeof flags['name'] === 'string' ? { name: flags['name'] } : {}),\n activate: flags['activate'] === true,\n })\n\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n activationRequired: result.activationRequired,\n dryRun: result.dryRun,\n credentialsNeeded: result.credentialsNeeded,\n ...(result.dryRun ? { workflow: result.workflow } : {}),\n }, null, 2))\n}\n\nasync function handleReplace(positional: string[]): Promise<void> {\n const id = positional[0]\n const description = positional.slice(1).join(' ')\n\n if (!id || !description) {\n console.error('Usage: kairos replace <n8n-workflow-id> <description>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const start = Date.now()\n console.error(`Replacing workflow ${id}...`)\n\n const result = await kairos.replace(id, description)\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n }, null, 2))\n}\n\nasync function handleList(): Promise<void> {\n const kairos = createClient()\n const workflows = await kairos.list()\n await kairos.drain()\n\n if (workflows.length === 0) {\n console.log('No workflows found.')\n return\n }\n\n for (const w of workflows) {\n const status = w.active ? 'active' : 'inactive'\n console.log(` ${w.id} ${status.padEnd(8)} ${w.name}`)\n }\n console.log(`\\n${workflows.length} workflow(s)`)\n}\n\nasync function handleGet(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos get <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const workflow = await kairos.get(id)\n await kairos.drain()\n console.log(JSON.stringify(workflow, null, 2))\n}\n\nasync function handleActivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos activate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.activate(id)\n await kairos.drain()\n console.log(`Activated workflow ${id}`)\n}\n\nasync function handleDeactivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos deactivate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.deactivate(id)\n await kairos.drain()\n console.log(`Deactivated workflow ${id}`)\n}\n\nasync function handleDelete(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos delete <workflow-id> --confirm')\n process.exit(1)\n }\n\n if (flags['confirm'] !== true) {\n console.error('Refusing to delete without --confirm flag.')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.delete(id, { confirm: true })\n await kairos.drain()\n console.log(`Deleted workflow ${id}`)\n}\n\nasync function handleSyncTemplates(flags: Record<string, string | boolean>): Promise<void> {\n const maxRaw = typeof flags['max'] === 'string' ? parseInt(flags['max'], 10) : NaN\n const max = Number.isNaN(maxRaw) ? 500 : maxRaw\n const library = new FileLibrary()\n const syncer = new TemplateSyncer(library, CLI_LOGGER)\n\n console.error(`Syncing up to ${max} templates from n8n community library...`)\n\n const result = await syncer.sync({\n maxTemplates: max,\n onProgress: (p) => {\n if (p.processed % 25 === 0 && p.processed > 0) {\n console.error(` Progress: ${p.processed}/${p.total} processed, ${p.saved} saved`)\n }\n },\n })\n\n console.error('')\n console.error(`Sync complete:`)\n console.error(` Saved: ${result.saved}`)\n console.error(` Blocked: ${result.blocked} (validation errors or unsafe content)`)\n console.error(` Review: ${result.reviewed} (saved but flagged for review)`)\n console.error(` Duplicates: ${result.skippedDuplicate} (already in library)`)\n console.error(` Paid: ${result.skippedPaid} (skipped)`)\n}\n\nasync function handlePatterns(flags: Record<string, string | boolean>): Promise<void> {\n const daysRaw = typeof flags['days'] === 'string' ? parseInt(flags['days'], 10) : NaN\n const days = Number.isNaN(daysRaw) ? 30 : daysRaw\n const analyzer = PatternAnalyzer.fromEnv()\n\n const analysis = await analyzer.analyzeAndSave(days)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(analysis, null, 2))\n return\n }\n\n console.log(`\\nKairos Pattern Analysis (last ${days} days)`)\n console.log('─'.repeat(45))\n console.log(` Builds: ${analysis.summary.totalBuilds}`)\n console.log(` Attempts: ${analysis.summary.totalAttempts}`)\n console.log(` First-try pass: ${(analysis.summary.firstTryPassRate * 100).toFixed(1)}%`)\n console.log(` Correction rate: ${(analysis.summary.correctionRate * 100).toFixed(1)}%`)\n if (analysis.summary.singleAttemptFailRate !== undefined) {\n console.log(` Single-attempt failures: ${(analysis.summary.singleAttemptFailRate * 100).toFixed(1)}%`)\n }\n console.log(` Avg duration: ${(analysis.summary.avgDurationMs / 1000).toFixed(1)}s`)\n\n const active = analysis.topFailureRules.filter(p => p.state !== 'resolved')\n const resolved = analysis.topFailureRules.filter(p => p.state === 'resolved')\n\n if (active.length > 0) {\n console.log(`\\nActive Failure Patterns:`)\n for (const p of active) {\n const regressionTag = p.regressed ? '[REGRESSION] ' : ''\n const stateTag = p.state === 'confirmed' ? '[CONFIRMED]' : '[DRAFT]'\n const trendIcon = p.trend === 'improving' ? ' ^' : p.trend === 'worsening' ? ' v' : p.trend === 'new' ? ' *' : ''\n const stage = p.pipelineStage.replace(/_/g, ' ')\n const scoreStr = p.compositeScore.toFixed(3)\n console.log(` Rule ${p.rule} ${regressionTag}${stateTag}${trendIcon} — score ${scoreStr} | ${p.failureCount} failures (${(p.confidence * 100).toFixed(1)}%) [${stage}]`)\n const f = p.scoringFactors\n console.log(` Factors: confidence=${f.rawConfidence} × impact=${f.impact} × recency=${f.recency} + boost=${f.stickinessBoost}`)\n if (p.mitigation) console.log(` Fix: ${p.mitigation}`)\n if (p.exampleMessages.length > 0) console.log(` e.g. ${p.exampleMessages[0]}`)\n if (p.workflowTypeBreakdown) {\n const topType = Object.entries(p.workflowTypeBreakdown).sort((a, b) => b[1] - a[1])[0]\n if (topType) console.log(` Top workflow type: ${topType[0]} (${topType[1]} failures)`)\n }\n }\n } else {\n console.log(`\\nNo active failure patterns.`)\n }\n\n if (resolved.length > 0) {\n console.log(`\\nResolved Patterns:`)\n for (const p of resolved) {\n console.log(` Rule ${p.rule} — previously confirmed, 0 failures in current window`)\n }\n }\n\n if (analysis.failingCredentialTypes.length > 0) {\n console.log(`\\nFailing Credential Types:`)\n for (const c of analysis.failingCredentialTypes) {\n console.log(` ${c.type}: ${c.count} failures`)\n }\n }\n\n if (analysis.warningEffectiveness && analysis.warningEffectiveness.length > 0) {\n console.log(`\\nWarning Effectiveness:`)\n for (const w of analysis.warningEffectiveness) {\n console.log(` Rule ${w.rule}: warned ${w.timesWarned}x, prevented ${w.timesWarnedAndPassed}x (${Math.round(w.effectivenessRate * 100)}% effective)`)\n }\n }\n\n const drift = analysis.drift\n if (drift) {\n console.log(`\\nDrift Detection: ${drift.healthy ? 'HEALTHY' : 'ALERTS FOUND'}`)\n console.log(` Coverage: ${drift.coveredRules}/${drift.totalRules} rules have mitigations + stage mappings`)\n if (drift.alerts.length > 0) {\n for (const a of drift.alerts) {\n console.log(` [${a.type}] Rule ${a.rule}: ${a.message}`)\n }\n }\n }\n\n console.log(`\\nPatterns saved to ~/.kairos/patterns.json`)\n}\n\nasync function handleSessions(flags: Record<string, string | boolean>): Promise<void> {\n const limitRaw = typeof flags['limit'] === 'string' ? parseInt(flags['limit'], 10) : NaN\n const limit = Number.isNaN(limitRaw) ? 20 : limitRaw\n const analyzer = PatternAnalyzer.fromEnv()\n const sessions = await analyzer.getSessions(limit)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(sessions, null, 2))\n return\n }\n\n if (sessions.length === 0) {\n console.log('No session history found. Run kairos patterns first to generate session data.')\n return\n }\n\n console.log(`\\nRecent Sessions (last ${sessions.length})`)\n console.log('─'.repeat(60))\n\n for (const s of [...sessions].reverse()) {\n const status = s.success ? '✓' : '✗'\n const typeTag = s.workflowType ? ` [${s.workflowType}]` : ''\n const attemptsStr = s.attempts > 1 ? ` (${s.attempts} attempts)` : ''\n const nameStr = s.workflowName ? ` ${s.workflowName}` : ` ${s.description.slice(0, 50)}`\n const rulesStr = s.failedRules.length > 0 ? ` — rules ${s.failedRules.join(', ')} failed` : ''\n console.log(`${s.date} ${status}${nameStr}${attemptsStr}${typeTag}${rulesStr}`)\n }\n}\n\nasync function handleInit(): Promise<void> {\n const { writeFile, readFile, mkdir } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n const readline = await import('node:readline')\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr })\n const ask = (q: string): Promise<string> => new Promise((resolve) => rl.question(q, resolve))\n\n console.error('')\n console.error(' Kairos SDK — Setup Wizard')\n console.error(' ─────────────────────────')\n console.error('')\n\n const envPath = join(process.cwd(), '.env')\n let existingEnv = ''\n try {\n existingEnv = await readFile(envPath, 'utf-8')\n } catch {}\n\n const has = (key: string) => existingEnv.includes(key) || !!process.env[key]\n\n const lines: string[] = []\n\n if (!has('ANTHROPIC_API_KEY')) {\n const key = await ask(' Anthropic API key (from console.anthropic.com): ')\n if (key.trim()) lines.push(`ANTHROPIC_API_KEY=${key.trim()}`)\n } else {\n console.error(' Anthropic API key: already set')\n }\n\n if (!has('N8N_BASE_URL')) {\n const url = await ask(' n8n instance URL (e.g. https://your-name.app.n8n.cloud): ')\n if (url.trim()) lines.push(`N8N_BASE_URL=${url.trim().replace(/\\/$/, '')}`)\n } else {\n console.error(' n8n base URL: already set')\n }\n\n if (!has('N8N_API_KEY')) {\n const key = await ask(' n8n API key: ')\n if (key.trim()) lines.push(`N8N_API_KEY=${key.trim()}`)\n } else {\n console.error(' n8n API key: already set')\n }\n\n rl.close()\n\n if (lines.length > 0) {\n const newContent = existingEnv\n ? existingEnv.trimEnd() + '\\n' + lines.join('\\n') + '\\n'\n : lines.join('\\n') + '\\n'\n await writeFile(envPath, newContent, 'utf-8')\n console.error(`\\n Saved to ${envPath}`)\n } else {\n console.error('\\n All credentials already configured.')\n }\n\n console.error('')\n console.error(' Seeding template library...')\n\n const library = new FileLibrary()\n const logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n }\n const syncer = new TemplateSyncer(library, logger)\n\n await library.initialize()\n const existing = await library.list()\n\n if (existing.length >= 50) {\n console.error(` Library already has ${existing.length} entries — skipping sync.`)\n } else {\n const result = await syncer.sync({\n maxTemplates: 500,\n onProgress: (p) => {\n if (p.processed % 100 === 0 && p.processed > 0) {\n process.stderr.write(` ${p.processed}/${p.total} processed, ${p.saved} saved...\\r`)\n }\n },\n })\n console.error(` Synced ${result.saved} templates (${result.blocked} blocked, ${result.skippedDuplicate} duplicates)`)\n }\n\n const kairosDir = join(homedir(), '.kairos')\n await mkdir(join(kairosDir, 'telemetry'), { recursive: true })\n\n console.error('')\n console.error(' Setup complete! Try:')\n console.error('')\n console.error(' kairos build \"Send a Slack message when a webhook fires\" --dry-run')\n console.error('')\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || command === '--help' || flags['help'] === true) {\n console.log(HELP)\n return\n }\n\n switch (command) {\n case 'init':\n await handleInit()\n break\n case 'build':\n await handleBuild(positional, flags)\n break\n case 'replace':\n await handleReplace(positional)\n break\n case 'patterns':\n await handlePatterns(flags)\n break\n case 'sessions':\n await handleSessions(flags)\n break\n case 'list':\n await handleList()\n break\n case 'get':\n await handleGet(positional)\n break\n case 'activate':\n await handleActivate(positional)\n break\n case 'deactivate':\n await handleDeactivate(positional)\n break\n case 'delete':\n await handleDelete(positional, flags)\n break\n case 'sync-templates':\n await handleSyncTemplates(flags)\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err: unknown) => {\n if (err instanceof Error) {\n console.error(`Error: ${err.message}`)\n if ('issues' in err && Array.isArray((err as Record<string, unknown>).issues)) {\n for (const issue of (err as Record<string, unknown>).issues as Array<{ rule: number; message: string }>) {\n console.error(` [Rule ${issue.rule}] ${issue.message}`)\n }\n }\n } else {\n console.error(String(err))\n }\n process.exit(1)\n})\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Kairos } from './client.js'\nimport { FileLibrary } from './library/file-library.js'\nimport { TemplateSyncer } from './templates/syncer.js'\nimport { PatternAnalyzer } from './telemetry/pattern-analyzer.js'\n\nconst HELP = `\nKairos SDK — LLM-powered n8n workflow generation\n\nUsage:\n kairos init First-time setup wizard\n kairos build <description> [options]\n kairos build-pack <business context> [options]\n kairos pack export <name> [--handoff]\n kairos validate-pack <name>\n kairos replace <n8n-id> <description>\n kairos patterns [options]\n kairos sessions [options]\n kairos list\n kairos get <id>\n kairos activate <id>\n kairos deactivate <id>\n kairos delete <id> --confirm\n kairos sync-templates [options]\n\nBuild options:\n --dry-run Generate and validate without deploying\n --name <name> Override the generated workflow name\n --activate Activate the workflow after deployment\n --smoke-test After deploy, trigger the workflow and verify it runs without error\n\nBuild-pack options:\n --dry-run Plan and validate without deploying\n --activate Activate each workflow after deployment (blocked if blocking assumptions exist)\n --yes Skip confirmation prompt and build immediately\n\nPack options:\n pack export <name> Print the saved pack as JSON\n pack export <name> --handoff Generate a client-ready Markdown handoff document\n validate-pack <name> Cross-workflow safety check before activation\n\nPatterns options:\n --days <days> Analysis window (default: 30)\n --json Output raw JSON instead of summary\n\nSessions options:\n --limit <n> Number of recent sessions to show (default: 20)\n --json Output raw JSON instead of summary\n\nSync options:\n --max <count> Maximum templates to fetch (default: 500)\n\nEnvironment variables:\n ANTHROPIC_API_KEY Anthropic API key (required)\n N8N_BASE_URL n8n instance URL (required for deploy, optional for --dry-run)\n N8N_API_KEY n8n API key (required for deploy, optional for --dry-run)\n KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)\n KAIROS_TELEMETRY Set to \"true\" or a directory path to enable telemetry logging\n KAIROS_PROMPT_PROFILE minimal | standard | rich (default: standard)\n minimal: base prompt only, no library context, top 3 patterns\n standard: full library context, top 10 patterns (default)\n rich: full library context, top 15 patterns, proactive expression guidance\n`\n\nfunction getEnvOrExit(name: string): string {\n const val = process.env[name]\n if (!val) {\n console.error(`Missing required environment variable: ${name}`)\n process.exit(1)\n }\n return val\n}\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2)\n const command = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]!\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n return { command, positional, flags }\n}\n\nconst CLI_LOGGER = {\n debug: () => {},\n info: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),\n warn: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),\n error: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`),\n}\n\nfunction getTelemetryOption(): boolean | string | undefined {\n const telemetryEnv = process.env['KAIROS_TELEMETRY']\n if (telemetryEnv === 'true') return true\n if (telemetryEnv && telemetryEnv !== 'false') return telemetryEnv\n return undefined\n}\n\nfunction createClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n n8nBaseUrl: getEnvOrExit('N8N_BASE_URL'),\n n8nApiKey: getEnvOrExit('N8N_API_KEY'),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nfunction createDryRunClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n ...(process.env['N8N_BASE_URL'] ? { n8nBaseUrl: process.env['N8N_BASE_URL'] } : {}),\n ...(process.env['N8N_API_KEY'] ? { n8nApiKey: process.env['N8N_API_KEY'] } : {}),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nasync function handleBuild(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const description = positional.join(' ')\n if (!description) {\n console.error('Usage: kairos build <description> [--dry-run] [--name <name>] [--activate] [--smoke-test]')\n process.exit(1)\n }\n\n const isDryRun = flags['dry-run'] === true\n const kairos = isDryRun ? createDryRunClient() : createClient()\n const start = Date.now()\n\n console.error(`Generating workflow...`)\n\n const result = await kairos.build(description, {\n dryRun: isDryRun,\n ...(typeof flags['name'] === 'string' ? { name: flags['name'] } : {}),\n activate: flags['activate'] === true || flags['smoke-test'] === true,\n smokeTest: flags['smoke-test'] === true,\n })\n\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n activationRequired: result.activationRequired,\n dryRun: result.dryRun,\n credentialsNeeded: result.credentialsNeeded,\n ...(result.dryRun ? { workflow: result.workflow } : {}),\n ...(result.smokeTest ? { smokeTest: result.smokeTest } : {}),\n }, null, 2))\n}\n\nasync function handleReplace(positional: string[]): Promise<void> {\n const id = positional[0]\n const description = positional.slice(1).join(' ')\n\n if (!id || !description) {\n console.error('Usage: kairos replace <n8n-workflow-id> <description>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const start = Date.now()\n console.error(`Replacing workflow ${id}...`)\n\n const result = await kairos.replace(id, description)\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n }, null, 2))\n}\n\nasync function handleList(): Promise<void> {\n const kairos = createClient()\n const workflows = await kairos.list()\n await kairos.drain()\n\n if (workflows.length === 0) {\n console.log('No workflows found.')\n return\n }\n\n for (const w of workflows) {\n const status = w.active ? 'active' : 'inactive'\n console.log(` ${w.id} ${status.padEnd(8)} ${w.name}`)\n }\n console.log(`\\n${workflows.length} workflow(s)`)\n}\n\nasync function handleGet(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos get <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const workflow = await kairos.get(id)\n await kairos.drain()\n console.log(JSON.stringify(workflow, null, 2))\n}\n\nasync function handleActivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos activate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.activate(id)\n await kairos.drain()\n console.log(`Activated workflow ${id}`)\n}\n\nasync function handleDeactivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos deactivate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.deactivate(id)\n await kairos.drain()\n console.log(`Deactivated workflow ${id}`)\n}\n\nasync function handleDelete(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos delete <workflow-id> --confirm')\n process.exit(1)\n }\n\n if (flags['confirm'] !== true) {\n console.error('Refusing to delete without --confirm flag.')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.delete(id, { confirm: true })\n await kairos.drain()\n console.log(`Deleted workflow ${id}`)\n}\n\nasync function handleSyncTemplates(flags: Record<string, string | boolean>): Promise<void> {\n const maxRaw = typeof flags['max'] === 'string' ? parseInt(flags['max'], 10) : NaN\n const max = Number.isNaN(maxRaw) ? 500 : maxRaw\n const library = new FileLibrary()\n const syncer = new TemplateSyncer(library, CLI_LOGGER)\n\n console.error(`Syncing up to ${max} templates from n8n community library...`)\n\n const result = await syncer.sync({\n maxTemplates: max,\n onProgress: (p) => {\n if (p.processed % 25 === 0 && p.processed > 0) {\n console.error(` Progress: ${p.processed}/${p.total} processed, ${p.saved} saved`)\n }\n },\n })\n\n console.error('')\n console.error(`Sync complete:`)\n console.error(` Saved: ${result.saved}`)\n console.error(` Blocked: ${result.blocked} (validation errors or unsafe content)`)\n console.error(` Review: ${result.reviewed} (saved but flagged for review)`)\n console.error(` Duplicates: ${result.skippedDuplicate} (already in library)`)\n console.error(` Paid: ${result.skippedPaid} (skipped)`)\n}\n\nasync function handlePatterns(flags: Record<string, string | boolean>): Promise<void> {\n const daysRaw = typeof flags['days'] === 'string' ? parseInt(flags['days'], 10) : NaN\n const days = Number.isNaN(daysRaw) ? 30 : daysRaw\n const analyzer = PatternAnalyzer.fromEnv()\n\n const analysis = await analyzer.analyzeAndSave(days)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(analysis, null, 2))\n return\n }\n\n console.log(`\\nKairos Pattern Analysis (last ${days} days)`)\n console.log('─'.repeat(45))\n console.log(` Builds: ${analysis.summary.totalBuilds}`)\n console.log(` Attempts: ${analysis.summary.totalAttempts}`)\n console.log(` First-try pass: ${(analysis.summary.firstTryPassRate * 100).toFixed(1)}%`)\n console.log(` Correction rate: ${(analysis.summary.correctionRate * 100).toFixed(1)}%`)\n if (analysis.summary.singleAttemptFailRate !== undefined) {\n console.log(` Single-attempt failures: ${(analysis.summary.singleAttemptFailRate * 100).toFixed(1)}%`)\n }\n console.log(` Avg duration: ${(analysis.summary.avgDurationMs / 1000).toFixed(1)}s`)\n\n const active = analysis.topFailureRules.filter(p => p.state !== 'resolved')\n const resolved = analysis.topFailureRules.filter(p => p.state === 'resolved')\n\n if (active.length > 0) {\n console.log(`\\nActive Failure Patterns:`)\n for (const p of active) {\n const regressionTag = p.regressed ? '[REGRESSION] ' : ''\n const stateTag = p.state === 'confirmed' ? '[CONFIRMED]' : '[DRAFT]'\n const trendIcon = p.trend === 'improving' ? ' ^' : p.trend === 'worsening' ? ' v' : p.trend === 'new' ? ' *' : ''\n const stage = p.pipelineStage.replace(/_/g, ' ')\n const scoreStr = p.compositeScore.toFixed(3)\n console.log(` Rule ${p.rule} ${regressionTag}${stateTag}${trendIcon} — score ${scoreStr} | ${p.failureCount} failures (${(p.confidence * 100).toFixed(1)}%) [${stage}]`)\n const f = p.scoringFactors\n console.log(` Factors: confidence=${f.rawConfidence} × impact=${f.impact} × recency=${f.recency} + boost=${f.stickinessBoost}`)\n if (p.mitigation) console.log(` Fix: ${p.mitigation}`)\n if (p.exampleMessages.length > 0) console.log(` e.g. ${p.exampleMessages[0]}`)\n if (p.workflowTypeBreakdown) {\n const topType = Object.entries(p.workflowTypeBreakdown).sort((a, b) => b[1] - a[1])[0]\n if (topType) console.log(` Top workflow type: ${topType[0]} (${topType[1]} failures)`)\n }\n }\n } else {\n console.log(`\\nNo active failure patterns.`)\n }\n\n if (resolved.length > 0) {\n console.log(`\\nResolved Patterns:`)\n for (const p of resolved) {\n console.log(` Rule ${p.rule} — previously confirmed, 0 failures in current window`)\n }\n }\n\n if (analysis.failingCredentialTypes.length > 0) {\n console.log(`\\nFailing Credential Types:`)\n for (const c of analysis.failingCredentialTypes) {\n console.log(` ${c.type}: ${c.count} failures`)\n }\n }\n\n if (analysis.warningEffectiveness && analysis.warningEffectiveness.length > 0) {\n console.log(`\\nWarning Effectiveness:`)\n for (const w of analysis.warningEffectiveness) {\n console.log(` Rule ${w.rule}: warned ${w.timesWarned}x, prevented ${w.timesWarnedAndPassed}x (${Math.round(w.effectivenessRate * 100)}% effective)`)\n }\n }\n\n const drift = analysis.drift\n if (drift) {\n console.log(`\\nDrift Detection: ${drift.healthy ? 'HEALTHY' : 'ALERTS FOUND'}`)\n console.log(` Coverage: ${drift.coveredRules}/${drift.totalRules} rules have mitigations + stage mappings`)\n if (drift.alerts.length > 0) {\n for (const a of drift.alerts) {\n console.log(` [${a.type}] Rule ${a.rule}: ${a.message}`)\n }\n }\n }\n\n console.log(`\\nPatterns saved to ~/.kairos/patterns.json`)\n}\n\nasync function handleSessions(flags: Record<string, string | boolean>): Promise<void> {\n const limitRaw = typeof flags['limit'] === 'string' ? parseInt(flags['limit'], 10) : NaN\n const limit = Number.isNaN(limitRaw) ? 20 : limitRaw\n const analyzer = PatternAnalyzer.fromEnv()\n const sessions = await analyzer.getSessions(limit)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(sessions, null, 2))\n return\n }\n\n if (sessions.length === 0) {\n console.log('No session history found. Run kairos patterns first to generate session data.')\n return\n }\n\n console.log(`\\nRecent Sessions (last ${sessions.length})`)\n console.log('─'.repeat(60))\n\n for (const s of [...sessions].reverse()) {\n const status = s.success ? '✓' : '✗'\n const typeTag = s.workflowType ? ` [${s.workflowType}]` : ''\n const attemptsStr = s.attempts > 1 ? ` (${s.attempts} attempts)` : ''\n const nameStr = s.workflowName ? ` ${s.workflowName}` : ` ${s.description.slice(0, 50)}`\n const rulesStr = s.failedRules.length > 0 ? ` — rules ${s.failedRules.join(', ')} failed` : ''\n console.log(`${s.date} ${status}${nameStr}${attemptsStr}${typeTag}${rulesStr}`)\n }\n}\n\nfunction printPackResult(result: import('./pack/pack-builder.js').WorkflowPackResult): void {\n const line = '─'.repeat(50)\n const deployed = result.workflows.filter(w => w.deployed).length\n const total = result.workflows.length\n\n console.error(`\\n${result.businessContext} — Workflow Pack`)\n console.error('═'.repeat(Math.min(result.businessContext.length + 18, 60)))\n console.error(`Status: ${result.status}`)\n\n const blocking = result.assumptions.filter(a => a.type === 'blocking')\n if (blocking.length > 0) {\n console.error(`\\n⚠ Blocking Issues (${blocking.length}) — resolve before activating`)\n console.error(line)\n for (const a of blocking) {\n console.error(` ✗ ${a.text}`)\n }\n }\n\n console.error(`\\nWorkflows Built (${deployed}/${total})`)\n console.error(line)\n for (const wf of result.workflows) {\n const icon = wf.error ? '✗' : '✓'\n const idStr = wf.workflowId ? ` [${wf.workflowId}]` : ''\n const attStr = wf.generationAttempts > 1 ? ` ${wf.generationAttempts} attempts` : ''\n console.error(` ${icon} ${wf.name}${idStr}${attStr}`)\n console.error(` ${wf.purpose}`)\n if (wf.error) console.error(` Error: ${wf.error}`)\n }\n\n if (result.allCredentials.length > 0) {\n console.error(`\\nCredentials Needed (connect once in n8n)`)\n console.error(line)\n for (const cred of result.allCredentials) {\n console.error(` □ ${cred.service}`)\n }\n }\n\n if (result.sheetsColumns.length > 0) {\n console.error(`\\nGoogle Sheets Required`)\n console.error(line)\n for (const sheet of result.sheetsColumns) {\n console.error(` □ ${sheet.sheet}: ${sheet.columns.join(', ')}`)\n }\n }\n\n const needsConfirmation = result.assumptions.filter(a => a.type === 'needs_confirmation')\n if (needsConfirmation.length > 0) {\n console.error(`\\nNeeds Confirmation Before Going Live`)\n console.error(line)\n for (const a of needsConfirmation) {\n console.error(` ? ${a.text}`)\n }\n }\n\n const safe = result.assumptions.filter(a => a.type === 'safe')\n if (safe.length > 0) {\n console.error(`\\nSafe Assumptions`)\n console.error(line)\n for (const a of safe) {\n console.error(` - ${a.text}`)\n }\n }\n\n if (result.testChecklist.length > 0) {\n console.error(`\\nTest Checklist`)\n console.error(line)\n for (const item of result.testChecklist) {\n console.error(` ${item.workflow}`)\n for (const step of item.steps) {\n console.error(` □ ${step}`)\n }\n }\n }\n}\n\nasync function handleBuildPack(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const businessContext = positional.join(' ')\n if (!businessContext) {\n console.error('Usage: kairos build-pack <business context description> [--dry-run] [--activate] [--yes]')\n process.exit(1)\n }\n\n const anthropicKey = getEnvOrExit('ANTHROPIC_API_KEY')\n const { PackBuilder } = await import('./pack/pack-builder.js')\n const isDryRun = flags['dry-run'] === true\n const kairos = isDryRun ? createDryRunClient() : createClient()\n const builder = new PackBuilder({ anthropicApiKey: anthropicKey, kairos })\n\n console.error('\\nPlanning workflow pack...')\n const plan = await builder.plan(businessContext)\n\n console.error(`\\n${businessContext} — Planned Workflows (${plan.workflows.length})\\n`)\n for (let i = 0; i < plan.workflows.length; i++) {\n const wf = plan.workflows[i]!\n console.error(` ${i + 1}. ${wf.name}`)\n console.error(` ${wf.purpose}`)\n }\n\n const planBlocking = plan.assumptions.filter(a => a.type === 'blocking')\n const planNeedsConfirmation = plan.assumptions.filter(a => a.type === 'needs_confirmation')\n if (planBlocking.length > 0) {\n console.error(`\\nBlocking Issues (resolve before activation)`)\n for (const a of planBlocking) console.error(` ✗ ${a.text}`)\n }\n if (planNeedsConfirmation.length > 0) {\n console.error(`\\nNeeds Confirmation`)\n for (const a of planNeedsConfirmation) console.error(` ? ${a.text}`)\n }\n\n if (flags['yes'] !== true) {\n const readline = await import('node:readline')\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr })\n const answer = await new Promise<string>(resolve => rl.question('\\nBuild all of these? [y/N] ', resolve))\n rl.close()\n if (!answer.toLowerCase().startsWith('y')) {\n console.error('Aborted.')\n process.exit(0)\n }\n }\n\n console.error('\\nBuilding...\\n')\n const result = await builder.build(plan, {\n dryRun: isDryRun,\n activate: flags['activate'] === true,\n onProgress: (wf, i, total) => {\n console.error(` [${i + 1}/${total}] ${wf.name}...`)\n },\n })\n\n printPackResult(result)\n\n const { writeFile, mkdir } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n const packsDir = join(homedir(), '.kairos', 'packs')\n await mkdir(packsDir, { recursive: true })\n const packPath = join(packsDir, `${result.packName}.json`)\n await writeFile(packPath, JSON.stringify(result, null, 2), 'utf-8')\n console.error(`\\nPack saved to: ${packPath}`)\n}\n\nasync function handlePackExport(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const packName = positional[0]\n if (!packName) {\n console.error('Usage: kairos pack export <pack-name> [--handoff]')\n process.exit(1)\n }\n\n const { readFile } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n\n const packPath = join(homedir(), '.kairos', 'packs', `${packName}.json`)\n\n let pack: import('./pack/pack-builder.js').WorkflowPackResult\n try {\n const content = await readFile(packPath, 'utf-8')\n pack = JSON.parse(content) as import('./pack/pack-builder.js').WorkflowPackResult\n } catch {\n console.error(`Pack not found: ${packPath}`)\n console.error('Run \"kairos build-pack <context>\" to create one.')\n process.exit(1)\n }\n\n if (flags['handoff'] === true) {\n const { generateHandoff } = await import('./pack/pack-exporter.js')\n console.log(generateHandoff(pack))\n } else {\n console.log(JSON.stringify(pack, null, 2))\n }\n}\n\nasync function handleValidatePack(positional: string[]): Promise<void> {\n const packName = positional[0]\n if (!packName) {\n console.error('Usage: kairos validate-pack <pack-name>')\n process.exit(1)\n }\n\n const { readFile } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n\n const packPath = join(homedir(), '.kairos', 'packs', `${packName}.json`)\n\n let pack: import('./pack/pack-builder.js').WorkflowPackResult\n try {\n const content = await readFile(packPath, 'utf-8')\n pack = JSON.parse(content) as import('./pack/pack-builder.js').WorkflowPackResult\n } catch {\n console.error(`Pack not found: ${packPath}`)\n console.error('Run \"kairos build-pack <context>\" to create one.')\n process.exit(1)\n }\n\n const { validatePack } = await import('./pack/pack-validator.js')\n const issues = validatePack(pack)\n\n const packLabel = `\"${packName}\" (status: ${pack.status})`\n\n if (issues.length === 0) {\n console.log(`✓ Pack ${packLabel} passed all cross-workflow checks`)\n return\n }\n\n const errors = issues.filter(i => i.severity === 'error')\n const warnings = issues.filter(i => i.severity === 'warning')\n\n console.log(`\\n${packName} — Pack Validation`)\n console.log('─'.repeat(50))\n console.log(`Status: ${pack.status}`)\n console.log(`Issues: ${errors.length} error(s), ${warnings.length} warning(s)`)\n console.log('')\n\n for (const issue of errors) {\n console.log(` ✗ [error] ${issue.message}`)\n }\n for (const issue of warnings) {\n console.log(` ⚠ [warning] ${issue.message}`)\n }\n\n if (errors.length > 0) process.exit(1)\n}\n\nasync function handleInit(): Promise<void> {\n const { writeFile, readFile, mkdir } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n const readline = await import('node:readline')\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr })\n const ask = (q: string): Promise<string> => new Promise((resolve) => rl.question(q, resolve))\n\n console.error('')\n console.error(' Kairos SDK — Setup Wizard')\n console.error(' ─────────────────────────')\n console.error('')\n\n const envPath = join(process.cwd(), '.env')\n let existingEnv = ''\n try {\n existingEnv = await readFile(envPath, 'utf-8')\n } catch {}\n\n const has = (key: string) => existingEnv.includes(key) || !!process.env[key]\n\n const lines: string[] = []\n\n if (!has('ANTHROPIC_API_KEY')) {\n const key = await ask(' Anthropic API key (from console.anthropic.com): ')\n if (key.trim()) lines.push(`ANTHROPIC_API_KEY=${key.trim()}`)\n } else {\n console.error(' Anthropic API key: already set')\n }\n\n if (!has('N8N_BASE_URL')) {\n const url = await ask(' n8n instance URL (e.g. https://your-name.app.n8n.cloud): ')\n if (url.trim()) lines.push(`N8N_BASE_URL=${url.trim().replace(/\\/$/, '')}`)\n } else {\n console.error(' n8n base URL: already set')\n }\n\n if (!has('N8N_API_KEY')) {\n const key = await ask(' n8n API key: ')\n if (key.trim()) lines.push(`N8N_API_KEY=${key.trim()}`)\n } else {\n console.error(' n8n API key: already set')\n }\n\n rl.close()\n\n if (lines.length > 0) {\n const newContent = existingEnv\n ? existingEnv.trimEnd() + '\\n' + lines.join('\\n') + '\\n'\n : lines.join('\\n') + '\\n'\n await writeFile(envPath, newContent, 'utf-8')\n console.error(`\\n Saved to ${envPath}`)\n } else {\n console.error('\\n All credentials already configured.')\n }\n\n console.error('')\n console.error(' Seeding template library...')\n\n const library = new FileLibrary()\n const logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n }\n const syncer = new TemplateSyncer(library, logger)\n\n await library.initialize()\n const existing = await library.list()\n\n if (existing.length >= 50) {\n console.error(` Library already has ${existing.length} entries — skipping sync.`)\n } else {\n const result = await syncer.sync({\n maxTemplates: 500,\n onProgress: (p) => {\n if (p.processed % 100 === 0 && p.processed > 0) {\n process.stderr.write(` ${p.processed}/${p.total} processed, ${p.saved} saved...\\r`)\n }\n },\n })\n console.error(` Synced ${result.saved} templates (${result.blocked} blocked, ${result.skippedDuplicate} duplicates)`)\n }\n\n const kairosDir = join(homedir(), '.kairos')\n await mkdir(join(kairosDir, 'telemetry'), { recursive: true })\n\n const kairosPath = process.execPath\n ? `${process.execPath.replace(/node$/, 'kairos-mcp')}`\n : 'kairos-mcp'\n\n console.error('')\n console.error(' Setup complete! Try:')\n console.error('')\n console.error(' kairos build \"Send a Slack message when a webhook fires\" --dry-run')\n console.error('')\n console.error(' ─── Claude Desktop MCP config ───────────────────────────────')\n console.error(' Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:')\n console.error('')\n console.error(' {')\n console.error(' \"mcpServers\": {')\n console.error(' \"kairos\": {')\n console.error(` \"command\": \"${kairosPath}\",`)\n console.error(' \"env\": {')\n console.error(` \"ANTHROPIC_API_KEY\": \"${process.env['ANTHROPIC_API_KEY'] ? '<set>' : 'your-key-here'}\",`)\n console.error(` \"N8N_BASE_URL\": \"${process.env['N8N_BASE_URL'] ?? 'https://your-n8n-instance'}\",`)\n console.error(` \"N8N_API_KEY\": \"${process.env['N8N_API_KEY'] ? '<set>' : 'your-n8n-api-key'}\"`)\n console.error(' }')\n console.error(' }')\n console.error(' }')\n console.error(' }')\n console.error('')\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || command === '--help' || flags['help'] === true) {\n console.log(HELP)\n return\n }\n\n switch (command) {\n case 'init':\n await handleInit()\n break\n case 'build':\n await handleBuild(positional, flags)\n break\n case 'build-pack':\n await handleBuildPack(positional, flags)\n break\n case 'replace':\n await handleReplace(positional)\n break\n case 'patterns':\n await handlePatterns(flags)\n break\n case 'sessions':\n await handleSessions(flags)\n break\n case 'list':\n await handleList()\n break\n case 'get':\n await handleGet(positional)\n break\n case 'activate':\n await handleActivate(positional)\n break\n case 'deactivate':\n await handleDeactivate(positional)\n break\n case 'delete':\n await handleDelete(positional, flags)\n break\n case 'sync-templates':\n await handleSyncTemplates(flags)\n break\n case 'pack': {\n const subcommand = positional[0]\n const subPositional = positional.slice(1)\n if (subcommand === 'export') {\n await handlePackExport(subPositional, flags)\n } else {\n console.error(`Unknown pack subcommand: ${subcommand ?? '(none)'}`)\n console.error('Available: kairos pack export <name> [--handoff]')\n process.exit(1)\n }\n break\n }\n case 'validate-pack':\n await handleValidatePack(positional)\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err: unknown) => {\n if (err instanceof Error) {\n console.error(`Error: ${err.message}`)\n if ('issues' in err && Array.isArray((err as Record<string, unknown>).issues)) {\n for (const issue of (err as Record<string, unknown>).issues as Array<{ rule: number; message: string }>) {\n console.error(` [Rule ${issue.rule}] ${issue.message}`)\n }\n }\n } else {\n console.error(String(err))\n }\n process.exit(1)\n})\n"],"mappings":"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","names":[]}