@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/README.md +28 -11
- package/dist/{chunk-4TS6GW6O.js → chunk-GVZKMS53.js} +27 -16
- package/dist/chunk-GVZKMS53.js.map +1 -0
- package/dist/{chunk-6CLI43FI.js → chunk-MYAGTDQ2.js} +109 -13
- package/dist/chunk-MYAGTDQ2.js.map +1 -0
- package/dist/{chunk-CR2NHLOH.js → chunk-V2IZBZGB.js} +57 -11
- package/dist/chunk-V2IZBZGB.js.map +1 -0
- package/dist/{chunk-6IXW3WCC.js → chunk-VPPWTMRJ.js} +533 -77
- package/dist/chunk-VPPWTMRJ.js.map +1 -0
- package/dist/cli.cjs +790 -145
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +54 -16
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +740 -133
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.js +5 -5
- package/dist/mcp-server.cjs +960 -347
- package/dist/mcp-server.cjs.map +1 -1
- package/dist/mcp-server.js +374 -261
- package/dist/mcp-server.js.map +1 -1
- package/dist/{reader-CpUcHhKW.d.ts → reader-B5mV20H6.d.cts} +34 -4
- package/dist/{reader-CpUcHhKW.d.cts → reader-B5mV20H6.d.ts} +34 -4
- package/dist/standalone.cjs +603 -85
- package/dist/standalone.cjs.map +1 -1
- package/dist/standalone.d.cts +2 -1
- package/dist/standalone.d.ts +2 -1
- package/dist/standalone.js +3 -3
- package/package.json +15 -5
- package/dist/chunk-4TS6GW6O.js.map +0 -1
- package/dist/chunk-6CLI43FI.js.map +0 -1
- package/dist/chunk-6IXW3WCC.js.map +0 -1
- package/dist/chunk-CR2NHLOH.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
Kairos
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-GVZKMS53.js";
|
|
5
|
+
import "./chunk-V2IZBZGB.js";
|
|
6
6
|
import {
|
|
7
7
|
TemplateSyncer
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-MYAGTDQ2.js";
|
|
9
9
|
import {
|
|
10
10
|
FileLibrary,
|
|
11
11
|
PatternAnalyzer
|
|
12
|
-
} from "./chunk-
|
|
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
|
|
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":[]}
|