Commit Graph

61 Commits

Author SHA1 Message Date
gsxdsm
bac7049822 chore(release): v0.46.0
Version bump via changesets.
2026-06-23 12:27:50 -07:00
gsxdsm
b599b6ab41 chore(release): v0.45.0
Version bump via changesets.
2026-06-23 01:07:59 -07:00
gsxdsm
ee9c8ab7d5 fix(dashboard): align view headers and pane spacing 2026-06-22 12:43:32 -07:00
gsxdsm
4850e4309e fix(dashboard): apply code-review fixes + live UI tweaks
Code review (8 reviewers) fixes:
- P1: embedded board task-detail now passes onRequestClose so delete/merge/retry dismiss the panel (no ghost task).
- P1: RightDock + TerminalModal drag handlers add pointercancel + unmount teardown (no leaked document listeners / rAF / stuck userSelect); remove dead onOpenChange prop.
- Planning slot DOM-poll interval now caps (self-cancels on mobile); heartbeat slider persist debounced + mounted-guarded.
- Cleanup: remove dead ViewHeader-migration CSS (Skills/Insights), extract shared GithubIcon, move Activity Log embedded CSS to ActivityLogModal.css, FNXC date-format fixes, AGENTS lazy-view note.
- Update stale RightDock roster tests + LeftSidebarNav 'Compound Eng' test to current behavior.

Live UI tweaks:
- Default load lands on board, never the Command Center Dashboard.
- View Board/View Agents moved to the Command Center Overview tab (under the live-activity strip).
- Heartbeat card full-width with spaced, wrapping controls.
- Dev Server panel scrolls in the dock; ChatView right-pane title takes the full line.
- Files pop-out renders deterministic left-right two-pane.
- Mailbox list pane narrower + narrow by default; Add Goal button height matches the Compound stage button; Memory Working-Memory tab no longer overlaps; Skills view fills full width.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:57:10 -07:00
gsxdsm
fe98a2a699 feat(compound-plugin): use shared ViewHeader for a consistent view header
Compound Engineering plugin view now renders the dashboard's shared ViewHeader (Sparkles icon + title) so it matches the other main-content views. Expose ViewHeader via the dashboard exports map; resolve it in the plugin via an ambient interop declaration (no host runtime dependency). Tests updated (plugin suite green).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:34:16 -07:00
gsxdsm
8b5b9a75ad Build Compound Engineering plugin dist before its tests
dist-freshness.test.ts reads the plugin's compiled dist/settings.js and
dist/session/orchestrator.js to guard against stale dist (FN-6596), but the
plugin had no pretest build and was missing from ensure-test-artifacts.mjs.
On a fresh CI checkout dist/ does not exist, so the guard threw "dist/ is
missing" — failing the non-blocking Full Suite on every main commit.

Register the plugin's required artifacts in ensure-test-artifacts.mjs and add
a `pretest` hook that builds them, matching the dependency-graph / hermes /
openclaw plugins. Verified locally: with dist/ absent, `pnpm --filter
@fusion-plugin-examples/compound-engineering test` now builds dist via the
pretest and all 192 plugin tests pass (incl. the two dist-freshness cases).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 20:47:32 -07:00
gsxdsm
4373946a07 chore(release): v0.44.0
Version bump via changesets.
2026-06-19 07:34:26 -07:00
gsxdsm
1020b3f83f FN-6606: restore CE sync lane coverage
Restore the compound-engineering broad lane tests after the timeout could not be reproduced on the stabilized shared test infrastructure.

- Re-enable the compound-engineering sync and work-bridge tests by clearing their Vitest quarantine excludes.
- Remove the stale quarantine ledger entries now that the broad package lane stayed stable under verification.

Files changed:
 plugins/fusion-plugin-compound-engineering/vitest.config.ts | 10 ++++------
 scripts/lib/test-quarantine.json                            | 13 +------------
 2 files changed, 5 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-6606

Fusion-Task-Lineage: f357c626-c181-44a7-a463-c53644566ca1
2026-06-17 20:19:55 -07:00
gsxdsm
48da420414 FN-6593: delete unresolved flaky test quarantines
Delete unresolved quarantined flaky tests under the deletion ratchet while preserving newer active quarantines.

- Remove four flaky test files that were not rescued before the ratchet follow-up.
- Drop their matching Vitest excludes and quarantine ledger entries.
- Preserve later sync, work-bridge, and core quarantine records from main.

Files changed:
 .../src/__tests__/github-tracking-hook.test.ts     | 592 ---------------------
 packages/dashboard/vitest.config.ts                |   8 +-
 .../src/__tests__/cli-agent-executor.test.ts       | 404 --------------
 packages/engine/vitest.config.ts                   |   5 +-
 .../src/__tests__/orchestrator-flow.test.ts        | 156 ------
 .../src/__tests__/skill-wiring.test.ts             | 101 ----
 .../vitest.config.ts                               |   6 +-
 scripts/lib/test-quarantine.json                   |  20 -
 8 files changed, 13 insertions(+), 1279 deletions(-)

