autoagent-cli
Version:
Run autonomous AI agents using Claude or Gemini for task execution
157 lines (156 loc) • 7.45 kB
JavaScript
;
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);
}