Allow workflows to define default-on optional steps and expose browser verification as a togglable workflow option. - Add core optional-step helpers, IR metadata, compiler support, exports, and regression coverage. - Mark browser verification optional in the built-in coding workflow and document optional workflow-step behavior. - Add dashboard/API support for optional step defaults and enabled-state presentation with localized label cleanup. - Add a patch changeset for the published Fusion package. Files changed: .changeset/fn-6304-optional-workflow-steps.md | 5 ++ docs/task-management.md | 2 +- docs/workflow-steps.md | 8 ++ packages/core/src/__tests__/workflow-ir.test.ts | 45 +++++++++++ .../src/__tests__/workflow-optional-steps.test.ts | 88 ++++++++++++++++++++++ packages/core/src/builtin-coding-workflow-ir.ts | 1 + packages/core/src/index.ts | 3 + packages/core/src/store.ts | 3 + packages/core/src/workflow-compiler.ts | 30 +++++++- packages/core/src/workflow-ir-types.ts | 11 +++ packages/core/src/workflow-ir.ts | 32 +++++++- packages/core/src/workflow-optional-steps.ts | 46 +++++++++++ packages/dashboard/app/api/legacy.ts | 10 +++ .../dashboard/app/components/InlineCreateCard.css | 20 +++++ .../dashboard/app/components/InlineCreateCard.tsx | 87 ++++++++++++++++----- .../app/components/WorkflowResultsTab.tsx | 44 +++++++++-- .../components/__tests__/InlineCreateCard.test.tsx | 41 +++++++++- .../__tests__/WorkflowResultsTab.test.tsx | 58 +++++++++++++- .../src/__tests__/workflow-routes.test.ts | 22 ++++++ .../src/routes/register-workflow-routes.ts | 16 +++- packages/i18n/locales/en/app.json | 6 +- packages/i18n/locales/es/app.json | 3 - packages/i18n/locales/fr/app.json | 3 - packages/i18n/locales/ko/app.json | 3 - packages/i18n/locales/zh-CN/app.json | 3 - packages/i18n/locales/zh-TW/app.json | 3 - packages/i18n/src/resources.d.ts | 6 +- 27 files changed, 543 insertions(+), 56 deletions(-) Fusion-Task-Id: FN-6304 Fusion-Task-Lineage: 385f8ae1-494f-4e2b-a6e9-3a2d2bbe7f71
47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
import type { WorkflowIr } from "./workflow-ir-types.js";
|
|
import { WORKFLOW_STEP_TEMPLATES, type WorkflowStepTemplate } from "./types.js";
|
|
|
|
export interface ResolvedWorkflowOptionalStep {
|
|
templateId: string;
|
|
name: string;
|
|
description: string;
|
|
icon?: string;
|
|
phase: NonNullable<WorkflowStepTemplate["phase"]>;
|
|
defaultOn: boolean;
|
|
}
|
|
|
|
/**
|
|
* Resolve workflow-declared optional step template ids into display metadata.
|
|
*
|
|
* The declaration is intentionally execution-inert: it only advertises which
|
|
* template-backed workflow steps a task may toggle into `enabledWorkflowSteps`.
|
|
* Unknown template ids are skipped so stale/custom declarations never render
|
|
* blank UI rows or break workflow loading.
|
|
*/
|
|
export function resolveWorkflowOptionalSteps(
|
|
ir: WorkflowIr,
|
|
pluginTemplates: WorkflowStepTemplate[] = [],
|
|
): ResolvedWorkflowOptionalStep[] {
|
|
if (ir.version !== "v2" || !ir.optionalSteps?.length) return [];
|
|
|
|
const templates = new Map<string, WorkflowStepTemplate>();
|
|
for (const template of [...WORKFLOW_STEP_TEMPLATES, ...pluginTemplates]) {
|
|
templates.set(template.id, template);
|
|
}
|
|
|
|
const resolved: ResolvedWorkflowOptionalStep[] = [];
|
|
for (const optionalStep of ir.optionalSteps) {
|
|
const template = templates.get(optionalStep.templateId);
|
|
if (!template) continue;
|
|
resolved.push({
|
|
templateId: optionalStep.templateId,
|
|
name: template.name,
|
|
description: template.description,
|
|
icon: template.icon,
|
|
phase: template.phase ?? "pre-merge",
|
|
defaultOn: optionalStep.defaultOn ?? template.defaultOn ?? false,
|
|
});
|
|
}
|
|
return resolved;
|
|
}
|