Fusion-Task-Id: FN-6593

Fusion-Task-Lineage: 1165ba24-894a-4cc9-b678-50ae1625ba6b
2026-06-17 17:37:08 -07:00
gsxdsm
cc793987b2 FN-6596: guard compound engineering debug launches
Guard Compound Engineering debug stage launches against stale stage settings and artifacts.

- Add source-level coverage proving stale enabledStages snapshots do not block registered CE stages, including debug.
- Add dist freshness checks for the disabledStages opt-out launch model so stale compiled plugin artifacts fail fast.
- Mirror newly observed core suite-load flakes in the quarantine ledger and Vitest excludes.

Files changed:
 packages/core/vitest.config.ts                     |  5 ++
 .../src/__tests__/dist-freshness.test.ts           | 38 +++++++++++++++
 .../src/__tests__/stage-launch-guard.test.ts       | 57 ++++++++++++++++++++++
 scripts/lib/test-quarantine.json                   | 10 ++++
 4 files changed, 110 insertions(+)

Fusion-Task-Id: FN-6596

Fusion-Task-Lineage: 3cd75e5f-c6f8-4bde-8202-54eeac82b894
2026-06-17 17:21:22 -07:00
gsxdsm
822d5d1872 fix(FN-6587): stabilize test lanes under production env
Normalize spawned Vitest processes to NODE_ENV=test so React/jsdom lanes do not inherit release-shell production mode. Split the compound-engineering plugin Vitest projects so Node-only setup and teardown only run in Node lanes, and quarantine the remaining broad-lane CE timeout flakes under the deletion ratchet.
2026-06-17 17:13:13 -07:00
gsxdsm
d8b80d0bfe FN-6587: quarantine compound-engineering timeout flakes
Quarantine compound-engineering timeout flakes from the broad test workflow.

- Add the compound-engineering orchestrator and skill-wiring tests to the quarantine ledger.
- Exclude the quarantined tests from the compound-engineering node Vitest project without changing timeouts or retries.
- Document the quarantine requirement next to the Vitest excludes.

Files changed:
 .../fusion-plugin-compound-engineering/vitest.config.ts   | 15 ++++++++++++++-
 scripts/lib/test-quarantine.json                          | 10 ++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6587

Fusion-Task-Lineage: 5aeb0202-8330-4a93-bdab-675c81b9cb54
2026-06-17 14:52:56 -07:00
gsxdsm
05fe6e5e0c FN-6575: make CE stage gating opt-out
Make Compound Engineering stage launch gating opt-out so registered stages like debug remain launchable by default.

- Replace enabledStages settings schema with disabledStages defaults and docs.
- Derive launchable stages from the live registry minus explicit disabled opt-outs.
- Update orchestrator gating, exports, tests, and plugin docs for the new setting.
- Add a patch changeset for the Compound Engineering plugin behavior fix.

Files changed:
 .changeset/fn-6575-ce-stage-optout.md              |  5 ++++
 docs/plugins/compound-engineering.md               |  4 +--
 .../fusion-plugin-compound-engineering/README.md   |  9 ++++--
 .../manifest.json                                  |  8 +++---
 .../src/__tests__/manifest.test.ts                 |  2 +-
 .../src/__tests__/settings.test.ts                 | 33 +++++++++++++---------
 .../src/__tests__/skill-wiring.test.ts             | 21 +++++++++++++-
 .../src/index.ts                                   |  1 +
 .../src/session/orchestrator.ts                    |  9 ++++--
 .../src/settings.ts                                | 33 ++++++++++++++--------
 10 files changed, 87 insertions(+), 38 deletions(-)

Fusion-Task-Id: FN-6575

Fusion-Task-Lineage: 903732d7-4ffb-4c8f-ba3e-e517d88bc644
2026-06-17 14:52:55 -07:00
gsxdsm
89171e0f16 FN-6531: polish Compound Engineering dashboard UI
Align the bundled Compound Engineering plugin with Fusion dashboard spacing, radius, and control conventions.

- Apply shared dashboard card, button, icon button, and input classes to CE panels and controls.
- Replace ad-hoc CE layout spacing and radius values with dashboard design tokens across desktop and mobile surfaces.
- Document the plugin's theme consistency expectations and add tests that guard representative spacing, radius, and textarea token usage.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fn-6531-compound-engineering-ui.md      |   5 +
 docs/plugins/compound-engineering.md               |   5 +
 .../src/dashboard/CeFlow.tsx                       |  10 +-
 .../src/dashboard/CompoundEngineeringView.css      | 203 ++++++++++++++-------
 .../src/dashboard/CompoundEngineeringView.tsx      |  11 +-
 .../src/dashboard/__tests__/theme-tokens.test.ts   |  46 +++++
 6 files changed, 215 insertions(+), 65 deletions(-)

Fusion-Task-Id: FN-6531

Fusion-Task-Lineage: be99bbaa-0842-4598-b0a1-4f41816b032b
2026-06-17 03:36:14 -07:00
gsxdsm
e353079829 FN-6506: add Compound Engineering debug sessions
Add a bundled CE debug stage and skill so operators can launch root-cause investigation sessions from Compound Engineering.

