33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
import type { ForgeTask, ForgeTaskResult, TaskExecutor } from './types.js';
|
|
|
|
/**
|
|
* Simulated executor — used ONLY when the caller explicitly passes --simulate.
|
|
*
|
|
* It submits no real work and returns typed `simulated` results so a simulated
|
|
* run can never be confused with a verified one. In normal mode (no --simulate)
|
|
* the CLI refuses to run at all with FORGE_NO_EXECUTOR instead of wiring this
|
|
* stub (fail closed, SDLC-D-035).
|
|
*/
|
|
export function createSimulatedExecutor(options?: { log?: boolean }): TaskExecutor {
|
|
const log = options?.log ?? true;
|
|
return {
|
|
async submitTask(task: ForgeTask) {
|
|
if (log) console.log(` [forge:simulated] stage submitted: ${task.id} (${task.title})`);
|
|
},
|
|
async waitForCompletion(taskId: string): Promise<ForgeTaskResult> {
|
|
if (log) console.log(` [forge:simulated] stage complete: ${taskId}`);
|
|
return {
|
|
task_id: taskId,
|
|
outcome: 'simulated',
|
|
reason: 'no executor wired; simulated execution requested via --simulate',
|
|
completed_at: new Date().toISOString(),
|
|
exit_code: 0,
|
|
gate_results: [],
|
|
};
|
|
},
|
|
async getTaskStatus() {
|
|
return 'completed' as const;
|
|
},
|
|
};
|
|
}
|