diff --git a/workflows/sense-generator/roles/coder/index.ts b/workflows/sense-generator/roles/coder/index.ts index fbf51ee..0f1d328 100644 --- a/workflows/sense-generator/roles/coder/index.ts +++ b/workflows/sense-generator/roles/coder/index.ts @@ -1,7 +1,6 @@ import { createCursorRole } from "@uncaged/nerve-workflow-utils"; -import { z } from "zod"; import { resolveDashScopeProvider, NERVE_ROOT, SENSES_DIR } from "../shared.js"; - +import { coderMetaSchema } from "../types.js"; import type { SenseMeta } from "../types.js"; export async function buildCoderRole() { @@ -25,9 +24,7 @@ Implement the sense. Create exactly: Follow the patterns from existing senses. Create all files now.`, extract: { provider, - schema: z.object({ - filesCreated: z.boolean().describe("true if the sense files were created"), - }), + schema: coderMetaSchema, }, }); } diff --git a/workflows/sense-generator/roles/planner/index.ts b/workflows/sense-generator/roles/planner/index.ts index 07c111f..9e49c4c 100644 --- a/workflows/sense-generator/roles/planner/index.ts +++ b/workflows/sense-generator/roles/planner/index.ts @@ -1,8 +1,6 @@ import { createCursorRole } from "@uncaged/nerve-workflow-utils"; -import { readFileSync } from "node:fs"; -import { join } from "node:path"; -import { z } from "zod"; import { resolveDashScopeProvider, buildSenseExamples, getNerveYaml, NERVE_ROOT } from "../shared.js"; +import { plannerMetaSchema } from "../types.js"; import type { SenseMeta } from "../types.js"; const senseExamples = buildSenseExamples(); @@ -40,9 +38,7 @@ ${nerveYaml} Output ONLY the plan. Be precise and implementation-ready.`, extract: { provider, - schema: z.object({ - senseName: z.string().describe("kebab-case sense name from the plan"), - }), + schema: plannerMetaSchema, }, }); } diff --git a/workflows/sense-generator/roles/types.ts b/workflows/sense-generator/roles/types.ts index 3abf1e7..04ae9cf 100644 --- a/workflows/sense-generator/roles/types.ts +++ b/workflows/sense-generator/roles/types.ts @@ -1,5 +1,15 @@ +import { z } from "zod"; + export type SenseMeta = { planner: { senseName: string }; coder: { filesCreated: boolean }; tester: { passed: boolean; attempt: number }; }; + +export const plannerMetaSchema = z.object({ + senseName: z.string().describe("kebab-case sense name from the plan"), +}); + +export const coderMetaSchema = z.object({ + filesCreated: z.boolean().describe("true if the sense files were created"), +});