- Register the debug stage with stage metadata, default enabled settings, and dashboard coverage.
- Bundle the ce-debug skill and expose its trigger patterns with reachability and wiring tests.
- Document the new debug flow and add registry coverage for the stage catalog.

Files changed:
 .../fusion-plugin-compound-engineering/README.md   |   7 +-
 .../manifest.json                                  |   4 +-
 .../src/__tests__/manifest.test.ts                 |   1 +
 .../src/__tests__/skill-reachability.test.ts       |  31 +++--
 .../src/__tests__/skill-wiring.test.ts             |  65 ++++++----
 .../src/__tests__/stage-registry.test.ts           |  30 +++++
 .../src/dashboard/__tests__/StageLauncher.test.tsx |   7 +-
 .../src/session/stage-registry.ts                  |  13 ++
 .../src/skills.ts                                  |  13 ++
 .../src/skills/ce-debug/SKILL.md                   | 144 +++++++++++++++++++++
 10 files changed, 273 insertions(+), 42 deletions(-)

Fusion-Task-Id: FN-6506
Fusion-Task-Lineage: d65a238e-83a2-4664-9e97-01244c9df087
2026-06-16 20:28:02 -07:00
gsxdsm
8d228fc212 Merge pull request #1679 from Runfusion/fix/full-suite-schema-and-cancel-error
fix: repair two post-merge Full Suite failures
2026-06-15 16:57:35 +08:00
gsxdsm
f80b301af2 chore(release): v0.43.1
Version bump via changesets.
2026-06-14 22:43:49 -07:00
gsxdsm
62335f8814 fix: repair two post-merge Full Suite failures
The non-blocking Full Suite tier on main was red on shards 2 and 4:

- roadmap-store schema assertion lagged core's SCHEMA_VERSION bump to 117
  (landed in FN-6277), so it still expected 116.
- useCeSessions "cancel surfaces a transport error" failed deterministically:
  a session with an in-flight status keeps the poll fallback running, and a
  successful background list refresh called setError(undefined), wiping the
  cancel error before it could be observed. Background refreshes (poll + push)
  now leave action errors intact; only user-initiated/initial refreshes clear.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 15:56:26 -07:00
gsxdsm
4482425d4b chore(release): v0.43.0
Version bump via changesets.
2026-06-14 00:43:13 -07:00
gsxdsm
dd0ceec7dd Merge main: keep ce-* agent install alongside stale-session recovery; address PR review
Resolves the onLoad conflict in the compound-engineering plugin by keeping both
the bundled ce-* persona-def install (this branch) and main's
recoverStaleSessionsForContext call.

Also addresses PR #1672 review feedback:
- executor: sentinel resume now guards on !live.paused (mirrors
  runAwaitInputNode) so a still-paused task can't consume a reply and re-enter
  the skill early.
- TaskCard: make the Answer-questions button text/title/aria-label fallbacks
  consistent ("Answer questions") for label-in-name a11y; update test.
- ce-work: replace the unshipped `skill: ce-worktree` reference with the real
  git worktree commands so Option B can't dead-end.
- ce-resolve-pr-feedback: invoke bundled scripts by absolute path via the new
  FUSION_CE_SKILLS_DIR env (sessions run with cwd=projectRoot); add the Fusion
  await-input sentinel path instead of AskUserQuestion for workflow steps;
  normalize whitespace-only review bodies like PR comments.
- plugin: expose FUSION_CE_SKILLS_DIR (installed skills root) to step sessions.
- plan doc: add language to fenced block (markdownlint MD040).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 16:08:51 -07:00
gsxdsm
69ddee0d92 Merge pull request #1671 from plarson/fix/ce-recover-stale-active-sessions
fix(ce): recover stale active sessions
2026-06-13 14:52:27 -07:00
gsxdsm
43c54290a9 chore(release): v0.42.0
Version bump via changesets.
2026-06-13 12:11:05 -07:00
Phil Larson
65a4c51c98 fix(ce): recover stale active sessions
Recover persisted Compound Engineering active/launching sessions that outlived their live agent handles on plugin load and session reads.
2026-06-13 10:59:32 -07:00
gsxdsm
e24a3e8150 feat(skills): teach ce-plan/ce-work/ce-code-review the Fusion step conventions (U5)
In a Fusion workflow step (FUSION_WORKFLOW_STEP set), the skills now:
- emit a ===FUSION_AWAIT_INPUT=== block instead of calling AskUserQuestion
  into the void (Fusion pauses the task + surfaces it on the card; U6/U7),
  and take the assumptions path when FUSION_HEADLESS is set;
- dispatch sub-agents via fn_spawn_agent with systemPromptOverride read
  from FUSION_CE_AGENTS_DIR/<persona>.md (U2/U3), falling back to inline
  single-agent work when the dir/def is absent.

