Commit Graph

10662 Commits

Author SHA1 Message Date
gsxdsm
c16cc9e08a FN-7515: expose planner oversight configuration
Expose planner oversight as workflow-native configuration across task and workflow surfaces.

- Add a shared TaskForm selector for per-task planner oversight overrides with inherit semantics.
- Thread plannerOversightLevel through new task creation, task detail edits, and legacy dashboard API payloads.
- Add a Workflow Editor Values display group and documentation for configuring workflow defaults.
- Cover create, edit, form, and workflow settings behavior with dashboard tests.

Files changed:
 .changeset/fn-7515-planner-oversight-config-exposure.md   |  7 ++
 docs/dashboard-guide.md                                    |  1 +
 docs/settings-reference.md                                 |  2 +-
 packages/dashboard/app/api/legacy.ts                       |  3 +
 packages/dashboard/app/components/NewTaskModal.tsx         | 12 +++-
 packages/dashboard/app/components/TaskDetailModal.tsx      | 11 +++-
 packages/dashboard/app/components/TaskForm.tsx             | 34 ++++++++++
 packages/dashboard/app/components/__tests__/NewTaskModal.test.tsx | 31 +++++++++
 packages/dashboard/app/components/__tests__/TaskDetailModal.inline-editing-and-integrations.test.tsx | 76 ++++++++++++++++++++++
 packages/dashboard/app/components/__tests__/TaskForm.test.tsx | 28 ++++++++
 packages/dashboard/app/components/__tests__/WorkflowSettingsPanel.test.tsx | 34 ++++++++++
 packages/dashboard/app/components/workflow-setting-display.ts | 17 ++++-
 12 files changed, 251 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-7515

Fusion-Task-Lineage: aded67c0-835c-4046-b691-04dc2bb2d314

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 14:26:46 -07:00
gsxdsm
79ab367547 FN-7514: withhold overseer actions under human control
Add a human-control guard so planner overseer recovery stays inert for paused or human-review tasks.

- Add a pure overseer human-control policy that treats explicit user pauses and autoMerge:false / human-review tasks as full withhold states.
- Thread settings through planner recovery ticks, skip action classification and pending confirmations when withheld, and emit deduped no-action run-audit events.
- Wire ProjectEngine audit recording and document the new guard, run-audit event, exports, and release note.

Files changed:
 .changeset/fn-7514-overseer-human-control-guard.md |   7 +
 AGENTS.md                                          |   1 +
 docs/architecture.md                               |  39 +++++
 .../overseer-human-control-policy.test.ts          |  86 +++++++++++
 ...anner-recovery-controller-human-control.test.ts | 170 +++++++++++++++++++++
 packages/engine/src/index.ts                       |   7 +
 .../engine/src/overseer-human-control-policy.ts    |  88 +++++++++++
 packages/engine/src/planner-recovery-controller.ts | 107 ++++++++++++-
 packages/engine/src/project-engine.ts              |  44 +++++-
 packages/engine/src/run-audit.ts                   |  15 +-
 10 files changed, 558 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-7514

Fusion-Task-Lineage: d4d3bd04-3f8e-4a05-9636-f177e050390b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 14:11:25 -07:00
gsxdsm
b545083249 FN-7530: isolate flaky dist-barrel extension test
Restore the stable extension suite by quarantining only the dist-barrel recompilation case.

- Move the built @fusion/core dist-barrel extension test into its own file.
- Re-admit extension.test.ts while keeping the isolated dist-barrel file quarantined.
- Update the quarantine ledger and velocity baseline to reflect the narrowed quarantine.

Files changed:
 docs/test-velocity-baseline.md                     |  10 +-
 .../src/__tests__/extension-dist-barrel.test.ts    | 230 +++++++++++++++++++++
 packages/cli/src/__tests__/extension.test.ts       | 103 +--------
 packages/cli/vitest.config.ts                      |   5 +-
 scripts/lib/test-quarantine.json                   |   4 +-
 5 files changed, 247 insertions(+), 105 deletions(-)

Fusion-Task-Id: FN-7530

Fusion-Task-Lineage: 7b07540f-689b-4133-b590-a39427095397

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 14:04:29 -07:00
gsxdsm
ed5417a341 FN-7529: fix desktop header search test
Update the App test to assert the open desktop search panel state after rerender.\n\n- Avoid re-clicking the desktop search toggle after the non-mobile panel stays open across rerender.\n- Assert the branch-filter selects directly while the search panel remains rendered.\n\nFiles changed:\n packages/dashboard/app/components/__tests__/App.test.tsx | 9 +++++++--\n 1 file changed, 7 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-7529

Fusion-Task-Lineage: 1495f872-d262-4ea4-83f2-5a53ecf7a202

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 13:57:20 -07:00
gsxdsm
2cc84b5177 FN-7513: require planner confirmation for risky side effects
Require explicit approval before planner recovery runs merge, PR, destructive, or external-service actions.

- Add pure planner side-effect classification and confirmation request modeling in core.
- Route merge/PR recovery decisions to await confirmation instead of autonomous dispatch.
- Persist pending confirmation requests and only execute approved controller actions.
- Cover confirmation gating with core and engine regression tests and document the policy.

Files changed:
 .changeset/fn-7513-planner-confirmation-gate.md    |   7 +
 docs/architecture.md                               |  85 ++++++++-
 docs/settings-reference.md                         |   2 +-
 .../src/__tests__/planner-confirmation.test.ts     | 125 +++++++++++++
 .../core/src/__tests__/planner-recovery.test.ts    |  14 +-
 packages/core/src/index.ts                         |   7 +
 packages/core/src/planner-confirmation.ts          | 141 ++++++++++++++
 packages/core/src/planner-recovery.ts              | 103 ++++++++---
 ...lanner-recovery-controller-confirmation.test.ts | 205 +++++++++++++++++++++
 packages/engine/src/index.ts                       |   5 +
 packages/engine/src/planner-recovery-controller.ts | 204 +++++++++++++++++++-
 packages/engine/src/project-engine.ts              |  44 +++++
 12 files changed, 913 insertions(+), 29 deletions(-)

Fusion-Task-Id: FN-7513

Fusion-Task-Lineage: 1e3c6640-8a4f-41f6-89dd-41eb9b675b2b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 13:51:09 -07:00
gsxdsm
3b52a4d2d9 FN-7527: fix desktop server switching redirects
Route desktop shell server switches through the live runtime/profile state.

- Replace separate local/remote redirect effects with a shared resolver that uses localRuntime/baseUrl and active remote profiles.
- Remove the dead localServer shell state field and document the local/remote switch navigation behavior.
- Add regression coverage for desktop shell redirect targets and include a patch changeset.

Files changed:
 .changeset/fn-7527-desktop-switch-server-navigation.md    |   7 +
 docs/native-shell.md                               |   2 +-
 packages/dashboard/app/App.tsx                     |  44 ++---
 packages/dashboard/app/components/__tests__/App.test.tsx          |   1 -
 packages/dashboard/app/types/native-shell.d.ts     |  13 +-
 packages/dashboard/app/utils/__tests__/appLifecycle.test.ts       | 180 +++++++++++++++++++++
 packages/dashboard/app/utils/appLifecycle.ts       |  70 ++++++++
 7 files changed, 280 insertions(+), 37 deletions(-)

Fusion-Task-Id: FN-7527

Fusion-Task-Lineage: a0fe5cbc-120b-4a56-b791-48306223a636

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 13:43:59 -07:00
gsxdsm
87a700cd4d FN-7506: add scoped settings reset actions
Add a Settings footer reset flow for scoped menu and project-wide defaults.

- Add Reset Settings dialog actions for the active settings menu and all project settings.
- Track section-owned settings keys in a shared scope-aware registry and reuse it for save/reset validation.
- Cover modal/mobile reset behavior, registry invariants, docs, i18n strings, and a release changeset.

Files changed:
 .changeset/fn-7506-settings-reset.md               |   7 +
 docs/dashboard-guide.md                            |  12 +
 .../dashboard/app/components/SettingsModal.css     |  33 +++
 .../dashboard/app/components/SettingsModal.tsx     | 215 +++++++++++++++++-
 .../__tests__/SettingsModal.general.test.tsx       | 145 ++++++++++++
 .../components/__tests__/settings-mobile.test.tsx  |  37 +++-
 .../settings/__tests__/section-keys.test.ts        | 171 ++++++++++++++
 .../app/components/settings/save-split.ts          |   9 +-
 .../app/components/settings/section-keys.ts        | 246 +++++++++++++++++++++
 packages/i18n/locales/en/app.json                  |  11 +
 packages/i18n/locales/zh-CN/app.json               |  11 +
 11 files changed, 886 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-7506
