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)
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import type { WorkflowDefinition } from "@uncaged/nerve-core";
|
|
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
|
|
import { buildPlannerRole } from "./roles/planner/index.js";
|
|
import { buildCoderRole } from "./roles/coder/index.js";
|
|
import { buildTesterRole } from "./roles/tester/index.js";
|
|
import { moderator } from "./moderator.js";
|
|
import type { SenseMeta } from "./moderator.js";
|
|
|
|
export type BuildSenseGeneratorDeps = {
|
|
provider: LlmProvider;
|
|
nerveRoot: string;
|
|
sensesDir: string;
|
|
senseExamples: string;
|
|
nerveYaml: string;
|
|
};
|
|
|
|
export function buildSenseGenerator(deps: BuildSenseGeneratorDeps): WorkflowDefinition<SenseMeta> {
|
|
return {
|
|
name: "sense-generator",
|
|
roles: {
|
|
planner: buildPlannerRole({
|
|
provider: deps.provider,
|
|
cwd: deps.nerveRoot,
|
|
senseExamples: deps.senseExamples,
|
|
nerveYaml: deps.nerveYaml,
|
|
}),
|
|
coder: buildCoderRole({
|
|
provider: deps.provider,
|
|
cwd: deps.nerveRoot,
|
|
sensesDir: deps.sensesDir,
|
|
nerveRoot: deps.nerveRoot,
|
|
}),
|
|
tester: buildTesterRole({
|
|
provider: deps.provider,
|
|
sensesDir: deps.sensesDir,
|
|
nerveRoot: deps.nerveRoot,
|
|
}),
|
|
},
|
|
moderator,
|
|
};
|
|
}
|