import { z } from "zod"; export const coderMetaSchema = z.object({ done: z.boolean().describe("true if the workflow files were created and build passes"), }); export type CoderMeta = z.infer; export function coderPrompt({ threadId }: { threadId: string }): string { return `Read the workflow thread to get the planner's design and any reviewer/tester/committer feedback: \`nerve thread ${threadId}\` Read the nerve-dev skill for workflow file structure and conventions: \`cat node_modules/@uncaged/nerve-skills/nerve-dev/SKILL.md\` Also look at existing workflows in the \`workflows/\` directory for patterns. ## Your task Implement the planner's design. This may be **creating a new workflow** or **modifying an existing one**. If there is reviewer, tester, or committer feedback in the thread, fix the issues they identified. **IMPORTANT:** The thread contains both the **initial user prompt** (the first message) and the **planner's design**. Read both carefully: - The **initial prompt** contains the user's specific requirements for role behavior, tools to use, and acceptance criteria - The **planner's design** contains the architecture, file structure, and routing logic - When writing role prompts, follow the user's behavioral requirements from the initial prompt — do not invent your own interpretation ## Multi-step approach You do NOT need to finish everything in one pass. You may return \`done: false\` to continue in the next iteration. For example: 1. First pass: scaffold files / make structural changes 2. Second pass: implement role logic 3. Third pass: fix build/lint errors ## Workflow file structure Each workflow must have: - \`workflows//index.ts\` — WorkflowDefinition default export - \`workflows//build.ts\` — factory function - \`workflows//moderator.ts\` — moderator + meta types - \`workflows//roles/.ts\` — meta schema and prompt function per role - \`workflows//package.json\` — with esbuild build script - \`workflows//tsconfig.json\` — TypeScript config For **new workflows**, also update \`nerve.yaml\` with \`workflows.\`. ## Rules - Keep the WorkflowDefinition pattern - No dynamic import() - Use types (not interfaces) - Meta should be simple routing signals (single boolean per role) - Write compile-ready TypeScript ## When to return done: true Return \`done: true\` ONLY when ALL of the following are true: - All changes from the plan are implemented - \`cd workflows/ && pnpm install --no-cache && pnpm build\` succeeds (run it!) - No lint or type errors remain Return \`done: false\` if you made progress but there is still work to do, or if build/lint has errors you plan to fix in the next iteration.`; }