Fusion-Task-Lineage: a627e820-fe3b-42c5-adf2-97469bbe7a3b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 13:36:01 -07:00
gsxdsm
81f2053921 FN-7512: add bounded planner recovery
Adds bounded autonomous planner recovery decisions and dispatch so overseer observations can safely nudge stuck planning stages.

- Add pure core recovery policy with per-stage attempt limits and no-op fallbacks for disallowed or exhausted cases.
- Add engine controller wiring to inject guidance, retry steps, request targeted fixes, and emit recovery audit events.
- Register the planner recovery controller in project engine lifecycle and document the autonomous recovery behavior.
- Cover core decisions and controller dispatch with targeted tests, plus a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7512-planner-bounded-recovery.md     |   7 +
 docs/architecture.md                               |  62 ++++++
 .../core/src/__tests__/planner-recovery.test.ts    | 116 +++++++++++
 packages/core/src/index.ts                         |  12 ++
 packages/core/src/planner-recovery.ts              | 222 +++++++++++++++++++++
 .../__tests__/planner-recovery-controller.test.ts  | 163 +++++++++++++++
 packages/engine/src/index.ts                       |  20 ++
 packages/engine/src/planner-recovery-controller.ts | 195 ++++++++++++++++++
 packages/engine/src/project-engine.ts              |  66 ++++++
 9 files changed, 863 insertions(+)

Fusion-Task-Id: FN-7512

Fusion-Task-Lineage: aad3849d-090e-497d-ae5c-34ec7ca96c3d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 13:19:02 -07:00
gsxdsm
4baa4c43c5 FN-7505: show defaults in settings descriptions
Expose settings defaults directly in dashboard help text so operators can see baseline values while editing settings.

- Add default-value wording across global and project settings descriptions and locale strings.
- Document the dashboard/default-reference alignment and add a changeset for the published CLI package.
- Add coverage that every visible settings field includes its default in helper text and update existing assertions.

Files changed:
 .changeset/fn-7505-settings-default-descriptions.md       |   7 +
 docs/dashboard-guide.md                                    |   3 +
 docs/settings-reference.md                                 |   3 +
 .../__tests__/SettingsModal.general.test.tsx               |   2 +-
 .../settings/sections/AgentPermissionsSection.tsx          |   4 +-
 .../settings/sections/AppearanceSection.tsx                |   4 +-
 .../settings/sections/BackupsSection.tsx                   |  13 +-
 .../settings/sections/CommandsSection.tsx                  |   4 +-
 .../settings/sections/ExperimentalSection.tsx              |   2 +-
 .../settings/sections/GeneralSection.tsx                   |  26 +-
 .../settings/sections/GlobalGeneralSection.tsx             |  25 +-
 .../settings/sections/GlobalModelsSection.tsx              |  24 +-
 .../settings/sections/McpServersCard.tsx                   |   1 +
 .../components/settings/sections/MemorySection.tsx         |  12 +-
 .../components/settings/sections/MergeSection.tsx          |  37 +-
 .../settings/sections/ModelPricingSection.tsx              |   2 +-
 .../settings/sections/NodeRoutingSection.tsx               |   3 +-
 .../settings/sections/NodeSyncSection.tsx                  |   6 +-
 .../settings/sections/NotificationsSection.tsx             |  14 +-
 .../settings/sections/ProjectModelsSection.tsx             |  11 +-
 .../settings/sections/PromptsSection.tsx                   |   2 +-
 .../components/settings/sections/RemoteSection.tsx         |   7 +-
 .../settings/sections/ResearchGlobalSection.tsx            |  15 +-
 .../settings/sections/ResearchProjectSection.tsx           |  16 +-
 .../settings/sections/ScheduledEvalsSection.tsx            |   7 +-
 .../settings/sections/SchedulingSection.tsx                |  20 +-
 .../settings/sections/WorktreesSection.tsx                 |  14 +-
 .../sections/__tests__/AppearanceSection.test.tsx          |   4 +-
 .../MergeSection.legacy-automerge-cleanup.test.tsx         |   2 +-
 .../settings-default-descriptions.test.tsx                 | 573 +++++++++++++++++++++
 packages/i18n/locales/en/app.json                          | 261 ++++++----
 31 files changed, 914 insertions(+), 210 deletions(-)

Fusion-Task-Id: FN-7505

Fusion-Task-Lineage: 7688caf2-2a95-4401-8b27-9da4b46ecfcd

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 13:09:29 -07:00
gsxdsm
12a6d1bc6a FN-7511: add planner overseer stage monitoring
Add records-only planner overseer monitoring across in-flight task lifecycle stages.

- Add a PlannerOverseerMonitor with normalized observations and deterministic watched-stage resolution.
- Wire ProjectEngine to poll in-progress and in-review tasks, gated by effective planner oversight level.
- Document the monitoring seam and add focused coverage plus a release changeset.

Files changed:
 .changeset/fn-7511-planner-overseer-monitoring.md  |   7 +
 docs/architecture.md                               |  26 ++
 docs/workflow-steps.md                             |   2 +
 .../engine/src/__tests__/planner-overseer.test.ts  | 294 ++++++++++++++++++
 packages/engine/src/index.ts                       |  12 +
 packages/engine/src/planner-overseer.ts            | 338 +++++++++++++++++++++
 packages/engine/src/project-engine.ts              |  93 +++++-
 7 files changed, 771 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-7511

Fusion-Task-Lineage: 81b616cf-47e9-4769-b02d-fc7ebd3fcb2f

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 12:55:25 -07:00
gsxdsm
0689250097 FN-7510: default planner oversight to autonomous
Enable full planner steering/control by default while preserving explicit workflow and task opt-outs.

- Document that planner oversight resolves as task override, workflow setting, then autonomous default.
- Add regression coverage for built-in workflow defaults, stored workflow overrides, and per-task overrides.
- Add a minor changeset for the published Fusion package.

Files changed:
 .changeset/fn-7510-oversight-default.md            |  7 ++
 docs/workflow-steps.md                             |  9 ++-
 .../plannerOversightLevel-default.test.ts          | 79 ++++++++++++++++++++++
 3 files changed, 93 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-7510

Fusion-Task-Lineage: 2dbf8273-4239-4754-9713-e089f75be930

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 12:38:14 -07:00
gsxdsm
aa757bc1a3 FN-7509: add per-task planner oversight overrides
Add core support for tasks to carry a planner oversight override that can supersede workflow settings.

- Add nullable plannerOversightLevel task storage, schema migration, store update/create/archive plumbing, and mesh replication support.
- Export planner oversight level types/defaults and an effective-level resolver with task-over-workflow precedence.
- Document override precedence and add regression coverage for migration, persistence, updates, and resolution.
- Add a minor changeset for the published Fusion package.

Files changed:
 .../fn-7509-per-task-planner-oversight-override.md |  7 ++
 docs/settings-reference.md                         |  2 +-
 packages/core/src/__tests__/db.test.ts             | 45 +++++++++++++
 packages/core/src/__tests__/store-update.test.ts   | 75 ++++++++++++++++++++++
 .../__tests__/workflow-settings-resolver.test.ts   | 28 ++++++++
 packages/core/src/db.ts                            | 17 ++++-
 packages/core/src/index.ts                         |  5 +-
 packages/core/src/mesh-task-replication.ts         |  2 +
 packages/core/src/store.ts                         | 15 ++++-
 packages/core/src/types.ts                         | 23 +++++++
 packages/core/src/workflow-settings-resolver.ts    | 28 ++++++++
 11 files changed, 240 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-7509

Fusion-Task-Lineage: 41695cc5-34d2-4079-9e34-a8fb40f961fb

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 12:32:09 -07:00
gsxdsm
4707eb5be0 FN-7526: guard plan auto-approval routing
Adds regression coverage ensuring project auto-approve-all sends eligible plans to todo without weakening independent gates.

- Cover Plan Review retry routing when workflow-stored requirePlanApproval is overridden by project auto-approve-all.
- Verify release authorization and Workflow Plan Review still block independently under auto-approve-all.
- Add refinement and self-healing routing coverage plus a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7526-plan-auto-approve.md            |   7 ++
 .../self-healing-starved-refinement.test.ts        |  61 +++++++++
 .../__tests__/triage-refinement-routing.test.ts    |  54 ++++++++
 packages/engine/src/__tests__/triage.test.ts       | 139 +++++++++++++++++++++
 packages/engine/src/triage.ts                      |   3 +
 5 files changed, 264 insertions(+)

Fusion-Task-Id: FN-7526

Fusion-Task-Lineage: 642d7856-d546-423b-bf10-68c28e205e21

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 12:25:18 -07:00
gsxdsm
9f24b507fc FN-7507: prioritize topmost dashboard shortcut dismissal
Refine dashboard keyboard shortcut behavior and coverage for configurable popup handling.

