feat(FN-4396): merge fusion/fn-4396
This commit is contained in:
@@ -715,7 +715,7 @@ describe("schema migration", () => {
|
||||
const rows = db.prepare("SELECT id, mode, gateMode FROM workflow_steps ORDER BY id ASC").all() as Array<{ id: string; mode: string; gateMode: string }>;
|
||||
expect(rows).toEqual([
|
||||
{ id: "WS-001", mode: "prompt", gateMode: "advisory" },
|
||||
{ id: "WS-002", mode: "script", gateMode: "gate" },
|
||||
{ id: "WS-002", mode: "script", gateMode: "advisory" },
|
||||
]);
|
||||
expect(db.getSchemaVersion()).toBe(77);
|
||||
|
||||
|
||||
@@ -348,6 +348,7 @@ describe("GlobalSettingsStore", () => {
|
||||
"gridlock",
|
||||
"fallback-used",
|
||||
"memory-dreams-processed",
|
||||
"token-budget",
|
||||
]);
|
||||
});
|
||||
|
||||
|
||||
@@ -158,6 +158,7 @@ describe("NotificationDispatcher", () => {
|
||||
"gridlock",
|
||||
"fallback-used",
|
||||
"memory-dreams-processed",
|
||||
"token-budget",
|
||||
]);
|
||||
expect(DEFAULT_GLOBAL_SETTINGS.notificationProviders).toEqual([]);
|
||||
expect(DEFAULT_GLOBAL_SETTINGS.failureNotificationDelayMs).toBe(30000);
|
||||
|
||||
@@ -190,7 +190,7 @@ describe("settings key parity", () => {
|
||||
it("only intentional shared keys appear in both global and project scopes", () => {
|
||||
const projectKeySet = new Set(PROJECT_SETTINGS_KEYS as readonly string[]);
|
||||
const overlap = (GLOBAL_SETTINGS_KEYS as readonly string[]).filter((key) => projectKeySet.has(key));
|
||||
expect(overlap).toEqual(["githubTrackingDefaultRepo", "agentMemoryInclusionMode"]);
|
||||
expect(overlap).toEqual(["taskTokenBudget", "githubTrackingDefaultRepo", "agentMemoryInclusionMode"]);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -2593,7 +2593,6 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
|
||||
phase: "pre-merge",
|
||||
gateMode: "advisory",
|
||||
prompt: template.prompt,
|
||||
gateMode: "advisory",
|
||||
toolMode: template.toolMode || "readonly",
|
||||
enabled: true,
|
||||
createdAt: now,
|
||||
@@ -2610,7 +2609,6 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
|
||||
phase: string | null;
|
||||
gateMode: string | null;
|
||||
prompt: string;
|
||||
gateMode: string | null;
|
||||
toolMode: string | null;
|
||||
scriptName: string | null;
|
||||
enabled: number;
|
||||
@@ -2631,9 +2629,6 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
|
||||
? row.gateMode
|
||||
: (row.mode === "script" ? "gate" : "advisory"),
|
||||
prompt: row.prompt || "",
|
||||
gateMode: row.gateMode === "gate" || row.gateMode === "advisory"
|
||||
? row.gateMode
|
||||
: (row.mode === "script" ? "gate" : "advisory"),
|
||||
toolMode: row.toolMode === "coding" || row.toolMode === "readonly" ? row.toolMode : undefined,
|
||||
scriptName: row.scriptName ?? undefined,
|
||||
enabled: Boolean(row.enabled),
|
||||
@@ -7202,7 +7197,6 @@ ${stepsSection}`;
|
||||
phase: input.phase || "pre-merge",
|
||||
gateMode,
|
||||
prompt: mode === "prompt" ? (input.prompt || "") : "",
|
||||
gateMode: input.gateMode || (mode === "script" ? "gate" : "advisory"),
|
||||
toolMode: mode === "prompt" ? (input.toolMode || "readonly") : undefined,
|
||||
scriptName: mode === "script" ? input.scriptName : undefined,
|
||||
enabled: input.enabled !== undefined ? input.enabled : true,
|
||||
@@ -7223,7 +7217,6 @@ ${stepsSection}`;
|
||||
phase,
|
||||
gateMode,
|
||||
prompt,
|
||||
gateMode,
|
||||
toolMode,
|
||||
scriptName,
|
||||
enabled,
|
||||
@@ -7242,7 +7235,6 @@ ${stepsSection}`;
|
||||
step.phase || "pre-merge",
|
||||
step.gateMode,
|
||||
step.prompt,
|
||||
step.gateMode ?? (step.mode === "script" ? "gate" : "advisory"),
|
||||
step.toolMode ?? null,
|
||||
step.scriptName ?? null,
|
||||
step.enabled ? 1 : 0,
|
||||
@@ -7284,9 +7276,8 @@ ${stepsSection}`;
|
||||
description: entry.template.description,
|
||||
mode: entry.template.mode ?? "prompt",
|
||||
phase: entry.template.phase ?? "pre-merge",
|
||||
gateMode: (entry.template.mode ?? "prompt") === "script" ? "gate" : "advisory",
|
||||
prompt: entry.template.prompt ?? "",
|
||||
gateMode: entry.template.gateMode ?? ((entry.template.mode ?? "prompt") === "script" ? "gate" : "advisory"),
|
||||
prompt: entry.template.prompt ?? "",
|
||||
scriptName: entry.template.scriptName,
|
||||
toolMode: entry.template.toolMode,
|
||||
enabled: entry.template.enabled ?? true,
|
||||
@@ -7351,7 +7342,6 @@ ${stepsSection}`;
|
||||
phase: string | null;
|
||||
gateMode: string | null;
|
||||
prompt: string;
|
||||
gateMode: string | null;
|
||||
toolMode: string | null;
|
||||
scriptName: string | null;
|
||||
enabled: number;
|
||||
@@ -7378,7 +7368,6 @@ ${stepsSection}`;
|
||||
phase: string | null;
|
||||
gateMode: string | null;
|
||||
prompt: string;
|
||||
gateMode: string | null;
|
||||
toolMode: string | null;
|
||||
scriptName: string | null;
|
||||
enabled: number;
|
||||
@@ -7412,7 +7401,6 @@ ${stepsSection}`;
|
||||
phase: string | null;
|
||||
gateMode: string | null;
|
||||
prompt: string;
|
||||
gateMode: string | null;
|
||||
toolMode: string | null;
|
||||
scriptName: string | null;
|
||||
enabled: number;
|
||||
|
||||
@@ -242,7 +242,6 @@ export type WorkflowStepGateMode = "gate" | "advisory";
|
||||
|
||||
/** Lifecycle phase for workflow step execution. */
|
||||
export type WorkflowStepPhase = "pre-merge" | "post-merge";
|
||||
export type WorkflowStepGateMode = "gate" | "advisory";
|
||||
|
||||
export interface WorkflowStep {
|
||||
/** Unique identifier (e.g., "WS-001") */
|
||||
@@ -261,8 +260,6 @@ export interface WorkflowStep {
|
||||
gateMode: WorkflowStepGateMode;
|
||||
/** Full agent prompt to execute when this step runs (used when mode is "prompt") */
|
||||
prompt: string;
|
||||
/** Whether failures should block merge (`gate`) or be informational (`advisory`). */
|
||||
gateMode?: WorkflowStepGateMode;
|
||||
/** Tool set available to prompt-mode workflow agents. Defaults to readonly. */
|
||||
toolMode?: WorkflowStepToolMode;
|
||||
/** Name of a script from project settings `scripts` map to execute (required when mode is "script") */
|
||||
@@ -363,8 +360,6 @@ export interface WorkflowStepInput {
|
||||
gateMode?: WorkflowStepGateMode;
|
||||
/** Agent prompt (used when mode is "prompt"). Optional — can be AI-generated later via refinement. */
|
||||
prompt?: string;
|
||||
/** Failure behavior. Defaults to advisory for prompt mode and gate for script mode. */
|
||||
gateMode?: WorkflowStepGateMode;
|
||||
/** Tool set available to prompt-mode workflow agents. Defaults to readonly. */
|
||||
toolMode?: WorkflowStepToolMode;
|
||||
/** Script name from project settings (required when mode is "script").
|
||||
|
||||
Reference in New Issue
Block a user