@kairos-sdk/core 0.4.5 → 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-4TS6GW6O.js";
5
- import "./chunk-CR2NHLOH.js";
4
+ } from "./chunk-GVZKMS53.js";
5
+ import "./chunk-V2IZBZGB.js";
6
6
  import {
7
7
  TemplateSyncer
8
- } from "./chunk-6CLI43FI.js";
8
+ } from "./chunk-MYAGTDQ2.js";
9
9
  import {
10
10
  FileLibrary,
11
11
  PatternAnalyzer
12
- } from "./chunk-6IXW3WCC.js";
12
+ } from "./chunk-VPPWTMRJ.js";
13
13
 
14
14
  // src/cli.ts
15
15
  var HELP = `
@@ -18,6 +18,7 @@ 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 replace <n8n-id> <description>
21
22
  kairos patterns [options]
22
23
  kairos sessions [options]
23
24
  kairos list
@@ -31,6 +32,7 @@ Build options:
31
32
  --dry-run Generate and validate without deploying
32
33
  --name <name> Override the generated workflow name
33
34
  --activate Activate the workflow after deployment
35
+ --smoke-test After deploy, trigger the workflow and verify it runs without error
34
36
 
35
37
  Patterns options:
36
38
  --days <days> Analysis window (default: 30)
@@ -124,7 +126,7 @@ function createDryRunClient() {
124
126
  async function handleBuild(positional, flags) {
125
127
  const description = positional.join(" ");
126
128
  if (!description) {
127
- 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]");
128
130
  process.exit(1);
129
131
  }
130
132
  const isDryRun = flags["dry-run"] === true;
@@ -134,7 +136,8 @@ async function handleBuild(positional, flags) {
134
136
  const result = await kairos.build(description, {
135
137
  dryRun: isDryRun,
136
138
  ...typeof flags["name"] === "string" ? { name: flags["name"] } : {},
137
- activate: flags["activate"] === true
139
+ activate: flags["activate"] === true || flags["smoke-test"] === true,
140
+ smokeTest: flags["smoke-test"] === true
138
141
  });
139
142
  await kairos.drain();
140
143
  const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
@@ -147,7 +150,29 @@ async function handleBuild(positional, flags) {
147
150
  activationRequired: result.activationRequired,
148
151
  dryRun: result.dryRun,
149
152
  credentialsNeeded: result.credentialsNeeded,
150
- ...result.dryRun ? { workflow: result.workflow } : {}
153
+ ...result.dryRun ? { workflow: result.workflow } : {},
154
+ ...result.smokeTest ? { smokeTest: result.smokeTest } : {}
155
+ }, null, 2));
156
+ }
157
+ async function handleReplace(positional) {
158
+ const id = positional[0];
159
+ const description = positional.slice(1).join(" ");
160
+ if (!id || !description) {
161
+ console.error("Usage: kairos replace <n8n-workflow-id> <description>");
162
+ process.exit(1);
163
+ }
164
+ const kairos = createClient();
165
+ const start = Date.now();
166
+ console.error(`Replacing workflow ${id}...`);
167
+ const result = await kairos.replace(id, description);
168
+ await kairos.drain();
169
+ const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
170
+ console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? "s" : ""})`);
171
+ console.error("");
172
+ console.log(JSON.stringify({
173
+ workflowId: result.workflowId,
174
+ name: result.name,
175
+ generationAttempts: result.generationAttempts
151
176
  }, null, 2));
152
177
  }
153
178
  async function handleList() {
@@ -217,14 +242,7 @@ async function handleSyncTemplates(flags) {
217
242
  const maxRaw = typeof flags["max"] === "string" ? parseInt(flags["max"], 10) : NaN;
218
243
  const max = Number.isNaN(maxRaw) ? 500 : maxRaw;
219
244
  const library = new FileLibrary();
220
- const logger = {
221
- debug: () => {
222
- },
223
- info: (msg, meta) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),
224
- warn: (msg, meta) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),
225
- error: (msg, meta) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`)
226
- };
227
- const syncer = new TemplateSyncer(library, logger);
245
+ const syncer = new TemplateSyncer(library, CLI_LOGGER);
228
246
  console.error(`Syncing up to ${max} templates from n8n community library...`);
229
247
  const result = await syncer.sync({
230
248
  maxTemplates: max,
@@ -424,15 +442,32 @@ async function handleInit() {
424
442
  }
425
443
  const kairosDir = join(homedir(), ".kairos");
426
444
  await mkdir(join(kairosDir, "telemetry"), { recursive: true });
445
+ const kairosPath = process.execPath ? `${process.execPath.replace(/node$/, "kairos-mcp")}` : "kairos-mcp";
427
446
  console.error("");
428
447
  console.error(" Setup complete! Try:");
429
448
  console.error("");
430
449
  console.error(' kairos build "Send a Slack message when a webhook fires" --dry-run');
431
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("");
432
467
  }
433
468
  async function main() {
434
469
  const { command, positional, flags } = parseArgs(process.argv);
435
- if (!command || command === "help" || flags["help"] === true) {
470
+ if (!command || command === "help" || command === "--help" || flags["help"] === true) {
436
471
  console.log(HELP);
437
472
  return;
438
473
  }
@@ -443,6 +478,9 @@ async function main() {
443
478
  case "build":
444
479
  await handleBuild(positional, flags);
445
480
  break;
481
+ case "replace":
482
+ await handleReplace(positional);
483
+ break;
446
484
  case "patterns":
447
485
  await handlePatterns(flags);
448
486
  break;
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 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 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 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 const syncer = new TemplateSyncer(library, 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' || 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 '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 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":[]}