- Factor App Escape dismissal into a pure helper that closes one topmost surface at a time.
- Prioritize popped-out tasks ahead of Quick Chat, Terminal, and fixed dashboard modals.
- Add regression coverage for configurable shortcut bindings, editable focus guards, default-prevented events, and Escape ordering.
- Update dashboard shortcut documentation and release-note wording.

Files changed:
 .changeset/fn-7494-keyboard-shortcuts.md           |   4 +-
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/App.tsx                     | 110 +++++++++-----
 .../app/__tests__/App.keyboard-shortcuts.test.tsx  | 158 +++++++++++++++++++++
 .../app/utils/__tests__/keyboardShortcuts.test.ts  |   1 +
 5 files changed, 236 insertions(+), 39 deletions(-)

Fusion-Task-Id: FN-7507

Fusion-Task-Lineage: 804986ef-ec6c-4404-a168-6d154f75b118

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 12:08:38 -07:00
gsxdsm
2f23d2260d FN-7494: add configurable dashboard shortcuts
Add configurable dashboard keyboard shortcuts for opening Quick Chat and Terminal.

- Add global settings defaults, schemas, persistence, and Settings UI controls for dashboard shortcuts.
- Register safe document-level shortcut handling with editable-target guards and Escape popup dismissal.
- Normalize shortcut strings, detect disabled/conflicting bindings, and document operator behavior.
- Cover shortcut parsing, dashboard listener behavior, and settings persistence with tests.

Files changed:
 .changeset/fn-7494-keyboard-shortcuts.md           |   7 +
 docs/dashboard-guide.md                            |  14 ++
 .../core/src/__tests__/global-settings.test.ts     |  20 +++
 .../core/src/__tests__/settings-defaults.test.ts   |  10 ++
 .../core/src/__tests__/settings-parity.test.ts     |  10 ++
 packages/core/src/__tests__/store-settings.test.ts |  10 ++
 packages/core/src/settings-schema.ts               |   8 +
 packages/core/src/types.ts                         |  12 ++
 packages/dashboard/app/App.tsx                     |  52 ++++++
 .../dashboard/app/components/SettingsModal.css     |  21 +++
 .../dashboard/app/components/SettingsModal.tsx     |  11 ++
 .../__tests__/SettingsModal.general.test.tsx       |  63 ++++++++
 .../app/components/settings/save-split.ts          |   1 +
 .../settings/sections/GlobalGeneralSection.tsx     |  38 +++++
 .../useDashboardKeyboardShortcuts.test.tsx         | 101 ++++++++++++
 packages/dashboard/app/hooks/useAppSettings.ts     |   8 +-
 .../app/hooks/useDashboardKeyboardShortcuts.ts     |  66 ++++++++
 .../app/utils/__tests__/keyboardShortcuts.test.ts  |  76 +++++++++
 packages/dashboard/app/utils/keyboardShortcuts.ts  | 175 +++++++++++++++++++++
 19 files changed, 702 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-7494
Fusion-Task-Lineage: 30445f4d-c0c5-4657-bd79-fc2acaf3c37d
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 11:38:42 -07:00
gsxdsm
68f5153e17 FN-7508: add planner oversight workflow setting
Declare a workflow-native planner oversight level with release notes and docs.

- Add the plannerOversightLevel enum setting with Off, Observe, Steer, and Autonomous recovery values.
- Export the oversight settings catalog and include it in built-in workflow defaults.
- Cover consistency, resolver defaults, and catalog membership with core tests.
- Document the workflow setting and add the published package changeset.

Files changed:
 .../fn-7508-planner-oversight-level-setting.md     |  7 +++++
 docs/settings-reference.md                         |  8 ++++--
 docs/workflow-steps.md                             | 17 +++++++-----
 .../builtin-workflow-settings-triage.test.ts       | 32 ++++++++++++++++++++++
 .../src/__tests__/settings-consistency.test.ts     |  4 ++-
 .../__tests__/workflow-settings-resolver.test.ts   |  1 +
 packages/core/src/builtin-workflow-settings.ts     | 26 ++++++++++++++++++
 packages/core/src/index.ts                         |  1 +
 8 files changed, 86 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-7508

Fusion-Task-Lineage: 1adc7ce6-9e0e-475e-956a-ee36edae0cdc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 11:26:31 -07:00
gsxdsm
2797803c0b FN-7503: add agent log timing metrics
Record and surface request first-token latency and tool processing duration in task logs.

- Add optional agent log timing fields and persist them in file-backed task logs.
- Track Time To First Token from the first visible model output per agent logger request.
- Track FIFO tool durations for tool result and error rows without storing sensitive payloads.
- Render TTFT and duration badges in task chat and agent log viewers with regression coverage.
- Document the new persisted timing fields and add a patch changeset for the CLI package.

Files changed:
 .changeset/fn-7503-agent-log-timing.md             |   7 ++
 docs/storage.md                                    |   1 +
 .../src/__tests__/agent-log-file-store.test.ts     |  35 ++++++
 .../src/__tests__/store-agent-log-file.test.ts     |  28 +++++
 packages/core/src/agent-log-file-store.ts          |  19 ++++
 packages/core/src/store.ts                         |  13 +++
 packages/core/src/types.ts                         |   4 +
 .../dashboard/app/components/AgentLogViewer.css    |  33 ++++++
 .../dashboard/app/components/AgentLogViewer.tsx    |  39 ++++++-
 packages/dashboard/app/components/TaskChatTab.css  |  23 +++-
 packages/dashboard/app/components/TaskChatTab.tsx  |  17 ++-
 .../__tests__/AgentLogViewer.rendering.test.tsx    |  24 +++++
 .../app/components/__tests__/TaskChatTab.test.tsx  |  18 ++++
 packages/engine/src/__tests__/agent-logger.test.ts | 120 ++++++++++++++++++---
 packages/engine/src/agent-logger.ts                |  97 ++++++++++++++---
 15 files changed, 446 insertions(+), 32 deletions(-)

Fusion-Task-Id: FN-7503

Fusion-Task-Lineage: 7e62034f-4c35-420d-a670-3f7f4a7948df

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:21 -07:00
gsxdsm
b0208c140a FN-7500: restore terminal clipboard shortcuts
Restore terminal copy and paste shortcut handling across integrated and embedded sessions.

- Handle Ctrl/Cmd+V by reading clipboard text and forwarding it once to the active PTY or attach channel.
- Preserve Ctrl/Cmd+C selection copy behavior while leaving no-selection interrupts available to the shell.
- Document the exact-once terminal paste behavior and add a patch changeset.
- Cover successful, missing, rejected, and empty clipboard paste paths in terminal tests.

Files changed:
 .changeset/fn-7500-terminal-shortcuts.md           |  7 +++
 docs/dashboard-guide.md                            |  4 +-
 .../dashboard/app/components/SessionTerminal.tsx   | 24 ++++++++++-
 .../dashboard/app/components/TerminalModal.tsx     | 23 ++++++++-
 .../components/__tests__/SessionTerminal.test.tsx  | 43 ++++++++++++++++-
 .../components/__tests__/TerminalModal.test.tsx    | 50 +++++++++++++++++++-
 6 files changed, 132 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-7500

Fusion-Task-Lineage: 8e87fa22-c0b7-402d-aeef-322cbd852529

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:21 -07:00
gsxdsm
a2d6349bb8 FN-7504: keep mobile chat composer above keyboard chrome
Keeps the mobile Chat composer visible when iOS keyboard accessory chrome is open.

- Add ChatView-local keyboard accessory clearance for iOS keyboard-active composer padding.
- Reset the clearance when keyboard tracking is suppressed or torn down, without adding persistent thread transforms.
- Cover empty, streaming, room, and Android mobile composer behavior with regression tests.
- Add a patch changeset for the published Fusion package.

Files changed:
 .../fn-7504-mobile-chat-composer-keyboard.md       |   7 +
 packages/dashboard/app/components/ChatView.css     |   4 +
 packages/dashboard/app/components/ChatView.tsx     |  10 ++
 .../components/__tests__/ChatView.mobile.test.tsx  | 191 +++++++++++++++++++++
 4 files changed, 212 insertions(+)

Fusion-Task-Id: FN-7504

Fusion-Task-Lineage: 4e7ed36e-e7d5-4cd1-934b-3b0f19ed6615

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:21 -07:00
gsxdsm
7d8a1b8831 FN-7502: add pinned terminal layout
Adds a persisted pinned terminal mode that places the terminal below the dashboard instead of overlaying it.

