@kairos-sdk/core 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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-GVZKMS53.js";
5
+ import "./chunk-V2IZBZGB.js";
6
6
  import {
7
7
  TemplateSyncer
8
- } from "./chunk-5GAY7CSJ.js";
8
+ } from "./chunk-MYAGTDQ2.js";
9
9
  import {
10
10
  FileLibrary,
11
11
  PatternAnalyzer
12
- } from "./chunk-KIFT5LA7.js";
12
+ } from "./chunk-VPPWTMRJ.js";
13
13
 
14
14
  // src/cli.ts
15
15
  var HELP = `
@@ -32,6 +32,7 @@ Build options:
32
32
  --dry-run Generate and validate without deploying
33
33
  --name <name> Override the generated workflow name
34
34
  --activate Activate the workflow after deployment
35
+ --smoke-test After deploy, trigger the workflow and verify it runs without error
35
36
 
36
37
  Patterns options:
37
38
  --days <days> Analysis window (default: 30)
@@ -125,7 +126,7 @@ function createDryRunClient() {
125
126
  async function handleBuild(positional, flags) {
126
127
  const description = positional.join(" ");
127
128
  if (!description) {
128
- console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]");
129
+ console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate] [--smoke-test]");
129
130
  process.exit(1);
130
131
  }
131
132
  const isDryRun = flags["dry-run"] === true;
@@ -135,7 +136,8 @@ async function handleBuild(positional, flags) {
135
136
  const result = await kairos.build(description, {
136
137
  dryRun: isDryRun,
137
138
  ...typeof flags["name"] === "string" ? { name: flags["name"] } : {},
138
- activate: flags["activate"] === true
139
+ activate: flags["activate"] === true || flags["smoke-test"] === true,
140
+ smokeTest: flags["smoke-test"] === true
139
141
  });
140
142
  await kairos.drain();
141
143
  const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
@@ -148,7 +150,8 @@ async function handleBuild(positional, flags) {
148
150
  activationRequired: result.activationRequired,
149
151
  dryRun: result.dryRun,
150
152
  credentialsNeeded: result.credentialsNeeded,
151
- ...result.dryRun ? { workflow: result.workflow } : {}
153
+ ...result.dryRun ? { workflow: result.workflow } : {},
154
+ ...result.smokeTest ? { smokeTest: result.smokeTest } : {}
152
155
  }, null, 2));
153
156
  }
154
157
  async function handleReplace(positional) {
@@ -439,11 +442,28 @@ async function handleInit() {
439
442
  }
440
443
  const kairosDir = join(homedir(), ".kairos");
441
444
  await mkdir(join(kairosDir, "telemetry"), { recursive: true });
445
+ const kairosPath = process.execPath ? `${process.execPath.replace(/node$/, "kairos-mcp")}` : "kairos-mcp";
442
446
  console.error("");
443
447
  console.error(" Setup complete! Try:");
444
448
  console.error("");
445
449
  console.error(' kairos build "Send a Slack message when a webhook fires" --dry-run');
446
450
  console.error("");
451
+ 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");
452
+ console.error(" Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:");
453
+ console.error("");
454
+ console.error(" {");
455
+ console.error(' "mcpServers": {');
456
+ console.error(' "kairos": {');
457
+ console.error(` "command": "${kairosPath}",`);
458
+ console.error(' "env": {');
459
+ console.error(` "ANTHROPIC_API_KEY": "${process.env["ANTHROPIC_API_KEY"] ? "<set>" : "your-key-here"}",`);
460
+ console.error(` "N8N_BASE_URL": "${process.env["N8N_BASE_URL"] ?? "https://your-n8n-instance"}",`);
461
+ console.error(` "N8N_API_KEY": "${process.env["N8N_API_KEY"] ? "<set>" : "your-n8n-api-key"}"`);
462
+ console.error(" }");
463
+ console.error(" }");
464
+ console.error(" }");
465
+ console.error(" }");
466
+ console.error("");
447
467
  }
