feat: add plan2code-bot with --resume capability and state cleanup

Add the autonomous workflow test runner (plan2code-bot) that uses the
Claude Agent SDK to run plan2code end-to-end. Includes --resume flag
to continue incomplete runs from saved state, and automatic state file
cleanup on successful completion.
This commit is contained in:
2026-03-01 21:30:45 -08:00
parent 63656d339d
commit c92865c395
22 changed files with 2267 additions and 3 deletions
@@ -0,0 +1,58 @@
import { describe, it, expect } from 'vitest';
import { buildStepPrompt } from './step-instructions.js';
import type { BotConfig } from '../types.js';
const config: BotConfig = {
workDir: '/tmp/work',
projectDir: '/tmp/work/my-app',
ideaDescription: 'A todo app with drag-and-drop',
ideaName: 'drag-todo',
mode: 'new-project',
};
describe('buildStepPrompt', () => {
it('each step includes the autonomous preamble', () => {
const steps = ['init', 'plan', 'document', 'implement', 'finalize'] as const;
for (const step of steps) {
const prompt = buildStepPrompt(step, config);
expect(prompt).toContain('running autonomously');
}
});
it('init prompt includes /plan2code-init skill invocation', () => {
const prompt = buildStepPrompt('init', config);
expect(prompt).toContain('/plan2code-init');
});
it('plan prompt includes /plan2code-1-plan skill invocation', () => {
const prompt = buildStepPrompt('plan', config);
expect(prompt).toContain('/plan2code-1-plan');
});
it('document prompt includes /plan2code-2-document skill invocation', () => {
const prompt = buildStepPrompt('document', config);
expect(prompt).toContain('/plan2code-2-document');
});
it('implement prompt includes /plan2code-3-implement skill invocation', () => {
const prompt = buildStepPrompt('implement', config);
expect(prompt).toContain('/plan2code-3-implement');
});
it('finalize prompt includes /plan2code-4-finalize skill invocation', () => {
const prompt = buildStepPrompt('finalize', config);
expect(prompt).toContain('/plan2code-4-finalize');
});
it('plan prompt includes project name and description', () => {
const prompt = buildStepPrompt('plan', config);
expect(prompt).toContain('drag-todo');
expect(prompt).toContain('A todo app with drag-and-drop');
});
it('init prompt includes project name and description', () => {
const prompt = buildStepPrompt('init', config);
expect(prompt).toContain('drag-todo');
expect(prompt).toContain('A todo app with drag-and-drop');
});
});