@oliverpople/agency-x
Version:
🚀 **Transform feature requests into production-ready code in seconds**
124 lines (122 loc) • 4.52 kB
JavaScript
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();