448
468
  async function main() {
449
469
  const { command, positional, flags } = parseArgs(process.argv);
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":";;;;;;;;;;;;;;AAOA,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4Cb,SAAS,aAAa,MAAsB;AAC1C,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,0CAA0C,IAAI,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAoG;AACrH,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAA0C,CAAC;AAEjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,MAAM,IAAI,MAAM,CAAC;AACvB,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,WAAW,IAAI,GAAG;AAClC,cAAM,GAAG,IAAI;AACb;AAAA,MACF,OAAO;AACL,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,MAAM;AACtC;AAEA,IAAM,aAAa;AAAA,EACjB,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,GAAG;AAAA,EAClH,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,UAAU,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,GAAG,EAAE;AAAA,EACrI,OAAO,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,GAAG,EAAE;AAC1I;AAEA,SAAS,qBAAmD;AAC1D,QAAM,eAAe,QAAQ,IAAI,kBAAkB;AACnD,MAAI,iBAAiB,OAAQ,QAAO;AACpC,MAAI,gBAAgB,iBAAiB,QAAS,QAAO;AACrD,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,QAAM,YAAY,mBAAmB;AACrC,SAAO,IAAI,OAAO;AAAA,IAChB,iBAAiB,aAAa,mBAAmB;AAAA,IACjD,YAAY,aAAa,cAAc;AAAA,IACvC,WAAW,aAAa,aAAa;AAAA,IACrC,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,OAAO,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IAC5E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,YAAY;AAAA,IACzB,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,qBAA6B;AACpC,QAAM,YAAY,mBAAmB;AACrC,SAAO,IAAI,OAAO;AAAA,IAChB,iBAAiB,aAAa,mBAAmB;AAAA,IACjD,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,YAAY,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IACjF,GAAI,QAAQ,IAAI,aAAa,IAAI,EAAE,WAAW,QAAQ,IAAI,aAAa,EAAE,IAAI,CAAC;AAAA,IAC9E,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,OAAO,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IAC5E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,YAAY;AAAA,IACzB,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAe,YAAY,YAAsB,OAAwD;AACvG,QAAM,cAAc,WAAW,KAAK,GAAG;AACvC,MAAI,CAAC,aAAa;AAChB,YAAQ,MAAM,4EAA4E;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,MAAM,SAAS,MAAM;AACtC,QAAM,SAAS,WAAW,mBAAmB,IAAI,aAAa;AAC9D,QAAM,QAAQ,KAAK,IAAI;AAEvB,UAAQ,MAAM,wBAAwB;AAEtC,QAAM,SAAS,MAAM,OAAO,MAAM,aAAa;AAAA,IAC7C,QAAQ;AAAA,IACR,GAAI,OAAO,MAAM,MAAM,MAAM,WAAW,EAAE,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC;AAAA,IACnE,UAAU,MAAM,UAAU,MAAM;AAAA,EAClC,CAAC;AAED,QAAM,OAAO,MAAM;AAEnB,QAAM,YAAY,KAAK,IAAI,IAAI,SAAS,KAAM,QAAQ,CAAC;AAEvD,UAAQ,MAAM,WAAW,OAAO,MAAM,OAAO,kBAAkB,WAAW,OAAO,qBAAqB,IAAI,MAAM,EAAE,GAAG;AACrH,UAAQ,MAAM,EAAE;AAEhB,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY,OAAO;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,oBAAoB,OAAO;AAAA,IAC3B,oBAAoB,OAAO;AAAA,IAC3B,QAAQ,OAAO;AAAA,IACf,mBAAmB,OAAO;AAAA,IAC1B,GAAI,OAAO,SAAS,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvD,GAAG,MAAM,CAAC,CAAC;AACb;AAEA,eAAe,cAAc,YAAqC;AAChE,QAAM,KAAK,WAAW,CAAC;AACvB,QAAM,cAAc,WAAW,MAAM,CAAC,EAAE,KAAK,GAAG;AAEhD,MAAI,CAAC,MAAM,CAAC,aAAa;AACvB,YAAQ,MAAM,uDAAuD;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,UAAQ,MAAM,sBAAsB,EAAE,KAAK;AAE3C,QAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,WAAW;AACnD,QAAM,OAAO,MAAM;AAEnB,QAAM,YAAY,KAAK,IAAI,IAAI,SAAS,KAAM,QAAQ,CAAC;AACvD,UAAQ,MAAM,WAAW,OAAO,MAAM,OAAO,kBAAkB,WAAW,OAAO,qBAAqB,IAAI,MAAM,EAAE,GAAG;AACrH,UAAQ,MAAM,EAAE;AAEhB,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY,OAAO;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,oBAAoB,OAAO;AAAA,EAC7B,GAAG,MAAM,CAAC,CAAC;AACb;AAEA,eAAe,aAA4B;AACzC,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAY,MAAM,OAAO,KAAK;AACpC,QAAM,OAAO,MAAM;AAEnB,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,aAAW,KAAK,WAAW;AACzB,UAAM,SAAS,EAAE,SAAS,WAAW;AACrC,YAAQ,IAAI,KAAK,EAAE,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;AAAA,EACzD;AACA,UAAQ,IAAI;AAAA,EAAK,UAAU,MAAM,cAAc;AACjD;AAEA,eAAe,UAAU,YAAqC;AAC5D,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,iCAAiC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,WAAW,MAAM,OAAO,IAAI,EAAE;AACpC,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC/C;AAEA,eAAe,eAAe,YAAqC;AACjE,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,SAAS,EAAE;AACxB,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,sBAAsB,EAAE,EAAE;AACxC;AAEA,eAAe,iBAAiB,YAAqC;AACnE,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,wCAAwC;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,WAAW,EAAE;AAC1B,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,wBAAwB,EAAE,EAAE;AAC1C;AAEA,eAAe,aAAa,YAAsB,OAAwD;AACxG,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,8CAA8C;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM,SAAS,MAAM,MAAM;AAC7B,YAAQ,MAAM,4CAA4C;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,OAAO,IAAI,EAAE,SAAS,KAAK,CAAC;AACzC,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,oBAAoB,EAAE,EAAE;AACtC;AAEA,eAAe,oBAAoB,OAAwD;AACzF,QAAM,SAAS,OAAO,MAAM,KAAK,MAAM,WAAW,SAAS,MAAM,KAAK,GAAG,EAAE,IAAI;AAC/E,QAAM,MAAM,OAAO,MAAM,MAAM,IAAI,MAAM;AACzC,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS,IAAI,eAAe,SAAS,UAAU;AAErD,UAAQ,MAAM,iBAAiB,GAAG,0CAA0C;AAE5E,QAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,cAAc;AAAA,IACd,YAAY,CAAC,MAAM;AACjB,UAAI,EAAE,YAAY,OAAO,KAAK,EAAE,YAAY,GAAG;AAC7C,gBAAQ,MAAM,eAAe,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ;AAAA,MACnF;AAAA,IACF;AAAA,EACF,CAAC;AAED,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,gBAAgB;AAC9B,UAAQ,MAAM,iBAAiB,OAAO,KAAK,EAAE;AAC7C,UAAQ,MAAM,iBAAiB,OAAO,OAAO,wCAAwC;AACrF,UAAQ,MAAM,iBAAiB,OAAO,QAAQ,iCAAiC;AAC/E,UAAQ,MAAM,iBAAiB,OAAO,gBAAgB,uBAAuB;AAC7E,UAAQ,MAAM,iBAAiB,OAAO,WAAW,YAAY;AAC/D;AAEA,eAAe,eAAe,OAAwD;AACpF,QAAM,UAAU,OAAO,MAAM,MAAM,MAAM,WAAW,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI;AAClF,QAAM,OAAO,OAAO,MAAM,OAAO,IAAI,KAAK;AAC1C,QAAM,WAAW,gBAAgB,QAAQ;AAEzC,QAAM,WAAW,MAAM,SAAS,eAAe,IAAI;AAEnD,MAAI,MAAM,MAAM,MAAM,MAAM;AAC1B,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,gCAAmC,IAAI,QAAQ;AAC3D,UAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,UAAQ,IAAI,sBAAsB,SAAS,QAAQ,WAAW,EAAE;AAChE,UAAQ,IAAI,sBAAsB,SAAS,QAAQ,aAAa,EAAE;AAClE,UAAQ,IAAI,uBAAuB,SAAS,QAAQ,mBAAmB,KAAK,QAAQ,CAAC,CAAC,GAAG;AACzF,UAAQ,IAAI,uBAAuB,SAAS,QAAQ,iBAAiB,KAAK,QAAQ,CAAC,CAAC,GAAG;AACvF,MAAI,SAAS,QAAQ,0BAA0B,QAAW;AACxD,YAAQ,IAAI,+BAA+B,SAAS,QAAQ,wBAAwB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,EACxG;AACA,UAAQ,IAAI,uBAAuB,SAAS,QAAQ,gBAAgB,KAAM,QAAQ,CAAC,CAAC,GAAG;AAEvF,QAAM,SAAS,SAAS,gBAAgB,OAAO,OAAK,EAAE,UAAU,UAAU;AAC1E,QAAM,WAAW,SAAS,gBAAgB,OAAO,OAAK,EAAE,UAAU,UAAU;AAE5E,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI;AAAA,yBAA4B;AACxC,eAAW,KAAK,QAAQ;AACtB,YAAM,gBAAgB,EAAE,YAAY,kBAAkB;AACtD,YAAM,WAAW,EAAE,UAAU,cAAc,gBAAgB;AAC3D,YAAM,YAAY,EAAE,UAAU,cAAc,OAAO,EAAE,UAAU,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO;AAC/G,YAAM,QAAQ,EAAE,cAAc,QAAQ,MAAM,GAAG;AAC/C,YAAM,WAAW,EAAE,eAAe,QAAQ,CAAC;AAC3C,cAAQ,IAAI,UAAU,EAAE,IAAI,IAAI,aAAa,GAAG,QAAQ,GAAG,SAAS,iBAAY,QAAQ,MAAM,EAAE,YAAY,eAAe,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,GAAG;AACxK,YAAM,IAAI,EAAE;AACZ,cAAQ,IAAI,2BAA2B,EAAE,aAAa,gBAAa,EAAE,MAAM,iBAAc,EAAE,OAAO,YAAY,EAAE,eAAe,EAAE;AACjI,UAAI,EAAE,WAAY,SAAQ,IAAI,YAAY,EAAE,UAAU,EAAE;AACxD,UAAI,EAAE,gBAAgB,SAAS,EAAG,SAAQ,IAAI,YAAY,EAAE,gBAAgB,CAAC,CAAC,EAAE;AAChF,UAAI,EAAE,uBAAuB;AAC3B,cAAM,UAAU,OAAO,QAAQ,EAAE,qBAAqB,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACrF,YAAI,QAAS,SAAQ,IAAI,0BAA0B,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,YAAY;AAAA,MAC1F;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,IAAI;AAAA,4BAA+B;AAAA,EAC7C;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,IAAI;AAAA,mBAAsB;AAClC,eAAW,KAAK,UAAU;AACxB,cAAQ,IAAI,UAAU,EAAE,IAAI,4DAAuD;AAAA,IACrF;AAAA,EACF;AAEA,MAAI,SAAS,uBAAuB,SAAS,GAAG;AAC9C,YAAQ,IAAI;AAAA,0BAA6B;AACzC,eAAW,KAAK,SAAS,wBAAwB;AAC/C,cAAQ,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,KAAK,WAAW;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,SAAS,wBAAwB,SAAS,qBAAqB,SAAS,GAAG;AAC7E,YAAQ,IAAI;AAAA,uBAA0B;AACtC,eAAW,KAAK,SAAS,sBAAsB;AAC7C,cAAQ,IAAI,UAAU,EAAE,IAAI,YAAY,EAAE,WAAW,gBAAgB,EAAE,oBAAoB,MAAM,KAAK,MAAM,EAAE,oBAAoB,GAAG,CAAC,cAAc;AAAA,IACtJ;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS;AACvB,MAAI,OAAO;AACT,YAAQ,IAAI;AAAA,mBAAsB,MAAM,UAAU,YAAY,cAAc,EAAE;AAC9E,YAAQ,IAAI,eAAe,MAAM,YAAY,IAAI,MAAM,UAAU,0CAA0C;AAC3G,QAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,iBAAW,KAAK,MAAM,QAAQ;AAC5B,gBAAQ,IAAI,MAAM,EAAE,IAAI,UAAU,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,0CAA6C;AAC3D;AAEA,eAAe,eAAe,OAAwD;AACpF,QAAM,WAAW,OAAO,MAAM,OAAO,MAAM,WAAW,SAAS,MAAM,OAAO,GAAG,EAAE,IAAI;AACrF,QAAM,QAAQ,OAAO,MAAM,QAAQ,IAAI,KAAK;AAC5C,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,WAAW,MAAM,SAAS,YAAY,KAAK;AAEjD,MAAI,MAAM,MAAM,MAAM,MAAM;AAC1B,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,+EAA+E;AAC3F;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,wBAA2B,SAAS,MAAM,GAAG;AACzD,UAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAE1B,aAAW,KAAK,CAAC,GAAG,QAAQ,EAAE,QAAQ,GAAG;AACvC,UAAM,SAAS,EAAE,UAAU,WAAM;AACjC,UAAM,UAAU,EAAE,eAAe,KAAK,EAAE,YAAY,MAAM;AAC1D,UAAM,cAAc,EAAE,WAAW,IAAI,KAAK,EAAE,QAAQ,eAAe;AACnE,UAAM,UAAU,EAAE,eAAe,KAAK,EAAE,YAAY,KAAK,KAAK,EAAE,YAAY,MAAM,GAAG,EAAE,CAAC;AACxF,UAAM,WAAW,EAAE,YAAY,SAAS,IAAI,kBAAa,EAAE,YAAY,KAAK,IAAI,CAAC,YAAY;AAC7F,YAAQ,IAAI,GAAG,EAAE,IAAI,KAAK,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA,EACjF;AACF;AAEA,eAAe,aAA4B;AACzC,QAAM,EAAE,WAAW,UAAU,MAAM,IAAI,MAAM,OAAO,aAAkB;AACtE,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,IAAS;AAC1C,QAAM,WAAW,MAAM,OAAO,UAAe;AAE7C,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,MAAM,CAAC,MAA+B,IAAI,QAAQ,CAAC,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5F,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,kCAA6B;AAC3C,UAAQ,MAAM,0JAA6B;AAC3C,UAAQ,MAAM,EAAE;AAEhB,QAAM,UAAU,KAAK,QAAQ,IAAI,GAAG,MAAM;AAC1C,MAAI,cAAc;AAClB,MAAI;AACF,kBAAc,MAAM,SAAS,SAAS,OAAO;AAAA,EAC/C,QAAQ;AAAA,EAAC;AAET,QAAM,MAAM,CAAC,QAAgB,YAAY,SAAS,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG;AAE3E,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,IAAI,mBAAmB,GAAG;AAC7B,UAAM,MAAM,MAAM,IAAI,oDAAoD;AAC1E,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,qBAAqB,IAAI,KAAK,CAAC,EAAE;AAAA,EAC9D,OAAO;AACL,YAAQ,MAAM,kCAAkC;AAAA,EAClD;AAEA,MAAI,CAAC,IAAI,cAAc,GAAG;AACxB,UAAM,MAAM,MAAM,IAAI,6DAA6D;AACnF,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,gBAAgB,IAAI,KAAK,EAAE,QAAQ,OAAO,EAAE,CAAC,EAAE;AAAA,EAC5E,OAAO;AACL,YAAQ,MAAM,6BAA6B;AAAA,EAC7C;AAEA,MAAI,CAAC,IAAI,aAAa,GAAG;AACvB,UAAM,MAAM,MAAM,IAAI,iBAAiB;AACvC,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,eAAe,IAAI,KAAK,CAAC,EAAE;AAAA,EACxD,OAAO;AACL,YAAQ,MAAM,4BAA4B;AAAA,EAC5C;AAEA,KAAG,MAAM;AAET,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,aAAa,cACf,YAAY,QAAQ,IAAI,OAAO,MAAM,KAAK,IAAI,IAAI,OAClD,MAAM,KAAK,IAAI,IAAI;AACvB,UAAM,UAAU,SAAS,YAAY,OAAO;AAC5C,YAAQ,MAAM;AAAA,aAAgB,OAAO,EAAE;AAAA,EACzC,OAAO;AACL,YAAQ,MAAM,yCAAyC;AAAA,EACzD;AAEA,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,+BAA+B;AAE7C,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,IACd,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,QAAM,SAAS,IAAI,eAAe,SAAS,MAAM;AAEjD,QAAM,QAAQ,WAAW;AACzB,QAAM,WAAW,MAAM,QAAQ,KAAK;AAEpC,MAAI,SAAS,UAAU,IAAI;AACzB,YAAQ,MAAM,yBAAyB,SAAS,MAAM,gCAA2B;AAAA,EACnF,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,KAAK;AAAA,MAC/B,cAAc;AAAA,MACd,YAAY,CAAC,MAAM;AACjB,YAAI,EAAE,YAAY,QAAQ,KAAK,EAAE,YAAY,GAAG;AAC9C,kBAAQ,OAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa;AAAA,QACrF;AAAA,MACF;AAAA,IACF,CAAC;AACD,YAAQ,MAAM,YAAY,OAAO,KAAK,eAAe,OAAO,OAAO,aAAa,OAAO,gBAAgB,cAAc;AAAA,EACvH;AAEA,QAAM,YAAY,KAAK,QAAQ,GAAG,SAAS;AAC3C,QAAM,MAAM,KAAK,WAAW,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wBAAwB;AACtC,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,MAAM,EAAE;AAClB;AAEA,eAAe,OAAsB;AACnC,QAAM,EAAE,SAAS,YAAY,MAAM,IAAI,UAAU,QAAQ,IAAI;AAE7D,MAAI,CAAC,WAAW,YAAY,UAAU,YAAY,YAAY,MAAM,MAAM,MAAM,MAAM;AACpF,YAAQ,IAAI,IAAI;AAChB;AAAA,EACF;AAEA,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IACF,KAAK;AACH,YAAM,YAAY,YAAY,KAAK;AACnC;AAAA,IACF,KAAK;AACH,YAAM,cAAc,UAAU;AAC9B;AAAA,IACF,KAAK;AACH,YAAM,eAAe,KAAK;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,eAAe,KAAK;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IACF,KAAK;AACH,YAAM,UAAU,UAAU;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,eAAe,UAAU;AAC/B;AAAA,IACF,KAAK;AACH,YAAM,iBAAiB,UAAU;AACjC;AAAA,IACF,KAAK;AACH,YAAM,aAAa,YAAY,KAAK;AACpC;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,KAAK;AAC/B;AAAA,IACF;AACE,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,IAAI,IAAI;AAChB,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAiB;AAC7B,MAAI,eAAe,OAAO;AACxB,YAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AACrC,QAAI,YAAY,OAAO,MAAM,QAAS,IAAgC,MAAM,GAAG;AAC7E,iBAAW,SAAU,IAAgC,QAAoD;AACvG,gBAAQ,MAAM,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,MAAM,OAAO,GAAG,CAAC;AAAA,EAC3B;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;","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 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\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\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 '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":[]}
package/dist/index.cjs CHANGED
@@ -537,6 +537,36 @@ var N8nProvider = class {
537
537
  }
538
538
  };
