import type { StartStep, WorkflowDefinition } from "@uncaged/nerve-core"; import { createCursorAdapter, cursorAdapter } from "@uncaged/nerve-adapter-cursor"; import { hermesAdapter } from "@uncaged/nerve-adapter-hermes"; import type { LlmExtractorConfig } from "@uncaged/nerve-workflow-utils"; import { createRole } from "@uncaged/nerve-workflow-utils"; import { coderMetaSchema, coderPrompt, } from "./roles/coder.js"; import { buildWorkspaceCommitterRole, } from "./roles/committer.js"; import { plannerMetaSchema, plannerPrompt, } from "./roles/planner.js"; import { reviewerMetaSchema, reviewerPrompt, } from "./roles/reviewer.js"; import { testerMetaSchema, testerPrompt, } from "./roles/tester.js"; import { moderator } from "./moderator.js"; import type { WorkflowMeta } from "./moderator.js"; export type BuildDevelopWorkflowDeps = { extract: LlmExtractorConfig; nerveRoot: string; }; const CURSOR_TIMEOUT_MS = 300_000; export function buildDevelopWorkflow({ extract, nerveRoot, }: BuildDevelopWorkflowDeps): WorkflowDefinition { const roles = { planner: createRole( createCursorAdapter({ type: "cursor", mode: "ask", model: "auto", timeout: CURSOR_TIMEOUT_MS, }), async (start: StartStep) => plannerPrompt({ threadId: start.meta.threadId }), plannerMetaSchema, extract, ), coder: createRole( cursorAdapter, async (start: StartStep) => coderPrompt({ threadId: start.meta.threadId }), coderMetaSchema, extract, ), reviewer: createRole( hermesAdapter, async (start: StartStep) => reviewerPrompt({ threadId: start.meta.threadId, nerveRoot }), reviewerMetaSchema, extract, ), tester: createRole( hermesAdapter, async (start: StartStep) => testerPrompt({ threadId: start.meta.threadId, nerveRoot }), testerMetaSchema, extract, ), committer: buildWorkspaceCommitterRole({ extract, nerveRoot, workflowName: "develop-workflow", conventionalCommitScopeHint: "workflow", branchCheckoutExample: "git checkout -b feat/workflow-new-step", }), }; return { name: "develop-workflow", roles, moderator, }; }