- Add a project-scoped below display mode with pin/unpin header controls and resize support.
- Render below-mode terminal in the dashboard flow while preserving overlay behavior for docked, floating, and mobile modes.
- Move terminal utility actions into the header so controls remain available across layouts.
- Document the new terminal pin control and add release-note coverage plus regression tests.

Files changed:
 .changeset/fn-7502-terminal-below-layout.md        |   7 +
 docs/dashboard-guide.md                            |  16 +-
 packages/dashboard/app/App.tsx                     |  22 +-
 packages/dashboard/app/components/AppModals.tsx    |  14 --
 .../dashboard/app/components/ProjectSelector.css   |  12 +
 .../dashboard/app/components/TerminalModal.css     | 108 ++++++---
 .../dashboard/app/components/TerminalModal.tsx     | 246 +++++++++++----------
 .../components/__tests__/TerminalModal.test.tsx    | 100 ++++++++-
 8 files changed, 351 insertions(+), 174 deletions(-)

Fusion-Task-Id: FN-7502

Fusion-Task-Lineage: bb1b5e22-d19f-4af1-aa34-4213bc712384

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:21 -07:00
gsxdsm
d2e3134746 FN-7499: require before-after task summaries
Require generated task specs to summarize the requested before-to-after transformation near the top.

- Add a Before → After Transformation section to standard and fast planning prompt templates.\n- Document the new task definition section and cover it with prompt regression tests.\n- Add a patch changeset for the published Fusion package.\n\nFiles changed:\n .changeset/fn-7499-before-after-transformation.md |  7 +++++++\n docs/task-management.md                           |  1 +\n packages/core/src/__tests__/agent-prompts.test.ts | 17 +++++++++++++++\n packages/core/src/agent-prompts.ts                | 25 +++++++++++++++++++----\n packages/engine/src/__tests__/triage.test.ts      | 20 ++++++++++++++++++\n 5 files changed, 66 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-7499

Fusion-Task-Lineage: d049b5d6-a4bc-40dd-831d-04a11f9dc2cf

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:20 -07:00
gsxdsm
e8dc2ae6d1 FN-7498: show original task prompts in Plan tab
Display the initial task prompt separately from the generated plan in task details.

- Add a read-only Original prompt section above generated PROMPT.md content in task detail Plan views.
- Preserve plain-text formatting and responsive wrapping for original prompts while leaving plan edit/revision controls scoped to generated prompts.
- Cover modal, embedded, empty-state, CSS, docs, and release-note behavior.

Files changed:
 .changeset/fn-7498-original-task-prompt.md         |   7 ++
 docs/dashboard-guide.md                            |   1 +
 .../dashboard/app/components/TaskDetailModal.css   |  30 +++++
 .../dashboard/app/components/TaskDetailModal.tsx   |  18 +++
 ...lModal.inline-editing-and-integrations.test.tsx | 127 ++++++++++++++++++++-
 5 files changed, 182 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-7498

Fusion-Task-Lineage: df83c73d-d731-4ba4-942b-bd93ec1b9712

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:20 -07:00
gsxdsm
61c8bdc117 FN-7497: keep accepted chat streams waiting
Keep accepted-but-silent chat streams waiting so late responses can reconcile without false timeout failures.

- Stop aborting accepted chat streams when the first SSE event timer fires without content.
- Cover desktop, mobile, planner chat, reattach, hook, and SSE parser paths for late accepted responses.
- Add a patch changeset for the chat first-event timeout fix.

Files changed:
 .changeset/fn-7497-chat-first-event-timeout.md     |  7 +++
 .../app/api/__tests__/legacy-chat-stream.test.ts   | 27 ++++++--
 packages/dashboard/app/api/legacy.ts               |  8 ++-
 .../__tests__/ChatView.core-interactions.test.tsx  | 41 +++++++++++++
 .../__tests__/TaskPlannerChatTab.test.tsx          | 71 ++++++++++++++++++++++
 .../dashboard/app/hooks/__tests__/useChat.test.ts  | 41 +++++++++++++
 6 files changed, 188 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-7497

Fusion-Task-Lineage: bb53793d-dc78-4a25-af22-ed1c62b73094

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:20 -07:00
gsxdsm
efa8105036 FN-7495: add settings search
Add a searchable Settings navigation that filters visible sections by setting names and keywords.

- Add a Settings search field with clear and empty-state affordances for desktop and mobile layouts.
- Filter only the already-visible Settings sections while preserving matching group headers and mobile section labels.
- Add searchable section metadata, localized labels, tests, docs, and a release changeset.

Files changed:
 .changeset/fn-7495-settings-search.md              |   7 +
 docs/dashboard-guide.md                            |   5 +
 .../dashboard/app/components/SettingsModal.css     |  97 +++++-
 .../dashboard/app/components/SettingsModal.tsx     | 346 ++++++++++++++++-----
 .../__tests__/SettingsModal.general.test.tsx       |  71 +++++
 .../components/__tests__/settings-mobile.test.tsx  |  25 ++
 .../settings/sections/McpServersCard.tsx           |   2 +-
 packages/i18n/locales/en/app.json                  |  11 +
 8 files changed, 475 insertions(+), 89 deletions(-)

Fusion-Task-Id: FN-7495
Fusion-Task-Lineage: 1d703059-6156-4d20-afbd-3cdb64e3e9f3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:20 -07:00
gsxdsm
5689346afc FN-7490: fix post-merge push target resolution
Fix post-merge push settings so direct merges use the configured push target reliably.

- Resolve remote-only push targets from the merge integration branch, including detached-head merge worktrees.
- Clear hidden stale Push Remote values when Push to remote after merge is disabled while preserving persisted enabled values.
- Add dashboard, API, and merger regression coverage plus operator documentation and a patch changeset.

Files changed:
 .changeset/fn-7490-push-to-remote-setting.md       |   7 ++
 docs/settings-reference.md                         |   6 +-
 .../dashboard/app/components/SettingsModal.tsx     |   5 ++
 .../SettingsModal.scheduling-merge.test.tsx        |  59 +++++++++++-
 .../components/__tests__/settings-mobile.test.tsx  |  30 ++++++-
 .../src/__tests__/routes-settings.test.ts          |  28 ++++++
 .../src/__tests__/merger-prompt-and-utils.test.ts  | 100 ++++++++++++++++++++-
 packages/engine/src/merger.ts                      |  13 ++-
 8 files changed, 238 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-7490

Fusion-Task-Lineage: 774515bc-ea8b-427d-89ac-8d047f0273d4

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:20 -07:00
gsxdsm
8668a053dc FN-7491: add workflow toggle for proactive triage splitting
Add a workflow-scoped policy switch so operators can keep large triage tasks intact unless subtask splitting is explicitly requested.

- Define triageProactiveSubtaskSplittingEnabled with default-on workflow settings, display formatting, and prompt rendering.
- Preserve mandatory breakIntoSubtasks behavior while disabling automatic oversized-task decomposition when the setting is false.
- Cover the new policy in core, engine, and dashboard tests plus settings/workflow docs and a changeset.

Files changed:
 .changeset/FN-7491-triage-splitting-setting.md     |  7 +++
 docs/settings-reference.md                         |  6 +++
 docs/workflow-steps.md                             | 10 ++--
 packages/core/src/__tests__/agent-prompts.test.ts  | 17 ++++--
 .../builtin-workflow-settings-triage.test.ts       | 23 ++++++++
 packages/core/src/agent-prompts.ts                 | 27 ++--------
 packages/core/src/builtin-workflow-settings.ts     | 44 ++++++++++++++++
 .../__tests__/WorkflowSettingsPanel.test.tsx       | 53 +++++++++++++++++++
 .../app/components/workflow-setting-display.ts     | 10 ++++
 .../__tests__/triage-threshold-settings.test.ts    | 28 ++++++++++
 packages/engine/src/__tests__/triage.test.ts       | 61 +++++++++++++++++++---
 11 files changed, 250 insertions(+), 36 deletions(-)

Fusion-Task-Id: FN-7491

Fusion-Task-Lineage: c982455a-685c-4ce2-8e33-6d1a7bb9d154

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:20 -07:00
gsxdsm
b42be87ad1 FN-7493: keep task popups on board layer
Keep task-detail popups below global utility windows while preserving Activity menu visibility.

- Route ordinary task-detail FloatingWindow instances through a lower task-detail z-index band.
- Emit and consume popup geometry-change signals so root-portaled Activity menus stay attached during drag and resize.
- Extend dashboard tests and docs for popup layering and Activity dropdown behavior.