539
539
 
540
+ // src/errors/generation-error.ts
541
+ var GenerationError = class extends KairosError {
542
+ constructor(message, cause) {
543
+ super(message, cause);
544
+ this.name = "GenerationError";
545
+ }
546
+ };
547
+
548
+ // src/errors/response-parse-error.ts
549
+ var ResponseParseError = class extends KairosError {
550
+ constructor(message, cause) {
551
+ super(message, cause);
552
+ this.name = "ResponseParseError";
553
+ }
554
+ };
555
+
556
+ // src/errors/validation-error.ts
557
+ var ValidationError = class extends KairosError {
558
+ constructor(message, issues, attemptMetadata, warnedRules) {
559
+ super(message);
560
+ this.issues = issues;
561
+ this.attemptMetadata = attemptMetadata;
562
+ this.warnedRules = warnedRules;
563
+ this.name = "ValidationError";
564
+ }
565
+ issues;
566
+ attemptMetadata;
567
+ warnedRules;
568
+ };
569
+
540
570
  // src/validation/registry.ts
541
571
  var DEFAULT_REGISTRY = [
542
572
  // Trigger nodes
@@ -1311,36 +1341,6 @@ var N8nValidator = class {
1311
1341
  }
1312
1342
  };
1313
1343
 
1314
- // src/errors/generation-error.ts
1315
- var GenerationError = class extends KairosError {
1316
- constructor(message, cause) {
1317
- super(message, cause);
1318
- this.name = "GenerationError";
1319
- }
1320
- };
1321
-
1322
- // src/errors/response-parse-error.ts
1323
- var ResponseParseError = class extends KairosError {
1324
- constructor(message, cause) {
1325
- super(message, cause);
1326
- this.name = "ResponseParseError";
1327
- }
1328
- };
1329
-
1330
- // src/errors/validation-error.ts
1331
- var ValidationError = class extends KairosError {
1332
- constructor(message, issues, attemptMetadata, warnedRules) {
1333
- super(message);
1334
- this.issues = issues;
1335
- this.attemptMetadata = attemptMetadata;
1336
- this.warnedRules = warnedRules;
1337
- this.name = "ValidationError";
1338
- }
1339
- issues;
1340
- attemptMetadata;
1341
- warnedRules;
1342
- };
1343
-
1344
1344
  // src/generation/prompt-builder.ts