This is the keystone that makes the U1/U2/U3 plumbing actually used.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 08:59:35 -07:00
gsxdsm
5104e67935 feat(plugin): install ce-* persona defs + expose dir to step sessions (U3)
Vendor the 43 ce-* persona definitions (from compound-engineering 3.9.4),
add installBundledCeAgents() mirroring the skill installer (pinned,
plugin-local, idempotent, never a global ~/.claude/agents), install them
in onLoad, and expose the install dir to executor/step sessions via an
executorRuntimeEnv hook (FUSION_CE_AGENTS_DIR).

Together with U2's systemPromptOverride this gives the lightweight
subagent path: a CE skill reads a persona def from FUSION_CE_AGENTS_DIR
and passes its body to fn_spawn_agent. Installer test added (19 plugin
tests green).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 08:56:25 -07:00
gsxdsm
c850a30cde feat(workflow): headless step signal + bundle CE shipping skills (U1, U8)
U1: workflow-step sessions now carry FUSION_WORKFLOW_STEP=1 (scoped to
the step session, not the main executor) so skills detect autonomous
context and surface questions via await-input instead of a dead blocking
tool.

U8: bundle ce-commit, ce-commit-push-pr, and ce-resolve-pr-feedback
(vendored from compound-engineering 3.9.4) so the CE merge/PR flow has
its skills. Registered in COMPOUND_ENGINEERING_SKILLS; manifest test
updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 06:56:22 -07:00
gsxdsm
4c587d6a80 FN-6285: replace CE cancel buttons with trash icons
Update Compound Engineering cancellation controls to use compact icon-only affordances while preserving accessible labels.

- Render session-list and flow cancel actions as red trash-can icon buttons.
- Add hover, focus, disabled, and inline layout styling for the compact cancel controls.
- Update README wording and tests to assert icon-only accessible cancel buttons.

Files changed:
 .../fusion-plugin-compound-engineering/README.md   |  2 +-
 .../src/dashboard/CeFlow.tsx                       |  7 +++-
 .../src/dashboard/CompoundEngineeringView.css      | 46 ++++++++++++++++++++--
 .../src/dashboard/CompoundEngineeringView.tsx      |  6 ++-
 .../src/dashboard/__tests__/CeFlow.test.tsx        |  8 +++-
 .../__tests__/CompoundEngineeringView.test.tsx     |  9 ++++-
 6 files changed, 68 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6285

Fusion-Task-Lineage: 307d96e0-a234-4a3b-a13f-98342374eb38
2026-06-12 07:52:04 -07:00
gsxdsm
89654b2a90 FN-6282: isolate vitest worker temp roots
Use per-invocation Vitest worker roots to keep compound-engineering tests from timing out on stale temp fixtures.

- Allocate a fresh FUSION_TEST_WORKER_ROOT during Vitest global setup and remove it during teardown.
- Preserve per-worker fallback root creation when global setup is not available.
- Clean compound-engineering harness project roots on close and cover the setup invariants with regression tests.

Files changed:
 packages/core/src/__test-utils__/vitest-setup.ts   | 20 +++++++---
 .../core/src/__test-utils__/vitest-teardown.ts     | 38 +++++++++++--------
 .../src/__tests__/_harness.ts                      |  7 +++-
 .../src/__tests__/setup-invariant.test.ts          | 43 ++++++++++++++++++++++
 4 files changed, 85 insertions(+), 23 deletions(-)

Fusion-Task-Id: FN-6282

Fusion-Task-Lineage: 8b842dd0-4f51-44de-b2db-8e8bfa97239c
2026-06-12 04:19:42 -07:00
gsxdsm
2efa833357 FN-6250: add Compound Engineering session cancellation
Add cancel controls and backend support for preserving interrupted Compound Engineering sessions.

- Add an orchestrator cancel path and POST route that stops live work without deleting session history.
- Wire dashboard APIs, hooks, and UI buttons to cancel active, launching, or awaiting-input sessions.
- Cover cancellation behavior across orchestrator, routes, hooks, flow controls, and session panel tests.
- Document the cancel versus discard workflow in plugin docs and README.

Files changed:
 docs/plugins/compound-engineering.md               |  13 ++-
 .../fusion-plugin-compound-engineering/README.md   |  11 ++-
 .../src/__tests__/orchestrator-cancel.test.ts      | 101 +++++++++++++++++++++
 .../src/__tests__/session-routes.test.ts           |  35 +++++++
 .../src/dashboard/CeFlow.tsx                       |  16 +++-
 .../src/dashboard/CompoundEngineeringView.css      |  20 ++++
 .../src/dashboard/CompoundEngineeringView.tsx      |  40 +++++++-
 .../src/dashboard/__tests__/CeFlow.test.tsx        |  20 ++++
 .../__tests__/CompoundEngineeringView.test.tsx     |  53 ++++++++++-
 .../hooks/__tests__/useCeSessions.test.tsx         |  44 ++++++++-
 .../src/dashboard/hooks/api.ts                     |  10 ++
 .../src/dashboard/hooks/useCeSessions.ts           |  23 ++++-
 .../src/routes/session-routes.ts                   |  11 +++
 .../src/session/orchestrator.ts                    |  20 ++++
 14 files changed, 404 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6250

