UNPKG

@oliverpople/agency-x

Version:

🚀 **Transform feature requests into production-ready code in seconds**

124 lines (122 loc) • 4.52 kB
#!/usr/bin/env node import { AGENT_DEFINITIONS, runOrchestrator, setDefaultProvider, speak } from "../chunk-QTUC4UBE.mjs"; // src/cli/index.ts import * as dotenv from "dotenv"; import chalk from "chalk"; dotenv.config(); var args = process.argv.slice(2); var getArgValue = (argName) => { const argIndex = args.indexOf(argName); return argIndex !== -1 && args[argIndex + 1] ? args[argIndex + 1] : null; }; var showHelp = () => { console.log(chalk.dim("agency-x") + chalk.bold(" - AI Orchestration System\n")); console.log("Usage:"); console.log(chalk.cyan(" agency-x") + " --feature " + chalk.yellow('"description"')); console.log(chalk.cyan(" agency-x") + " --resume " + chalk.yellow("SPEC-ID")); console.log(""); console.log("Options:"); console.log(" --feature What to build"); console.log(" --resume Continue from session ID"); console.log(" --voice Enable audio narration"); console.log(" --concurrent Max parallel agents (default: 5)"); console.log(" --verbose Show detailed logs"); console.log(" --llm LLM provider (claude or openai, default: claude)"); console.log(" --help Show this help"); }; var feature = getArgValue("--feature"); var resume = getArgValue("--resume"); var concurrent = parseInt(getArgValue("--concurrent") || "5", 10); var llmProvider = getArgValue("--llm") || "claude"; var voice = args.includes("--voice"); var verbose = args.includes("--verbose"); var help = args.includes("--help"); if (!["claude", "openai"].includes(llmProvider)) { console.error(chalk.red("Invalid LLM provider. Use: claude or openai")); process.exit(1); } setDefaultProvider(llmProvider); if (help) { showHelp(); process.exit(0); } if (!feature && !resume) { console.error(chalk.red("Missing required argument")); console.log("Try: " + chalk.cyan("agency-x --help")); process.exit(1); } if (verbose) { process.env.DEBUG = "true"; } var startTime = Date.now(); var isRunning = true; var cleanup = () => { isRunning = false; process.exit(0); }; process.on("SIGINT", cleanup); process.on("SIGTERM", cleanup); var showProgress = (completed, total, phase) => { const percent = (completed / total * 100).toFixed(0); const bar = "\u2588".repeat(Math.floor(completed / total * 20)) + "\u2591".repeat(20 - Math.floor(completed / total * 20)); const elapsed = ((Date.now() - startTime) / 1e3).toFixed(0); process.stdout.write("\r\x1B[K"); process.stdout.write(`${chalk.blue(bar)} ${percent}% (${completed}/${total}) ${elapsed}s`); if (phase) process.stdout.write(chalk.gray(` \u2022 ${phase}`)); }; async function main() { try { if (resume) { console.log(chalk.dim("Resuming"), chalk.cyan(resume)); } else { console.log(chalk.dim("Building"), chalk.cyan(feature)); } const providerEmoji = llmProvider === "openai" ? "\u{1F916}" : "\u{1F9E0}"; const providerName = llmProvider === "openai" ? "OpenAI GPT" : "Anthropic Claude"; console.log(chalk.dim(`${providerEmoji} Using ${providerName}`)); if (concurrent !== 5 || voice) { const opts = []; if (concurrent !== 5) opts.push(`${concurrent} concurrent`); if (voice) opts.push("voice enabled"); console.log(chalk.dim(`(${opts.join(", ")}) `)); } let progressInterval = null; let lastStatus = { completed: 0, failed: 0, running: 0 }; if (!verbose) { progressInterval = setInterval(() => { showProgress(lastStatus.completed + lastStatus.failed, AGENT_DEFINITIONS.length); }, 500); } const result = await runOrchestrator({ feature: feature || "", voice, resume: resume || void 0, maxConcurrent: concurrent, onStop: voice ? (log) => speak(log.join("\n")) : void 0, onProgress: (status) => { lastStatus = status; } }); if (progressInterval) { clearInterval(progressInterval); process.stdout.write("\r\x1B[K"); } const duration = ((Date.now() - startTime) / 1e3).toFixed(1); console.log(chalk.green("\u2713") + " Complete in " + chalk.cyan(duration + "s")); console.log(chalk.dim("Saved: ") + chalk.cyan("./sessions/" + result.specId + ".json")); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.log("\n" + chalk.red("\u2717") + " Failed: " + errorMessage); if (verbose && error instanceof Error && error.stack) { console.log(chalk.dim("\n" + error.stack)); } process.exit(1); } } main();