小橘 🍊(NEKO Team) 56ce22fb1b Migrate workflows to WorkflowSpec-style roles (RFC-003)
Replace createCursorRole/createHermesRole with adapter + prompt + zod meta.

Add shared compileRoleSpec, cursor ask adapter, nerve.yaml extract defaults.

Refs #248

Made-with: Cursor
2026-04-29 09:23:55 +00:00

68 lines
2.6 KiB
TypeScript

import type { StartStep, WorkflowDefinition } from "@uncaged/nerve-core";
import { hermesAdapter } from "@uncaged/nerve-adapter-hermes";
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
import { compileRoleSpec, defaultAgentCreateContext, zodMeta } from "../_shared/rfc003-compile.js";
import { moderator } from "./moderator.js";
import type { WorkflowMeta } from "./moderator.js";
import { buildImplementRole } from "./roles/implement/index.js";
import { buildPlanRole } from "./roles/plan/index.js";
import { prepareMetaSchema } from "./roles/prepare/index.js";
import { preparePrompt } from "./roles/prepare/prompt.js";
import { buildPublishRole } from "./roles/publish/index.js";
import { readIssueMetaSchema } from "./roles/read-issue/index.js";
import { readIssuePrompt } from "./roles/read-issue/prompt.js";
import { reviewMetaSchema } from "./roles/review/index.js";
import { reviewPrompt } from "./roles/review/prompt.js";
import { testMetaSchema } from "./roles/test/index.js";
import { testPrompt } from "./roles/test/prompt.js";
export type BuildSolveIssueDeps = {
nerveRoot: string;
provider: LlmProvider;
};
export function buildSolveIssue({ nerveRoot, provider }: BuildSolveIssueDeps): WorkflowDefinition<WorkflowMeta> {
const createContext = defaultAgentCreateContext(nerveRoot);
const deps = { provider, createContext };
const agentRoles = {
"read-issue": {
adapter: hermesAdapter,
prompt: async (start: StartStep) => readIssuePrompt({ threadId: start.meta.threadId }),
meta: zodMeta(readIssueMetaSchema),
},
prepare: {
adapter: hermesAdapter,
prompt: async (start: StartStep) => preparePrompt({ threadId: start.meta.threadId }),
meta: zodMeta(prepareMetaSchema),
},
review: {
adapter: hermesAdapter,
prompt: async (start: StartStep) =>
reviewPrompt({ threadId: start.meta.threadId, nerveRoot }),
meta: zodMeta(reviewMetaSchema),
},
test: {
adapter: hermesAdapter,
prompt: async (start: StartStep) => testPrompt({ threadId: start.meta.threadId }),
meta: zodMeta(testMetaSchema),
},
};
return {
name: "solve-issue",
roles: {
"read-issue": compileRoleSpec(agentRoles["read-issue"], deps),
prepare: compileRoleSpec(agentRoles.prepare, deps),
plan: buildPlanRole({ provider, nerveRoot }),
implement: buildImplementRole({ provider, nerveRoot }),
review: compileRoleSpec(agentRoles.review, deps),
test: compileRoleSpec(agentRoles.test, deps),
publish: buildPublishRole({ provider, nerveRoot }),
},
moderator,
};
}