Every role is self-contained (types.ts, prompt.ts, index.ts).
No shared.ts, no cross-role imports. All dependencies injected:
index.ts — wiring (resolve env, call buildSenseGenerator)
build.ts — buildSenseGenerator(deps) → WorkflowDefinition
moderator.ts — pure routing, composes meta from role types
roles/planner/ — buildPlannerRole(deps), self-contained
roles/coder/ — buildCoderRole(deps), self-contained
roles/tester/ — buildTesterRole(deps), self-contained
Workflow is now reusable: buildSenseGenerator() can be called with
any provider/paths, not hardcoded to this machine.
小橘 🍊(NEKO Team)
23 lines
738 B
TypeScript
23 lines
738 B
TypeScript
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
|
|
import { createCursorRole } from "@uncaged/nerve-workflow-utils";
|
|
import { plannerMetaSchema } from "./types.js";
|
|
import type { PlannerMeta } from "./types.js";
|
|
import { plannerPrompt } from "./prompt.js";
|
|
|
|
export type BuildPlannerDeps = {
|
|
provider: LlmProvider;
|
|
cwd: string;
|
|
senseExamples: string;
|
|
nerveYaml: string;
|
|
};
|
|
|
|
export function buildPlannerRole(deps: BuildPlannerDeps) {
|
|
return createCursorRole<PlannerMeta>({
|
|
cwd: deps.cwd,
|
|
mode: "ask",
|
|
prompt: async (threadId) =>
|
|
plannerPrompt({ threadId, senseExamples: deps.senseExamples, nerveYaml: deps.nerveYaml }),
|
|
extract: { provider: deps.provider, schema: plannerMetaSchema },
|
|
});
|
|
}
|