Fusion-Task-Lineage: e9997056-364c-44e1-b846-00b08a1ff8fc
2026-06-11 22:42:21 -07:00
gsxdsm
4fc00b6e1f FN-6251: rehydrate compound answers before resuming
Allow interrupted compound engineering sessions to answer pending questions after the live handle is lost.

- Rehydrate missing live session handles before sending answer turns.
- Keep detached answer resumes active while background rehydration completes.
- Cover route and orchestrator resume paths for old interrupted sessions.
- Document the resume behavior and add a patch changeset.

Files changed:
 .changeset/fn-6251-ce-answer-rehydrate.md          |   5 +
 .../fusion-plugin-compound-engineering/README.md   |   5 +-
 .../orchestrator-interrupt-resume.test.ts          | 156 ++++++++++++++++++++-
 .../src/__tests__/session-routes.test.ts           |  72 +++++++++-
 .../src/session/orchestrator.ts                    |  52 +++++--
 5 files changed, 276 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-6251
Fusion-Task-Lineage: b6930c72-6106-4da9-a0c3-4bcf882f20da
2026-06-11 21:37:10 -07:00
gsxdsm
b0967984b3 FN-6249: theme Compound Engineering textareas
Compound Engineering plugin textareas now use dashboard theme input styling.

- Apply dashboard surface, text, border, radius, font, focus, and placeholder tokens to CE free-text and guidance textareas.
- Add CSS token coverage for standard, degraded fallback, guidance, focus, and placeholder textarea states.

Files changed:
 .../src/dashboard/CompoundEngineeringView.css      | 19 ++++++
 .../src/dashboard/__tests__/theme-tokens.test.ts   | 71 ++++++++++++++++++++++
 2 files changed, 90 insertions(+)

Fusion-Task-Id: FN-6249

Fusion-Task-Lineage: d3c4dd30-1a94-4af2-a672-a2b814eb2c0d
2026-06-11 21:32:02 -07:00
gsxdsm
045a74d249 chore(release): v0.41.0
Version bump via changesets.
2026-06-10 19:05:55 -07:00
gsxdsm
f0d6d70a32 chore(release): v0.40.1
Version bump via changesets.
2026-06-10 18:08:04 -07:00
gsxdsm
9f38b0d090 chore(release): v0.40.0
Version bump via changesets.
2026-06-10 17:58:39 -07:00
gsxdsm
916031acf1 FN-6125: hide duplicate agent prompts in CE transcript
Remove structured question echoing so CE transcripts only show the user-facing answer flow.

- stop rendering stored agent question control records as transcript bubbles while keeping question metadata for answer label lookup
- remove the now-unused transcript question styling
- update CE transcript tests to assert hidden structured question turns and preserved answer rendering

Files changed:
 plugins/fusion-plugin-compound-engineering/src/dashboard/CeFlow.tsx          |  9 ---------
 plugins/fusion-plugin-compound-engineering/src/dashboard/CompoundEngineeringView.css |  3 ---
 plugins/fusion-plugin-compound-engineering/src/dashboard/__tests__/CeFlow.test.tsx   | 16 ++++++++++++++--
 3 files changed, 14 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-6125

Fusion-Task-Lineage: 5cfec24a-8c46-4983-8fa5-77da821ac0ca
2026-06-09 15:14:24 -07:00
gsxdsm
7f08845ed5 FN-6130: make compound engineering theme colors dark-mode aware
Align compound engineering dashboard colors with the active theme tokens.

- replace hardcoded and legacy compound engineering CSS colors with dashboard theme tokens
- switch dimmed text treatments from opacity to explicit theme-aware text tokens for light and dark mode
- add regression coverage for token usage in compound engineering styles
- keep branch authority checks compatible with the optional base SHA argument

Files changed:
 packages/engine/src/branch-conflicts.ts            |   1 +
 .../src/dashboard/CompoundEngineeringView.css      | 106 +++++++++++----------
 .../src/dashboard/__tests__/theme-tokens.test.ts   |  97 +++++++++++++++++++
 3 files changed, 153 insertions(+), 51 deletions(-)

Fusion-Task-Id: FN-6130

Fusion-Task-Lineage: 00adc217-0649-4b4f-9b9b-92c551f02926
2026-06-09 14:56:26 -07:00
gsxdsm
30ba1f005a FN-6119: open CE docs in built-in file viewer
Expose the dashboard file viewer to plugin views and wire Compound Engineering artifacts to it.

- add an openFile callback to the dashboard plugin view context and pass through the app host implementation
- switch Compound Engineering artifact Open actions to the built-in file viewer with matching styling and coverage
- document the new plugin context capability and add a published changeset for the CLI package

Files changed:
 .changeset/ce-docs-built-in-viewer.md              |  5 +++
 docs/PLUGIN_AUTHORING.md                           |  2 +-
 packages/dashboard/app/App.tsx                     |  1 +
 packages/dashboard/app/plugins/types.ts            |  2 ++
 .../src/dashboard-interop.d.ts                     |  1 +
 .../src/dashboard/CompoundEngineeringView.css      | 16 +++++++++
 .../src/dashboard/CompoundEngineeringView.tsx      | 24 +++++++-------
 .../__tests__/CompoundEngineeringView.test.tsx     | 38 ++++++++++++++++++++++
 8 files changed, 76 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6119

