agentix-cli 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -107
- package/dist/agent-K2YOEOJ5.js +2 -0
- package/dist/chunk-4YCH6IZV.js +2 -0
- package/dist/chunk-AIBBZF4E.js +41 -0
- package/dist/chunk-AIBBZF4E.js.map +1 -0
- package/dist/chunk-F73GPYCO.js +106 -0
- package/dist/chunk-F73GPYCO.js.map +1 -0
- package/dist/chunk-M7HKBG3V.js +2 -0
- package/dist/chunk-M7HKBG3V.js.map +1 -0
- package/dist/chunk-MGMZNJCE.js +46 -0
- package/dist/chunk-MGMZNJCE.js.map +1 -0
- package/dist/{chunk-6PVFYFUE.js → chunk-X7UN6JAA.js} +2 -2
- package/dist/{chunk-6PVFYFUE.js.map → chunk-X7UN6JAA.js.map} +1 -1
- package/dist/chunk-Z4GC5D6D.js +12 -0
- package/dist/chunk-Z4GC5D6D.js.map +1 -0
- package/dist/cli.js +9 -155
- package/dist/cli.js.map +1 -1
- package/dist/heal-UV5A6B5T.js +2 -0
- package/dist/index.d.ts +265 -11
- package/dist/index.js +85 -1
- package/dist/index.js.map +1 -1
- package/dist/loader-6VSM6FSY.js +2 -0
- package/dist/providers-AVYG63KK.js +2 -0
- package/dist/providers-AVYG63KK.js.map +1 -0
- package/package.json +3 -1
- package/dist/agent-AI6DUEPU.js +0 -2
- package/dist/chunk-FUYKPFUV.js +0 -46
- package/dist/chunk-FUYKPFUV.js.map +0 -1
- package/dist/chunk-NZ6W33BD.js +0 -116
- package/dist/chunk-NZ6W33BD.js.map +0 -1
- package/dist/chunk-THMHQELC.js +0 -106
- package/dist/chunk-THMHQELC.js.map +0 -1
- package/dist/heal-MJLBETRV.js +0 -2
- package/dist/loader-PHU6STSZ.js +0 -2
- package/dist/providers-MPYTYJVB.js +0 -2
- /package/dist/{agent-AI6DUEPU.js.map → agent-K2YOEOJ5.js.map} +0 -0
- /package/dist/{heal-MJLBETRV.js.map → chunk-4YCH6IZV.js.map} +0 -0
- /package/dist/{loader-PHU6STSZ.js.map → heal-UV5A6B5T.js.map} +0 -0
- /package/dist/{providers-MPYTYJVB.js.map → loader-6VSM6FSY.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/chat.ts","../src/commands/generate.ts","../src/utils/generate-tui.ts","../src/utils/render-markdown.ts","../src/commands/evolve.ts","../src/commands/create.ts","../src/commands/run.ts","../src/commands/inspect.ts","../src/commands/skill.ts","../src/commands/serve.ts","../src/commands/model.ts","../src/commands/git.ts","../src/commands/a2a.ts","../src/commands/daemon.ts","../src/cli.ts"],"sourcesContent":["import { existsSync } from \"fs\"\nimport path from \"path\"\nimport { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { getPackageInfo } from \"@/utils/get-package-info\"\nimport { ReplEngine } from \"@/repl\"\nimport { listSessions } from \"@/repl/session\"\nimport { setDebug } from \"@/observability\"\nimport { globalPermissions, type PermissionMode } from \"@/permissions\"\n\nexport const chat = new Command()\n .name(\"chat\")\n .description(\"start an interactive AI coding session\")\n .option(\"--resume\", \"resume the last session\", false)\n .option(\"-s, --session <id>\", \"resume a specific session\")\n .option(\"--list\", \"list saved sessions\", false)\n .option(\n \"-p, --provider <provider>\",\n \"AI provider (claude-code, claude)\",\n \"claude-code\"\n )\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key for the provider\")\n .option(\"-c, --cwd <cwd>\", \"working directory\", process.cwd())\n .option(\"--debug\", \"enable debug mode with verbose logging\", false)\n .option(\"--mode <mode>\", \"permission mode (default, acceptEdits, plan, yolo)\", \"yolo\")\n .action(async (opts) => {\n try {\n // List sessions mode\n if (opts.list) {\n const sessions = listSessions()\n if (!sessions.length) {\n logger.info(\"No saved sessions\")\n return\n }\n\n console.log()\n console.log(chalk.bold(\" Saved sessions:\"))\n console.log()\n for (const s of sessions.slice(0, 20)) {\n const date = new Date(s.updatedAt).toLocaleDateString()\n const msgs = s.messages.length\n const tokens = s.tokensUsed.toLocaleString()\n console.log(\n ` ${chalk.cyan(s.id)} ${date} ${msgs} msgs ${tokens} tokens`\n )\n }\n console.log()\n return\n }\n\n if (opts.debug) {\n setDebug(true)\n }\n\n if (opts.mode) {\n globalPermissions.setMode(opts.mode as PermissionMode)\n }\n\n const cwd = path.resolve(opts.cwd)\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist.`)\n process.exit(1)\n }\n\n const packageInfo = await getPackageInfo()\n\n const engine = new ReplEngine({\n cwd,\n provider: opts.provider,\n model: opts.model,\n apiKey: opts.apiKey,\n resume: opts.resume,\n sessionId: opts.session,\n version: packageInfo.version || \"1.0.0\",\n })\n\n await engine.start()\n } catch (error) {\n handleError(error)\n }\n })\n","import { existsSync } from \"fs\"\nimport path from \"path\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { generateStream } from \"@/agent\"\nimport { OUTPUT_TYPES, outputTypeDescriptions } from \"@/agent/providers/types\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport ora from \"ora\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\nimport { setDebug } from \"@/observability\"\nimport { globalTracker } from \"@/observability\"\nimport { globalPermissions, type PermissionMode } from \"@/permissions\"\nimport { GenerateTui } from \"@/utils/generate-tui\"\nimport { renderMarkdownForTerminal } from \"@/utils/render-markdown\"\n\nconst generateOptionsSchema = z.object({\n task: z.string().optional(),\n type: z.string().default(\"auto\"),\n output: z.string().optional(),\n overwrite: z.boolean().default(false),\n dryRun: z.boolean().default(false),\n provider: z.enum([\"claude-code\", \"claude\", \"openai\", \"ollama\", \"custom\"]).default(\"claude-code\"),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n cwd: z.string(),\n noContext7: z.boolean().default(false),\n yes: z.boolean().default(false),\n})\n\nexport const gen = new Command()\n .name(\"generate\")\n .aliases([\"gen\", \"g\"])\n .description(\"generate anything using AI — components, pages, APIs, docs, skills, and more\")\n .argument(\"[task...]\", \"describe what you want to generate\")\n .option(\n \"-t, --type <type>\",\n `output type: ${OUTPUT_TYPES.join(\", \")}`,\n \"auto\"\n )\n .option(\"-o, --output <dir>\", \"output directory\")\n .option(\"--overwrite\", \"overwrite existing files\", false)\n .option(\"--dry-run\", \"preview without writing files\", false)\n .option(\n \"-p, --provider <provider>\",\n \"AI provider (claude-code, claude, openai, ollama)\",\n \"claude-code\"\n )\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key for the provider\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .option(\"--no-context7\", \"disable Context7 documentation lookup\")\n .option(\n \"--max-steps <n>\",\n \"max agentic loop steps for complex generation (default: 5)\",\n \"5\"\n )\n .option(\"-y, --yes\", \"skip confirmation prompts\", false)\n .option(\"--debug\", \"enable debug mode with verbose logging\", false)\n .option(\"--no-tui\", \"disable interactive TUI output\")\n .option(\"--mode <mode>\", \"permission mode (default, acceptEdits, plan, yolo)\", \"yolo\")\n .option(\"--heal\", \"verify generated code and auto-fix errors\")\n .option(\"--no-heal\", \"skip verification after generation\")\n .option(\"--test-cmd <cmd>\", \"test command for heal verification\")\n .option(\"--build-cmd <cmd>\", \"build command for heal verification\")\n .action(async (taskParts, opts) => {\n try {\n let task = taskParts?.length ? taskParts.join(\" \") : opts.task\n\n if (opts.debug) {\n setDebug(true)\n }\n\n if (opts.mode) {\n globalPermissions.setMode(opts.mode as PermissionMode)\n }\n\n const cwd = path.resolve(opts.cwd)\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist.`)\n process.exit(1)\n }\n\n // Interactive task input if not provided\n if (!task) {\n const response = await prompts({\n type: \"text\",\n name: \"task\",\n message: \"What would you like to generate?\",\n validate: (v) => (v.trim() ? true : \"Please describe what to generate\"),\n })\n\n if (!response.task) {\n logger.warn(\"No task provided. Exiting.\")\n process.exit(0)\n }\n task = response.task\n }\n\n // Show available output types if type is \"auto\" and user wants to choose\n if (opts.type === \"auto\" && !opts.yes) {\n const { type } = await prompts({\n type: \"select\",\n name: \"type\",\n message: \"Output type (or auto-detect)\",\n choices: [\n { title: \"Auto-detect\", value: \"auto\" },\n ...OUTPUT_TYPES.filter((t) => t !== \"auto\").map((t) => ({\n title: `${t} — ${outputTypeDescriptions[t]}`,\n value: t,\n })),\n ],\n initial: 0,\n })\n\n if (type !== undefined) {\n opts.type = type\n }\n }\n\n const options = generateOptionsSchema.parse({\n task,\n ...opts,\n apiKey: opts.apiKey,\n noContext7: !opts.context7,\n })\n\n const maxSteps = parseInt(opts.maxSteps || \"5\", 10)\n const useTui = Boolean(opts.tui) && Boolean(process.stdout.isTTY) && !Boolean(opts.debug)\n const spinner = (!useTui && !opts.debug) ? ora(\"Waiting for provider...\").start() : undefined\n\n const tui = useTui\n ? new GenerateTui({\n task,\n provider: options.provider,\n model: options.model,\n cwd,\n outputDir: options.output,\n outputType: options.type,\n maxSteps,\n overwrite: options.overwrite,\n dryRun: options.dryRun,\n })\n : undefined\n\n if (!useTui) {\n // Show what we're about to do (plain logs).\n logger.break()\n logger.info(`Task: ${chalk.bold(task)}`)\n logger.info(`Provider: ${chalk.bold(options.provider)}`)\n if (options.type !== \"auto\") {\n logger.info(`Type: ${chalk.bold(options.type)}`)\n }\n if (options.output) {\n logger.info(`Output: ${chalk.bold(options.output)}`)\n }\n if (options.dryRun) {\n logger.warn(\"Dry run mode — no files will be written\")\n }\n logger.break()\n }\n\n tui?.start()\n\n let result: any | undefined\n let streamError: string | undefined\n for await (const event of generateStream({\n task,\n outputType: options.type as any,\n outputDir: options.output,\n overwrite: options.overwrite,\n dryRun: options.dryRun,\n provider: options.provider as any,\n model: options.model,\n apiKey: options.apiKey,\n cwd,\n context7: !options.noContext7,\n interactive: !options.yes,\n maxSteps,\n heal: opts.heal,\n healConfig: (opts.testCmd || opts.buildCmd) ? {\n testCommand: opts.testCmd,\n buildCommand: opts.buildCmd,\n } : undefined,\n })) {\n tui?.onEvent(event as any)\n\n if (!useTui) {\n if (event.type === \"context_ready\") {\n if (spinner) spinner.text = \"Generating...\"\n }\n if (event.type === \"context_ready\") {\n logger.info(\"Analyzing project... done\")\n logger.info(`Output type: ${event.outputType}`)\n } else if (event.type === \"iteration\") {\n logger.info(`Step ${event.iteration}/${maxSteps}...`)\n } else if (event.type === \"tool_call\") {\n logger.info(`Tool: ${event.name}`)\n } else if (event.type === \"tool_result\") {\n logger.info(`Tool result: ${event.name}${event.is_error ? \" (error)\" : \"\"}`)\n } else if (event.type === \"error\") {\n logger.error(event.error)\n }\n }\n\n if (event.type === \"generate_result\") {\n result = event.result\n }\n if (event.type === \"error\") {\n streamError = event.error\n }\n }\n\n spinner?.stop()\n tui?.stop()\n if (streamError) {\n throw new Error(streamError)\n }\n if (!result) {\n throw new Error(\"Generation finished without a result\")\n }\n\n // Handle follow-up questions\n if (result.followUp) {\n // Ensure the terminal is back to normal before prompting.\n logger.break()\n logger.info(chalk.yellow(\"The agent needs more information:\"))\n logger.break()\n if (result.content) {\n const rendered = process.stdout.isTTY\n ? renderMarkdownForTerminal(result.content)\n : result.content\n console.log(rendered)\n logger.break()\n }\n console.log(process.stdout.isTTY ? renderMarkdownForTerminal(result.followUp) : result.followUp)\n logger.break()\n\n const { answer } = await prompts({\n type: \"text\",\n name: \"answer\",\n message: \"Your answer:\",\n })\n\n if (answer) {\n const task2 =\n `${task}\\n\\n` +\n `Previous agent output (for context):\\n${result.content || \"\"}\\n\\n` +\n `User response: ${answer}\\n\\n` +\n `If the above was a plan awaiting approval and the user approved, proceed to implementation now using create_files (do not ask for approval again).`\n const tui2 = useTui\n ? new GenerateTui({\n task: task2,\n provider: options.provider,\n model: options.model,\n cwd,\n outputDir: options.output,\n outputType: options.type,\n maxSteps,\n overwrite: options.overwrite,\n dryRun: options.dryRun,\n })\n : undefined\n\n tui2?.start()\n\n let result2: any | undefined\n let streamError2: string | undefined\n for await (const event of generateStream({\n task: task2,\n outputType: options.type as any,\n outputDir: options.output,\n overwrite: options.overwrite,\n dryRun: options.dryRun,\n provider: options.provider as any,\n model: options.model,\n apiKey: options.apiKey,\n cwd,\n context7: !options.noContext7,\n interactive: false,\n maxSteps,\n heal: opts.heal,\n healConfig: (opts.testCmd || opts.buildCmd) ? {\n testCommand: opts.testCmd,\n buildCommand: opts.buildCmd,\n } : undefined,\n })) {\n tui2?.onEvent(event as any)\n if (event.type === \"generate_result\") result2 = event.result\n if (event.type === \"error\") streamError2 = event.error\n }\n\n tui2?.stop()\n if (streamError2) throw new Error(streamError2)\n if (!result2) throw new Error(\"Generation finished without a result\")\n printResult(result2)\n }\n } else {\n printResult(result)\n }\n } catch (error) {\n handleError(error)\n }\n })\n\nfunction printResult(result: any) {\n logger.break()\n\n if (result.content) {\n const rendered = process.stdout.isTTY\n ? renderMarkdownForTerminal(result.content)\n : result.content\n console.log(rendered)\n logger.break()\n }\n\n if (result.files.written.length) {\n logger.success(`Created ${result.files.written.length} file(s):`)\n for (const file of result.files.written) {\n console.log(` ${chalk.green(\"+\")} ${file}`)\n }\n }\n\n if (result.files.skipped.length) {\n logger.warn(`Skipped ${result.files.skipped.length} existing file(s):`)\n for (const file of result.files.skipped) {\n console.log(` ${chalk.yellow(\"~\")} ${file} (use --overwrite)`)\n }\n }\n\n if (result.files.errors.length) {\n logger.error(`Failed ${result.files.errors.length} file(s):`)\n for (const err of result.files.errors) {\n console.log(` ${chalk.red(\"x\")} ${err}`)\n }\n }\n\n // Display heal results\n if (result.healResult) {\n logger.break()\n if (result.healResult.healed) {\n if (result.healResult.attempts === 0) {\n logger.success(\"Verification passed — generated code is clean\")\n } else {\n logger.success(\n `Auto-healed in ${result.healResult.attempts} attempt(s)` +\n (result.healResult.filesChanged?.length ? ` (fixed: ${result.healResult.filesChanged.join(\", \")})` : \"\")\n )\n }\n } else if (result.healResult.error) {\n logger.error(`Verification failed after ${result.healResult.attempts} attempt(s):`)\n console.log(chalk.dim(` ${result.healResult.error.split(\"\\n\").slice(0, 3).join(\"\\n \")}`))\n }\n }\n\n if (result.tokensUsed) {\n logger.break()\n const summary = globalTracker.getSummary()\n if (summary.steps.length > 1) {\n logger.info(`Tokens used: ${result.tokensUsed} across ${summary.steps.length} steps`)\n for (const step of summary.steps) {\n logger.info(` Step ${step.step}: ${(step.inputTokens + step.outputTokens).toLocaleString()} tokens ($${step.cost.toFixed(4)})`)\n }\n logger.info(` Total cost: $${summary.totalCost.toFixed(4)}`)\n } else {\n logger.info(`Tokens used: ${result.tokensUsed} ($${summary.totalCost.toFixed(4)})`)\n }\n }\n}\n","import chalk from \"chalk\"\n\nimport type { GenerateStreamEvent } from \"@/agent\"\n\nfunction nowMs(): number {\n return Date.now()\n}\n\nfunction formatDuration(ms: number): string {\n const s = Math.floor(ms / 1000)\n const m = Math.floor(s / 60)\n const h = Math.floor(m / 60)\n const ss = String(s % 60).padStart(2, \"0\")\n const mm = String(m % 60).padStart(2, \"0\")\n if (h > 0) return `${h}:${mm}:${ss}`\n return `${m}:${ss}`\n}\n\nfunction tailLines(text: string, maxLines: number): string[] {\n const lines = text.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")\n if (lines.length <= maxLines) return lines\n return lines.slice(lines.length - maxLines)\n}\n\nfunction clampTail(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text\n return text.slice(text.length - maxChars)\n}\n\nexport interface GenerateTuiOptions {\n task: string\n provider: string\n model?: string\n cwd: string\n outputDir?: string\n outputType?: string\n maxSteps?: number\n overwrite?: boolean\n dryRun?: boolean\n}\n\nexport class GenerateTui {\n private startedAt = nowMs()\n private phase: string = \"Analyzing project\"\n private outputType: string = \"auto\"\n private iteration: number = 0\n private maxSteps?: number\n private filesCreated: number = 0\n private filesWritten: number = 0\n private filesSkipped: number = 0\n private filesErrors: number = 0\n\n private eventLog: string[] = []\n private textTail: string = \"\"\n private lastActivityAt = nowMs()\n\n private dirty = true\n private renderTimer: NodeJS.Timeout | undefined\n private pulseTimer: NodeJS.Timeout | undefined\n private stopped = false\n private restoreHandlersInstalled = false\n private handleExit = () => this.stop()\n private handleSigint = () => {\n this.stop()\n process.exit(130)\n }\n private handleSigterm = () => {\n this.stop()\n process.exit(143)\n }\n\n constructor(private opts: GenerateTuiOptions) {\n this.outputType = opts.outputType || \"auto\"\n this.maxSteps = opts.maxSteps\n }\n\n start(): void {\n if (!process.stdout.isTTY) return\n\n // Hide cursor.\n process.stdout.write(\"\\x1b[?25l\")\n this.installRestoreHandlers()\n // Keep the UI alive even if the provider doesn't stream (loader/elapsed updates).\n this.pulseTimer = setInterval(() => {\n if (this.stopped) return\n this.scheduleRender()\n }, 120)\n this.render()\n }\n\n stop(): void {\n if (this.stopped) return\n this.stopped = true\n\n if (this.renderTimer) clearTimeout(this.renderTimer)\n this.renderTimer = undefined\n if (this.pulseTimer) clearInterval(this.pulseTimer)\n this.pulseTimer = undefined\n\n if (process.stdout.isTTY) {\n // Show cursor.\n process.stdout.write(\"\\x1b[?25h\")\n // Leave screen in a clean state for normal logs.\n process.stdout.write(\"\\n\")\n }\n\n this.uninstallRestoreHandlers()\n }\n\n onEvent(evt: GenerateStreamEvent): void {\n if (this.stopped) return\n this.lastActivityAt = nowMs()\n\n if (evt.type === \"context_ready\") {\n this.phase = \"Generating\"\n this.outputType = evt.outputType\n this.log(`Context ready. Output type: ${evt.outputType}`)\n } else if (evt.type === \"iteration\") {\n this.phase = \"Generating\"\n this.iteration = evt.iteration\n this.log(`Step ${evt.iteration}${this.maxSteps ? `/${this.maxSteps}` : \"\"}`)\n } else if (evt.type === \"tool_call\") {\n this.phase = \"Running tools\"\n this.log(`Tool: ${evt.name} (${evt.id})`)\n } else if (evt.type === \"tool_result\") {\n const status = evt.is_error ? chalk.red(\"error\") : chalk.green(\"ok\")\n this.log(`Tool result: ${evt.name} (${evt.id}) ${status}`)\n } else if (evt.type === \"step_complete\") {\n this.filesCreated += evt.filesCount\n this.log(`Created ${evt.filesCount} file(s)`)\n } else if (evt.type === \"text_delta\") {\n // Keep a small tail; rendering is throttled.\n this.textTail = clampTail(this.textTail + evt.text, 4000)\n } else if (evt.type === \"done\") {\n this.phase = \"Writing files\"\n this.log(\"Model completed. Writing files...\")\n } else if (evt.type === \"generate_result\") {\n this.phase = \"Done\"\n this.filesWritten = evt.result.files.written.length\n this.filesSkipped = evt.result.files.skipped.length\n this.filesErrors = evt.result.files.errors.length\n if (evt.result.healResult) {\n this.log(evt.result.healResult.healed ? \"Verification: ok\" : \"Verification: failed\")\n }\n if (evt.result.followUp) {\n this.phase = \"Needs input\"\n this.log(\"Waiting for your answer...\")\n }\n } else if (evt.type === \"error\") {\n this.phase = \"Error\"\n this.log(chalk.red(evt.error))\n }\n\n this.scheduleRender()\n }\n\n private log(line: string): void {\n const ts = formatDuration(nowMs() - this.startedAt)\n const msg = `${chalk.dim(ts)} ${line}`\n this.eventLog.push(msg)\n if (this.eventLog.length > 25) {\n this.eventLog = this.eventLog.slice(this.eventLog.length - 25)\n }\n }\n\n private scheduleRender(): void {\n if (!process.stdout.isTTY) return\n this.dirty = true\n if (this.renderTimer) return\n this.renderTimer = setTimeout(() => {\n this.renderTimer = undefined\n this.render()\n }, 50)\n }\n\n private render(): void {\n if (!process.stdout.isTTY) return\n if (!this.dirty) return\n this.dirty = false\n\n const cols = process.stdout.columns || 80\n const rows = process.stdout.rows || 24\n const spinnerFrames = [\"|\", \"/\", \"-\", \"\\\\\"] as const\n const spinner = spinnerFrames[Math.floor((nowMs() - this.startedAt) / 120) % spinnerFrames.length]\n const idleForMs = nowMs() - this.lastActivityAt\n\n const header = chalk.bold(\"agentx generate\") + chalk.dim(` ${formatDuration(nowMs() - this.startedAt)}`)\n const meta1 = `${chalk.dim(\"Task:\")} ${this.opts.task}`\n const meta2 =\n `${chalk.dim(\"Provider:\")} ${this.opts.provider}` +\n (this.opts.model ? ` ${chalk.dim(\"Model:\")} ${this.opts.model}` : \"\") +\n ` ${chalk.dim(\"Type:\")} ${this.outputType}`\n\n const meta3 =\n `${chalk.dim(\"CWD:\")} ${this.opts.cwd}` +\n (this.opts.outputDir ? ` ${chalk.dim(\"Out:\")} ${this.opts.outputDir}` : \"\") +\n (this.opts.overwrite ? ` ${chalk.dim(\"Overwrite:\")} yes` : \"\") +\n (this.opts.dryRun ? ` ${chalk.dim(\"Dry-run:\")} yes` : \"\")\n\n const status =\n `${chalk.dim(\"Status:\")} ${chalk.bold(this.phase)} ${chalk.dim(spinner)}` +\n (this.iteration ? ` ${chalk.dim(\"Step:\")} ${this.iteration}${this.maxSteps ? `/${this.maxSteps}` : \"\"}` : \"\") +\n (idleForMs > 1500 ? ` ${chalk.dim(\"Idle:\")} ${formatDuration(idleForMs)}` : \"\") +\n (this.filesWritten || this.filesSkipped || this.filesErrors\n ? ` ${chalk.dim(\"Files:\")} ${chalk.green(String(this.filesWritten))} written, ${chalk.yellow(String(this.filesSkipped))} skipped, ${chalk.red(String(this.filesErrors))} failed`\n : (this.filesCreated ? ` ${chalk.dim(\"Files:\")} ${this.filesCreated} created` : \"\"))\n\n const sep = chalk.dim(\"\".padEnd(Math.min(cols, 80), \"─\"))\n\n // Leave room for header/meta/status/sep lines.\n const fixedLines = 6\n const available = Math.max(0, rows - fixedLines)\n const outputLines = Math.max(6, Math.floor(available * 0.55))\n const eventLines = Math.max(4, available - outputLines)\n\n const eventTail = this.eventLog.slice(-eventLines)\n const outTailLines = tailLines(this.textTail, outputLines)\n\n const body = [\n header,\n meta1,\n meta2,\n meta3,\n status,\n sep,\n chalk.dim(\"Events:\"),\n ...eventTail.map((l) => l.slice(0, cols)),\n sep,\n chalk.dim(\"Output (tail):\"),\n ...outTailLines.map((l) => l.slice(0, cols)),\n ].join(\"\\n\")\n\n // Clear screen and render from top-left.\n process.stdout.write(\"\\x1b[H\\x1b[2J\")\n process.stdout.write(body)\n }\n\n private installRestoreHandlers(): void {\n if (this.restoreHandlersInstalled) return\n this.restoreHandlersInstalled = true\n process.once(\"exit\", this.handleExit)\n process.once(\"SIGINT\", this.handleSigint)\n process.once(\"SIGTERM\", this.handleSigterm)\n }\n\n private uninstallRestoreHandlers(): void {\n if (!this.restoreHandlersInstalled) return\n this.restoreHandlersInstalled = false\n process.off(\"exit\", this.handleExit)\n process.off(\"SIGINT\", this.handleSigint)\n process.off(\"SIGTERM\", this.handleSigterm)\n }\n}\n","import chalk from \"chalk\"\n\n// Minimal, dependency-free markdown pretty-printer for terminal output.\n// Goal: improve readability of plans/specs without trying to fully parse Markdown.\n\nfunction indentBlock(s: string, prefix: string): string {\n return s\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((l) => (l.length ? prefix + l : l))\n .join(\"\\n\")\n}\n\nfunction renderInline(line: string): string {\n // Inline code\n line = line.replace(/`([^`]+)`/g, (_, code) => chalk.cyan(code))\n // Links: [text](url) -> text (url)\n line = line.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_, text, url) => `${text} ${chalk.dim(`(${url})`)}`)\n // Bold (**text**). Keep this last-ish to avoid interfering with code/link replacements.\n line = line.replace(/\\*\\*([^*]+)\\*\\*/g, (_, t) => chalk.bold(t))\n return line\n}\n\nfunction renderTextBlock(block: string): string {\n const lines = block.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")\n const out: string[] = []\n\n for (const raw of lines) {\n const line = raw.trimEnd()\n\n if (/^\\s*#{1,6}\\s+/.test(line)) {\n const title = line.replace(/^\\s*#{1,6}\\s+/, \"\")\n out.push(chalk.bold(renderInline(title)))\n continue\n }\n\n if (/^\\s*([-*_]\\s*){3,}$/.test(line)) {\n out.push(chalk.dim(\"─\".repeat(40)))\n continue\n }\n\n if (/^\\s*>\\s?/.test(line)) {\n out.push(chalk.dim(\"│ \") + renderInline(line.replace(/^\\s*>\\s?/, \"\")))\n continue\n }\n\n out.push(renderInline(line))\n }\n\n return out.join(\"\\n\")\n}\n\nexport function renderMarkdownForTerminal(md: string): string {\n const input = (md || \"\").replace(/\\r\\n/g, \"\\n\")\n if (!input.trim()) return \"\"\n\n // Split by fenced code blocks. Keep fences so output still looks like markdown,\n // but dim the code body to reduce noise for plan/spec output.\n const parts = input.split(/```/g)\n if (parts.length === 1) return renderTextBlock(input)\n\n const out: string[] = []\n for (let i = 0; i < parts.length; i++) {\n const chunk = parts[i]\n const isCode = i % 2 === 1\n\n if (!isCode) {\n out.push(renderTextBlock(chunk))\n continue\n }\n\n // chunk starts with optional \"lang\\n\"\n const firstNl = chunk.indexOf(\"\\n\")\n const info = firstNl === -1 ? chunk.trim() : chunk.slice(0, firstNl).trim()\n const body = firstNl === -1 ? \"\" : chunk.slice(firstNl + 1)\n\n const header = info ? chalk.dim(\"```\" + info) : chalk.dim(\"```\")\n const footer = chalk.dim(\"```\")\n const codeBody = chalk.dim(indentBlock(body.replace(/\\s+$/g, \"\"), \"\"))\n\n out.push([header, codeBody, footer].filter(Boolean).join(\"\\n\"))\n }\n\n // Avoid leading/trailing empty lines noise.\n return out.join(\"\\n\").replace(/^\\n+|\\n+$/g, \"\")\n}\n\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { createAgentContext } from \"@/agent\"\nimport { createProvider, type ProviderName } from \"@/agent/providers\"\nimport { ensureCredentials } from \"@/utils/auth-store\"\nimport { loadAuthConfig } from \"@/utils/auth-store\"\nimport type { GenerationMessage, GeneratedFile } from \"@/agent/providers/types\"\nimport { formatTechStack } from \"@/agent/context/tech-stack\"\nimport { formatSchemas } from \"@/agent/context/schema\"\nimport { matchSkillsToTask } from \"@/agent/skills/loader\"\nimport { globalHooks } from \"@/hooks\"\nimport { globalPermissions, type PermissionMode } from \"@/permissions\"\nimport { globalTracker, debug, setDebug } from \"@/observability\"\nimport { MemoryHierarchy } from \"@/memory\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport ora from \"ora\"\nimport prompts from \"prompts\"\nimport fg from \"fast-glob\"\n\n// --- `agentx evolve` — modify existing code with AI ---\n\ninterface FileChange {\n path: string\n original: string\n proposed: string\n description?: string\n}\n\nexport const evolve = new Command()\n .name(\"evolve\")\n .aliases([\"ev\", \"transform\"])\n .description(\"modify existing code using AI — add features, refactor, migrate patterns\")\n .argument(\"[task...]\", \"describe the transformation to apply\")\n .option(\n \"-g, --glob <pattern>\",\n \"glob pattern for files to evolve (e.g., src/components/**/*.tsx)\"\n )\n .option(\n \"--max-files <n>\",\n \"maximum number of files to process\",\n \"10\"\n )\n .option(\n \"-p, --provider <provider>\",\n \"AI provider (claude-code, claude)\",\n \"claude-code\"\n )\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .option(\"--no-context7\", \"disable Context7 doc lookup\")\n .option(\"-y, --yes\", \"apply all changes without confirmation\", false)\n .option(\"--dry-run\", \"show proposed changes without writing\", false)\n .option(\"--debug\", \"enable debug mode with verbose logging\", false)\n .option(\"--mode <mode>\", \"permission mode (default, acceptEdits, plan, yolo)\")\n .option(\"--heal\", \"verify generated code and auto-fix errors\")\n .option(\"--no-heal\", \"skip verification after applying changes\")\n .option(\"--test-cmd <cmd>\", \"test command for heal verification\")\n .option(\"--build-cmd <cmd>\", \"build command for heal verification\")\n .action(async (taskParts, opts) => {\n try {\n let task = taskParts?.length ? taskParts.join(\" \") : undefined\n const cwd = path.resolve(opts.cwd)\n\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist.`)\n process.exit(1)\n }\n\n // Debug/mode init\n if (opts.debug) {\n setDebug(true)\n }\n if (opts.mode) {\n globalPermissions.setMode(opts.mode as PermissionMode)\n }\n\n // Interactive task input\n if (!task) {\n const response = await prompts({\n type: \"text\",\n name: \"task\",\n message: \"Describe the transformation to apply:\",\n validate: (v) => (v.trim() ? true : \"Please describe the transformation\"),\n })\n if (!response.task) {\n logger.warn(\"No task provided. Exiting.\")\n process.exit(0)\n }\n task = response.task\n }\n\n // pre:prompt hook — can modify or block the task\n let effectiveTask = task!\n if (globalHooks.has(\"pre:prompt\")) {\n const promptResult = await globalHooks.execute(\"pre:prompt\", {\n event: \"pre:prompt\",\n task: effectiveTask,\n cwd,\n })\n if (promptResult.blocked) {\n logger.error(promptResult.message || \"Blocked by pre:prompt hook\")\n process.exit(1)\n }\n if (promptResult.modified?.task) {\n effectiveTask = String(promptResult.modified.task)\n }\n }\n\n // pre:generate hook — can block the entire generation\n if (globalHooks.has(\"pre:generate\")) {\n const genResult = await globalHooks.execute(\"pre:generate\", {\n event: \"pre:generate\",\n task: effectiveTask,\n cwd,\n })\n if (genResult.blocked) {\n logger.error(genResult.message || \"Blocked by pre:generate hook\")\n process.exit(1)\n }\n }\n\n // Get glob pattern\n let globPattern = opts.glob\n if (!globPattern) {\n const response = await prompts({\n type: \"text\",\n name: \"glob\",\n message: \"File pattern to evolve (glob):\",\n initial: \"src/**/*.{ts,tsx,js,jsx}\",\n validate: (v) => (v.trim() ? true : \"Pattern is required\"),\n })\n if (!response.glob) {\n logger.warn(\"No pattern provided. Exiting.\")\n process.exit(0)\n }\n globPattern = response.glob\n }\n\n // Find matching files\n const matchedFiles = await fg.glob(globPattern, {\n cwd,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/target/**\",\n \"**/.git/**\",\n ],\n onlyFiles: true,\n })\n\n const maxFiles = parseInt(opts.maxFiles, 10)\n if (!matchedFiles.length) {\n logger.warn(`No files matched pattern: ${globPattern}`)\n process.exit(0)\n }\n\n const filesToProcess = matchedFiles.slice(0, maxFiles)\n if (matchedFiles.length > maxFiles) {\n logger.warn(\n `Found ${matchedFiles.length} files, processing first ${maxFiles}. Use --max-files to increase.`\n )\n }\n\n logger.break()\n logger.info(`Task: ${chalk.bold(effectiveTask)}`)\n logger.info(`Files: ${chalk.bold(String(filesToProcess.length))} matching ${chalk.dim(globPattern)}`)\n logger.break()\n\n // Read all target files\n const spinner = ora(\"Reading files and analyzing project...\").start()\n\n const fileContents: { path: string; content: string }[] = []\n for (const file of filesToProcess) {\n const fullPath = path.resolve(cwd, file)\n const content = await fs.readFile(fullPath, \"utf8\")\n fileContents.push({ path: file, content })\n }\n\n // Gather agent context\n const context = await createAgentContext(cwd, effectiveTask, {\n provider: opts.provider,\n context7: { enabled: opts.context7 !== false },\n })\n\n // Match skills\n const matchedSkills = matchSkillsToTask(context.skills, effectiveTask, undefined)\n if (matchedSkills.length) {\n debug.context(\"skills\", `${matchedSkills.length} matched for evolve`)\n }\n\n spinner.text = \"Generating transformations...\"\n\n // Build the evolve prompt (now includes memory and project instructions)\n const systemPrompt = buildEvolveSystemPrompt(context, matchedSkills.map((m) => m.skill))\n\n const filesSummary = fileContents\n .map(\n (f) =>\n `## File: ${f.path}\\n\\`\\`\\`\\n${truncate(f.content, 4000)}\\n\\`\\`\\``\n )\n .join(\"\\n\\n\")\n\n const userMessage = `# Transformation Task\n${effectiveTask}\n\n# Files to Transform\n${filesSummary}\n\nTransform these files according to the task. For each file that needs changes, use \\`create_files\\` with the complete updated file content. Only include files that actually need changes — skip files that don't need modification.`\n\n // Ensure credentials exist (auto-prompt if missing)\n const hasCredentials = await ensureCredentials(opts.apiKey)\n if (!hasCredentials) {\n logger.error(\"No credentials configured. Run `agentx model` to set up.\")\n process.exit(1)\n }\n\n // Generate with provider\n const providerName = opts.provider as ProviderName\n const provider = createProvider(providerName, opts.apiKey)\n const resolvedModel = opts.model || loadAuthConfig()?.model\n const messages: GenerationMessage[] = [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userMessage },\n ]\n\n debug.step(1, `Starting evolve generation (model: ${resolvedModel || \"default\"})`)\n\n const result = await provider.generate(messages, {\n model: resolvedModel,\n maxTokens: 16384,\n })\n\n // Track usage\n const stepTokens = result.tokensUsed || 0\n const stepModel = resolvedModel || \"claude-sonnet-4-20250514\"\n const estInput = Math.round(stepTokens * 0.3)\n const estOutput = stepTokens - estInput\n globalTracker.recordStep(1, stepModel, estInput, estOutput)\n debug.api(\"evolve\", stepModel, stepTokens)\n\n spinner.stop()\n\n // Handle follow-up questions\n if (result.followUp) {\n logger.break()\n logger.info(chalk.yellow(\"The agent needs more information:\"))\n logger.break()\n console.log(result.followUp)\n logger.break()\n return\n }\n\n if (!result.files.length) {\n logger.info(\"No changes proposed.\")\n if (result.content) {\n logger.break()\n console.log(result.content)\n }\n return\n }\n\n // Build change set with diffs\n const changes: FileChange[] = []\n for (const file of result.files) {\n const original = fileContents.find((f) => f.path === file.path)\n changes.push({\n path: file.path,\n original: original?.content || \"\",\n proposed: file.content,\n description: file.description,\n })\n }\n\n // Display changes with diff preview\n logger.break()\n console.log(\n chalk.bold(` ${changes.length} file(s) with proposed changes:`)\n )\n logger.break()\n\n if (result.content) {\n console.log(chalk.dim(result.content))\n logger.break()\n }\n\n // Show diff for each file\n const approved: FileChange[] = []\n\n for (const change of changes) {\n console.log(chalk.bold.cyan(` ${change.path}`))\n if (change.description) {\n console.log(chalk.dim(` ${change.description}`))\n }\n logger.break()\n\n // Show a simplified diff\n const diffLines = generateSimpleDiff(change.original, change.proposed)\n for (const line of diffLines.slice(0, 40)) {\n if (line.startsWith(\"+\")) {\n console.log(chalk.green(` ${line}`))\n } else if (line.startsWith(\"-\")) {\n console.log(chalk.red(` ${line}`))\n } else {\n console.log(chalk.dim(` ${line}`))\n }\n }\n if (diffLines.length > 40) {\n console.log(chalk.dim(` ... ${diffLines.length - 40} more lines`))\n }\n logger.break()\n\n if (opts.yes || opts.dryRun) {\n approved.push(change)\n } else {\n const { action } = await prompts({\n type: \"select\",\n name: \"action\",\n message: `${change.path}`,\n choices: [\n { title: \"Accept\", value: \"accept\" },\n { title: \"Skip\", value: \"skip\" },\n { title: \"Accept all remaining\", value: \"accept-all\" },\n { title: \"Quit\", value: \"quit\" },\n ],\n })\n\n if (action === \"accept\") {\n approved.push(change)\n } else if (action === \"accept-all\") {\n approved.push(change)\n // Accept all remaining\n const remaining = changes.slice(changes.indexOf(change) + 1)\n approved.push(...remaining)\n break\n } else if (action === \"quit\") {\n break\n }\n // \"skip\" just continues\n }\n }\n\n // Write approved changes\n if (!approved.length) {\n logger.info(\"No changes applied.\")\n return\n }\n\n if (opts.dryRun) {\n logger.break()\n logger.success(`Dry run: ${approved.length} file(s) would be modified:`)\n for (const change of approved) {\n console.log(` ${chalk.green(\"~\")} ${change.path}`)\n }\n return\n }\n\n const writeSpinner = ora(\"Applying changes...\").start()\n\n let written = 0\n let errors = 0\n const writtenFiles: string[] = []\n\n for (const change of approved) {\n // Permissions-aware file writing\n if (globalHooks.has(\"pre:file-write\")) {\n const writeResult = await globalHooks.execute(\"pre:file-write\", {\n event: \"pre:file-write\",\n file: change.path,\n fileContent: change.proposed,\n cwd,\n })\n if (writeResult.blocked) {\n logger.warn(`Skipped ${change.path}: ${writeResult.message || \"blocked by hook\"}`)\n continue\n }\n }\n\n try {\n const fullPath = path.resolve(cwd, change.path)\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await fs.writeFile(fullPath, change.proposed, \"utf8\")\n written++\n writtenFiles.push(change.path)\n\n // post:file-write hook\n if (globalHooks.has(\"post:file-write\")) {\n await globalHooks.execute(\"post:file-write\", {\n event: \"post:file-write\",\n file: change.path,\n cwd,\n })\n }\n } catch (error: any) {\n logger.error(`Failed to write ${change.path}: ${error.message}`)\n errors++\n }\n }\n\n writeSpinner.stop()\n\n logger.break()\n logger.success(`Applied ${written} change(s):`)\n for (const change of approved) {\n if (writtenFiles.includes(change.path)) {\n console.log(` ${chalk.green(\"~\")} ${change.path}`)\n }\n }\n if (errors) {\n logger.error(`${errors} file(s) failed to write.`)\n }\n\n // Record in memory\n try {\n const memory = new MemoryHierarchy(cwd)\n await memory.load()\n await memory.recordGeneration({\n type: \"evolution\",\n task: effectiveTask,\n files: writtenFiles,\n success: errors === 0,\n error: errors > 0 ? `${errors} file(s) failed to write` : undefined,\n context: {\n techStack: context.techStack.languages.map(String),\n frameworks: context.techStack.frameworks.map(String),\n skillsUsed: matchedSkills.map((m) => m.skill.frontmatter.name),\n },\n })\n } catch {\n // Memory recording is non-critical\n }\n\n // Heal loop — verify and auto-fix if requested\n if (opts.heal !== false && writtenFiles.length > 0) {\n const { HealEngine } = await import(\"@/runtime/heal\")\n const healEngine = new HealEngine(cwd, {\n enabled: true,\n testCommand: opts.testCmd,\n buildCommand: opts.buildCmd,\n maxAttempts: 3,\n provider: providerName,\n model: resolvedModel,\n apiKey: opts.apiKey,\n })\n\n const healSpinner = ora(\"Verifying changes...\").start()\n const healResult = await healEngine.detectAndHeal(writtenFiles, effectiveTask)\n healSpinner.stop()\n\n if (healResult.healed) {\n if (healResult.attempts === 0) {\n logger.success(\"Verification passed — changes are clean\")\n } else {\n logger.success(\n `Auto-healed in ${healResult.attempts} attempt(s)` +\n (healResult.filesChanged.length ? ` (fixed: ${healResult.filesChanged.join(\", \")})` : \"\")\n )\n }\n } else if (healResult.error) {\n logger.error(`Verification failed after ${healResult.attempts} attempt(s):`)\n console.log(chalk.dim(` ${healResult.error.split(\"\\n\").slice(0, 3).join(\"\\n \")}`))\n\n await globalHooks.execute(\"on:error\", {\n event: \"on:error\",\n error: new Error(healResult.error),\n task: effectiveTask,\n cwd,\n })\n }\n }\n\n // post:generate hook\n if (globalHooks.has(\"post:generate\")) {\n await globalHooks.execute(\"post:generate\", {\n event: \"post:generate\",\n task: effectiveTask,\n content: result.content,\n cwd,\n })\n }\n\n if (result.tokensUsed) {\n logger.break()\n const summary = globalTracker.getSummary()\n logger.info(`Tokens used: ${result.tokensUsed} ($${summary.totalCost.toFixed(4)})`)\n }\n } catch (error) {\n handleError(error)\n }\n })\n\nfunction buildEvolveSystemPrompt(context: any, skills: any[]): string {\n const sections: string[] = []\n\n sections.push(`You are agentx evolve, an agentic code transformation tool. You modify existing code according to user instructions.\n\nYour primary tool is \\`create_files\\` — use it to output the COMPLETE updated content of each file that needs changes.\nIf the request is ambiguous, use \\`ask_user\\` to ask a clarifying question.\n\nCRITICAL RULES:\n- Output the FULL file content for each changed file (not just the diff)\n- Keep the file path exactly as given — do not rename files unless explicitly asked\n- Preserve existing code patterns, naming conventions, and style\n- Only modify what's necessary for the transformation\n- Do NOT remove unrelated code or comments\n- Do NOT add unrelated features or \"improvements\"\n- Include all existing imports — do not accidentally drop them\n- If a file doesn't need changes, do NOT include it in the output`)\n\n sections.push(`# Project Tech Stack\\n${formatTechStack(context.techStack)}`)\n\n const deps = Object.keys(context.techStack.dependencies).slice(0, 20)\n if (deps.length) {\n sections.push(`# Key Dependencies\\n${deps.join(\", \")}`)\n }\n\n const schemaStr = formatSchemas(context.schemas)\n if (schemaStr) {\n sections.push(`# Project Schemas\\n${schemaStr}`)\n }\n\n if (skills.length) {\n sections.push(\n `# Active Skills\\n` +\n skills\n .map(\n (s: any) =>\n `## ${s.frontmatter.name}\\n${s.frontmatter.description}\\n\\n${s.instructions}`\n )\n .join(\"\\n\\n---\\n\\n\")\n )\n }\n\n if (context.docs) {\n sections.push(context.docs)\n }\n\n // Project instructions (SHADXN.md / CLAUDE.md)\n if (context.projectInstructions) {\n sections.push(`# Project Instructions\\n${context.projectInstructions}`)\n }\n\n // Memory context (past generations, patterns, preferences)\n if (context.memoryContext) {\n sections.push(context.memoryContext)\n }\n\n return sections.join(\"\\n\\n\")\n}\n\nfunction generateSimpleDiff(original: string, proposed: string): string[] {\n const origLines = original.split(\"\\n\")\n const propLines = proposed.split(\"\\n\")\n const diff: string[] = []\n\n // Simple line-by-line comparison\n const maxLen = Math.max(origLines.length, propLines.length)\n let contextBuffer: string[] = []\n let lastChangeIdx = -10\n\n for (let i = 0; i < maxLen; i++) {\n const origLine = i < origLines.length ? origLines[i] : undefined\n const propLine = i < propLines.length ? propLines[i] : undefined\n\n if (origLine === propLine) {\n // Same line — keep as context near changes\n if (i - lastChangeIdx <= 2) {\n diff.push(` ${origLine}`)\n } else {\n contextBuffer.push(` ${origLine}`)\n // Only keep last 2 context lines\n if (contextBuffer.length > 2) {\n contextBuffer.shift()\n }\n }\n } else {\n // Add context buffer before this change\n if (i - lastChangeIdx > 3 && diff.length > 0) {\n diff.push(\" ...\")\n }\n diff.push(...contextBuffer)\n contextBuffer = []\n\n if (origLine !== undefined && propLine !== undefined) {\n diff.push(`-${origLine}`)\n diff.push(`+${propLine}`)\n } else if (origLine !== undefined) {\n diff.push(`-${origLine}`)\n } else if (propLine !== undefined) {\n diff.push(`+${propLine}`)\n }\n lastChangeIdx = i\n }\n }\n\n return diff\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str\n return str.slice(0, max) + \"\\n// ... (truncated)\"\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { generate } from \"@/agent\"\nimport type { ProviderName } from \"@/agent/providers\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport ora from \"ora\"\nimport prompts from \"prompts\"\n\n// --- `agentx create` — template system for scaffolding entire projects ---\n\ninterface Template {\n name: string\n description: string\n prompt: string\n skills: string[]\n outputType: string\n tags: string[]\n}\n\nconst TEMPLATES: Template[] = [\n {\n name: \"saas-starter\",\n description: \"Full-stack SaaS starter with auth, billing, dashboard, and landing page\",\n prompt: `Create a full-stack SaaS starter project with:\n1. Authentication (sign up, sign in, forgot password, email verification)\n2. Billing integration with Stripe (pricing page, checkout, subscription management, webhooks)\n3. Dashboard with sidebar navigation, user profile, settings page\n4. Landing page with hero, features, pricing, testimonials, FAQ, footer\n5. Database schema for users, subscriptions, teams\n6. API routes for all CRUD operations\n7. Middleware for auth protection\n8. Environment variables template`,\n skills: [],\n outputType: \"website\",\n tags: [\"saas\", \"auth\", \"billing\", \"stripe\", \"dashboard\"],\n },\n {\n name: \"api-service\",\n description: \"REST API service with auth, validation, error handling, and tests\",\n prompt: `Create a REST API service with:\n1. Project structure with routes, controllers, middleware, models, utils\n2. Authentication middleware (JWT)\n3. Input validation using the project's validation library\n4. Centralized error handling with proper HTTP status codes\n5. Health check endpoint\n6. CRUD endpoints for a sample resource\n7. Request logging middleware\n8. Rate limiting\n9. Environment configuration\n10. Test suite for all endpoints`,\n skills: [],\n outputType: \"api\",\n tags: [\"api\", \"rest\", \"backend\", \"auth\", \"jwt\"],\n },\n {\n name: \"cli-tool\",\n description: \"CLI application with commands, flags, interactive prompts, and config\",\n prompt: `Create a CLI tool with:\n1. Command framework setup (commander or similar)\n2. Multiple subcommands with flags and arguments\n3. Interactive prompts for user input\n4. Configuration file support (read/write)\n5. Colored output and spinners\n6. Help text and version command\n7. Error handling with friendly messages\n8. A sample command that demonstrates all features`,\n skills: [],\n outputType: \"script\",\n tags: [\"cli\", \"tool\", \"command-line\"],\n },\n {\n name: \"component-library\",\n description: \"UI component library with Storybook, tests, and documentation\",\n prompt: `Create a UI component library with:\n1. Button, Input, Card, Modal, Dropdown, Alert, Badge, Avatar components\n2. Consistent theming system (colors, typography, spacing)\n3. All components are accessible (ARIA, keyboard navigation)\n4. Component props are typed and documented\n5. Each component has unit tests\n6. Storybook stories for each component\n7. Export barrel file\n8. Package.json configured for publishing`,\n skills: [],\n outputType: \"component\",\n tags: [\"components\", \"ui\", \"library\", \"storybook\"],\n },\n {\n name: \"fullstack-app\",\n description: \"Full-stack application with database, API, UI, and deployment config\",\n prompt: `Create a full-stack application with:\n1. Database schema with models for a practical app (e.g., task management)\n2. API layer with CRUD operations for all models\n3. Frontend pages: home, list view, detail view, create/edit forms\n4. Authentication flow (login, register, protected routes)\n5. Form validation on client and server\n6. Loading states and error handling in the UI\n7. Docker configuration for development\n8. CI/CD workflow for GitHub Actions\n9. Environment configuration template`,\n skills: [],\n outputType: \"website\",\n tags: [\"fullstack\", \"app\", \"database\", \"auth\"],\n },\n {\n name: \"mobile-app\",\n description: \"Mobile application with navigation, screens, and native features\",\n prompt: `Create a mobile application with:\n1. Navigation setup (tab navigation + stack navigation)\n2. Screens: Home, Profile, Settings, List, Detail\n3. Authentication flow (login, register)\n4. Theme system with dark mode support\n5. State management setup\n6. API client configuration\n7. Common components (Button, Card, Input, Header)\n8. App configuration and assets setup`,\n skills: [],\n outputType: \"page\",\n tags: [\"mobile\", \"react-native\", \"expo\", \"flutter\"],\n },\n {\n name: \"chrome-extension\",\n description: \"Browser extension with popup, content script, background worker, and options\",\n prompt: `Create a browser extension (Chrome/Firefox compatible) with:\n1. manifest.json (Manifest V3)\n2. Popup page with UI\n3. Content script that modifies web pages\n4. Background service worker for event handling\n5. Options/settings page\n6. Storage management for user preferences\n7. Message passing between popup, content script, and background\n8. Icons and assets structure\n9. Build script`,\n skills: [],\n outputType: \"website\",\n tags: [\"extension\", \"chrome\", \"browser\", \"plugin\"],\n },\n {\n name: \"data-pipeline\",\n description: \"Data processing pipeline with ingestion, transformation, and output stages\",\n prompt: `Create a data processing pipeline with:\n1. Data ingestion from multiple sources (file, API, database)\n2. Transformation stage with configurable processors\n3. Validation and error handling at each stage\n4. Output to multiple destinations (file, database, API)\n5. Logging and monitoring\n6. Configuration file for pipeline definition\n7. CLI runner with progress reporting\n8. Test suite with sample data\n9. Docker configuration`,\n skills: [],\n outputType: \"script\",\n tags: [\"data\", \"pipeline\", \"etl\", \"processing\"],\n },\n]\n\nexport const create = new Command()\n .name(\"create\")\n .description(\"scaffold a new project from a template using AI\")\n .argument(\"[name]\", \"project name\")\n .option(\n \"-t, --template <template>\",\n `template to use: ${TEMPLATES.map((t) => t.name).join(\", \")}`\n )\n .option(\n \"-p, --provider <provider>\",\n \"AI provider (claude-code, claude)\",\n \"claude-code\"\n )\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\n \"-c, --cwd <cwd>\",\n \"parent directory\",\n process.cwd()\n )\n .option(\"--list\", \"list available templates\", false)\n .option(\"-y, --yes\", \"skip confirmation prompts\", false)\n .action(async (name, opts) => {\n try {\n // List templates\n if (opts.list) {\n logger.break()\n console.log(chalk.bold(\" Available templates:\"))\n logger.break()\n for (const t of TEMPLATES) {\n console.log(` ${chalk.green(t.name)}`)\n console.log(` ${chalk.dim(t.description)}`)\n console.log(\n ` ${chalk.dim(\"tags:\")} ${t.tags.map((tag) => chalk.cyan(tag)).join(\", \")}`\n )\n logger.break()\n }\n return\n }\n\n // Interactive project name\n if (!name) {\n const response = await prompts({\n type: \"text\",\n name: \"name\",\n message: \"Project name:\",\n validate: (v) =>\n v.trim()\n ? /^[a-z0-9-_.]+$/.test(v.trim())\n ? true\n : \"Use lowercase letters, numbers, hyphens, dots, or underscores\"\n : \"Name is required\",\n })\n if (!response.name) {\n logger.warn(\"No name provided. Exiting.\")\n process.exit(0)\n }\n name = response.name\n }\n\n // Select template\n let template: Template | undefined\n if (opts.template) {\n template = TEMPLATES.find((t) => t.name === opts.template)\n if (!template) {\n logger.error(\n `Template \"${opts.template}\" not found. Available: ${TEMPLATES.map((t) => t.name).join(\", \")}`\n )\n logger.info(`Run ${chalk.green(\"agentx create --list\")} to see all templates.`)\n process.exit(1)\n }\n } else {\n const { selected } = await prompts({\n type: \"select\",\n name: \"selected\",\n message: \"Choose a template:\",\n choices: [\n ...TEMPLATES.map((t) => ({\n title: `${t.name} — ${t.description}`,\n value: t.name,\n })),\n {\n title: \"Custom — describe your own project\",\n value: \"_custom\",\n },\n ],\n })\n\n if (!selected) {\n logger.warn(\"No template selected. Exiting.\")\n process.exit(0)\n }\n\n if (selected === \"_custom\") {\n const { description } = await prompts({\n type: \"text\",\n name: \"description\",\n message: \"Describe the project you want to create:\",\n validate: (v) => (v.trim() ? true : \"Description is required\"),\n })\n\n if (!description) {\n logger.warn(\"No description provided. Exiting.\")\n process.exit(0)\n }\n\n template = {\n name: \"custom\",\n description,\n prompt: description,\n skills: [],\n outputType: \"website\",\n tags: [],\n }\n } else {\n template = TEMPLATES.find((t) => t.name === selected)!\n }\n }\n\n // Create project directory\n const projectDir = path.resolve(opts.cwd, name)\n if (existsSync(projectDir)) {\n if (!opts.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `Directory \"${name}\" already exists. Continue?`,\n initial: false,\n })\n if (!overwrite) {\n logger.info(\"Cancelled.\")\n return\n }\n }\n } else {\n await fs.mkdir(projectDir, { recursive: true })\n }\n\n logger.break()\n logger.info(`Project: ${chalk.bold(name)}`)\n logger.info(`Template: ${chalk.bold(template.name)}`)\n logger.info(`Directory: ${chalk.dim(projectDir)}`)\n logger.break()\n\n const spinner = ora(\"Generating project from template...\").start()\n\n const result = await generate({\n task: `Create a new project called \"${name}\" in the current directory.\\n\\n${template.prompt}\\n\\nGenerate all files relative to the project root. Include a README.md explaining the project and how to get started.`,\n outputType: template.outputType as any,\n cwd: projectDir,\n overwrite: true,\n dryRun: false,\n provider: opts.provider as ProviderName,\n model: opts.model,\n apiKey: opts.apiKey,\n context7: true,\n interactive: false,\n maxSteps: 5,\n })\n\n spinner.stop()\n\n // Show results\n logger.break()\n if (result.content) {\n console.log(result.content)\n logger.break()\n }\n\n if (result.files.written.length) {\n logger.success(\n `Created ${result.files.written.length} file(s) in ${chalk.bold(name)}/`\n )\n for (const file of result.files.written) {\n const relative = path.relative(projectDir, file)\n console.log(` ${chalk.green(\"+\")} ${relative}`)\n }\n }\n\n if (result.files.errors.length) {\n logger.error(`${result.files.errors.length} file(s) failed:`)\n for (const err of result.files.errors) {\n console.log(` ${chalk.red(\"x\")} ${err}`)\n }\n }\n\n logger.break()\n logger.info(\"Next steps:\")\n console.log(` ${chalk.green(\"cd\")} ${name}`)\n console.log(\n ` ${chalk.green(\"agentx inspect\")} — see what was generated`\n )\n console.log(\n ` ${chalk.green(\"agentx evolve\")} — modify and extend`\n )\n logger.break()\n\n if (result.tokensUsed) {\n logger.info(`Tokens used: ${result.tokensUsed}`)\n }\n } catch (error) {\n handleError(error)\n }\n })\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { AgentXRuntime, type RuntimeConfig } from \"@/runtime\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\n\n// --- `agentx run` — start the intelligent runtime framework ---\n\nexport const run = new Command()\n .name(\"run\")\n .description(\n \"start the agentx runtime — an intelligent framework that receives requests, learns, auto-heals, and self-enhances\"\n )\n .option(\"--port <port>\", \"server port\", \"3170\")\n .option(\"--host <host>\", \"server host\", \"0.0.0.0\")\n .option(\n \"-p, --provider <provider>\",\n \"AI provider (claude-code, claude)\",\n \"claude-code\"\n )\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .option(\"--no-memory\", \"disable memory/learning\")\n .option(\"--no-heal\", \"disable auto-heal\")\n .option(\"--no-enhance\", \"disable self-enhancement\")\n .option(\"--test-cmd <cmd>\", \"test command for auto-heal\")\n .option(\"--build-cmd <cmd>\", \"build command for auto-heal\")\n .option(\"--no-cors\", \"disable CORS\")\n .action(async (opts) => {\n try {\n const cwd = path.resolve(opts.cwd)\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist.`)\n process.exit(1)\n }\n\n // Load config from agentx.config.json if it exists\n const configPath = path.resolve(cwd, \"agentx.config.json\")\n let fileConfig: Partial<RuntimeConfig> = {}\n if (existsSync(configPath)) {\n try {\n const raw = await fs.readFile(configPath, \"utf8\")\n fileConfig = JSON.parse(raw)\n logger.info(`Loaded config from ${chalk.dim(\"agentx.config.json\")}`)\n } catch {\n logger.warn(\"Failed to parse agentx.config.json, using defaults\")\n }\n }\n\n const config: Partial<RuntimeConfig> = {\n port: parseInt(opts.port, 10) || fileConfig.port,\n host: opts.host || fileConfig.host,\n provider: (opts.provider || fileConfig.provider) as any,\n model: opts.model || fileConfig.model,\n apiKey: opts.apiKey || fileConfig.apiKey,\n cwd,\n memory: {\n enabled: opts.memory !== false && (fileConfig.memory?.enabled !== false),\n },\n heal: {\n enabled: opts.heal !== false && (fileConfig.heal?.enabled !== false),\n testCommand: opts.testCmd || fileConfig.heal?.testCommand,\n buildCommand: opts.buildCmd || fileConfig.heal?.buildCommand,\n },\n enhance: {\n enabled: opts.enhance !== false && (fileConfig.enhance?.enabled !== false),\n autoSkills: fileConfig.enhance?.autoSkills !== false,\n },\n cors: opts.cors !== false,\n }\n\n // Banner\n console.log(\"\")\n console.log(chalk.bold.cyan(\" ░░░ agentx runtime ░░░\"))\n console.log(chalk.dim(\" the intelligent framework\"))\n console.log(\"\")\n\n const runtime = new AgentXRuntime(config)\n await runtime.start()\n } catch (error) {\n handleError(error)\n }\n })\n","import { existsSync } from \"fs\"\nimport path from \"path\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { createAgentContext } from \"@/agent\"\nimport { formatTechStack } from \"@/agent/context/tech-stack\"\nimport { formatSchemas } from \"@/agent/context/schema\"\nimport { loadLocalSkills } from \"@/agent/skills/loader\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport ora from \"ora\"\n\n// --- `agentx inspect` — show what the agent sees ---\n\nexport const inspect = new Command()\n .name(\"inspect\")\n .aliases([\"info\", \"ctx\"])\n .description(\"show what the agent knows about your project — tech stack, schemas, skills, and more\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .option(\"--json\", \"output as JSON\", false)\n .option(\"--verbose\", \"show full schema and model contents\", false)\n .action(async (opts) => {\n try {\n const cwd = path.resolve(opts.cwd)\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist.`)\n process.exit(1)\n }\n\n const spinner = ora(\"Analyzing project...\").start()\n\n const context = await createAgentContext(cwd, \"inspect\", {\n context7: { enabled: false },\n })\n\n spinner.stop()\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n techStack: context.techStack,\n schemas: context.schemas,\n skills: context.skills.map((s) => ({\n name: s.frontmatter.name,\n description: s.frontmatter.description,\n source: s.source,\n tags: s.frontmatter.tags,\n })),\n },\n null,\n 2\n )\n )\n return\n }\n\n // Header\n logger.break()\n console.log(chalk.bold.cyan(\" agentx inspect\"))\n console.log(chalk.dim(` ${cwd}`))\n logger.break()\n\n // Languages\n const { techStack } = context\n if (techStack.languages.length) {\n console.log(chalk.bold(\" Languages\"))\n for (const lang of techStack.languages) {\n console.log(\n ` ${chalk.green(\"●\")} ${lang.name}${lang.version ? chalk.dim(` ${lang.version}`) : \"\"}${lang.configFile ? chalk.dim(` (${lang.configFile})`) : \"\"}`\n )\n }\n logger.break()\n }\n\n // Frameworks\n if (techStack.frameworks.length) {\n console.log(chalk.bold(\" Frameworks\"))\n for (const fw of techStack.frameworks) {\n const typeColor =\n fw.type === \"frontend\"\n ? chalk.blue\n : fw.type === \"backend\"\n ? chalk.yellow\n : fw.type === \"fullstack\"\n ? chalk.magenta\n : fw.type === \"mobile\"\n ? chalk.green\n : chalk.dim\n console.log(\n ` ${chalk.green(\"●\")} ${fw.name}${fw.version ? chalk.dim(` @${fw.version}`) : \"\"} ${typeColor(`[${fw.type}]`)}`\n )\n }\n logger.break()\n }\n\n // Package manager\n if (techStack.packageManager) {\n console.log(chalk.bold(\" Package Manager\"))\n console.log(` ${chalk.green(\"●\")} ${techStack.packageManager}`)\n logger.break()\n }\n\n // Databases\n if (techStack.databases.length) {\n console.log(chalk.bold(\" Databases\"))\n for (const db of techStack.databases) {\n console.log(` ${chalk.green(\"●\")} ${db}`)\n }\n logger.break()\n }\n\n // Styling\n if (techStack.styling.length) {\n console.log(chalk.bold(\" Styling\"))\n for (const style of techStack.styling) {\n console.log(` ${chalk.green(\"●\")} ${style}`)\n }\n logger.break()\n }\n\n // Testing\n if (techStack.testing.length) {\n console.log(chalk.bold(\" Testing\"))\n for (const test of techStack.testing) {\n console.log(` ${chalk.green(\"●\")} ${test}`)\n }\n logger.break()\n }\n\n // Deployment\n if (techStack.deployment.length) {\n console.log(chalk.bold(\" Deployment\"))\n for (const dep of techStack.deployment) {\n console.log(` ${chalk.green(\"●\")} ${dep}`)\n }\n logger.break()\n }\n\n // Monorepo\n if (techStack.monorepo) {\n console.log(chalk.bold(\" Monorepo\"))\n console.log(` ${chalk.green(\"●\")} yes`)\n logger.break()\n }\n\n // Schemas\n const { schemas } = context\n const hasSchemas =\n schemas.database || schemas.api || schemas.env || schemas.models?.length\n\n if (hasSchemas) {\n console.log(chalk.bold(\" Schemas Detected\"))\n\n if (schemas.database) {\n console.log(\n ` ${chalk.green(\"●\")} Database: ${chalk.cyan(schemas.database.type)}${\n schemas.database.tables?.length\n ? chalk.dim(` (${schemas.database.tables.length} tables: ${schemas.database.tables.slice(0, 5).join(\", \")}${schemas.database.tables.length > 5 ? \"...\" : \"\"})`)\n : \"\"\n }`\n )\n if (opts.verbose && schemas.database.content) {\n console.log(chalk.dim(\" ┌─────────────────────\"))\n for (const line of schemas.database.content.split(\"\\n\").slice(0, 20)) {\n console.log(chalk.dim(` │ ${line}`))\n }\n console.log(chalk.dim(\" └─────────────────────\"))\n }\n }\n\n if (schemas.api) {\n console.log(` ${chalk.green(\"●\")} API: ${chalk.cyan(schemas.api.type)}`)\n }\n\n if (schemas.env) {\n console.log(\n ` ${chalk.green(\"●\")} Environment: ${chalk.cyan(`${schemas.env.variables.length} variables`)}${\n schemas.env.variables.filter((v) => v.required).length\n ? chalk.dim(` (${schemas.env.variables.filter((v) => v.required).length} required)`)\n : \"\"\n }`\n )\n }\n\n if (schemas.models?.length) {\n console.log(\n ` ${chalk.green(\"●\")} Models: ${chalk.cyan(`${schemas.models.length} file(s)`)} ${chalk.dim(schemas.models.map((m) => m.path).join(\", \"))}`\n )\n }\n\n logger.break()\n }\n\n // Skills\n if (context.skills.length) {\n console.log(chalk.bold(\" Skills\"))\n for (const s of context.skills) {\n const source =\n s.source === \"remote\"\n ? chalk.blue(`[${s.packageId || \"remote\"}]`)\n : s.source === \"generated\"\n ? chalk.magenta(\"[generated]\")\n : chalk.dim(\"[local]\")\n\n console.log(` ${chalk.green(\"●\")} ${s.frontmatter.name} ${source}`)\n console.log(` ${chalk.dim(s.frontmatter.description)}`)\n }\n logger.break()\n } else {\n console.log(chalk.bold(\" Skills\"))\n console.log(\n ` ${chalk.dim(\"none installed\")} — run ${chalk.green(\"agentx skill install <owner/repo>\")} or ${chalk.green(\"agentx skill create <name>\")}`\n )\n logger.break()\n }\n\n // Dependencies summary\n const depCount = Object.keys(techStack.dependencies).length\n const devDepCount = Object.keys(techStack.devDependencies).length\n if (depCount || devDepCount) {\n console.log(chalk.bold(\" Dependencies\"))\n console.log(\n ` ${chalk.green(\"●\")} ${depCount} dependencies, ${devDepCount} devDependencies`\n )\n if (opts.verbose) {\n const topDeps = Object.entries(techStack.dependencies).slice(0, 15)\n for (const [name, version] of topDeps) {\n console.log(` ${chalk.dim(name)} ${chalk.dim(version)}`)\n }\n if (depCount > 15) {\n console.log(chalk.dim(` ... and ${depCount - 15} more`))\n }\n }\n logger.break()\n }\n\n // Summary line\n const parts: string[] = []\n if (techStack.languages.length) parts.push(`${techStack.languages.length} lang(s)`)\n if (techStack.frameworks.length) parts.push(`${techStack.frameworks.length} framework(s)`)\n if (hasSchemas) parts.push(\"schemas detected\")\n if (context.skills.length) parts.push(`${context.skills.length} skill(s)`)\n console.log(chalk.dim(` Summary: ${parts.join(\" · \")}`))\n logger.break()\n } catch (error) {\n handleError(error)\n }\n })\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { createProvider, type ProviderName } from \"@/agent/providers\"\nimport { ensureCredentials } from \"@/utils/auth-store\"\nimport { detectTechStack, formatTechStack } from \"@/agent/context/tech-stack\"\nimport { loadLocalSkills } from \"@/agent/skills/loader\"\nimport { installSkillPackage, generateSkillMd, listInstalledSkills } from \"@/agent/skills/registry\"\nimport { generateSkill } from \"@/agent/skills/generator\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport ora from \"ora\"\nimport prompts from \"prompts\"\n\nexport const skill = new Command()\n .name(\"skill\")\n .description(\"manage agent skills — install, create, list, and generate\")\n\n// --- skill install ---\nskill\n .command(\"install\")\n .aliases([\"add\", \"i\"])\n .description(\"install a skill package from skills.sh or GitHub\")\n .argument(\"<package>\", \"skill package (e.g., intellectronica/agent-skills)\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .action(async (packageId, opts) => {\n try {\n const cwd = path.resolve(opts.cwd)\n const spinner = ora(`Installing skill: ${packageId}`).start()\n\n const skills = await installSkillPackage(packageId, cwd)\n\n spinner.stop()\n\n if (skills.length) {\n logger.success(`Installed ${skills.length} skill(s):`)\n for (const s of skills) {\n console.log(\n ` ${chalk.green(\"+\")} ${s.frontmatter.name} — ${s.frontmatter.description}`\n )\n }\n } else {\n logger.warn(\"No skills found in the package.\")\n }\n } catch (error) {\n handleError(error)\n }\n })\n\n// --- skill list ---\nskill\n .command(\"list\")\n .aliases([\"ls\"])\n .description(\"list installed skills\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .action(async (opts) => {\n try {\n const cwd = path.resolve(opts.cwd)\n const skills = await listInstalledSkills(cwd)\n\n if (!skills.length) {\n logger.info(\"No skills installed. Install one with:\")\n console.log(\n ` ${chalk.green(\"agentx skill install\")} ${chalk.dim(\"<owner/repo>\")}`\n )\n return\n }\n\n logger.info(`Found ${skills.length} skill(s):`)\n logger.break()\n\n for (const s of skills) {\n const source =\n s.source === \"remote\"\n ? chalk.blue(`[${s.packageId}]`)\n : s.source === \"generated\"\n ? chalk.magenta(\"[generated]\")\n : chalk.dim(\"[local]\")\n\n console.log(` ${chalk.bold(s.frontmatter.name)} ${source}`)\n console.log(` ${chalk.dim(s.frontmatter.description)}`)\n\n if (s.frontmatter.tags?.length) {\n console.log(\n ` ${chalk.dim(\"tags:\")} ${s.frontmatter.tags.map((t) => chalk.cyan(t)).join(\", \")}`\n )\n }\n\n if (s.path) {\n console.log(` ${chalk.dim(\"path:\")} ${s.path}`)\n }\n\n logger.break()\n }\n } catch (error) {\n handleError(error)\n }\n })\n\n// --- skill create ---\nskill\n .command(\"create\")\n .description(\"create a new skill interactively or from a description\")\n .argument(\"[name]\", \"skill name\")\n .option(\"-d, --description <desc>\", \"skill description\")\n .option(\"--tags <tags>\", \"comma-separated tags\")\n .option(\n \"-p, --provider <provider>\",\n \"AI provider for generation (claude-code, claude)\",\n \"claude-code\"\n )\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .option(\"--no-ai\", \"create a blank skill template without AI\")\n .action(async (name, opts) => {\n try {\n const cwd = path.resolve(opts.cwd)\n\n // Interactive name input if not provided\n if (!name) {\n const response = await prompts({\n type: \"text\",\n name: \"name\",\n message: \"Skill name:\",\n validate: (v) =>\n v.trim()\n ? /^[a-z0-9-]+$/.test(v.trim())\n ? true\n : \"Use lowercase letters, numbers, and hyphens only\"\n : \"Name is required\",\n })\n if (!response.name) {\n logger.warn(\"No name provided. Exiting.\")\n process.exit(0)\n }\n name = response.name\n }\n\n // Get description\n let description = opts.description\n if (!description) {\n const response = await prompts({\n type: \"text\",\n name: \"description\",\n message: \"Skill description:\",\n validate: (v) => (v.trim() ? true : \"Description is required\"),\n })\n if (!response.description) {\n logger.warn(\"No description provided. Exiting.\")\n process.exit(0)\n }\n description = response.description\n }\n\n const tags = opts.tags\n ? opts.tags.split(\",\").map((t: string) => t.trim())\n : undefined\n\n const skillDir = path.resolve(cwd, \".skills\", name)\n const skillPath = path.resolve(skillDir, \"SKILL.md\")\n\n if (existsSync(skillPath)) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `Skill \"${name}\" already exists. Overwrite?`,\n initial: false,\n })\n if (!overwrite) {\n logger.info(\"Skipped.\")\n return\n }\n }\n\n let content: string\n\n if (opts.ai === false) {\n // Blank template\n content = await generateSkillMd(\n name,\n description,\n `# ${name}\\n\\n## Instructions\\n\\nAdd your skill instructions here.\\n\\n## Examples\\n\\nAdd examples here.`,\n tags\n )\n } else {\n // AI-generated skill — ensure credentials first\n const hasCredentials = await ensureCredentials(opts.apiKey)\n if (!hasCredentials) {\n logger.error(\"No credentials configured. Run `agentx model` to set up.\")\n process.exit(1)\n }\n\n const spinner = ora(\"Detecting tech stack...\").start()\n const techStack = await detectTechStack(cwd)\n spinner.text = \"Generating skill with AI...\"\n\n const provider = createProvider(\n opts.provider as ProviderName,\n opts.apiKey\n )\n\n const result = await generateSkill(\n provider,\n name,\n description,\n techStack,\n { tags }\n )\n\n spinner.stop()\n content = result.content\n }\n\n // Write skill file\n await fs.mkdir(skillDir, { recursive: true })\n await fs.writeFile(skillPath, content, \"utf8\")\n\n logger.success(`Created skill: ${skillPath}`)\n logger.break()\n logger.info(\"The skill will be automatically loaded for future generations.\")\n logger.info(\n `To share it, push to GitHub and others can install with: ${chalk.green(`agentx skill install <your-username>/<your-repo>`)}`\n )\n } catch (error) {\n handleError(error)\n }\n })\n\n// --- skill inspect ---\nskill\n .command(\"inspect\")\n .description(\"show details of an installed skill\")\n .argument(\"<name>\", \"skill name\")\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .action(async (name, opts) => {\n try {\n const cwd = path.resolve(opts.cwd)\n const skills = await listInstalledSkills(cwd)\n\n const found = skills.find(\n (s) => s.frontmatter.name === name || s.path?.includes(name)\n )\n\n if (!found) {\n logger.error(`Skill \"${name}\" not found.`)\n logger.info(`Run ${chalk.green(\"agentx skill list\")} to see installed skills.`)\n return\n }\n\n console.log(chalk.bold(`\\n ${found.frontmatter.name}`))\n console.log(` ${found.frontmatter.description}`)\n logger.break()\n\n if (found.frontmatter.tags?.length) {\n console.log(\n ` ${chalk.dim(\"Tags:\")} ${found.frontmatter.tags.join(\", \")}`\n )\n }\n if (found.packageId) {\n console.log(` ${chalk.dim(\"Package:\")} ${found.packageId}`)\n }\n if (found.path) {\n console.log(` ${chalk.dim(\"Path:\")} ${found.path}`)\n }\n\n logger.break()\n console.log(chalk.dim(\" --- Instructions ---\"))\n logger.break()\n console.log(\n found.instructions\n .split(\"\\n\")\n .map((l) => ` ${l}`)\n .join(\"\\n\")\n )\n logger.break()\n } catch (error) {\n handleError(error)\n }\n })\n","import { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { startMcpServer } from \"@/mcp\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\n\n// --- `agentx serve` — run as MCP server for AI editors ---\n\nexport const serve = new Command()\n .name(\"serve\")\n .description(\"run agentx as an MCP server for AI editors (Claude Code, Cursor, Windsurf, etc.)\")\n .option(\"--stdio\", \"use stdio transport (default)\", true)\n .option(\n \"-c, --cwd <cwd>\",\n \"working directory\",\n process.cwd()\n )\n .action(async (opts) => {\n try {\n if (opts.stdio !== false) {\n // stdio mode — all logging goes to stderr, stdout is JSON-RPC\n await startMcpServer()\n } else {\n logger.error(\"Only stdio transport is currently supported.\")\n logger.info(\n `Usage: ${chalk.green(\"agentx serve --stdio\")} or configure in your MCP client.`\n )\n logger.break()\n logger.info(\"Add to Claude Code:\")\n logger.info(\n chalk.dim(\n ' claude mcp add agentx -- npx agentx serve --stdio'\n )\n )\n logger.break()\n logger.info(\"Add to Cursor/MCP config:\")\n logger.info(\n chalk.dim(\n JSON.stringify(\n {\n mcpServers: {\n agentx: {\n command: \"npx\",\n args: [\"agentx\", \"serve\", \"--stdio\"],\n },\n },\n },\n null,\n 2\n )\n )\n )\n }\n } catch (error) {\n handleError(error)\n }\n })\n","import { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { loadAuthConfig, runModelSetup, type AuthConfig } from \"@/utils/auth-store\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\n\nconst ANTHROPIC_MODELS = [\n { id: \"claude-sonnet-4-20250514\", label: \"anthropic/claude-sonnet-4\", hint: \"Claude Sonnet 4 · ctx 200k · recommended\" },\n { id: \"claude-opus-4-20250514\", label: \"anthropic/claude-opus-4-5\", hint: \"Claude Opus 4.5 · ctx 200k · reasoning\" },\n { id: \"claude-haiku-4-20250514\", label: \"anthropic/claude-haiku-4\", hint: \"Claude Haiku 4 · ctx 200k · fast\" },\n]\n\nexport const model = new Command()\n .name(\"model\")\n .description(\"configure AI provider, credentials, and model\")\n\n// --- model (default: interactive setup) ---\nmodel\n .command(\"setup\", { isDefault: true })\n .description(\"interactively configure provider and model\")\n .action(async () => {\n try {\n const result = await runModelSetup()\n if (!result) process.exit(0)\n } catch (e) {\n handleError(e)\n }\n })\n\n// --- model show ---\nmodel\n .command(\"show\")\n .description(\"display current provider and model configuration\")\n .action(async () => {\n try {\n const config = loadAuthConfig()\n\n if (!config) {\n logger.warn(\"No configuration found. Run `agentx model` to set up.\")\n process.exit(0)\n }\n\n const modelLabel = ANTHROPIC_MODELS.find((m) => m.id === config.model)?.label || config.model\n\n console.log(chalk.bold(\"\\nCurrent configuration:\"))\n console.log(` Provider: ${chalk.cyan(\"anthropic\")} (${config.authType})`)\n console.log(` Model: ${chalk.cyan(modelLabel)}`)\n console.log(` Token: ${chalk.dim(maskToken(config.token))}`)\n console.log(` File: ${chalk.dim(\"~/.agentx/auth.json\")}`)\n\n if (process.env.ANTHROPIC_API_KEY) {\n console.log(chalk.yellow(\"\\n Note: ANTHROPIC_API_KEY env var is set (takes priority)\"))\n }\n if (process.env.ANTHROPIC_OAUTH_TOKEN) {\n console.log(chalk.yellow(\"\\n Note: ANTHROPIC_OAUTH_TOKEN env var is set (takes priority)\"))\n }\n console.log()\n } catch (e) {\n handleError(e)\n }\n })\n\nfunction maskToken(token: string): string {\n if (token.length < 12) return \"***\"\n return token.slice(0, 10) + \"...\" + token.slice(-4)\n}\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport ora from \"ora\"\nimport { handleError } from \"@/utils/handle-error\"\nimport { logger } from \"@/utils/logger\"\nimport { GitManager } from \"@/git\"\nimport { createProvider } from \"@/agent/providers\"\n\nexport const git = new Command()\n .name(\"git\")\n .description(\"AI-powered git operations\")\n\ngit\n .command(\"status\")\n .alias(\"s\")\n .description(\"show git status with summary\")\n .option(\"-c, --cwd <cwd>\", \"working directory\", process.cwd())\n .action(async (opts) => {\n try {\n const gm = new GitManager(opts.cwd)\n if (!(await gm.isRepo())) {\n logger.error(\"Not a git repository\")\n process.exit(1)\n }\n\n const status = await gm.status()\n\n logger.break()\n logger.info(`Branch: ${chalk.bold(status.branch)}`)\n logger.break()\n\n if (status.isClean) {\n logger.success(\"Working tree clean\")\n return\n }\n\n if (status.staged.length) {\n logger.success(`Staged (${status.staged.length}):`)\n for (const f of status.staged) {\n console.log(` ${chalk.green(\"+\")} ${f}`)\n }\n }\n\n if (status.modified.length) {\n logger.warn(`Modified (${status.modified.length}):`)\n for (const f of status.modified) {\n console.log(` ${chalk.yellow(\"~\")} ${f}`)\n }\n }\n\n if (status.untracked.length) {\n console.log(chalk.dim(`Untracked (${status.untracked.length}):`))\n for (const f of status.untracked) {\n console.log(` ${chalk.dim(\"?\")} ${f}`)\n }\n }\n\n if (status.deleted.length) {\n logger.error(`Deleted (${status.deleted.length}):`)\n for (const f of status.deleted) {\n console.log(` ${chalk.red(\"-\")} ${f}`)\n }\n }\n\n logger.break()\n } catch (error) {\n handleError(error)\n }\n })\n\ngit\n .command(\"commit\")\n .alias(\"c\")\n .description(\"create an AI-generated commit message and commit\")\n .option(\"-m, --message <message>\", \"use a custom commit message\")\n .option(\"-a, --all\", \"stage all changes before committing\", false)\n .option(\"--ai\", \"generate commit message with AI\", true)\n .option(\"-c, --cwd <cwd>\", \"working directory\", process.cwd())\n .action(async (opts) => {\n try {\n const gm = new GitManager(opts.cwd)\n if (!(await gm.isRepo())) {\n logger.error(\"Not a git repository\")\n process.exit(1)\n }\n\n // Stage all if requested\n if (opts.all) {\n await gm.addAll()\n }\n\n const status = await gm.status()\n if (status.staged.length === 0) {\n logger.warn(\"Nothing staged to commit. Use --all to stage everything.\")\n process.exit(0)\n }\n\n let message = opts.message\n if (!message) {\n if (opts.ai) {\n const spinner = ora(\"Generating commit message...\").start()\n try {\n const provider = createProvider()\n message = await gm.generateCommitMessage(provider)\n spinner.stop()\n logger.info(`Message: ${chalk.bold(message)}`)\n } catch {\n spinner.stop()\n message = await gm.generateCommitMessage()\n logger.info(`Message: ${chalk.bold(message)}`)\n }\n } else {\n message = await gm.generateCommitMessage()\n }\n }\n\n const result = await gm.commit(message)\n logger.break()\n logger.success(\n `[${result.hash}] ${result.message} (${result.filesChanged} file(s))`\n )\n } catch (error) {\n handleError(error)\n }\n })\n\ngit\n .command(\"diff\")\n .alias(\"d\")\n .description(\"show diff of changes\")\n .option(\"-s, --staged\", \"show staged changes\", false)\n .option(\"-c, --cwd <cwd>\", \"working directory\", process.cwd())\n .action(async (opts) => {\n try {\n const gm = new GitManager(opts.cwd)\n const diffOutput = await gm.diff(opts.staged)\n\n if (!diffOutput.trim()) {\n logger.info(opts.staged ? \"No staged changes\" : \"No changes\")\n return\n }\n\n console.log(diffOutput)\n } catch (error) {\n handleError(error)\n }\n })\n\ngit\n .command(\"log\")\n .alias(\"l\")\n .description(\"show recent commits\")\n .option(\"-n, --count <n>\", \"number of commits to show\", \"10\")\n .option(\"-c, --cwd <cwd>\", \"working directory\", process.cwd())\n .action(async (opts) => {\n try {\n const gm = new GitManager(opts.cwd)\n const entries = await gm.log(parseInt(opts.count))\n\n if (!entries.length) {\n logger.info(\"No commits yet\")\n return\n }\n\n logger.break()\n for (const entry of entries) {\n console.log(\n `${chalk.yellow(entry.shortHash)} ${entry.message} ${chalk.dim(`— ${entry.author}`)}`\n )\n }\n logger.break()\n } catch (error) {\n handleError(error)\n }\n })\n","import { Command } from \"commander\"\nimport { A2AServer } from \"@/a2a\"\nimport type { ProviderName } from \"@/agent/providers\"\n\nexport const a2a = new Command()\n .name(\"a2a\")\n .description(\"start an A2A (Agent-to-Agent) protocol server for external agent integration\")\n .option(\"--port <port>\", \"server port\", \"3171\")\n .option(\"--host <host>\", \"server host\", \"0.0.0.0\")\n .option(\"-p, --provider <provider>\", \"AI provider\", \"claude-code\")\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--api-key <key>\", \"API key for the provider\")\n .option(\"-c, --cwd <cwd>\", \"working directory\", process.cwd())\n .option(\"--no-cors\", \"disable CORS headers\")\n .action(async (opts) => {\n const server = new A2AServer({\n port: parseInt(opts.port, 10),\n host: opts.host,\n provider: opts.provider as ProviderName,\n model: opts.model,\n apiKey: opts.apiKey,\n cwd: opts.cwd,\n cors: opts.cors !== false,\n })\n\n await server.start()\n })\n","import { Command } from \"commander\"\nimport { AgentXDaemon } from \"@/daemon\"\n\nexport const daemon = new Command()\n .name(\"daemon\")\n .description(\"start the agentx daemon — channels, crons, agents, and mesh\")\n .option(\"-c, --config <path>\", \"path to agentx.json config file\")\n .action(async (opts) => {\n const d = new AgentXDaemon(opts.config)\n await d.start()\n })\n","#!/usr/bin/env node\nimport { chat } from \"@/commands/chat\"\nimport { gen } from \"@/commands/generate\"\nimport { evolve } from \"@/commands/evolve\"\nimport { create } from \"@/commands/create\"\nimport { run } from \"@/commands/run\"\nimport { inspect } from \"@/commands/inspect\"\nimport { skill } from \"@/commands/skill\"\nimport { serve } from \"@/commands/serve\"\nimport { model } from \"@/commands/model\"\nimport { git } from \"@/commands/git\"\nimport { a2a } from \"@/commands/a2a\"\nimport { daemon } from \"@/commands/daemon\"\nimport { Command } from \"commander\"\nimport { globalHooks, loadHooks } from \"@/hooks\"\nimport { getPackageInfo } from \"@/utils/get-package-info\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const packageInfo = await getPackageInfo()\n\n const cwd = process.cwd()\n loadHooks(cwd, globalHooks)\n\n const program = new Command()\n .name(\"agentx\")\n .description(\n \"the AI coding agent — generate, evolve, chat, and manage your codebase with AI\"\n )\n .version(\n packageInfo.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(chat)\n .addCommand(gen)\n .addCommand(evolve)\n .addCommand(git)\n .addCommand(create)\n .addCommand(run)\n .addCommand(inspect)\n .addCommand(skill)\n .addCommand(serve)\n .addCommand(model)\n .addCommand(a2a)\n .addCommand(daemon)\n\n // Default to chat when no command is given and stdin is a TTY\n const args = process.argv.slice(2)\n if (args.length === 0 && process.stdin.isTTY) {\n process.argv.push(\"chat\")\n }\n\n program.parse()\n}\n\nmain()\n"],"mappings":"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","names":["existsSync","path","Command","chalk","chat","Command","opts","sessions","listSessions","logger","chalk","date","msgs","tokens","setDebug","globalPermissions","cwd","path","existsSync","packageInfo","getPackageInfo","ReplEngine","error","handleError","existsSync","path","chalk","Command","ora","prompts","z","chalk","nowMs","formatDuration","ms","s","m","h","ss","mm","tailLines","text","maxLines","lines","clampTail","maxChars","GenerateTui","opts","evt","status","line","ts","msg","cols","rows","spinnerFrames","spinner","idleForMs","header","meta1","meta2","meta3","sep","available","outputLines","eventLines","eventTail","outTailLines","body","l","chalk","indentBlock","s","prefix","l","renderInline","line","_","code","text","url","t","renderTextBlock","block","lines","out","raw","title","renderMarkdownForTerminal","md","input","parts","chunk","firstNl","info","body","header","footer","codeBody","generateOptionsSchema","z","gen","Command","OUTPUT_TYPES","taskParts","opts","task","setDebug","globalPermissions","cwd","path","existsSync","logger","response","prompts","v","type","t","outputTypeDescriptions","options","maxSteps","useTui","spinner","ora","tui","GenerateTui","chalk","result","streamError","event","generateStream","rendered","renderMarkdownForTerminal","answer","task2","tui2","result2","streamError2","printResult","error","handleError","file","err","summary","globalTracker","step","existsSync","fs","path","chalk","Command","ora","prompts","fg","evolve","taskParts","opts","task","cwd","path","existsSync","logger","setDebug","globalPermissions","response","v","effectiveTask","globalHooks","promptResult","genResult","globPattern","matchedFiles","maxFiles","filesToProcess","spinner","fileContents","file","fullPath","content","fs","context","createAgentContext","matchedSkills","matchSkillsToTask","debug","systemPrompt","buildEvolveSystemPrompt","m","filesSummary","f","truncate","userMessage","ensureCredentials","providerName","provider","createProvider","resolvedModel","loadAuthConfig","messages","result","stepTokens","stepModel","estInput","estOutput","globalTracker","changes","original","approved","change","diffLines","generateSimpleDiff","line","action","remaining","writeSpinner","written","errors","writtenFiles","writeResult","dir","error","memory","MemoryHierarchy","HealEngine","healEngine","healSpinner","healResult","summary","handleError","skills","sections","formatTechStack","deps","schemaStr","formatSchemas","proposed","origLines","propLines","diff","maxLen","contextBuffer","lastChangeIdx","i","origLine","propLine","str","max","existsSync","fs","path","chalk","Command","ora","prompts","TEMPLATES","create","t","name","opts","logger","tag","response","v","template","selected","description","projectDir","path","existsSync","overwrite","fs","spinner","result","generate","file","relative","err","error","handleError","existsSync","fs","path","chalk","Command","run","opts","cwd","path","existsSync","logger","configPath","fileConfig","raw","fs","config","AgentXRuntime","error","handleError","existsSync","path","chalk","Command","ora","inspect","opts","cwd","path","existsSync","logger","spinner","context","createAgentContext","s","techStack","lang","fw","typeColor","db","style","test","dep","schemas","hasSchemas","line","v","m","source","depCount","devDepCount","topDeps","name","version","parts","error","handleError","existsSync","fs","path","chalk","Command","ora","prompts","skill","packageId","opts","cwd","path","spinner","skills","installSkillPackage","logger","error","handleError","listInstalledSkills","s","source","t","name","response","v","description","tags","skillDir","skillPath","existsSync","overwrite","content","generateSkillMd","ensureCredentials","techStack","detectTechStack","provider","createProvider","result","generateSkill","fs","found","l","chalk","Command","serve","opts","startMcpServer","logger","error","handleError","chalk","Command","ANTHROPIC_MODELS","model","runModelSetup","e","handleError","config","loadAuthConfig","logger","modelLabel","m","maskToken","token","Command","chalk","ora","git","Command","opts","gm","GitManager","logger","status","chalk","f","error","handleError","message","spinner","ora","provider","createProvider","result","diffOutput","entries","entry","Command","a2a","Command","opts","A2AServer","Command","daemon","Command","opts","AgentXDaemon","Command","main","packageInfo","getPackageInfo","cwd","loadHooks","globalHooks","program","Command","chat","gen","evolve","git","create","run","inspect","skill","serve","model","a2a","daemon"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/daemon.ts","../src/commands/init.ts","../src/commands/manage.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { daemon } from \"@/commands/daemon\"\nimport { init } from \"@/commands/init\"\nimport { agent, channel, cron, mesh, skillCmd, hook, migrate } from \"@/commands/manage\"\nimport { getPackageInfo } from \"@/utils/get-package-info\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const packageInfo = await getPackageInfo()\n\n const program = new Command()\n .name(\"agentx\")\n .description(\n \"self-hosted multi-agent orchestrator — Telegram, WhatsApp, crons, A2A mesh, wiki knowledge\"\n )\n .version(\n packageInfo.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(daemon)\n .addCommand(init)\n .addCommand(agent)\n .addCommand(channel)\n .addCommand(cron)\n .addCommand(mesh)\n .addCommand(skillCmd)\n .addCommand(hook)\n .addCommand(migrate)\n\n const args = process.argv.slice(2)\n if (args.length === 0) {\n program.outputHelp()\n return\n }\n\n program.parse()\n}\n\nmain()\n","import { Command } from \"commander\"\nimport { AgentXDaemon } from \"@/daemon\"\nimport { loadDaemonConfig, validateWorkspaces } from \"@/daemon/config\"\nimport chalk from \"chalk\"\n\n// --- agentx daemon: start/stop/status/logs ---\n\nexport const daemon = new Command()\n .name(\"daemon\")\n .description(\"manage the agentx daemon — start, stop, status, logs\")\n\n// agentx daemon start\ndaemon\n .command(\"start\")\n .description(\"start the daemon (default if no subcommand)\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"-d, --detach\", \"run in background (detached)\")\n .option(\"--port <port>\", \"override bind port\")\n .action(async (opts) => {\n if (opts.detach) {\n const { spawn } = await import(\"child_process\")\n const args = [\"dist/cli.js\", \"daemon\", \"start\"]\n if (opts.config) args.push(\"-c\", opts.config)\n if (opts.port) args.push(\"--port\", opts.port)\n\n const child = spawn(\"node\", args, {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n cwd: process.cwd(),\n })\n child.unref()\n\n const { writeFileSync } = await import(\"fs\")\n writeFileSync(\"/tmp/agentx-daemon.pid\", String(child.pid))\n console.log(chalk.green(`Daemon started in background (PID: ${child.pid})`))\n console.log(chalk.dim(` Logs: tail -f /tmp/agentx-daemon.log`))\n console.log(chalk.dim(` Stop: agentx daemon stop`))\n return\n }\n\n const d = new AgentXDaemon(opts.config)\n await d.start()\n })\n\n// agentx daemon stop\ndaemon\n .command(\"stop\")\n .description(\"stop the running daemon\")\n .action(async () => {\n const { readFileSync, existsSync } = await import(\"fs\")\n const pidFile = \"/tmp/agentx-daemon.pid\"\n\n if (!existsSync(pidFile)) {\n console.log(chalk.yellow(\"No daemon PID file found. Trying to find process...\"))\n }\n\n try {\n // Try PID file first\n if (existsSync(pidFile)) {\n const pid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10)\n process.kill(pid, \"SIGTERM\")\n console.log(chalk.green(`Daemon stopped (PID: ${pid})`))\n return\n }\n } catch {\n // PID might be stale\n }\n\n // Fallback: kill by process name\n const { execSync } = await import(\"child_process\")\n try {\n execSync(\"pkill -f 'node dist/cli.js daemon'\", { stdio: \"ignore\" })\n console.log(chalk.green(\"Daemon stopped\"))\n } catch {\n console.log(chalk.yellow(\"No daemon process found\"))\n }\n })\n\n// agentx daemon status\ndaemon\n .command(\"status\")\n .alias(\"st\")\n .description(\"show daemon status, agents, crons, and mesh\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"--json\", \"output as JSON\")\n .action(async (opts) => {\n // Try connecting to running daemon first\n try {\n const config = loadDaemonConfig(opts.config)\n const [host, port] = config.node.bind.split(\":\")\n const url = `http://${host || \"127.0.0.1\"}:${port}/health`\n const res = await fetch(url, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n console.log()\n console.log(chalk.bold(` ${data.node.name}`) + chalk.dim(` (${data.node.id})`))\n console.log(chalk.green(\" Status: running\") + chalk.dim(` — uptime ${formatDuration(data.uptime)}`))\n console.log()\n\n // Agents\n console.log(chalk.bold(\" Agents:\"))\n for (const a of data.agents) {\n const active = a.active > 0 ? chalk.yellow(` [${a.active} active]`) : \"\"\n const errors = a.errors > 0 ? chalk.red(` (${a.errors} errors)`) : \"\"\n console.log(` ${chalk.cyan(a.name)} ${chalk.dim(`(${a.tier})`)}${active}${errors}`)\n console.log(chalk.dim(` ${a.workspace}`))\n }\n\n // Crons\n const enabledCrons = data.crons.filter((c: any) => c.enabled)\n if (data.crons.length) {\n console.log()\n console.log(chalk.bold(` Crons: ${enabledCrons.length} enabled / ${data.crons.length} total`))\n for (const c of data.crons) {\n const icon = c.enabled ? chalk.green(\"●\") : chalk.dim(\"○\")\n const next = c.nextRun ? chalk.dim(` next: ${new Date(c.nextRun).toLocaleTimeString()}`) : \"\"\n console.log(` ${icon} ${c.id}${next}`)\n }\n }\n\n // Mesh\n if (data.mesh?.length) {\n console.log()\n console.log(chalk.bold(\" Mesh:\"))\n for (const p of data.mesh) {\n const icon = p.healthy ? chalk.green(\"●\") : chalk.red(\"●\")\n const skills = p.skills?.length ? chalk.dim(` (${p.skills.length} agents)`) : \"\"\n console.log(` ${icon} ${p.peer} ${chalk.dim(p.peerUrl)}${skills}`)\n }\n }\n\n console.log()\n } catch (e: any) {\n if (e.cause?.code === \"ECONNREFUSED\" || e.name === \"TimeoutError\") {\n console.log(chalk.red(\" Daemon is not running\"))\n console.log(chalk.dim(\" Start with: agentx daemon start\"))\n } else {\n // No running daemon — show config info\n try {\n const config = loadDaemonConfig(opts.config)\n const warnings = validateWorkspaces(config)\n console.log()\n console.log(chalk.bold(` ${config.node.name}`) + chalk.dim(` (${config.node.id})`))\n console.log(chalk.yellow(\" Status: stopped\"))\n console.log(chalk.dim(` ${Object.keys(config.agents).length} agents, ${Object.keys(config.crons).length} crons configured`))\n if (warnings.length) {\n console.log()\n for (const w of warnings) console.log(chalk.yellow(` ⚠ ${w}`))\n }\n console.log()\n } catch (err: any) {\n console.log(chalk.red(` ${err.message}`))\n }\n }\n }\n })\n\n// agentx daemon logs\ndaemon\n .command(\"logs\")\n .description(\"tail daemon logs\")\n .option(\"-n, --lines <n>\", \"number of lines\", \"50\")\n .option(\"-f, --follow\", \"follow log output\", false)\n .action(async (opts) => {\n const { execSync, spawn: spawnProc } = await import(\"child_process\")\n const logFile = \"/tmp/agentx-daemon.log\"\n\n const { existsSync } = await import(\"fs\")\n if (!existsSync(logFile)) {\n console.log(chalk.yellow(\"No log file found at /tmp/agentx-daemon.log\"))\n return\n }\n\n if (opts.follow) {\n const tail = spawnProc(\"tail\", [\"-f\", \"-n\", opts.lines, logFile], { stdio: \"inherit\" })\n process.on(\"SIGINT\", () => { tail.kill(); process.exit(0) })\n } else {\n execSync(`tail -n ${opts.lines} ${logFile}`, { stdio: \"inherit\" })\n }\n })\n\n// agentx daemon send — send a task to an agent\ndaemon\n .command(\"send <agent> <message...>\")\n .description(\"send a task to an agent via the daemon API\")\n .option(\"-c, --config <path>\", \"path to agentx.json\")\n .option(\"--peer <peer>\", \"send to a mesh peer's agent\")\n .option(\"--json\", \"output raw JSON response\")\n .action(async (agent, messageParts, opts) => {\n const message = messageParts.join(\" \")\n\n try {\n const config = loadDaemonConfig(opts.config)\n const [host, port] = config.node.bind.split(\":\")\n const baseUrl = `http://${host || \"127.0.0.1\"}:${port}`\n\n let url: string\n let body: Record<string, unknown>\n\n if (opts.peer) {\n url = `${baseUrl}/mesh/task`\n body = { peer: opts.peer, message, agent }\n } else {\n url = `${baseUrl}/task`\n body = { agent, message }\n }\n\n console.log(chalk.dim(` Sending to ${opts.peer ? `${opts.peer}/${agent}` : agent}...`))\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n const data = await res.json() as any\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else if (data.error) {\n console.log(chalk.red(` Error: ${data.error}`))\n } else {\n console.log()\n console.log(data.content || data.response || \"No response\")\n if (data.duration) {\n console.log(chalk.dim(`\\n (${(data.duration / 1000).toFixed(1)}s)`))\n }\n }\n } catch (e: any) {\n console.log(chalk.red(` Failed: ${e.message}`))\n console.log(chalk.dim(\" Is the daemon running? Try: agentx daemon status\"))\n }\n })\n\n// agentx daemon deploy — rsync dist to a remote server\ndaemon\n .command(\"deploy <host>\")\n .description(\"deploy agentx to a remote server via rsync\")\n .option(\"-i, --identity <key>\", \"SSH identity file\")\n .option(\"-u, --user <user>\", \"SSH user\", \"clawd\")\n .option(\"-p, --path <path>\", \"remote agentx path\", \"~/agentx\")\n .option(\"--restart\", \"restart remote daemon after deploy\", false)\n .action(async (host, opts) => {\n const { execSync } = await import(\"child_process\")\n const sshKey = opts.identity ? `-e \"ssh -i ${opts.identity}\"` : \"\"\n const remote = `${opts.user}@${host}:${opts.path}/dist/`\n\n console.log(chalk.dim(` Deploying to ${opts.user}@${host}:${opts.path}...`))\n\n try {\n execSync(`rsync -avz --delete ${sshKey} dist/ ${remote}`, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n })\n console.log(chalk.green(\" Deploy complete\"))\n\n if (opts.restart) {\n console.log(chalk.dim(\" Restarting remote daemon...\"))\n const ssh = opts.identity ? `ssh -i ${opts.identity}` : \"ssh\"\n execSync(\n `${ssh} ${opts.user}@${host} \"pkill -f 'node dist/cli.js daemon' 2>/dev/null; sleep 2; cd ${opts.path} && nohup node dist/cli.js daemon start > /tmp/agentx-daemon.log 2>&1 &\"`,\n { stdio: \"inherit\" },\n )\n console.log(chalk.green(\" Remote daemon restarted\"))\n }\n } catch (e: any) {\n console.log(chalk.red(` Deploy failed: ${e.message}`))\n }\n })\n\n// Default: `agentx daemon` without subcommand starts the daemon\ndaemon.action(async (opts) => {\n const d = new AgentXDaemon(opts.config)\n await d.start()\n})\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) return `${Math.round(seconds)}s`\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`\n if (seconds < 86400) return `${Math.round(seconds / 3600)}h ${Math.round((seconds % 3600) / 60)}m`\n return `${Math.round(seconds / 86400)}d ${Math.round((seconds % 86400) / 3600)}h`\n}\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"fs\"\nimport { resolve, join } from \"path\"\n\n// --- agentx init: interactive setup for new installations ---\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize agentx configuration in the current directory\")\n .option(\"--force\", \"overwrite existing config\")\n .action(async (opts) => {\n const cwd = process.cwd()\n const configPath = resolve(cwd, \"agentx.json\")\n const envPath = resolve(cwd, \".env\")\n const sessionsDir = resolve(cwd, \".agentx/sessions\")\n\n console.log()\n console.log(chalk.bold(\" agentx init\"))\n console.log()\n\n // Check existing config\n if (existsSync(configPath) && !opts.force) {\n console.log(chalk.yellow(` agentx.json already exists. Use --force to overwrite.`))\n console.log()\n return\n }\n\n // Find example config\n const examplePaths = [\n resolve(cwd, \"agentx.example.json\"),\n resolve(cwd, \"node_modules/agentix-cli/agentx.example.json\"),\n ]\n\n let example: string | undefined\n for (const p of examplePaths) {\n if (existsSync(p)) {\n example = readFileSync(p, \"utf-8\")\n break\n }\n }\n\n if (!example) {\n // Generate minimal config\n example = JSON.stringify({\n node: {\n id: require(\"os\").hostname().toLowerCase().replace(/[^a-z0-9-]/g, \"-\"),\n name: require(\"os\").hostname(),\n bind: \"127.0.0.1:18800\",\n },\n providers: {\n claude: { apiKey: \"${ANTHROPIC_API_KEY}\" },\n },\n agents: {\n assistant: {\n name: \"Assistant\",\n workspace: cwd,\n tier: \"claude-code\",\n model: \"claude-sonnet-4-6\",\n mentions: [\"@assistant\", \"assistant\"],\n maxConcurrent: 2,\n systemPrompt: \"You are a helpful assistant.\",\n permissionMode: \"default\",\n },\n },\n channels: {\n telegram: {\n enabled: false,\n accounts: {},\n policy: { dm: \"pair\", group: \"mention-required\" },\n },\n whatsapp: { enabled: false },\n },\n crons: {},\n mesh: {\n enabled: false,\n peers: [],\n discovery: \"static\",\n healthCheck: { interval: 60, timeout: 10 },\n },\n }, null, 2)\n }\n\n // Write config\n writeFileSync(configPath, example)\n console.log(chalk.green(` ✓ Created agentx.json`))\n\n // Create .env template\n if (!existsSync(envPath)) {\n writeFileSync(envPath, [\n \"# AgentX environment variables\",\n \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"# TG_BOT_TOKEN=123456:ABC...\",\n \"# MESH_TOKEN=your-mesh-secret\",\n \"\",\n ].join(\"\\n\"))\n console.log(chalk.green(` ✓ Created .env template`))\n }\n\n // Create session dir\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true })\n console.log(chalk.green(` ✓ Created .agentx/sessions/`))\n }\n\n // Create workspace .claude dir\n const claudeDir = resolve(cwd, \".claude\")\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true })\n console.log(chalk.green(` ✓ Created .claude/`))\n }\n\n console.log()\n console.log(chalk.bold(\" Next steps:\"))\n console.log(` 1. Edit ${chalk.cyan(\"agentx.json\")} — configure agents, channels, crons`)\n console.log(` 2. Edit ${chalk.cyan(\".env\")} — add API keys and bot tokens`)\n console.log(` 3. Run ${chalk.cyan(\"agentx daemon start\")} — start the daemon`)\n console.log(` 4. Run ${chalk.cyan(\"agentx daemon status\")} — verify everything`)\n console.log()\n })\n","import { Command } from \"commander\"\nimport chalk from \"chalk\"\nimport prompts from \"prompts\"\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync, readdirSync } from \"fs\"\nimport { resolve, join } from \"path\"\n\n// --- agentx agent/channel/cron/mesh/skill/hook management commands ---\n\nfunction loadConfig(): any {\n const p = resolve(process.cwd(), \"agentx.json\")\n if (!existsSync(p)) throw new Error(\"No agentx.json found. Run: agentx init\")\n return JSON.parse(readFileSync(p, \"utf-8\"))\n}\n\nfunction saveConfig(config: any): void {\n writeFileSync(resolve(process.cwd(), \"agentx.json\"), JSON.stringify(config, null, 2))\n}\n\n// ==================== agentx agent ====================\n\nexport const agent = new Command()\n .name(\"agent\")\n .description(\"manage agents — add, list, remove\")\n\nagent\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list configured agents\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, a] of Object.entries(config.agents || {}) as any) {\n const mentions = a.mentions?.join(\", \") || \"\"\n console.log(` ${chalk.cyan(id)} — ${a.name} (${a.tier})`)\n console.log(chalk.dim(` workspace: ${a.workspace}`))\n if (mentions) console.log(chalk.dim(` mentions: ${mentions}`))\n }\n console.log()\n })\n\nagent\n .command(\"add\")\n .description(\"add a new agent interactively\")\n .action(async () => {\n const config = loadConfig()\n\n const answers = await prompts([\n { type: \"text\", name: \"id\", message: \"Agent ID (kebab-case)\", validate: (v: string) => /^[a-z0-9-]+$/.test(v) || \"Use lowercase, numbers, hyphens\" },\n { type: \"text\", name: \"name\", message: \"Display name\" },\n { type: \"text\", name: \"workspace\", message: \"Workspace path\", initial: resolve(process.cwd(), \"agents/\") },\n { type: \"select\", name: \"tier\", message: \"Execution tier\", choices: [\n { title: \"claude-code (subscription, full features)\", value: \"claude-code\" },\n { title: \"sdk (API key, programmatic)\", value: \"sdk\" },\n { title: \"orchestrator (any provider)\", value: \"orchestrator\" },\n ]},\n { type: \"text\", name: \"model\", message: \"Model\", initial: \"claude-sonnet-4-6\" },\n { type: \"list\", name: \"mentions\", message: \"Mention patterns (comma-separated)\", separator: \",\" },\n { type: \"number\", name: \"maxConcurrent\", message: \"Max concurrent tasks\", initial: 2 },\n { type: \"text\", name: \"systemPrompt\", message: \"System prompt\" },\n ])\n\n if (!answers.id) return\n\n // Create workspace + .claude dir\n const ws = answers.workspace.endsWith(answers.id) ? answers.workspace : join(answers.workspace, answers.id)\n mkdirSync(resolve(ws, \".claude/skills\"), { recursive: true })\n\n // Create CLAUDE.md\n const claudeMd = `# ${answers.name}\\n\\n${answers.systemPrompt}\\n`\n writeFileSync(resolve(ws, \"CLAUDE.md\"), claudeMd)\n\n // Create default settings.json\n writeFileSync(resolve(ws, \".claude/settings.json\"), JSON.stringify({\n permissions: {\n allow: [\"Bash(git *)\", \"Bash(curl *)\", \"Bash(node *)\", \"Read\", \"Write\", \"Edit\", \"Glob\", \"Grep\", \"WebFetch\", \"WebSearch\"],\n },\n }, null, 2))\n\n // Install wiki skill\n const wikiSkillSrc = resolve(process.cwd(), \"src/wiki/SKILL.md\")\n const wikiSkillDist = resolve(__dirname, \"../wiki/SKILL.md\")\n const skillSrc = existsSync(wikiSkillSrc) ? wikiSkillSrc : wikiSkillDist\n if (existsSync(skillSrc)) {\n mkdirSync(resolve(ws, \".claude/skills/wiki\"), { recursive: true })\n cpSync(skillSrc, resolve(ws, \".claude/skills/wiki/SKILL.md\"))\n }\n\n // Add to config\n config.agents = config.agents || {}\n config.agents[answers.id] = {\n name: answers.name,\n workspace: ws,\n tier: answers.tier,\n model: answers.model,\n mentions: answers.mentions?.map((m: string) => m.trim()).filter(Boolean) || [],\n maxConcurrent: answers.maxConcurrent,\n systemPrompt: answers.systemPrompt,\n permissionMode: \"default\",\n }\n\n saveConfig(config)\n console.log(chalk.green(`\\n Agent \"${answers.id}\" added`))\n console.log(chalk.dim(` Workspace: ${ws}`))\n console.log(chalk.dim(` Wiki skill installed`))\n console.log(chalk.dim(` CLAUDE.md + settings.json created`))\n console.log()\n })\n\nagent\n .command(\"remove <id>\")\n .alias(\"rm\")\n .description(\"remove an agent from config (keeps workspace)\")\n .action((id) => {\n const config = loadConfig()\n if (!config.agents?.[id]) {\n console.log(chalk.red(` Agent \"${id}\" not found`))\n return\n }\n delete config.agents[id]\n saveConfig(config)\n console.log(chalk.green(` Agent \"${id}\" removed from config (workspace preserved)`))\n })\n\n// ==================== agentx channel ====================\n\nexport const channel = new Command()\n .name(\"channel\")\n .description(\"manage channels — add telegram/whatsapp/discord, list\")\n\nchannel\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list configured channels and bindings\")\n .action(() => {\n const config = loadConfig()\n console.log()\n\n // Telegram\n const tg = config.channels?.telegram\n if (tg?.enabled) {\n console.log(chalk.bold(\" Telegram:\"))\n for (const [name, acc] of Object.entries(tg.accounts || {}) as any) {\n console.log(` ${chalk.cyan(name)} -> agent: ${acc.agentBinding}`)\n }\n } else {\n console.log(chalk.dim(\" Telegram: disabled\"))\n }\n\n // WhatsApp\n const wa = config.channels?.whatsapp\n if (wa?.enabled) {\n console.log(chalk.bold(\" WhatsApp:\"))\n console.log(` default agent: ${wa.defaultAgent || \"(none)\"}`)\n console.log(` session: ${wa.sessionDir || \".agentx/whatsapp-sessions\"}`)\n for (const route of wa.routes || []) {\n const target = route.contact ? `contact ${route.contact}` : `group \"${route.group}\"`\n console.log(` ${target} -> agent: ${route.agent}`)\n }\n } else {\n console.log(chalk.dim(\" WhatsApp: disabled\"))\n }\n\n // Discord\n const dc = config.channels?.discord\n if (dc?.enabled) {\n console.log(chalk.bold(\" Discord:\"))\n console.log(` agent: ${dc.agentBinding || \"(none)\"}`)\n } else {\n console.log(chalk.dim(\" Discord: disabled\"))\n }\n\n console.log()\n })\n\nchannel\n .command(\"add\")\n .description(\"add a channel (telegram, whatsapp, or discord)\")\n .action(async () => {\n const config = loadConfig()\n const agentIds = Object.keys(config.agents || {})\n if (!agentIds.length) {\n console.log(chalk.red(\" No agents configured. Run: agentx agent add\"))\n return\n }\n\n const agentChoices = agentIds.map(id => ({ title: `${id} (${config.agents[id].name})`, value: id }))\n\n const { channelType } = await prompts({\n type: \"select\",\n name: \"channelType\",\n message: \"Channel type\",\n choices: [\n { title: \"Telegram — bot via BotFather token\", value: \"telegram\" },\n { title: \"WhatsApp — link via QR code (self-chat or contacts)\", value: \"whatsapp\" },\n { title: \"Discord — bot via Discord developer portal\", value: \"discord\" },\n ],\n })\n\n if (!channelType) return\n\n config.channels = config.channels || {}\n\n // --- Telegram ---\n if (channelType === \"telegram\") {\n const answers = await prompts([\n { type: \"text\", name: \"accountName\", message: \"Account name (e.g. 'default', 'devops')\" },\n { type: \"text\", name: \"token\", message: \"Bot token (from @BotFather)\" },\n { type: \"select\", name: \"agentBinding\", message: \"Bind to agent\", choices: agentChoices },\n ])\n\n if (!answers.accountName || !answers.token) return\n\n try {\n const res = await fetch(`https://api.telegram.org/bot${answers.token}/getMe`)\n const data = await res.json() as any\n if (!data.ok) throw new Error(data.description)\n console.log(chalk.green(` Bot verified: @${data.result.username}`))\n\n const botHandle = `@${data.result.username}`\n const agentMentions = config.agents[answers.agentBinding].mentions || []\n if (!agentMentions.includes(botHandle)) {\n agentMentions.push(botHandle, data.result.username)\n config.agents[answers.agentBinding].mentions = agentMentions\n }\n } catch (e: any) {\n console.log(chalk.red(` Invalid token: ${e.message}`))\n return\n }\n\n config.channels.telegram = config.channels.telegram || { enabled: false, accounts: {}, policy: { dm: \"pair\", group: \"mention-required\" } }\n config.channels.telegram.enabled = true\n config.channels.telegram.accounts[answers.accountName] = {\n token: answers.token,\n agentBinding: answers.agentBinding,\n }\n\n saveConfig(config)\n console.log(chalk.green(` Telegram \"${answers.accountName}\" added -> ${answers.agentBinding}`))\n }\n\n // --- WhatsApp ---\n if (channelType === \"whatsapp\") {\n const answers = await prompts([\n { type: \"select\", name: \"defaultAgent\", message: \"Default agent for WhatsApp messages\", choices: agentChoices },\n { type: \"text\", name: \"sessionDir\", message: \"Session directory\", initial: \".agentx/whatsapp-sessions\" },\n { type: \"confirm\", name: \"addRoute\", message: \"Add a contact/group route?\", initial: true },\n ])\n\n if (!answers.defaultAgent) return\n\n const routes: any[] = []\n let addMore = answers.addRoute\n\n while (addMore) {\n const route = await prompts([\n { type: \"select\", name: \"type\", message: \"Route type\", choices: [\n { title: \"Contact (phone number)\", value: \"contact\" },\n { title: \"Group (name match)\", value: \"group\" },\n ]},\n { type: \"text\", name: \"value\", message: (prev: string) => prev === \"contact\" ? \"Phone number (e.g. +21624309128)\" : \"Group name (partial match)\" },\n { type: \"select\", name: \"agent\", message: \"Route to agent\", choices: agentChoices },\n { type: \"confirm\", name: \"more\", message: \"Add another route?\", initial: false },\n ])\n\n if (route.value && route.agent) {\n routes.push({\n [route.type]: route.value,\n agent: route.agent,\n })\n }\n addMore = route.more\n }\n\n config.channels.whatsapp = {\n enabled: true,\n sessionDir: answers.sessionDir,\n defaultAgent: answers.defaultAgent,\n routes,\n }\n\n saveConfig(config)\n mkdirSync(resolve(process.cwd(), answers.sessionDir), { recursive: true })\n console.log(chalk.green(` WhatsApp enabled (${routes.length} routes, default: ${answers.defaultAgent})`))\n console.log(chalk.dim(\" Start daemon to scan QR code: agentx daemon start\"))\n }\n\n // --- Discord ---\n if (channelType === \"discord\") {\n const answers = await prompts([\n { type: \"text\", name: \"token\", message: \"Discord bot token (from developer portal)\" },\n { type: \"select\", name: \"agentBinding\", message: \"Bind to agent\", choices: agentChoices },\n ])\n\n if (!answers.token) return\n\n config.channels.discord = {\n enabled: true,\n token: answers.token,\n agentBinding: answers.agentBinding,\n }\n\n saveConfig(config)\n console.log(chalk.green(` Discord added -> ${answers.agentBinding}`))\n }\n\n console.log(chalk.dim(\" Restart daemon to apply: agentx daemon stop && agentx daemon start\"))\n console.log()\n })\n\n// ==================== agentx cron ====================\n\nexport const cron = new Command()\n .name(\"cron\")\n .description(\"manage cron jobs — add, list, enable, disable\")\n\ncron\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list cron jobs\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, c] of Object.entries(config.crons || {}) as any) {\n const icon = c.enabled ? chalk.green(\"●\") : chalk.dim(\"○\")\n console.log(` ${icon} ${chalk.cyan(id)} — ${c.schedule} (${c.timezone})`)\n console.log(chalk.dim(` agent: ${c.agent} | timeout: ${c.timeout}s`))\n }\n if (!Object.keys(config.crons || {}).length) {\n console.log(chalk.dim(\" No cron jobs configured\"))\n }\n console.log()\n })\n\ncron\n .command(\"add\")\n .description(\"add a cron job\")\n .action(async () => {\n const config = loadConfig()\n const agentIds = Object.keys(config.agents || {})\n\n const answers = await prompts([\n { type: \"text\", name: \"id\", message: \"Job ID (kebab-case)\" },\n { type: \"text\", name: \"schedule\", message: \"Cron expression (e.g. '0 9 * * *')\" },\n { type: \"text\", name: \"timezone\", message: \"Timezone\", initial: \"UTC\" },\n { type: \"select\", name: \"agent\", message: \"Agent\", choices: agentIds.map(id => ({ title: id, value: id })) },\n { type: \"text\", name: \"prompt\", message: \"Task prompt\" },\n { type: \"number\", name: \"timeout\", message: \"Timeout (seconds)\", initial: 600 },\n { type: \"confirm\", name: \"enabled\", message: \"Enable now?\", initial: false },\n ])\n\n if (!answers.id || !answers.schedule) return\n\n config.crons = config.crons || {}\n config.crons[answers.id] = {\n enabled: answers.enabled,\n schedule: answers.schedule,\n timezone: answers.timezone,\n agent: answers.agent,\n prompt: answers.prompt,\n timeout: answers.timeout,\n onError: \"log\",\n }\n\n saveConfig(config)\n console.log(chalk.green(` Cron \"${answers.id}\" added (${answers.enabled ? \"enabled\" : \"disabled\"})`))\n console.log()\n })\n\ncron\n .command(\"enable <id>\")\n .description(\"enable a cron job\")\n .action((id) => {\n const config = loadConfig()\n if (!config.crons?.[id]) { console.log(chalk.red(` Cron \"${id}\" not found`)); return }\n config.crons[id].enabled = true\n saveConfig(config)\n console.log(chalk.green(` Cron \"${id}\" enabled`))\n })\n\ncron\n .command(\"disable <id>\")\n .description(\"disable a cron job\")\n .action((id) => {\n const config = loadConfig()\n if (!config.crons?.[id]) { console.log(chalk.red(` Cron \"${id}\" not found`)); return }\n config.crons[id].enabled = false\n saveConfig(config)\n console.log(chalk.green(` Cron \"${id}\" disabled`))\n })\n\n// ==================== agentx mesh ====================\n\nexport const mesh = new Command()\n .name(\"mesh\")\n .description(\"manage mesh peers — add, list, remove\")\n\nmesh\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list mesh peers\")\n .action(async () => {\n const config = loadConfig()\n console.log()\n if (!config.mesh?.enabled) {\n console.log(chalk.dim(\" Mesh: disabled\"))\n } else {\n console.log(chalk.bold(\" Mesh peers:\"))\n for (const peer of config.mesh.peers || []) {\n // Try health check\n let status = chalk.red(\"unreachable\")\n try {\n const res = await fetch(`${peer.url}/health`, { signal: AbortSignal.timeout(3000) })\n const data = await res.json() as any\n status = chalk.green(`healthy — ${data.agents?.length || 0} agents`)\n } catch {}\n console.log(` ${chalk.cyan(peer.name)} ${chalk.dim(peer.url)} ${status}`)\n }\n }\n console.log()\n })\n\nmesh\n .command(\"add\")\n .description(\"add a mesh peer (another agentx server)\")\n .action(async () => {\n const config = loadConfig()\n\n const answers = await prompts([\n { type: \"text\", name: \"name\", message: \"Peer name (e.g. 'server-2')\" },\n { type: \"text\", name: \"url\", message: \"Peer URL (e.g. 'http://100.67.108.119:18800')\" },\n { type: \"text\", name: \"token\", message: \"Auth token (optional, press enter to skip)\" },\n ])\n\n if (!answers.name || !answers.url) return\n\n // Verify connectivity\n try {\n const res = await fetch(`${answers.url}/.well-known/agent-card.json`, { signal: AbortSignal.timeout(5000) })\n const card = await res.json() as any\n console.log(chalk.green(` Connected: ${card.name} (${card.skills?.length || 0} agents)`))\n } catch {\n console.log(chalk.yellow(\" Could not reach peer (adding anyway)\"))\n }\n\n config.mesh = config.mesh || { enabled: false, peers: [], discovery: \"static\", healthCheck: { interval: 60, timeout: 10 } }\n config.mesh.enabled = true\n config.mesh.peers = config.mesh.peers || []\n config.mesh.peers.push({\n url: answers.url,\n name: answers.name,\n ...(answers.token ? { token: answers.token } : {}),\n })\n\n saveConfig(config)\n console.log(chalk.green(` Peer \"${answers.name}\" added`))\n console.log()\n })\n\nmesh\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"remove a mesh peer\")\n .action((name) => {\n const config = loadConfig()\n if (!config.mesh?.peers) return\n config.mesh.peers = config.mesh.peers.filter((p: any) => p.name !== name)\n if (config.mesh.peers.length === 0) config.mesh.enabled = false\n saveConfig(config)\n console.log(chalk.green(` Peer \"${name}\" removed`))\n })\n\n// ==================== agentx skill ====================\n\nexport const skillCmd = new Command()\n .name(\"skill\")\n .description(\"manage skills — add to agent(s), list\")\n\nskillCmd\n .command(\"add <skillPath>\")\n .description(\"add a skill to agent(s)\")\n .option(\"-a, --agent <agents...>\", \"target agent ID(s)\")\n .option(\"--all\", \"add to all agents\")\n .action(async (skillPath, opts) => {\n const config = loadConfig()\n const srcPath = resolve(skillPath)\n\n if (!existsSync(srcPath)) {\n console.log(chalk.red(` Skill not found: ${srcPath}`))\n return\n }\n\n // Determine skill name\n const skillName = existsSync(join(srcPath, \"SKILL.md\"))\n ? srcPath.split(\"/\").pop()!\n : srcPath.replace(/\\/SKILL\\.md$/, \"\").split(\"/\").pop()!\n\n // Determine target agents\n let targets: string[]\n if (opts.all) {\n targets = Object.keys(config.agents || {})\n } else if (opts.agent) {\n targets = opts.agent\n } else {\n const agentIds = Object.keys(config.agents || {})\n const answer = await prompts({\n type: \"multiselect\",\n name: \"agents\",\n message: \"Install to which agents?\",\n choices: agentIds.map(id => ({ title: `${id} (${config.agents[id].name})`, value: id })),\n })\n targets = answer.agents || []\n }\n\n for (const agentId of targets) {\n const agent = config.agents[agentId]\n if (!agent) { console.log(chalk.yellow(` Agent \"${agentId}\" not found, skipping`)); continue }\n\n const destDir = resolve(agent.workspace, \".claude/skills\", skillName)\n mkdirSync(destDir, { recursive: true })\n\n if (existsSync(join(srcPath, \"SKILL.md\"))) {\n // Copy entire skill directory\n cpSync(srcPath, destDir, { recursive: true })\n } else if (srcPath.endsWith(\".md\")) {\n // Single SKILL.md file\n cpSync(srcPath, join(destDir, \"SKILL.md\"))\n }\n\n console.log(chalk.green(` ${skillName} -> ${agentId} (${agent.workspace})`))\n }\n console.log()\n })\n\nskillCmd\n .command(\"list\")\n .alias(\"ls\")\n .description(\"list skills per agent\")\n .action(() => {\n const config = loadConfig()\n console.log()\n for (const [id, a] of Object.entries(config.agents || {}) as any) {\n const skillsDir = resolve(a.workspace, \".claude/skills\")\n const skills = existsSync(skillsDir)\n ? readdirSync(skillsDir).filter((f: string) => !f.startsWith(\".\"))\n : []\n console.log(` ${chalk.cyan(id)}: ${skills.length ? skills.join(\", \") : chalk.dim(\"(none)\")}`)\n }\n console.log()\n })\n\n// ==================== agentx hook ====================\n\nexport const hook = new Command()\n .name(\"hook\")\n .description(\"manage hooks — add to agent workspace\")\n\nhook\n .command(\"add <agent>\")\n .description(\"add a hook to an agent's workspace settings\")\n .action(async (agentId) => {\n const config = loadConfig()\n const agent = config.agents?.[agentId]\n if (!agent) { console.log(chalk.red(` Agent \"${agentId}\" not found`)); return }\n\n const settingsPath = resolve(agent.workspace, \".claude/settings.json\")\n const settings = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, \"utf-8\")) : {}\n\n const answers = await prompts([\n { type: \"select\", name: \"event\", message: \"Hook event\", choices: [\n { title: \"PreToolUse — before any tool runs\", value: \"PreToolUse\" },\n { title: \"PostToolUse — after any tool runs\", value: \"PostToolUse\" },\n { title: \"SessionStart — when session begins\", value: \"SessionStart\" },\n { title: \"Notification — on notifications\", value: \"Notification\" },\n { title: \"Stop — before session stops\", value: \"Stop\" },\n ]},\n { type: \"select\", name: \"type\", message: \"Hook type\", choices: [\n { title: \"command — run a shell command\", value: \"command\" },\n { title: \"http — POST to a URL\", value: \"http\" },\n ]},\n { type: \"text\", name: \"value\", message: (prev: any) => prev === \"command\" ? \"Shell command\" : \"URL\" },\n { type: \"text\", name: \"matcher\", message: \"Matcher regex (optional, e.g. 'Bash' to match tool)\" },\n ])\n\n if (!answers.event || !answers.value) return\n\n settings.hooks = settings.hooks || {}\n settings.hooks[answers.event] = settings.hooks[answers.event] || []\n\n const hookDef: any = {\n type: answers.type,\n ...(answers.type === \"command\" ? { command: answers.value } : { url: answers.value }),\n }\n\n const entry: any = { hooks: [hookDef] }\n if (answers.matcher) entry.matcher = answers.matcher\n\n settings.hooks[answers.event].push(entry)\n\n mkdirSync(resolve(agent.workspace, \".claude\"), { recursive: true })\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2))\n console.log(chalk.green(` Hook added to ${agentId}: ${answers.event} -> ${answers.type}`))\n console.log()\n })\n\n// ==================== agentx migrate ====================\n\nexport const migrate = new Command()\n .name(\"migrate\")\n .description(\"import configuration from OpenClaw or other tools\")\n\nmigrate\n .command(\"openclaw [configPath]\")\n .description(\"import agents, channels, and crons from OpenClaw config\")\n .option(\"--dry-run\", \"show what would be imported without writing\")\n .action(async (configPath, opts) => {\n // Find OpenClaw config\n const searchPaths = [\n configPath,\n resolve(process.env.HOME || \"\", \".openclaw/openclaw.json\"),\n resolve(process.env.HOME || \"\", \".openclaw/clawdbot.json\"),\n ].filter(Boolean)\n\n let ocPath: string | undefined\n for (const p of searchPaths) {\n if (p && existsSync(p)) { ocPath = p; break }\n }\n\n if (!ocPath) {\n console.log(chalk.red(\" OpenClaw config not found. Pass the path: agentx migrate openclaw /path/to/config.json\"))\n return\n }\n\n console.log(chalk.dim(` Reading: ${ocPath}`))\n const oc = JSON.parse(readFileSync(ocPath, \"utf-8\"))\n\n const config = existsSync(resolve(process.cwd(), \"agentx.json\"))\n ? loadConfig()\n : { node: { id: \"imported\", name: \"Imported\", bind: \"127.0.0.1:18800\" }, providers: {}, agents: {}, channels: { telegram: { enabled: false, accounts: {}, policy: { dm: \"pair\", group: \"mention-required\" } }, whatsapp: { enabled: false } }, crons: {}, mesh: { enabled: false, peers: [] } }\n\n // Import agents\n const agents = oc.agents?.list || []\n const bindings = oc.bindings || []\n const bindMap: Record<string, string> = {}\n for (const b of bindings) {\n if (b.match?.channel === \"telegram\") {\n bindMap[b.match.accountId] = b.agentId\n }\n }\n // Default account -> main agent\n if (agents.find((a: any) => a.id === \"main\" || a.default)) {\n bindMap[\"default\"] = \"main\"\n }\n\n let agentCount = 0\n for (const a of agents) {\n if (a.workspace?.startsWith(\"/data\")) continue // skip remote devices\n\n const axId = a.id.replace(/-agent$/, \"\").replace(/^main$/, \"atlas\")\n const mentions = a.groupChat?.mentionPatterns || []\n if (!mentions.some((m: string) => m === axId)) mentions.push(axId)\n\n config.agents[axId] = {\n name: a.name,\n workspace: a.workspace,\n tier: \"claude-code\",\n model: \"claude-sonnet-4-6\",\n mentions,\n maxConcurrent: a.id === \"main\" ? 2 : 1,\n systemPrompt: `You are ${a.name} on AgentX.`,\n permissionMode: \"bypassPermissions\",\n }\n agentCount++\n\n if (!opts.dryRun) {\n mkdirSync(resolve(a.workspace, \".claude/skills\"), { recursive: true })\n }\n }\n console.log(` ${chalk.green(agentCount)} agents imported`)\n\n // Import Telegram accounts\n const tgAccounts = oc.channels?.telegram?.accounts || {}\n let tgCount = 0\n for (const [name, acc] of Object.entries(tgAccounts) as any) {\n if (!acc.botToken) continue\n const boundAgent = bindMap[name]\n const axAgentId = boundAgent?.replace(/-agent$/, \"\").replace(/^main$/, \"atlas\") || \"atlas\"\n\n config.channels.telegram.accounts[name] = {\n token: acc.botToken,\n agentBinding: axAgentId,\n }\n config.channels.telegram.enabled = true\n tgCount++\n }\n console.log(` ${chalk.green(tgCount)} Telegram accounts imported`)\n\n // Import cron jobs (from separate file if exists)\n const cronPath = resolve(ocPath, \"../cron/jobs.json\")\n if (existsSync(cronPath)) {\n const cronData = JSON.parse(readFileSync(cronPath, \"utf-8\"))\n let cronCount = 0\n for (const job of cronData.jobs || []) {\n const axId = job.name || job.id\n const agentId = job.agentId?.replace(/-agent$/, \"\").replace(/^main$/, \"atlas\") || \"atlas\"\n config.crons[axId] = {\n enabled: job.enabled || false,\n schedule: job.schedule?.expr || \"0 9 * * *\",\n timezone: job.schedule?.tz || \"UTC\",\n agent: agentId,\n prompt: job.payload?.message || \"\",\n timeout: job.payload?.timeoutSeconds || 600,\n onError: \"log\",\n }\n cronCount++\n }\n console.log(` ${chalk.green(cronCount)} cron jobs imported`)\n }\n\n if (opts.dryRun) {\n console.log(chalk.yellow(\"\\n Dry run — nothing written\"))\n console.log(JSON.stringify(config, null, 2))\n } else {\n saveConfig(config)\n console.log(chalk.green(\"\\n Migration complete! Review agentx.json and run: agentx daemon start\"))\n }\n console.log()\n })\n"],"mappings":"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","names":["Command","Command","chalk","daemon","Command","opts","spawn","args","child","writeFileSync","AgentXDaemon","readFileSync","existsSync","pidFile","pid","execSync","config","loadDaemonConfig","host","port","url","data","formatDuration","a","active","errors","enabledCrons","c","icon","next","p","skills","e","warnings","validateWorkspaces","w","err","spawnProc","logFile","tail","agent","messageParts","message","baseUrl","body","sshKey","remote","ssh","seconds","Command","chalk","existsSync","readFileSync","writeFileSync","mkdirSync","resolve","init","opts","cwd","configPath","envPath","sessionsDir","examplePaths","example","p","claudeDir","Command","chalk","prompts","readFileSync","writeFileSync","existsSync","mkdirSync","cpSync","readdirSync","resolve","join","loadConfig","p","saveConfig","config","agent","id","a","mentions","answers","v","ws","claudeMd","wikiSkillSrc","wikiSkillDist","skillSrc","m","channel","tg","name","acc","wa","route","target","dc","agentIds","agentChoices","channelType","data","botHandle","agentMentions","e","routes","addMore","prev","cron","c","icon","mesh","peer","status","card","skillCmd","skillPath","opts","srcPath","skillName","targets","agentId","destDir","skillsDir","skills","f","hook","settingsPath","settings","entry","migrate","configPath","searchPaths","ocPath","oc","agents","bindings","bindMap","b","agentCount","axId","tgAccounts","tgCount","axAgentId","cronPath","cronData","cronCount","job","main","packageInfo","getPackageInfo","program","Command","daemon","init","agent","channel","cron","mesh","skillCmd","hook","migrate"]}
|