## Summary Wave 17 organizes Fusion into **domain folders** (stacks on #2397). ### Layout - **core/types/** — board, task, agents, settings, merge, workflow, mesh, … - **core/src/** — agents, ai, async-stores, workflows, tasks, config, db, … - **dashboard/app/api/** — client, tasks, agents, git, missions, planning, … - **engine/src/** — agents, auth, execution, merge, missions, overseer, worktree, … Root keepers retained for large entrypoints (`store.ts`, `executor.ts`, `merger.ts`, …). Public barrels (`@fusion/core`, `@fusion/engine`, `app/api.ts` → legacy) stay stable. ## Test plan - [x] `@fusion/core` typecheck - [x] `@fusion/engine` typecheck (pre-existing playwright-core noise only) - [ ] CI merge gate **Stack:** #2394 → #2397 → **this PR**
48 lines
2.1 KiB
TypeScript
48 lines
2.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { WorkflowIrNode } from "@fusion/core";
|
|
import { workflowNodeRequiresWorktree } from "../workflows/workflow-node-execution-needs.js";
|
|
|
|
function node(overrides: Partial<WorkflowIrNode> = {}): WorkflowIrNode {
|
|
return { id: "node", kind: "prompt", ...overrides };
|
|
}
|
|
|
|
describe("workflowNodeRequiresWorktree", () => {
|
|
it.each([
|
|
["coding tool mode", node({ config: { toolMode: "coding" } })],
|
|
["script node", node({ kind: "script" })],
|
|
["named script", node({ config: { scriptName: "validate" } })],
|
|
["CLI command", node({ config: { executor: "cli", cliCommand: "pnpm lint" } })],
|
|
["CLI agent", node({ config: { executor: "cli-agent" } })],
|
|
])("requires a worktree for %s", (_name, workflowNode) => {
|
|
expect(workflowNodeRequiresWorktree(workflowNode)).toBe(true);
|
|
});
|
|
|
|
it.each([
|
|
["review name", node({ id: "review", config: { name: "Code Review" } }), undefined],
|
|
["verification name", node({ id: "verify", config: { name: "Browser Verification" } }), undefined],
|
|
["explicit inline fix config", node({ config: { reviewCanFixInline: true } }), undefined],
|
|
["code review optional group", node(), "code-review"],
|
|
["browser verification optional group", node(), "browser-verification"],
|
|
])("requires a worktree for inline fixes from %s", (_name, workflowNode, optionalGroupId) => {
|
|
expect(workflowNodeRequiresWorktree(workflowNode, { optionalGroupId })).toBe(true);
|
|
});
|
|
|
|
it("keeps inline-fix reviews read-only when disabled", () => {
|
|
expect(workflowNodeRequiresWorktree(node({ config: { name: "Code Review" } }), { reviewerInlineFixes: false })).toBe(false);
|
|
expect(workflowNodeRequiresWorktree(node(), {
|
|
optionalGroupId: "code-review",
|
|
reviewerInlineFixes: false,
|
|
})).toBe(false);
|
|
});
|
|
|
|
it.each([
|
|
node({ id: "plan-review-step", config: { name: "Code Review" } }),
|
|
node({ config: { name: "Plan Review" } }),
|
|
node(),
|
|
])("keeps Plan Review read-only", (workflowNode) => {
|
|
expect(workflowNodeRequiresWorktree(workflowNode, {
|
|
optionalGroupId: workflowNode.id === "node" ? "plan-review" : undefined,
|
|
})).toBe(false);
|
|
});
|
|
});
|