chore(workflow): auto-generated commit

This commit is contained in:
小橘 2026-04-28 13:33:14 +00:00
parent 994de1e7ff
commit bd89dcaff6
6 changed files with 61 additions and 4 deletions

View File

@ -3,6 +3,7 @@ import type { WorkflowDefinition } from "@uncaged/nerve-core";
import type { LlmProvider } from "@uncaged/nerve-workflow-utils"; import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
import { buildPlannerRole } from "./roles/planner/index.js"; import { buildPlannerRole } from "./roles/planner/index.js";
import { buildCoderRole } from "./roles/coder/index.js"; import { buildCoderRole } from "./roles/coder/index.js";
import { buildReviewerRole } from "./roles/reviewer/index.js";
import { buildTesterRole } from "./roles/tester/index.js"; import { buildTesterRole } from "./roles/tester/index.js";
import { buildCommitterRole } from "./roles/committer/index.js"; import { buildCommitterRole } from "./roles/committer/index.js";
import { moderator } from "./moderator.js"; import { moderator } from "./moderator.js";
@ -22,6 +23,7 @@ export function buildWorkflowGenerator({
roles: { roles: {
planner: buildPlannerRole({ provider, cwd: nerveRoot }), planner: buildPlannerRole({ provider, cwd: nerveRoot }),
coder: buildCoderRole({ provider, cwd: nerveRoot }), coder: buildCoderRole({ provider, cwd: nerveRoot }),
reviewer: buildReviewerRole({ provider, cwd: nerveRoot }),
tester: buildTesterRole({ provider, nerveRoot }), tester: buildTesterRole({ provider, nerveRoot }),
committer: buildCommitterRole({ nerveRoot }), committer: buildCommitterRole({ nerveRoot }),
}, },

View File

@ -2,12 +2,14 @@ import { END } from "@uncaged/nerve-core";
import type { Moderator } from "@uncaged/nerve-core"; import type { Moderator } from "@uncaged/nerve-core";
import type { PlannerMeta } from "./roles/planner/index.js"; import type { PlannerMeta } from "./roles/planner/index.js";
import type { CoderMeta } from "./roles/coder/index.js"; import type { CoderMeta } from "./roles/coder/index.js";
import type { ReviewerMeta } from "./roles/reviewer/index.js";
import type { TesterMeta } from "./roles/tester/index.js"; import type { TesterMeta } from "./roles/tester/index.js";
import type { CommitterMeta } from "./roles/committer/index.js"; import type { CommitterMeta } from "./roles/committer/index.js";
export type WorkflowMeta = { export type WorkflowMeta = {
planner: PlannerMeta; planner: PlannerMeta;
coder: CoderMeta; coder: CoderMeta;
reviewer: ReviewerMeta;
tester: TesterMeta; tester: TesterMeta;
committer: CommitterMeta; committer: CommitterMeta;
}; };
@ -25,7 +27,12 @@ export const moderator: Moderator<WorkflowMeta> = (context) => {
} }
if (last.role === "coder") { if (last.role === "coder") {
if (last.meta.done) return "tester"; if (last.meta.done) return "reviewer";
return coderCount < MAX_CODER_ITERATIONS ? "coder" : END;
}
if (last.role === "reviewer") {
if (last.meta.approved) return "tester";
return coderCount < MAX_CODER_ITERATIONS ? "coder" : END; return coderCount < MAX_CODER_ITERATIONS ? "coder" : END;
} }

View File

@ -1,11 +1,11 @@
export function coderPrompt({ threadId }: { threadId: string }): string { export function coderPrompt({ threadId }: { threadId: string }): string {
return `Read the workflow thread to get the planner's design and any tester/committer feedback: \`nerve thread ${threadId}\` return `Read the workflow thread to get the planner's design and any reviewer/tester/committer feedback: \`nerve thread ${threadId}\`
Read the nerve-dev skill for workflow file structure and conventions: \`cat node_modules/@uncaged/nerve-skills/nerve-dev/SKILL.md\` Read the nerve-dev skill for workflow file structure and conventions: \`cat node_modules/@uncaged/nerve-skills/nerve-dev/SKILL.md\`
Also look at existing workflows in the \`workflows/\` directory for patterns. Also look at existing workflows in the \`workflows/\` directory for patterns.
## Your task ## Your task
Implement the planner's design. This may be **creating a new workflow** or **modifying an existing one**. If there is tester or committer feedback in the thread, fix the issues they identified. Implement the planner's design. This may be **creating a new workflow** or **modifying an existing one**. If there is reviewer, tester, or committer feedback in the thread, fix the issues they identified.
## Multi-step approach ## Multi-step approach

View File

@ -24,7 +24,7 @@ For **modifications to existing workflows**:
- Workflow name (existing) - Workflow name (existing)
- What changes are needed and why - What changes are needed and why
- Files to add/modify/delete - Files to add/modify/delete
- Impact on moderator routing logic - Impact on moderator routing logic (this workflow's typical order is planner coder reviewer tester committer)
- Backward compatibility considerations (if any) - Backward compatibility considerations (if any)
If requirements are NOT clear, describe what is missing or ambiguous. If requirements are NOT clear, describe what is missing or ambiguous.

View File

@ -0,0 +1,23 @@
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
import { createCursorRole } from "@uncaged/nerve-workflow-utils";
import { reviewerPrompt } from "./prompt.js";
import { z } from "zod";
export const reviewerMetaSchema = z.object({
approved: z.boolean().describe("true if the workflow matches the plan and is ready for tester validation"),
});
export type ReviewerMeta = z.infer<typeof reviewerMetaSchema>;
export type BuildReviewerDeps = {
provider: LlmProvider;
cwd: string;
};
export function buildReviewerRole({ provider, cwd }: BuildReviewerDeps) {
return createCursorRole<ReviewerMeta>({
cwd,
mode: "ask",
prompt: async (threadId) => reviewerPrompt({ threadId }),
extract: { provider, schema: reviewerMetaSchema },
});
}

View File

@ -0,0 +1,25 @@
export function reviewerPrompt({ threadId }: { threadId: string }): string {
return `You are a **reviewer** for Nerve workflow generation. You run **after** the coder and **before** the tester.
Read the workflow thread for the planner's design and any prior feedback: \`nerve thread ${threadId}\`
Read workflow conventions: \`cat node_modules/@uncaged/nerve-skills/nerve-dev/SKILL.md\` (from the repo root after \`cd\`).
## Your job
1. Identify the target workflow name and paths from the thread (e.g. \`workflows/<name>/\`).
2. Read the relevant files: \`moderator.ts\`, \`build.ts\`, \`index.ts\`, and each role under \`roles/\`.
3. Check that the implementation matches the planner's plan (roles, routing, meta types, no forbidden patterns like dynamic \`import()\`).
4. Do **not** run full build/test here that is the tester's job. Flag obvious gaps (missing files, wrong exports, broken routing).
If the work is **ready for the tester** to validate builds and config, set \`approved: true\`.
If the coder must fix issues first, set \`approved: false\` and explain briefly what is wrong.
End with a JSON block:
\`\`\`json
{ "approved": true }
\`\`\`
or
\`\`\`json
{ "approved": false }
\`\`\``;
}