Fusion-Task-Lineage: 8feb461c-b1d2-4059-9aa1-ffc756d15196
2026-06-09 13:54:59 -07:00
gsxdsm
1315bc0fc3 FN-6120: make Compound Engineering interview full width and auto-scroll
Keep the Compound Engineering interview transcript full-width and pinned to the latest messages when appropriate.

- expand the Compound Engineering view and transcript containers so the interview flow can fill the available panel width and height
- auto-scroll the transcript on first load and while new messages arrive if the viewer is still following the bottom
- preserve user scroll position when they scroll away from the bottom and cover the transcript follow behavior with tests

Files changed:
 plugins/fusion-plugin-compound-engineering/src/dashboard/CeFlow.tsx                  |  53 ++++++++-
 plugins/fusion-plugin-compound-engineering/src/dashboard/CompoundEngineeringView.css |  28 ++++-
 plugins/fusion-plugin-compound-engineering/src/dashboard/__tests__/CeFlow.test.tsx   | 132 ++++++++++++++++++++-
 3 files changed, 207 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-6120

Fusion-Task-Lineage: 1f7152f3-5af0-4db3-a767-96bca06b93c3
2026-06-09 13:37:37 -07:00
gsxdsm
81c5bfeb27 FN-6085: avoid dashboard CSS import in plugin entry
Prevent the Compound Engineering plugin from pulling dashboard CSS into Node-side plugin loading.

- remove the dashboard view re-export from the Compound Engineering plugin server entry
- document the CSS-import failure mode caused by server-side index re-exports of dashboard views
- update bundled plugin registration guidance to keep dashboard view loading client-only

Files changed:
 docs/solutions/integration-issues/bundled-plugin-registration-drift.md |  4 ++--
 docs/solutions/integration-issues/bundled-plugin-vite-alias-missing.md | 13 ++++++++++++-
 plugins/fusion-plugin-compound-engineering/src/index.ts     |  1 -
 3 files changed, 14 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6085

Fusion-Task-Lineage: 38e6d4de-18ff-4f7b-9ea4-39b0653b4cce
2026-06-09 12:50:26 -07:00
gsxdsm
8bc3d7b0a5 FN-6042: raise dependency security floors
Harden dependency floors and update the Vitest toolchain to patched releases.

- upgrade workspace vitest and @vitest/coverage-v8 dependencies to the 4.1 line across packages and plugins
- pin transitive protobufjs via pnpm overrides and lockfile updates to patched versions
- adapt Vitest configs, engine test helpers, and security-floor coverage for the new dependency baselines
- add the published CLI changeset and related workspace/package metadata updates included in the task branch

