UNPKG

autoagent-cli

Version:

Run autonomous AI agents using Claude or Gemini for task execution

157 lines (156 loc) 7.45 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.registerRunCommand = registerRunCommand; const commander_1 = require("commander"); const autonomous_agent_1 = require("../../core/autonomous-agent"); const logger_1 = require("../../utils/logger"); const path = __importStar(require("path")); function collect(value, previous) { return previous.concat([value]); } const runCommand = new commander_1.Command('run') .description('Execute autonomous agent tasks') .argument('[task-id]', 'Specific task ID to execute') .option('-a, --all', 'Execute all pending tasks') .option('-p, --provider <provider>', 'AI provider to use (claude or gemini)') .option('-w, --workspace <path>', 'Working directory') .option('-d, --debug', 'Enable debug logging') .option('--co-author', 'Include co-authored-by in commits (enabled by default)', true) .option('--no-co-author', 'Disable co-authored-by in commits') .option('--dry-run', 'Preview mode without making changes') .option('--add-dir <path>', 'Add additional directory (repeatable)', collect, []) .option('--verify', 'Enable git hooks during commits (enabled by default)', true) .option('--no-verify', 'Skip git hooks during commits') .option('--strict-completion', 'Require strict task completion validation') .option('--completion-confidence <percent>', 'Minimum confidence threshold for task completion (0-100)', '80') .option('--ignore-tool-failures', 'Mark tasks complete even with tool failures') .option('--max-retry-attempts <count>', 'Maximum retry attempts for failed tasks', '3') .action(async (taskId, options) => { try { if (!options) { logger_1.Logger.error('No options provided'); process.exit(1); return; } const workspacePath = path.resolve(options.workspace ?? process.cwd()); if (options.debug === true) { logger_1.Logger.setDebugEnabled(true); } const agent = new autonomous_agent_1.AutonomousAgent({ provider: options.provider, workspace: workspacePath, includeCoAuthoredBy: options.coAuthor !== false, debug: options.debug, dryRun: options.dryRun, additionalDirectories: options.addDir, noVerify: options.verify === false || options.noVerify === true, strictCompletion: options.strictCompletion, completionConfidence: options.completionConfidence !== undefined && options.completionConfidence !== 0 && !isNaN(options.completionConfidence) ? parseInt(options.completionConfidence.toString(), 10) : undefined, ignoreToolFailures: options.ignoreToolFailures, maxRetryAttempts: options.maxRetryAttempts !== undefined && options.maxRetryAttempts !== 0 && !isNaN(options.maxRetryAttempts) ? parseInt(options.maxRetryAttempts.toString(), 10) : undefined }); await agent.initialize(); if (options.all === true) { const tasks = await agent.listTasks('pending'); if (tasks.length === 0) { logger_1.Logger.info('No pending tasks to execute'); return; } logger_1.Logger.info(`Found ${tasks.length} pending task${tasks.length > 1 ? 's' : ''}`); let successCount = 0; let failureCount = 0; for (const task of tasks) { logger_1.Logger.info(`\n▶️ Executing task: ${task.title}`); try { const result = await agent.executeTask(task.id); if (result.success) { successCount++; logger_1.Logger.success(`✅ Task ${task.id} completed successfully`); } else { failureCount++; logger_1.Logger.error(`❌ Task ${task.id} failed: ${result.error}`); } } catch (error) { failureCount++; logger_1.Logger.error(`❌ Task ${task.id} failed with error: ${error instanceof Error ? error.message : String(error)}`); } } logger_1.Logger.info(`\n📊 Summary: ${successCount} succeeded, ${failureCount} failed`); if (failureCount > 0) { process.exit(1); } } else if (taskId !== undefined && taskId !== '') { logger_1.Logger.info(`▶️ Executing task: ${taskId}`); const result = await agent.executeTask(taskId); if (result.success) { logger_1.Logger.success('✅ Task completed successfully'); if (result.output !== undefined && result.output !== '') { logger_1.Logger.info(`\n📝 Output:\n${result.output}`); } } else { logger_1.Logger.error(`❌ Task failed: ${result.error}`); process.exit(1); } } else { const tasks = await agent.listTasks(); if (tasks.length === 0) { logger_1.Logger.info('No tasks found. Create tasks using the "create" command.'); return; } logger_1.Logger.info('Available tasks:'); for (const task of tasks) { const statusIcon = task.status === 'completed' ? '✅' : task.status === 'in_progress' ? '🔄' : '⏳'; logger_1.Logger.info(` ${statusIcon} ${task.id}: ${task.title}`); } logger_1.Logger.info('\nRun with a task ID to execute a specific task, or use --all for all pending tasks.'); } } catch (error) { logger_1.Logger.error(`Error: ${error instanceof Error ? error.message : String(error)}`); if (options?.debug === true) { console.error(error); } process.exit(1); } }); function registerRunCommand(program) { program.addCommand(runCommand); }