小橘 cb61e98979 refactor(sense-generator): full DIP — all deps injected via build functions
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)
2026-04-28 04:00:38 +00:00

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,
};
}