Files changed:
 .changeset/fn-7493-task-popup-layer.md             |  7 +++
 docs/dashboard-guide.md                            |  8 ++-
 docs/settings-reference.md                         |  2 +-
 packages/dashboard/app/App.tsx                     |  4 ++
 .../App.taskDetailFloatingGeometry.test.tsx        | 45 +++++++++++++-
 .../dashboard/app/components/FloatingWindow.tsx    | 31 ++++++++--
 .../dashboard/app/components/TaskDetailModal.css   |  3 +
 .../dashboard/app/components/TaskDetailModal.tsx   | 27 ++++++++-
 .../components/__tests__/FloatingWindow.test.tsx   | 32 +++++++++-
 .../FloatingWindowStack.cross-type.test.tsx        | 48 ++++++++++++---
 .../TaskDetailModal.task-activity-chat.test.tsx    | 68 ++++++++++++++++++++++
 .../app/components/floatingWindowStack.ts          | 22 +++++--
 12 files changed, 272 insertions(+), 25 deletions(-)

Fusion-Task-Id: FN-7493

Fusion-Task-Lineage: 5f1ec72c-f8dc-44ee-b303-319e0faac0f9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:19 -07:00
gsxdsm
978cdda77c FN-7492: show active triage plan review progress
Show triage task cards when Plan Review is actively running.

- Render the existing progress affordance for triage cards only when unified progress has an active item.
- Keep enabled-but-idle workflow steps hidden to avoid false active indicators and empty progress shells.
- Cover running, idle, and empty triage progress states in TaskCard tests.
- Add a patch changeset for the published Fusion package.

Files changed:
 .../FN-7492-task-card-plan-review-progress.md      |  7 +++
 packages/dashboard/app/components/TaskCard.tsx     |  7 ++-
 .../app/components/__tests__/TaskCard.test.tsx     | 73 ++++++++++++++++++++++
 3 files changed, 86 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-7492

Fusion-Task-Lineage: 582aea40-8a14-4571-9a7c-e770bc2ab1fb

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:19 -07:00
gsxdsm
82493e0f62 FN-7488: allow source-free task artifacts to complete
Teach fn_task_done to honor explicit source-free task-artifact contracts without weakening ordinary commit requirements.

- Detect PROMPT-declared gitignored .fusion/tasks-only delivery contracts after completed steps.
- Keep zero-commit refusals for mixed tracked source, docs, config, test, or changeset scope.
- Document the completion contract in executor guidance and architecture notes.
- Add regression coverage for allowed source-free artifacts and refused mixed-scope deliveries.
- Add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7488-source-free-completion.md       |   7 ++
 docs/architecture.md                               |   2 +-
 packages/core/src/agent-prompts.ts                 |   6 ++
 .../__tests__/executor-task-done-invariant.test.ts | 120 +++++++++++++++++++++
 packages/engine/src/executor.ts                    |  61 ++++++++---
 5 files changed, 183 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-7488
