- restore customFields on unarchive; reconcile all occupants on field-schema edits (store.ts)
- serialize per-field saves + controlled inputs in TaskFieldsSection (race fixes)
- fn_workflow_get includes layout; Array.isArray guards in validateCodeNodeSources
- per-instance graphStepActiveContext keying; rebase in instance worktree; clear run-once memo on RETHINK
- GET /api/step-parsers + registry-backed parser select (plugin parsers reachable from editor)
- translate new workflowNodes/workflowFields strings across all 5 non-en locales
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Installing the Compound Engineering plugin from Settings → Built-in
Plugins failed with "Plugin manifest not found": the dashboard's
bundled-plugin fallback set (BUNDLED_PLUGIN_IDS in routes.ts) was
missing fusion-plugin-compound-engineering, so when the relative
./plugins/... path missed the server cwd, the bundled lookup was never
attempted. fusion-plugin-cli-printing-press had the same gap.
- Add both ids to the dashboard's BUNDLED_PLUGIN_IDS fallback set.
- Stage fusion-plugin-compound-engineering into dist/plugins via
bundlePluginEntry in the CLI tsup config so packaged installs can
resolve the bundled copy (every other bundled plugin already had a
staging block).
- Add route tests that actually exercise the bundled fallback (the
existing ones let cwd resolution succeed, so the fallback path was
untested).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The merge of main added resolvePrBaseRef (consumes tryRun mocks before the
push sequence) and classifyGhError mapping (network errors -> structured
502 with githubError payload). The long-orphaned test pinned the old shape.
Re-mapped mock queues to the real sequence, asserted the stronger current
error contract (status + githubError.code + retryable), and made the
accidentally-passing no-commits test deterministic. Mutate-to-prove
verified the push assertion still bites.
- WorkflowNodeEditor overlay was missing the `open` class, so the
graph editor mounted with display:none — clicking the button just
dismissed the steps view. Add `open` so the overlay renders.
- Add fusion-plugin-compound-engineering and fusion-plugin-roadmap to
BUILTIN_PLUGINS so they show under Settings → Built-in Plugins.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- WorkflowNodeEditor overlay was missing the `open` class, so the
graph editor mounted with display:none — clicking the button just
dismissed the steps view. Add `open` so the overlay renders.
- Add fusion-plugin-compound-engineering and fusion-plugin-roadmap to
BUILTIN_PLUGINS so they show under Settings → Built-in Plugins.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Show a one-time GitHub star prompt after a task first reaches done.
- detect task status transitions into done and trigger the prompt only in project view
- add a dismissible GitHub star prompt component plus localStorage-backed persistence hook
- cover the new prompt behavior with component, hook, and transition helper tests
- document the prompt behavior and styling guidance in the dashboard guide
Files changed:
docs/dashboard-guide.md | 3 +
packages/dashboard/app/App.tsx | 21 +++++-
.../dashboard/app/components/GitHubStarPrompt.css | 76 ++++++++++++++++++++++
.../dashboard/app/components/GitHubStarPrompt.tsx | 53 +++++++++++++++
.../app/components/__tests__/App.test.tsx | 12 +++-
.../components/__tests__/GitHubStarPrompt.test.tsx | 40 ++++++++++++
.../hooks/__tests__/useGitHubStarPrompt.test.ts | 64 ++++++++++++++++++
.../dashboard/app/hooks/useGitHubStarPrompt.ts | 46 +++++++++++++
8 files changed, 313 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5967
Fusion-Task-Lineage: 5fffdf4d-61d8-4ac8-bcf4-8b453b639b28
Make the Create Pull Request modal interactive before AI metadata finishes loading.
- load preflight checks and PR options independently from AI title/body generation with separate loading and error states
- preserve base-branch selection and remediation actions while refreshing preflight or regenerating metadata
- cover the faster modal flow in tests and document the immediate-render behavior in the dashboard guide
Files changed:
docs/dashboard-guide.md | 3 +-
packages/dashboard/app/components/PrCreateModal.css | 11 +
packages/dashboard/app/components/PrCreateModal.tsx | 357 ++++++++++++++-------
packages/dashboard/app/components/__tests__/PrCreateModal.test.tsx | 110 ++++++-
4 files changed, 355 insertions(+), 126 deletions(-)
Fusion-Task-Id: FN-5954
Fusion-Task-Lineage: 2595d220-ca7a-403c-935c-900034a20c67
Restore the chat message pane empty state on mobile without regressing desktop sidebar layouts.
- style chat message-pane empty states as centered framed cards and normalize mobile spacing tokens
- keep sidebar padded empty states left-aligned so loading and list placeholders preserve their desktop layout
- add mobile and desktop regression coverage for direct chats and chat rooms across empty, loading, populated, and streaming states
Files changed:
packages/dashboard/app/components/ChatView.css | 26 +-
.../__tests__/ChatView.mobile-render.test.tsx | 299 +++++++++++++++++++++
2 files changed, 323 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5948
Fusion-Task-Lineage: f4165f04-363d-4ade-8c10-6d242f943c6c
Add in-app preflight remediation so Create PR can push task branches without leaving Fusion.
- add a dashboard API route and client helper to push the task branch to origin and recompute PR preflight state
- update the Create Pull Request modal, styles, and tests to surface push-branch remediation alongside AI conflict resolution
- document the flow and add a published CLI changeset plus server coverage for the new push-branch endpoint
Files changed:
.changeset/fn-5950-pr-push-branch.md | 5 +
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/api/legacy.ts | 19 +++
packages/dashboard/app/components/PrCreateModal.css | 4 +-
packages/dashboard/app/components/PrCreateModal.tsx | 48 +++++-
packages/dashboard/app/components/__tests__/PrCreateModal.test.tsx | 44 ++++++
packages/dashboard/src/__tests__/register-git-github.pr-push-branch.test.ts | 176 +++++++++++++++++++++
packages/dashboard/src/routes/register-git-github.ts | 68 ++++++++
8 files changed, 362 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-5950
Fusion-Task-Lineage: 5a6c5c6a-8f99-44c0-8f54-f0a6ff537ed0
The newly-gated backfill file flaked on a loaded CI shard: waitFor's
private 1s default (independent of the 15s vitest testTimeout) raced the
click->respondToPlanning state-update chain. Passes deterministically in
isolation; 5s bound absorbs shard CPU starvation without masking real
regressions.
Components now call useTranslation(); without an initialized instance,
react-i18next's fallback returns inline defaults WITHOUT interpolation
(literal {{count}} in output) and t identity flips once init completes,
double-firing effects that list t in deps. Awaiting a backend-less en
init (all namespaces pre-loaded, useSuspense off) keeps t(key, default,
options) interpolating and identity-stable from the first render.
Cleared ~770 of the 1,051 dashboard test failures; the remainder were
triaged against a clean origin/main worktree baseline: 253 fail
identically there (local-env fake-timer waitFor hangs; CI passes them)
and 23 sweep-caused regressions are being fixed in the round-2 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Value-audit verdict: the file is already well-factored (~6% genuine bloat).
Merged: 7 full-modal renders for experimental-feature labels into 1;
read-only default-render clusters (Global General defaults, version
display, header actions); export-filename negative folded into positive.
All original assertions survive verbatim; 2 mutate-to-prove checks confirm
merged tests still bite; lane green 3x with no flakes.
Honest note: wall-clock neutral (~47s lane) — per-test cost is dominated
by the ~60-stub beforeEach + full-modal render, not duplicate assertions.
A 30-40% lane reduction requires structural work (shared mock fixture,
subtree renders) deliberately not attempted here (correctness risk).