feat(FN-4648): complete Step 1 — add hard merge blocker helper

Fusion-Task-Id: FN-4648
Fusion-Task-Lineage: 82289e69-7e72-40e4-acaf-b98ad82ad354
This commit is contained in:
Fusion
2026-05-15 10:59:55 -07:00
committed by gsxdsm
parent efdb687bbb
commit 12bfe63aa0
3 changed files with 52 additions and 0 deletions

View File

@@ -2,6 +2,7 @@ import { describe, it, expect } from "vitest";
import type { StepStatus } from "../types.js";
import {
getTaskCompletionBlocker,
getTaskHardMergeBlocker,
getTaskMergeBlocker,
isTaskReadyForMerge,
resolveTaskMergeTarget,
@@ -284,6 +285,45 @@ describe("getTaskMergeBlocker", () => {
});
});
describe("getTaskHardMergeBlocker", () => {
it("ignores paused when no hard blockers exist", () => {
expect(getTaskHardMergeBlocker({ ...baseTask, paused: true })).toBeUndefined();
});
it("ignores failed status when no hard blockers exist", () => {
expect(getTaskHardMergeBlocker({ ...baseTask, status: "failed" })).toBeUndefined();
});
it("still blocks on awaiting-user-review", () => {
expect(getTaskHardMergeBlocker({ ...baseTask, status: "awaiting-user-review" }))
.toContain("awaiting-user-review");
});
it("still blocks on incomplete steps", () => {
expect(getTaskHardMergeBlocker({
...baseTask,
steps: [{ name: "Step 1", status: "pending" }],
})).toBe("task has incomplete steps");
});
it("still blocks on failed pre-merge workflow step", () => {
expect(getTaskHardMergeBlocker({
...baseTask,
workflowStepResults: [{
workflowStepId: "WS-001",
workflowStepName: "Pre-merge Check",
phase: "pre-merge",
status: "failed",
}],
})).toBe("task has failed pre-merge workflow steps");
});
it("still blocks when task is not in-review", () => {
expect(getTaskHardMergeBlocker({ ...baseTask, column: "todo" }))
.toContain("must be in 'in-review'");
});
});
describe("isTaskReadyForMerge", () => {
it("returns true for a clean task in review", () => {
expect(isTaskReadyForMerge(baseTask)).toBe(true);

View File

@@ -152,6 +152,7 @@ export {
export type { CapacityRiskSignal } from "./capacity.js";
export {
getTaskMergeBlocker,
getTaskHardMergeBlocker,
getTaskCompletionBlocker,
isTaskReadyForMerge,
resolveTaskMergeTarget,

View File

@@ -116,6 +116,17 @@ export function getTaskMergeBlocker(
return undefined;
}
export function getTaskHardMergeBlocker(
task: Pick<Task, "column" | "paused" | "status" | "error" | "steps" | "workflowStepResults">,
): string | undefined {
return getTaskMergeBlocker({
...task,
paused: false,
status: task.status === "failed" ? undefined : task.status,
error: undefined,
});
}
export function isTaskReadyForMerge(
task: Pick<Task, "column" | "paused" | "status" | "error" | "steps" | "workflowStepResults">,
): boolean {