feat: initialize standalone agent-workflow
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* agent-workflow CLI entry point.
|
||||
*
|
||||
* Supports direct subcommands: start, review, retry-review, retry-execute, decide, status, abort.
|
||||
*/
|
||||
|
||||
import {
|
||||
parseWorkflowArgs,
|
||||
workflowUsage,
|
||||
type WorkflowArgs,
|
||||
} from "./workflow-args.js";
|
||||
import {
|
||||
startWorkflow,
|
||||
reviewWorkflow,
|
||||
decideWorkflow,
|
||||
statusWorkflow,
|
||||
abortWorkflow,
|
||||
retryReviewWorkflow,
|
||||
retryExecuteWorkflow,
|
||||
WorkflowEngineError,
|
||||
} from "./workflow-engine.js";
|
||||
import { WorkflowConfigError } from "./workflow-config.js";
|
||||
import { WorkflowLockError } from "./workflow-state.js";
|
||||
|
||||
async function main() {
|
||||
let args: WorkflowArgs;
|
||||
try {
|
||||
args = parseWorkflowArgs(process.argv.slice(2));
|
||||
} catch (err) {
|
||||
if (err instanceof Error && err.name === "WorkflowArgsError") {
|
||||
process.stderr.write(`Error: ${err.message}\n\n`);
|
||||
workflowUsage(1);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
try {
|
||||
switch (args.sub) {
|
||||
case "start":
|
||||
await startWorkflow({
|
||||
planInput: args.planInput,
|
||||
executor: args.executor,
|
||||
maxCycles: args.maxCycles,
|
||||
});
|
||||
break;
|
||||
|
||||
case "review":
|
||||
await reviewWorkflow({ runId: args.runId });
|
||||
break;
|
||||
|
||||
case "retry-review":
|
||||
retryReviewWorkflow({ runId: args.runId });
|
||||
break;
|
||||
|
||||
case "retry-execute":
|
||||
await retryExecuteWorkflow({ runId: args.runId });
|
||||
break;
|
||||
|
||||
case "decide":
|
||||
await decideWorkflow({
|
||||
runId: args.runId,
|
||||
decisionInput: args.decisionInput,
|
||||
});
|
||||
break;
|
||||
|
||||
case "status":
|
||||
statusWorkflow({ runId: args.runId, json: args.json });
|
||||
break;
|
||||
|
||||
case "abort":
|
||||
abortWorkflow({ runId: args.runId, reason: args.reason });
|
||||
break;
|
||||
|
||||
default: {
|
||||
const _exhaustive: never = args;
|
||||
throw new Error(`Unknown subcommand: ${(_exhaustive as any).sub}`);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
if (err instanceof WorkflowEngineError) {
|
||||
process.stderr.write(`Error: ${err.message}\n`);
|
||||
process.exit(err.exitCode);
|
||||
}
|
||||
if (err instanceof WorkflowConfigError) {
|
||||
process.stderr.write(`Configuration error: ${err.message}\n`);
|
||||
process.exit(4);
|
||||
}
|
||||
if (err instanceof WorkflowLockError) {
|
||||
process.stderr.write(`Lock error: ${err.message}\n`);
|
||||
process.exit(4);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((err) => {
|
||||
process.stderr.write(`Unexpected error: ${err.message}\n`);
|
||||
if (err.stack) {
|
||||
process.stderr.write(err.stack + "\n");
|
||||
}
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user