1345
1345
  var import_node_fs = require("fs");
1346
1346
  var import_node_path = require("path");
@@ -2345,7 +2345,7 @@ var PatternAnalyzer = class _PatternAnalyzer {
2345
2345
  this._cachedEvents = events;
2346
2346
  const starts = events.filter((e) => e.eventType === "build_start");
2347
2347
  const attempts = events.filter((e) => e.eventType === "generation_attempt");
2348
- const passed = attempts.filter(
2348
+ const _passed = attempts.filter(
2349
2349
  (a) => a.data.validationPassed === true
2350
2350
  );
2351
2351
  const failed = attempts.filter(
@@ -2839,7 +2839,6 @@ var DEFAULT_MODEL = process.env["KAIROS_MODEL"] ?? "claude-sonnet-4-6";
2839
2839
  var Kairos = class {
2840
2840
  provider;
2841
2841
  designer;
2842
- validator;
2843
2842
  library;
2844
2843
  logger;
2845
2844
  telemetry;
@@ -2865,7 +2864,6 @@ var Kairos = class {
2865
2864
  const anthropic = new import_sdk.default({ apiKey: options.anthropicApiKey });
2866
2865
  const patternsPath = typeof options.telemetry === "string" ? (0, import_node_path6.join)(options.telemetry, "..", "patterns.json") : (0, import_node_path6.join)((0, import_node_os5.homedir)(), ".kairos", "patterns.json");
2867
2866
  this.designer = new WorkflowDesigner(anthropic, this.model, logger, patternsPath);
2868
- this.validator = new N8nValidator();
2869
2867
  this.library = options.library ?? new NullLibrary();
2870
2868
  this.logger = logger;
2871
2869
  if (options.telemetry === true) {
@@ -2962,7 +2960,6 @@ var Kairos = class {
2962
2960
  }
2963
2961
  await this.emitAttemptTelemetry(description, designResult, workflowType, runId);
2964
2962
  const workflow = options?.name ? { ...designResult.workflow, name: options.name } : designResult.workflow;
2965
- this.saveToLibrary(workflow, description, designResult, matches);
2966
2963
  if (options?.dryRun) {
2967
2964
  const totalTokensInput2 = designResult.attemptMetadata.reduce((s, m) => s + m.tokensInput, 0);
2968
2965
  const totalTokensOutput2 = designResult.attemptMetadata.reduce((s, m) => s + m.tokensOutput, 0);
@@ -2998,6 +2995,7 @@ var Kairos = class {
2998
2995
  if (options?.activate) {
2999
2996
  await provider.activate(deployed.workflowId);
3000
2997
  }
2998
+ this.saveToLibrary(workflow, description, designResult, matches, deployed.workflowId);
3001
2999
  let smokeTestResult;
3002
3000
  if (options?.smokeTest) {
3003
3001
  smokeTestResult = await provider.smokeTest(deployed.workflowId, workflow).catch((err) => {