refactor: decouple adapters from workflow factories + role files export createXxxRole #15

Closed
opened 2026-04-29 12:32:39 +00:00 by xiaoju · 0 comments
Owner

What

Two changes to make workflow definitions adapter-agnostic and roles self-contained:

1. Workflow factory receives adapters as parameter

Rename buildDevelopSenseWorkflowcreateDevelopSenseWorkflow, buildDevelopWorkflowcreateDevelopWorkflowWorkflow.

Add an adapters parameter: Record<string, AgentFn> keyed by role name. The factory no longer imports any adapter directly — it receives them from the caller.

import type { AgentFn } from "@uncaged/nerve-core";

export type CreateDevelopSenseDeps = {
  adapters: Record<string, AgentFn>;  // e.g. { planner: cursorAdapter, coder: cursorAdapter, reviewer: hermesAdapter, ... }
  extract: LlmExtractorConfig;
  cwd: string;
};

export function createDevelopSenseWorkflow({ adapters, extract, cwd }: CreateDevelopSenseDeps): WorkflowDefinition<SenseMeta> {
  // ...
}

Remove all adapter imports (hermesAdapter, cursorAdapter, createCursorAdapter) from build.ts.

2. Each role file exports a createXxxRole factory

Instead of exporting raw schema + prompt for build.ts to assemble, each role file exports its own factory:

// roles/planner.ts
export function createPlannerRole(adapter: AgentFn, extract: LlmExtractorConfig): Role<PlannerMeta> {
  return createRole(adapter, async (start) => plannerPrompt({ threadId: start.meta.threadId }), plannerMetaSchema, extract);
}

Then build.ts becomes:

const roles = {
  planner: createPlannerRole(adapters.planner, extract),
  coder: createCoderRole(adapters.coder, extract),
  reviewer: createReviewerRole(adapters.reviewer, extract, cwd),
  tester: createTesterRole(adapters.tester, extract, cwd),
  committer: createWorkspaceCommitterRole(adapters.committer, { extract, nerveRoot: cwd, ... }),
};

3. Update _shared/workspace-committer.ts to also accept adapter as parameter

buildWorkspaceCommitterRole currently imports hermesAdapter directly. Change it to accept adapter: AgentFn as first parameter.

Scope

  • workflows/develop-sense/build.ts — rename + adapters param
  • workflows/develop-sense/roles/*.ts — each exports createXxxRole
  • workflows/develop-workflow/build.ts — same
  • workflows/develop-workflow/roles/*.ts — same
  • workflows/_shared/workspace-committer.ts — accept adapter param
  • workflows/solve-issue/build.ts — if it uses adapters directly, update too
  • Any file that calls the old buildDevelopSenseWorkflow / buildDevelopWorkflow — update call sites

Rules

  • AgentFn type is from @uncaged/nerve-core
  • createRole helper is from @uncaged/nerve-workflow-utils
  • No adapter imports in build.ts — adapters come from the adapters parameter
  • Keep all existing behavior, just restructure
  • Run pnpm build at repo root to verify
## What Two changes to make workflow definitions adapter-agnostic and roles self-contained: ### 1. Workflow factory receives adapters as parameter Rename `buildDevelopSenseWorkflow` → `createDevelopSenseWorkflow`, `buildDevelopWorkflow` → `createDevelopWorkflowWorkflow`. Add an `adapters` parameter: `Record<string, AgentFn>` keyed by role name. The factory no longer imports any adapter directly — it receives them from the caller. ```ts import type { AgentFn } from "@uncaged/nerve-core"; export type CreateDevelopSenseDeps = { adapters: Record<string, AgentFn>; // e.g. { planner: cursorAdapter, coder: cursorAdapter, reviewer: hermesAdapter, ... } extract: LlmExtractorConfig; cwd: string; }; export function createDevelopSenseWorkflow({ adapters, extract, cwd }: CreateDevelopSenseDeps): WorkflowDefinition<SenseMeta> { // ... } ``` Remove all adapter imports (`hermesAdapter`, `cursorAdapter`, `createCursorAdapter`) from build.ts. ### 2. Each role file exports a `createXxxRole` factory Instead of exporting raw schema + prompt for build.ts to assemble, each role file exports its own factory: ```ts // roles/planner.ts export function createPlannerRole(adapter: AgentFn, extract: LlmExtractorConfig): Role<PlannerMeta> { return createRole(adapter, async (start) => plannerPrompt({ threadId: start.meta.threadId }), plannerMetaSchema, extract); } ``` Then build.ts becomes: ```ts const roles = { planner: createPlannerRole(adapters.planner, extract), coder: createCoderRole(adapters.coder, extract), reviewer: createReviewerRole(adapters.reviewer, extract, cwd), tester: createTesterRole(adapters.tester, extract, cwd), committer: createWorkspaceCommitterRole(adapters.committer, { extract, nerveRoot: cwd, ... }), }; ``` ### 3. Update `_shared/workspace-committer.ts` to also accept adapter as parameter `buildWorkspaceCommitterRole` currently imports `hermesAdapter` directly. Change it to accept `adapter: AgentFn` as first parameter. ## Scope - `workflows/develop-sense/build.ts` — rename + adapters param - `workflows/develop-sense/roles/*.ts` — each exports `createXxxRole` - `workflows/develop-workflow/build.ts` — same - `workflows/develop-workflow/roles/*.ts` — same - `workflows/_shared/workspace-committer.ts` — accept adapter param - `workflows/solve-issue/build.ts` — if it uses adapters directly, update too - Any file that calls the old `buildDevelopSenseWorkflow` / `buildDevelopWorkflow` — update call sites ## Rules - `AgentFn` type is from `@uncaged/nerve-core` - `createRole` helper is from `@uncaged/nerve-workflow-utils` - No adapter imports in build.ts — adapters come from the `adapters` parameter - Keep all existing behavior, just restructure - Run `pnpm build` at repo root to verify
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoju/nerve-workspace#15
No description provided.