Fusion-Task-Lineage: adbf1146-4513-4531-bdd8-ccecbeb42a63
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-04 10:42:19 -07:00
gsxdsm
821a63e447 fix(desktop): stop Windows Terminal popup — worktrunk 'wt' name collision (#1889)
Follow-up to #1883 (merged). The Windows Terminal "Help"/version dialogs
on Windows were **not** caused by the embedded terminal (already
guarded) — the real trigger is the **worktrunk integration**.

## Root cause
Worktrunk's CLI is named `wt` (`WORKTRUNK_BINARY_NAME = "wt"`), which
collides with **Windows Terminal** (`wt.exe`, an App Execution Alias
under `%LOCALAPPDATA%\Microsoft\WindowsApps`, on PATH by default on
Windows 11). Worktrunk resolution runs `where wt` → finds Windows
Terminal → runs `"wt.exe" --version` to probe it → **launches Windows
Terminal**, popping the native "Windows Terminal 1.24.11321.0" dialog.
This fired automatically because the Settings UI fetched
`/api/worktrunk/status` on mount even when worktrunk wasn't in use.

## Fix
1. **Don't probe worktrunk automatically** — `useWorktrunkInstallStatus`
only auto-fetches status when the integration is **enabled** (user
opt-in). A plain Settings/dashboard mount no longer probes.
2. **Engine invariant guard** — `probeWorktrunk` refuses to `exec` a
resolved `wt` that is the Windows Terminal alias, covering every
resolution surface (cached/override/PATH/install/settings-route).
Basename is computed host-independently so the guard holds on POSIX CI
hosts too.
3. The #1883 frontend terminal-auto-create guard is retained as
defense-in-depth.

## Tests
- `worktrunk-installer.test.ts` — `probeWorktrunk` returns `{ok:false}`
for a `WindowsApps\wt.exe` path **without** calling exec; still probes a
genuine `wt` elsewhere; `resolveWorktrunkBinary` never execs `--version`
against a Windows Terminal PATH hit.
- `useWorktrunkInstallStatus.test.ts` — no fetch on mount unless
`enabled`.

Report updated with corrected root cause + Symptom Verification +
Surface Enumeration.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Resolved an issue where Windows Terminal “Help” dialogs could appear
when opening the dashboard or Settings on Windows.
* Worktrunk status checks are now gated behind integration enablement
and re-verified on save when turning it on.
* Added an engine safeguard to prevent probing/launching the Windows
Terminal alias during version checks.
* **Tests**
* Expanded coverage for Windows Terminal collision detection and for
opt-in behavior (including enablement toggles) in the status hook.
* **Documentation**
* Updated desktop release notes with the corrected root cause,
mitigations, and verification details.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-04 08:48:12 -07:00
gsxdsm
88c35218f6 fix: resolve main-branch CI test failures (planning checkpoint + cli flake quarantine) (#1891)
## Summary

Resolves the two failures from the full-suite run on `main` ([run
28697507894](https://github.com/Runfusion/Fusion/actions/runs/28697507894)).

### 1. dashboard `session-reconnect.test.ts` — real bug (deterministic)

The planning *"replays buffered events and supports reconnect catch-up"*
test hung at the 15s timeout.

**Root cause:** FN-7444 (planning summary deepening checkpoint) now
holds the completed planning summary behind a mandatory *"Would you like
to go deeper?"* checkpoint question instead of finalizing when the agent
returns a `"complete"` payload. `continueAgentConversation` calls
`setPendingSummaryCheckpoint`, which sets `session.pendingSummary` + a
checkpoint question and leaves `session.summary` undefined. The SSE
stream route's summary-emit path is therefore never reached, so it
subscribes waiting for a `"complete"` event that never arrives → 15s
hang.

**Fix:** respond to the deepening checkpoint with the reserved proceed
option (`PLANNING_DEEPEN_PROCEED_OPTION_ID`) so `finalizePendingSummary`
runs, `session.summary` is set, and the summary/complete events are
buffered for SSE replay.

- Reproduced locally: 15s timeout before, 4/4 green after.
- `routes-planning.test.ts`, `session-persistence-roundtrip.test.ts`,
`session-reconnect.test.ts` → 116/116 green.

### 2. cli `extension.test.ts` — loaded-lane CI flake (quarantined on
sight)

The built-dist-barrel `fn_task_list` test timed out at 5000ms in shard
4/4 while passing locally (~1.2s body) and in 3 of the 4 surrounding CI
runs.

**Root cause:** in-test dist-barrel recompilation (`vi.resetModules` +
`vi.importActual` of the full `@fusion/core` dist barrel + a fresh
dynamic `import("../extension.js")`) inside the default 5s test timeout.
That work is CPU-bound and degrades non-linearly under 4-shard CI
contention — the same loaded-lane signature rescued in FN-6483 / FN-6705
/ FN-6795 / FN-6839.

**Action:** quarantined on sight per the *Flaky Tests Are Quarantined on
Sight* rule — ledger entry in `scripts/lib/test-quarantine.json` plus
the matching `exclude` in `packages/cli/vitest.config.ts`, in the same
commit. No widened timeout, no retries, no loosened assertions (all
forbidden by the rule). The sibling source-`@fusion/core` test *"bounds
large column-filtered listings"* covers the identical truncation
invariant through source, so the dist-barrel slice's marginal coverage
is dist-resolution, which has been stable.

⚠️ **Collateral:** the file-granular exclude also drops the ~68
otherwise-stable tests in `extension.test.ts` until a rescue before the
2026-07-18 deletion deadline. This matches the project's quarantine
ratchet; the file has been rescued 4× before.

## Verification

- `packages/dashboard` `session-reconnect.test.ts` → 4/4 ✅
- `packages/dashboard` `routes-planning` +
`session-persistence-roundtrip` + `session-reconnect` → 116/116 ✅
- `pnpm test:gate` (engine-core 321 + ci-shape 63) → ✅
- `pnpm test:gate` appeasement-check + changeset-format-check → ✅ (no
changeset needed: test-only changes to a private package)
- cli `extension.test.ts` confirmed excluded post-quarantine.

## Notes

- No changeset: both changes are test-only and don't affect published
`@runfusion/fusion` behavior.
- No production code changed.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved test reliability by keeping a known flaky CLI test out of the
main run, reducing CI timeout-related failures.
* Updated reconnect behavior coverage to better match event replay
expectations after planning updates.
* **Tests**
* Adjusted dashboard session reconnect tests to validate the full
reconnect-and-replay flow more accurately.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-04 08:47:42 -07:00
gsxdsm
7ecf5e2b9c fix: resolve main-branch CI test failures
Two failures surfaced in the full-suite run on main (28697507894):

1. dashboard session-reconnect.test.ts — real bug. The planning
   "replays buffered events" test hung at the 15s timeout because
   FN-7444 (planning summary deepening checkpoint) now holds the
   completed summary behind a mandatory checkpoint question instead
   of finalizing on the agent's "complete" payload. The stream route
   never observed session.summary and subscribed forever. Fix: respond
   to the deepening checkpoint with the reserved proceed option so
   finalizePendingSummary runs, session.summary is set, and the
   summary/complete events are buffered for SSE replay. Reproduced
   locally (15s hang) and verified green (4/4).

2. cli extension.test.ts — loaded-lane CI flake. The built-dist-barrel
   fn_task_list test timed out at 5000ms under 4-shard contention while
   passing locally (~1.2s body) and in 3 of the 4 surrounding runs.
   Root cause is in-test dist-barrel recompilation inside the default
   5s timeout (vi.resetModules + vi.importActual of the full core dist
   + fresh dynamic import), the same signature rescued in
   FN-6483/FN-6705/FN-6795/FN-6839. Quarantined on sight per the
   flaky-test rule (ledger + matching vitest exclude) rather than
   widening the timeout or loosening assertions; the sibling
   source-@fusion/core test covers the identical truncation invariant.
2026-07-04 00:26:49 -07:00
gsxdsm
046d2d3f72 fix: add missing vitest aliases and mock export for CI test failures (#1888)
## Summary

Fixes three root causes behind CI run
[28695362549](https://github.com/Runfusion/Fusion/actions/runs/28695362549)
failures on main.

### 1. droid-cli: missing `@fusion-plugin-examples/droid-runtime` alias
(8 tests)

The droid-cli `index.test.ts` imports
`@fusion-plugin-examples/droid-runtime`, but the droid-cli vitest config
had no source alias. Without the alias, Vite tries to resolve the
package's dist/ exports which don't exist in a source checkout, causing
every droid-cli test that touches the droid runtime to fail.

**Fix:** Added `resolve.alias` entries for
`@fusion-plugin-examples/droid-runtime` and `/probe` subpath to
`packages/droid-cli/vitest.config.ts`.

### 2. CLI: missing `@fusion-plugin-examples/roadmap` aliases

The CLI imports the roadmap plugin (`roadmap-routes.ts`,
`roadmap-suggestions.ts`), but the CLI vitest config was missing source
aliases for `@fusion-plugin-examples/roadmap` and its `/server` and
`/roadmap-suggestions` subpaths.

**Fix:** Added three regex aliases to `packages/cli/vitest.config.ts`.

### 3. CLI: missing `runTaskImportFromGitLab` mock export (73 tests)

The GitLab task import command was added to `bin.ts` and
`commands/task.ts` but `bin.test.ts`'s `vi.mock("../commands/task.js")`
factory was not updated to include the new export, causing 73 tests to
fail with `No "runTaskImportFromGitLab" export is defined on the
"../commands/task.js" mock`.

**Fix:** Added `runTaskImportFromGitLab: vi.fn()` to the hoisted
`commandMocks` and the mock factory in
`packages/cli/src/__tests__/bin.test.ts`.

## Verification

- droid-cli: 232 passed
- CLI bin.test.ts: 74 passed
- CLI broader tests (11 files): 146 passed, 90 skipped
- CLI dashboard-tui tests: 72 passed
- Gate suite (`pnpm test:gate`): 319 engine-core + 63 CI-shape passed

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved test environment module resolution so local source packages
load correctly during CLI and Droid CLI test runs.
* Added support for additional command routing in test coverage, helping
import-related flows dispatch to the right handler.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-03 23:19:43 -07:00
gsxdsm
6b19e36ca1 Address PR review feedback (#1889)
- probeWorktrunk: also refuse a bare wt/wt.exe override on Windows (resolves to
  Windows Terminal via PATH), and tighten the package-dir match from a broad
  'windowsterminal' substring to 'microsoft.windowsterminal' so a genuine
  worktrunk under an unrelated *windowsterminal* folder is still probed.
- Fix worktrunk enable deadlock/save-race: probe status when the user views the
  Worktrees section (not gated on 'enabled', which deadlocked since the toggle is
  disabled until status==installed), and re-verify on Save so a fast enable+save
  can't silently persist enabled:false. Hook 'refresh' now returns the fetched
  status and is exposed.
- Tests: bare-wt refusal, forward-slash Windows Terminal path, unrelated
  windowsterminal-folder is probed, and a rerender enabled false->true probe-once
  transition; update SettingsModal mocks for the new refresh().

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 23:16:58 -07:00
gsxdsm
89123997b9 fix(desktop): stop Windows Terminal popup — real cause is worktrunk 'wt' name collision
The 1882/1883 terminal-auto-create guard fixed the wrong subsystem; the
embedded terminal was already guarded. The actual trigger: worktrunk's CLI is
named 'wt', colliding with Windows Terminal (wt.exe) on PATH, so probing it with
'wt --version' launched Windows Terminal and popped its native version dialog —
fired automatically by the Settings worktrunk-status fetch on mount.

- useWorktrunkInstallStatus: only auto-fetch /api/worktrunk/status when the
  integration is enabled (user opt-in), never on a plain Settings/dashboard mount.
- probeWorktrunk: refuse to exec a resolved 'wt' that is the Windows Terminal
  alias (WindowsApps / WindowsTerminal package dir), covering every resolution
  surface (cached/override/PATH/install/settings-route). Basename computed
  host-independently so the guard holds when the build host is POSIX.
- Tests for both guards; report updated with corrected root cause + Symptom
  Verification + Surface Enumeration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 22:51:48 -07:00
gsxdsm
1a5f7e3b52 fix: add missing vitest aliases and mock export for CI test failures
Three root causes behind CI run 28695362549 failures:

1. droid-cli: 8 tests fail with 'Failed to resolve entry for
   @fusion-plugin-examples/droid-runtime'. The droid-cli vitest config
   had no source alias for the droid-runtime plugin, so Vite tried to
   resolve non-existent dist/ exports.

2. CLI: multiple tests fail with 'Failed to resolve entry for
   @fusion-plugin-examples/roadmap'. The CLI vitest config was missing
   source aliases for the roadmap plugin (., /server, /roadmap-suggestions).

3. CLI: 73 bin.test.ts tests fail with 'No runTaskImportFromGitLab export
   is defined on the ../commands/task.js mock'. The GitLab import command
   was added to bin.ts and task.ts but the bin.test.ts mock was not
   updated to include the new export.
2026-07-03 22:40:36 -07:00
gsxdsm
20184acdfd FN-7486: fix no-diff merge recovery ownership checks
Fix no-op task branch recovery by recognizing canonical branches with no unique diff before rejecting inherited foreign trailers.

- Add no-diff ownership classification for already-merged detection when canonical task branches inherit another task's landed commit.
- Teach self-healing and branch-misbound recovery to ignore foreign branch-tip trailers only for branches proven to have no unique task diff.
- Skip synthetic verify:fast typechecks for JavaScript alias packages without tsconfig files and cover the behavior with tests.
- Add regression coverage and a patch changeset for the recovery fix.

Files changed:
 .changeset/fn-7486-merge-recovery-noop-ownership.md       |  7 ++
 .../already-merged-detector.real-git.test.ts       | 68 +++++++++++++++++
 .../self-healing-already-merged.real-git.test.ts   | 89 ++++++++++++++++++++--
 packages/engine/src/already-merged-detector.ts     | 88 +++++++++++++++------
 packages/engine/src/self-healing.ts                | 61 +++++++++++++--
 scripts/__tests__/verify-fast.test.mjs             | 16 +++-
 scripts/verify-fast.mjs                            | 15 +++-
 7 files changed, 303 insertions(+), 41 deletions(-)

Fusion-Task-Id: FN-7486

Fusion-Task-Lineage: 4185c6ed-9731-4ffc-b033-34bf0c3a83ad

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 22:04:45 -07:00
gsxdsm
b42ba9f515 FN-7485: keep Activity menu open on mobile iOS
Keep the task-detail Activity view picker usable during mobile iOS opening taps.

- Add a short visualViewport opening guard for the root-portaled Activity views menu while preserving normal close behavior afterward.
- Reset menu position and guard state consistently on outside click, Escape, selection, task changes, and tab toggles.
- Cover the iOS visualViewport echo, portal/CSS contract, and documentation plus a patch changeset.

Files changed:
 .changeset/activity-menu-ios.md                    |   7 +
 docs/dashboard-guide.md                            |   3 +-
 .../dashboard/app/components/TaskDetailModal.tsx   |  68 +++++++---
 .../__tests__/TaskDetailModal.css.test.ts          |   9 +-
 .../TaskDetailModal.task-activity-chat.test.tsx    | 141 ++++++++++++++++++++-
 5 files changed, 210 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-7485

Fusion-Task-Lineage: 291331c4-453c-481b-b991-41f57db23e3b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:48:30 -07:00
gsxdsm
0f05156cb7 FN-7482: recover retryable review remediation failures
Recover retryable Code Review remediation failures so review tasks do not remain stranded after graph restarts.

- Route retryable pre-merge remediation graph failures back through the existing fix-pass handoff when durable failed gate evidence remains.
- Let self-healing revive parked Code Review and browser-verification remediation failures while excluding Plan Review replan failures and exhausted numeric caps.
- Document the remediation recovery behavior and add targeted executor/self-healing regression coverage.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fn-7482-code-review-remediation.md      |   7 ++
 docs/workflow-steps.md                             |   7 +-
 .../__tests__/executor-graph-requeue-gate.test.ts  | 129 ++++++++++++++++++++-
 packages/engine/src/__tests__/self-healing.test.ts | 129 +++++++++++++++++++++
 packages/engine/src/executor.ts                    | 101 ++++++++++++++++
 packages/engine/src/self-healing.ts                |  24 +++-
 6 files changed, 387 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-7482

Fusion-Task-Lineage: 0f178ab6-308e-4587-b5f3-be4e621799a0

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:47:00 -07:00
gsxdsm
34d071deef FN-7484: update manual routine callback assertions
Refresh routine runner server tests for the live manual trigger callback contract.

- Add a shared helper that asserts manual routine triggers receive live progress callbacks.
- Update global and project routine run/trigger route expectations for the two-argument triggerManual signature.

Files changed:
 packages/dashboard/src/__tests__/server.test.ts | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-7484

Fusion-Task-Lineage: a8592349-d204-4b91-a004-4d53f56b0692

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:47:00 -07:00
gsxdsm
b4b1f6d7ae FN-7476: fix desktop engine availability banner
Treat desktop embedded engine managers as automation-capable during startup so the dashboard avoids false remediation.

- Report process-level engine availability when a modern manager can lazily start or is starting project engines.\n- Keep project-scoped status details on /api/engine/status while hiding the dashboard-only unavailable banner in desktop mode.\n- Add dashboard health polling, banner, server health, and changeset coverage for the desktop false-banner regression.\n\nFiles changed:\n .changeset/fn-7476-desktop-engine-banner.md        |  7 +++++++\n .../dashboard/__tests__/DashboardBanners.test.tsx  | 18 ++++++++++++++++\n .../app/hooks/__tests__/useDashboardHealth.test.ts | 24 +++++++++++++++++++++-\n packages/dashboard/src/__tests__/server.test.ts    | 24 ++++++++++++++++++----\n packages/dashboard/src/server.ts                   |  9 +++++---\n 5 files changed, 74 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-7476

Fusion-Task-Lineage: d54a9872-252b-44c5-9c6d-6168b65118c7

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:47:00 -07:00
gsxdsm
e8b73623d4 FN-7477: clarify desktop remote server setup
Clarifies the desktop Connection Manager so local mode is distinct from adding saved remote servers.

- Split the desktop local server card from the remote server profile flow and keep the editor closed until adding or editing a remote.
- Add desktop-specific remote server copy, accessible labels with profile URLs, and responsive styling for the revised layout.
- Update Connection Manager tests, native shell docs, localized strings, resource types, and the Fusion changeset.

Files changed:
 .changeset/fn-7477-connection-manager-clarity.md   |   7 +
 docs/native-shell.md                               |   5 +-
 .../components/NativeShellConnectionManager.css    |  65 ++++++---
 .../components/NativeShellConnectionManager.tsx    | 153 ++++++++++++--------
 .../NativeShellConnectionManager.test.tsx          | 156 +++++++++++++++------
 packages/i18n/locales/en/app.json                  |  15 +-
 packages/i18n/locales/es/app.json                  |  15 +-
 packages/i18n/locales/fr/app.json                  |  15 +-
 packages/i18n/locales/ko/app.json                  |  15 +-
 packages/i18n/locales/zh-CN/app.json               |  15 +-
 packages/i18n/locales/zh-TW/app.json               |  15 +-
 packages/i18n/src/resources.d.ts                   |  13 +-
 12 files changed, 334 insertions(+), 155 deletions(-)

Fusion-Task-Id: FN-7477

Fusion-Task-Lineage: adc2df09-d713-4ccd-8fb6-20a32c6a553e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:47:00 -07:00
gsxdsm
a2b09f277d FN-7479: route dock task clicks to popups
Make right-dock task list clicks follow the task popup preference.

- Thread popup routing into the right-dock Tasks list while preserving embedded dock detail when popups are disabled.
- Cover popup-enabled and popup-disabled dock list behavior with controller tests.
- Update settings copy, operator docs, and release notes for the expanded popup setting scope.

Files changed:
 .changeset/fn-7479-right-dock-task-popup.md        |   7 ++
 docs/dashboard-guide.md                            |   7 +-
 docs/settings-reference.md                         |   4 +-
 packages/dashboard/app/App.tsx                     |   2 +-
 .../app/components/__tests__/RightDock.test.tsx    | 129 +++++++++++++++++++++
 .../settings/sections/AppearanceSection.tsx        |   4 +-
 .../app/components/useRightDockController.tsx      |  21 +++-
 7 files changed, 163 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-7479

Fusion-Task-Lineage: 953f6a77-8cb9-409e-be4b-f1dbdc6e1b42

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:47:00 -07:00
gsxdsm
50cdab17b9 FN-7474: add GitHub onboarding action choices
Add first-run onboarding paths for GitHub OAuth and GitHub CLI setup while preserving existing GitHub warning behavior.

- Add a GitHub onboarding action model for OAuth, authenticated gh CLI, unauthenticated gh CLI, missing gh CLI, and skip states.
- Render in-flow GitHub OAuth connection, gh auth login guidance, and gh CLI install guidance with mobile styling and coverage.
- Update onboarding docs, locale resources, and the release changeset as a minor user-facing feature.
- Preserve the one-day GitHub warning-delay copy and dashboard OAuth browser behavior docs from main.

Files changed:
 .changeset/fn-7474-github-onboarding-actions.md    |   7 +
 docs/dashboard-guide.md                            |   2 +-
 docs/getting-started.md                            |   2 +-
 packages/cli/vitest.config.ts                      |  12 ++
 .../app/components/ModelOnboardingModal.css        |  68 ++++++++-
 .../app/components/ModelOnboardingModal.tsx        | 153 +++++++++++++++++++--
 .../__tests__/ModelOnboardingModal.test.tsx        | 101 +++++++++++++-
 packages/dashboard/vitest.config.ts                |  20 +++
 packages/i18n/locales/en/app.json                  |  11 +-
 packages/i18n/locales/es/app.json                  |  11 +-
 packages/i18n/locales/fr/app.json                  |  11 +-
 packages/i18n/locales/ko/app.json                  |  11 +-
 packages/i18n/locales/zh-CN/app.json               |  11 +-
 packages/i18n/locales/zh-TW/app.json               |  11 +-
 packages/i18n/src/resources.d.ts                   |  11 +-
 15 files changed, 413 insertions(+), 29 deletions(-)

Fusion-Task-Id: FN-7474

Fusion-Task-Lineage: c06d3db5-da4b-43f7-8b74-a41f6a041029

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:46:59 -07:00
gsxdsm
ced783ea79 FN-7473: open desktop Anthropic OAuth in browser
Route desktop OAuth popups to the system browser while preserving Anthropic subscription login polling.\n\n- Add Electron window-open handling that keeps internal Fusion navigation in-app and external http(s) OAuth URLs in the system browser.\n- Cover Anthropic Subscription polling so login-in-progress states do not show a false incomplete-login toast.\n- Document desktop OAuth browser handoff behavior and add a patch changeset.\n\nFiles changed:\n .../fn-7473-desktop-anthropic-oauth-browser.md     |  7 ++\n docs/dashboard-guide.md                            |  2 +-\n docs/settings-reference.md                         |  2 +-\n .../__tests__/SettingsModal.models-auth.test.tsx   | 76 ++++++++++++++++++++++\n .../desktop/src/__tests__/main-integration.test.ts |  2 +\n .../desktop/src/__tests__/main-local-mode.test.ts  |  3 +-\n .../desktop/src/__tests__/main.integration.test.ts |  2 +\n packages/desktop/src/__tests__/main.test.ts        | 54 ++++++++++++++-\n packages/desktop/src/main.ts                       | 60 +++++++++++++++++-\n 9 files changed, 203 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-7473

Fusion-Task-Lineage: 3d6b0acd-536c-4f7d-8c6b-35eb519b46bb

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:45:21 -07:00
gsxdsm
315f3bc32c FN-7470: show Git prerequisite during onboarding
Add Git availability checks to the first-run GitHub onboarding flow so missing host prerequisites are visible before project setup.

- Probe the server-host Git CLI with a bounded core helper and expose status through the auth status API.
- Render ready/missing Git prerequisite guidance in the GitHub onboarding step with install instructions and localized strings.
- Cover the probe, auth route, and onboarding UI states with regression tests, docs, and a changeset.

Files changed:
 .changeset/fn-7470-git-onboarding.md               |  7 ++
 docs/dashboard-guide.md                            |  2 +
 docs/getting-started.md                            |  2 +-
 packages/core/src/__tests__/git-cli-status.test.ts | 83 +++++++++++++++++++++
 packages/core/src/git-cli-status.ts                | 56 ++++++++++++++
 packages/core/src/index.ts                         |  7 ++
 packages/dashboard/app/api/legacy.ts               |  8 ++
 .../app/components/ModelOnboardingModal.css        | 59 +++++++++++++++
 .../app/components/ModelOnboardingModal.tsx        | 53 ++++++++++++-
 .../__tests__/ModelOnboardingModal.test.tsx        | 87 ++++++++++++++++++++++
 .../dashboard/src/__tests__/routes-auth.test.ts    | 62 ++++++++++++++-
 .../dashboard/src/routes/register-auth-routes.ts   | 13 +++-
 packages/i18n/locales/en/app.json                  | 11 ++-
 packages/i18n/locales/es/app.json                  | 44 ++++++++++-
 packages/i18n/locales/fr/app.json                  | 44 ++++++++++-
 packages/i18n/locales/ko/app.json                  | 44 ++++++++++-
 packages/i18n/locales/zh-CN/app.json               | 44 ++++++++++-
 packages/i18n/locales/zh-TW/app.json               | 44 ++++++++++-
 packages/i18n/src/resources.d.ts                   |  9 +++
 19 files changed, 661 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-7470
Fusion-Task-Lineage: 56d6f118-0d82-4f89-bcaa-b01e72a1bf8b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:45:21 -07:00
gsxdsm
50786f29d4 FN-7475: delay GitHub setup warnings
Delay dashboard GitHub setup warnings until the project grace period expires while keeping AI setup warnings immediate.

- Add per-project GitHub warning delay state and persistence.
- Route dashboard GitHub warnings to Settings → Authentication with a Connect GitHub action.
- Hide non-actionable GitHub-only warnings in the New Task modal and update localized copy, docs, and tests.

Files changed:
 .changeset/fn-7475-github-setup-warning.md         |   7 ++
 docs/dashboard-guide.md                            |   6 +
 packages/dashboard/app/App.tsx                     |  11 +-
 packages/dashboard/app/components/NewTaskModal.tsx |   8 +-
 .../app/components/SetupWarningBanner.css          |  10 ++
 .../app/components/SetupWarningBanner.tsx          |  18 ++-
 .../app/components/__tests__/NewTaskModal.test.tsx |  46 ++++++-
 .../__tests__/SetupWarningBanner.test.tsx          |  40 ++++++
 .../app/components/dashboard/DashboardBanners.tsx  |   3 +
 .../dashboard/__tests__/DashboardBanners.test.tsx  | 125 ++++++++++++++++++-
 .../dashboard/app/components/dashboard/types.ts    |   1 +
 .../__tests__/useGithubSetupWarningDelay.test.ts   | 134 +++++++++++++++++++++
 .../app/hooks/useGithubSetupWarningDelay.ts        |  96 +++++++++++++++
 packages/dashboard/app/utils/projectStorage.ts     |   1 +
 packages/i18n/locales/en/app.json                  |   5 +-
 packages/i18n/locales/es/app.json                  |   5 +-
 packages/i18n/locales/fr/app.json                  |   5 +-
 packages/i18n/locales/ko/app.json                  |   5 +-
 packages/i18n/locales/zh-CN/app.json               |   5 +-
 packages/i18n/locales/zh-TW/app.json               |   5 +-
 packages/i18n/src/resources.d.ts                   | 127 +++++++++++++------
 21 files changed, 606 insertions(+), 57 deletions(-)

Fusion-Task-Id: FN-7475
Fusion-Task-Lineage: 5bf1fffa-b58c-42a1-b170-367a4c20eaaf
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:45:21 -07:00
gsxdsm
0900a38630 FN-7478: add local server desktop switch option
Restore the desktop connection manager's local server destination alongside saved remotes.

- Add a Local Server card for desktop-shell switching with active state handling.
- Switch remote profile selection into remote mode before activating the profile.
- Cover desktop local/remote switching behavior with tests and localized labels.
- Document the switch-server local option and add the published package changeset.

Files changed:
 .changeset/fn-7478-local-server-switch-option.md   |  7 +++
 docs/native-shell.md                               |  3 +-
 .../components/NativeShellConnectionManager.css    | 19 ++++++
 .../components/NativeShellConnectionManager.tsx    | 55 ++++++++++++++---
 .../NativeShellConnectionManager.test.tsx          | 71 ++++++++++++++++++++--
 packages/i18n/locales/en/app.json                  |  5 +-
 packages/i18n/locales/es/app.json                  |  5 +-
 packages/i18n/locales/fr/app.json                  |  5 +-
 packages/i18n/locales/ko/app.json                  |  5 +-
 packages/i18n/locales/zh-CN/app.json               |  5 +-
 packages/i18n/locales/zh-TW/app.json               |  5 +-
 packages/i18n/src/resources.d.ts                   |  3 +
 12 files changed, 168 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-7478

Fusion-Task-Lineage: 86a94faa-4799-46cc-aaed-b7901ee9698c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:45:21 -07:00
gsxdsm
52dbc0e65e FN-7472: quit Windows desktop runtime on window close
Ensure Windows Desktop treats window close as application shutdown.

- Allow Windows BrowserWindow close events to proceed so Electron emits quit lifecycle hooks.
- Keep non-Windows close-to-tray behavior while documenting platform-specific close semantics.
- Cover native, renderer, tray, and runtime cleanup paths with desktop tests.

Files changed:
 .changeset/fn-7472-windows-desktop-close-quits.md |   7 ++
 packages/desktop/README.md                        |  10 +-
 packages/desktop/src/__tests__/ipc.test.ts        |   9 ++
 packages/desktop/src/__tests__/main.test.ts       |  76 ++++++++++++++-
 packages/desktop/src/__tests__/tray.test.ts       | 110 +++++++++++++++++++++-
 packages/desktop/src/main.ts                      |   8 ++
 packages/desktop/src/tray.ts                      |   4 +
 7 files changed, 214 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-7472
Fusion-Task-Lineage: c007e20f-37b9-435e-861d-1665e2691bc9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:45:21 -07:00
gsxdsm
b800f7d0df FN-7469: select newly created project directories
Project setup now targets folders immediately after they are created from the directory picker.

- Add an opt-in DirectoryPicker mode that selects the API-returned created folder path.
- Enable the mode for setup wizard and project setup forms while preserving other picker behavior.
- Clear wizard path errors on path changes and document the setup behavior.
- Cover created-folder selection and default-picker preservation with dashboard tests.

Files changed:
 .../fn-7469-select-created-project-directory.md    |   7 ++
 docs/dashboard-guide.md                            |   2 +
 docs/getting-started.md                            |   1 +
 .../dashboard/app/components/DirectoryPicker.tsx   |  16 +++-
 .../dashboard/app/components/SetupProjectForm.tsx  |   1 +
 .../dashboard/app/components/SetupWizardModal.tsx  |   3 +-
 .../components/__tests__/DirectoryPicker.test.tsx  | 101 +++++++++++++++++----
 .../components/__tests__/SetupProjectForm.test.tsx |  10 ++
 .../components/__tests__/SetupWizardModal.test.tsx |  43 ++++++++-
 9 files changed, 162 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-7469

Fusion-Task-Lineage: 1883262f-3fdf-4583-9bb0-e9435039e17d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-03 21:45:20 -07:00