Files changed:
 .changeset/fn-6042-security-dependencies.md        |   5 +
 AGENTS.md                                          |   4 +
 Dockerfile                                         |   3 +
 docs/PLUGIN_AUTHORING.md                           |   2 -
 package.json                                       |   3 +-
 packages/cli/package.json                          |   4 +-
 packages/cli/vitest.config.ts                      |   2 +-
 packages/core/package.json                         |   4 +-
 packages/core/vitest.config.ts                     |   2 +-
 packages/dashboard/app/test/mockApi.ts             |   4 +-
 packages/dashboard/package.json                    |   4 +-
 packages/dashboard/vitest.config.ts                |   2 +-
 packages/desktop/package.json                      |   4 +-
 packages/desktop/vitest.config.ts                  |   2 +-
 packages/droid-cli/package.json                    |   2 +-
 packages/droid-cli/vitest.config.ts                |   2 +-
 packages/engine/package.json                       |   4 +-
 .../engine/src/__tests__/executor-test-helpers.ts  |  29 +-
 .../engine/src/__tests__/gridlock-detector.test.ts |   5 +-
 .../src/__tests__/heartbeat-scheduler.test.ts      |   3 +-
 packages/engine/src/__tests__/scheduler.test.ts    |  24 +-
 packages/engine/src/__tests__/self-healing.test.ts |   5 +
 packages/engine/tsconfig.json                      |   3 +-
 packages/engine/vitest.config.ts                   |  10 +-
 packages/i18n/package.json                         |   2 +-
 packages/i18n/vitest.config.ts                     |   7 +
 packages/mobile/package.json                       |   2 +-
 packages/mobile/vitest.config.ts                   |   2 +-
 packages/pi-claude-cli/package.json                |   2 +-
 packages/pi-claude-cli/vitest.config.ts            |   2 +-
 packages/pi-llama-cpp/package.json                 |   2 +-
 packages/pi-llama-cpp/vitest.config.ts             |   2 +-
 packages/plugin-sdk/package.json                   |   2 +-
 packages/plugin-sdk/vitest.config.ts               |   2 +-
 .../examples/fusion-plugin-auto-label/package.json |   2 +-
 .../fusion-plugin-auto-label/vitest.config.ts      |   2 +-
 .../examples/fusion-plugin-ci-status/package.json  |   2 +-
 .../fusion-plugin-ci-status/vitest.config.ts       |   2 +-
 .../fusion-plugin-notification/package.json        |   2 +-
 .../fusion-plugin-notification/vitest.config.ts    |   2 +-
 .../fusion-plugin-settings-demo/package.json       |   2 +-
 .../fusion-plugin-settings-demo/vitest.config.ts   |   2 +-
 plugins/fusion-plugin-acp-runtime/package.json     |   2 +-
 plugins/fusion-plugin-acp-runtime/vitest.config.ts |   2 +-
 plugins/fusion-plugin-agent-browser/package.json   |   2 +-
 .../fusion-plugin-agent-browser/vitest.config.ts   |   2 +-
 .../fusion-plugin-cli-printing-press/package.json  |   2 +-
 .../vitest.config.ts                               |   2 +-
 .../package.json                                   |   2 +-
 .../src/__tests__/orchestrator-live-output.test.ts |   4 +-
 .../vitest.config.ts                               |   2 +-
 plugins/fusion-plugin-cursor-runtime/package.json  |   4 +-
 .../fusion-plugin-dependency-graph/package.json    |   4 +-
 .../vitest.config.ts                               |   2 +-
 plugins/fusion-plugin-droid-runtime/package.json   |   2 +-
 .../fusion-plugin-droid-runtime/vitest.config.ts   |   2 +-
 plugins/fusion-plugin-even-cards/package.json      |   2 +-
 plugins/fusion-plugin-even-cards/vitest.config.ts  |   2 +-
 .../package.json                                   |   2 +-
 .../vitest.config.ts                               |   2 +-
 plugins/fusion-plugin-hermes-runtime/package.json  |   2 +-
 .../fusion-plugin-hermes-runtime/vitest.config.ts  |   2 +-
 .../fusion-plugin-openclaw-runtime/package.json    |   2 +-
 .../vitest.config.ts                               |   2 +-
 .../fusion-plugin-paperclip-runtime/package.json   |   2 +-
 .../vitest.config.ts                               |   2 +-
 plugins/fusion-plugin-reports/package.json         |   2 +-
 .../src/__tests__/review-panel.test.ts             |   6 +-
 plugins/fusion-plugin-reports/vitest.config.ts     |   2 +-
 plugins/fusion-plugin-roadmap/package.json         |   2 +-
 plugins/fusion-plugin-roadmap/vitest.config.ts     |   2 +-
 plugins/fusion-plugin-whatsapp-chat/package.json   |   2 +-
 .../fusion-plugin-whatsapp-chat/vitest.config.ts   |   2 +-
 pnpm-lock.yaml                                     | 626 ++++++++-------------
 .../__tests__/dependency-security-floor.test.mjs   |  95 ++++
 75 files changed, 475 insertions(+), 491 deletions(-)

Fusion-Task-Id: FN-6042

Fusion-Task-Lineage: fff6a1cb-8937-435c-9a91-b7c7a59cc80e
2026-06-08 15:19:27 -07:00
gsxdsm
7d417a1f9c fix(FN-0000): include compound engineering dashboard css 2026-06-08 12:55:52 -07:00
gsxdsm
8bac390e1b feat(engine): cli-agent one-shot sessions for validator, planning, and CE (U9)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 00:15:57 -07:00
gsxdsm
0106eee4ff feat(compound-engineering): live agent output, steering, and a real Q&A surface
Users can now watch everything the agent does while a CE stage works, steer
it mid-stage, and read the whole conversation as a proper chat surface.

Live output:
- New host capability: CreateInteractiveAiSessionOptions.onProgress — the
  engine adapter streams thinking/text deltas + tool start/end markers from
  the pi agent hooks (any plugin can use this).
- Orchestrator buffers per-session live activity (merged deltas, discrete
  tool lines, capped), emits throttled progress events over SSE, and
  GET /sessions/:id attaches it as liveActivity for the polling fallback.
- Routes detach turn execution: start/answer/resume return immediately
  (status active) and clients converge via push/poll — the turn is watchable
  instead of hidden inside a blocking POST.
- Turn timeout is now INACTIVITY-based: an actively-working long turn is
  never killed; a quiet one interrupts with its working trace preserved.
- On settle the trace persists into history as a condensed record.

Steering:
- Stage protocol: responses may be a direct answer, {value, comment}
  (answer + guidance), or {feedback} (guidance without answering); the
  system prompt instructs agents to treat steering as first-class input.
- CeFlow: guidance textarea alongside selectable questions — attach to the
  clicked answer, or "Send guidance" on its own.

Q&A UI:
- Transcript no longer hides control records: past questions/answers render
  as chat bubbles (option ids → labels), steering turns marked, working
  traces as collapsible "Agent work" blocks, completion marker.
- Live working pane (pulse + streaming thinking/tool lines) while a turn runs.

Tests: 130 plugin tests green (14 new: live buffer/flush ordering, inactivity
watchdog survives active work, detached convergence, steering payload shapes,
transcript rendering, live pane). Engine seam tests green; plugin/core/
engine/dashboard tsc clean. Core full suite OOMs locally (known orchestrator-
shell issue) — covered by CI shards.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 14:17:40 -07:00
gsxdsm
7f8db9f892 feat(compound-engineering): manage and work across multiple CE sessions
The store/orchestrator were already multi-session (independent rows + live
handles per session); this surfaces it end to end:

- Sessions panel in the dashboard view: lists every session with stage,
  status badge ("needs your input" for awaiting_input), and last activity;
  stays visible while a flow is open so switching is one click. Closing a
  flow returns to the overview without stopping the session.
- useCeSession.open(): adopt an existing session (pins its projectId for
  answer/resume/poll); useCeSessions list hook with push-event refresh and
  poll fallback while any session is mid-turn.
- DELETE /sessions/:id + orchestrator.discard(): dispose the live handle
  before deleting the row (pipeline-link rows kept for task provenance);
  Discard affordance on settled sessions.
- Tests: cross-session independence through one orchestrator, store delete,
  route list/delete, hook open/list/remove/push/poll, view panel
  open/switch/discard. 116 tests green; plugin + dashboard tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 13:47:02 -07:00
gsxdsm
8c170480dd fix(compound-engineering): break dashboard dependency cycle
A new workspace-acyclicity invariant on main (run via the PR merge) flagged
compound-engineering -> @fusion/dashboard -> compound-engineering: the plugin is
listed in @fusion/dashboard's deps (for view loading) AND declared @fusion/dashboard
as a runtime dependency, which the cycle check (deps+devDeps) and the
'bundled plugins must not depend on host packages' check both reject.

The plugin's only @fusion/dashboard use is the type-only PluginDashboardViewContext
import. Drop the @fusion/dashboard dependency and resolve that type via an ambient
dashboard-interop.d.ts + tsconfig paths mapping (the fusion-plugin-dependency-graph
interop pattern). Breaks the cycle; the host passes the real context at runtime.
2026-06-03 07:59:20 -07:00
gsxdsm
1cf0521a0a fix(compound-engineering): validate parsed JSON shape in rowToSession
safeParse() previously only caught JSON syntax errors, so a semantically-wrong
but valid column ('null', '{}', a string) would rehydrate a non-array
conversationHistory that later crashed appendHistory's spread (and a bogus
currentQuestion). safeParse now takes a shape validator and falls back to []/null
on invalid shapes too. + regression test covering 'null'/'{}'.
2026-06-03 07:10:10 -07:00
gsxdsm
fb1f726f39 fix(compound-engineering): address code review feedback
- session-store: rowToSession parses JSON columns via a safeParse helper, so a
  corrupted currentQuestion/conversationHistory column degrades to null/[] instead
  of throwing and crashing reads of an otherwise-valid row (+regression test)
- session-routes: validate the ?status= list filter against CE_SESSION_STATUSES
  (asCeSessionStatus) instead of casting an arbitrary query string with 'as never'
- _harness: makeScriptedSession throws on an empty script rather than yielding
  undefined, surfacing test mistakes loudly
- useCeSession tests: use fake timers (advanceTimersByTimeAsync) instead of real
  setTimeout waits for deterministic poll-interval assertions

Skipped: 3 doc nits in src/skills/ce-*/references/** — those are pinned upstream
ce-* skill copies (KTD5 vendored snapshot), not this repo's content.
2026-06-02 23:38:43 -07:00
gsxdsm
504308422d docs: update CE transport docs for SSE push + projectId session identity 2026-06-02 21:29:59 -07:00
gsxdsm
b3c7601e79 feat(core,dashboard,compound-engineering): real plugin event push over SSE
Replaces polling-only with a true server-push seam (any plugin benefits):
- core: createRouteContext accepts an emitEvent override (default still logs)
- dashboard: emitPluginCustomSseEvent forwards a plugin's ctx.emitEvent calls to
  connected /api/events clients as a project-scoped 'plugin:custom' event; the
  plugin route context's emitEvent is wired to it
- dashboard: PluginDashboardViewContext gains subscribePluginEvents so views
  consume push via a host capability (no raw EventSource, no deep app import)
- CE view subscribes its session to push and refetches on each event; polling
  stays as the fallback when push isn't wired or an event is missed

Also: skill-reachability test installs into a temp dir (no repo-dir writes).
Tests: dashboard sse +2 (plugin:custom relay + project scoping), plugin 99.
2026-06-02 21:28:57 -07:00
gsxdsm
79e66e414f fix(compound-engineering): thread projectId through session answer/resume/poll
The session's owning store (and its live in-process handle) is selected per
request by projectId. start() sent projectId but answer/resume/getSession did
not, so any project-scoped session broke on the first answer (a different store
resolved → session not found / no live handle). The client now captures the
start projectId and reuses it on every subsequent call. Closes the multi-project
session-identity residual.
2026-06-02 21:12:20 -07:00