Commit Graph

8178 Commits

Author SHA1 Message Date
Tom Durrant
978d07c96c Address PR review comments
- Update test assertions for bare model IDs
- Add deduplication guard for models with same bare ID
- Add validation for empty model IDs after prefix stripping
- Add test for API key forwarded as env var to spawn
- Add test for deduplication and empty model ID guard
- Extract shared handleOpencodeGoApiKeySaved helper
- Add changeset for the published package
2026-06-05 11:12:40 +10:00
Tom Durrant
1ae2555dd4 fix: strip provider prefix from opencode-go model IDs
normalizeOpencodeGoModel was prefixing model IDs with 'opencode-go/'
(e.g. 'opencode-go/deepseek-v4-flash'), but the Pi SDK sends the model
id field as the model name in API requests. The OpenCode API expects
bare model names (e.g. 'deepseek-v4-flash'), not prefixed ones.

Now strips the 'opencode/' or 'opencode-go/' prefix entirely so the
registered model ID matches what the API expects.
2026-06-05 10:40:01 +10:00
Tom Durrant
295d726768 fix: pass OPENCODE_API_KEY env var when syncing opencode-go models
discoverOpencodeGoModels() spawns 'opencode models opencode --refresh' but
never passed the saved API key as OPENCODE_API_KEY. The opencode CLI's
internal OpencodePlugin checks this env var to decide whether to show
paid models; without it, only free (cost.input === 0) models appear.

Now threads the apiKey from auth storage through to the spawned process
environment, so the CLI sees the user's Go subscription and returns the
full model catalog including paid models like Claude, GPT-5.x, Gemini, etc.

Callers in serve.ts, daemon.ts, and dashboard.ts all updated to read
the key from dashboardAuthStorage and pass it to refreshOpencodeGoModels.
syncStartupModels reads from authStorage in StartupSyncOptions.
2026-06-05 10:07:27 +10:00
gsxdsm
8f3d8a2c55 Merge pull request #1423 from Runfusion/gsxdsm/compound-plugin
Fix Compound Engineering plugin install failing from Settings
2026-06-04 15:47:26 -07:00
gsxdsm
82f40a86b9 Merge branch 'main' into gsxdsm/compound-plugin 2026-06-04 15:34:31 -07:00
gsxdsm
806ab72a6e Merge pull request #1418 from Runfusion/gsxdsm/custom-columns
feat: workflow-defined custom columns via composable traits
2026-06-04 15:30:49 -07:00
gsxdsm
19236a4bdd Document bundled-plugin registration drift learning
Capture the 4-list registration requirement for bundled plugins
(Settings catalog, dashboard fallback set, CLI auto-install list,
tsup staging) in docs/solutions/, and add the Bundled Plugin concept
to CONCEPTS.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 14:33:14 -07:00
gsxdsm
4c3a226050 Fix Compound Engineering plugin install failing from Settings
Installing the Compound Engineering plugin from Settings → Built-in
Plugins failed with "Plugin manifest not found": the dashboard's
bundled-plugin fallback set (BUNDLED_PLUGIN_IDS in routes.ts) was
missing fusion-plugin-compound-engineering, so when the relative
./plugins/... path missed the server cwd, the bundled lookup was never
attempted. fusion-plugin-cli-printing-press had the same gap.

- Add both ids to the dashboard's BUNDLED_PLUGIN_IDS fallback set.
- Stage fusion-plugin-compound-engineering into dist/plugins via
  bundlePluginEntry in the CLI tsup config so packaged installs can
  resolve the bundled copy (every other bundled plugin already had a
  staging block).
- Add route tests that actually exercise the bundled fallback (the
  existing ones let cwd resolution succeed, so the fallback path was
  untested).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 12:31:08 -07:00
gsxdsm
d0b5dcbfbe docs(plan): pluggable step parsers (plugin runtime) + code node for arbitrary TypeScript (KTD-15, U14)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 11:20:50 -07:00
gsxdsm
ef4e1f8a63 docs(plan): summary wording — parse-steps node
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 11:16:13 -07:00
gsxdsm
1dd831003d docs(plan): step parsing becomes a parse-steps graph node (artifact + registry parser, no-steps/parse-error outcomes)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 11:16:02 -07:00
gsxdsm
0f15938414 docs(plan): scope in workflow-defined task shape — artifacts/step-source registry, custom fields, dynamic task UI (KTD-12/13/14, U11-U13)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 11:11:30 -07:00
gsxdsm
8abdefcad1 docs(plan): step inversion — steps as workflow-modelable nodes (foreach/step-review/rework + parallel execution axes)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 10:56:47 -07:00
gsxdsm
0257bdf9d6 fix(ci): align tests/docs with issue-fix commits (recoveryRehome args, pi-ai mock Unknown/Record, new agent tools doc, hex-pattern comment reword)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 10:56:47 -07:00
gsxdsm
0b1c8fb56b fix(ci): widen Column to ColumnId in plugins + drop unused import after #1403 widening
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:40:10 -07:00
gsxdsm
eea18802fe docs(review): mark all residual findings fixed 2026-06-04 08:01:01 -07:00
gsxdsm
afc72b6bb0 fix(core): widen Task.column to ColumnId across packages; v1-preserving IR persistence for rollback safety (#1403 #1405) 2026-06-04 08:00:33 -07:00
gsxdsm
cfc9bb5fd5 fix(core): shared workflow-IR resolver, prod branch persistence + pruning, latest-run JOIN, sweep reservation-leak fix (#1402 #1407 #1412 #1413) 2026-06-04 07:34:02 -07:00
gsxdsm
45ce189548 fix(core): transitionPending recovery sweep, flag-off evacuation, recoveryRehome on self-healing moves (#1401 #1409 #1411) 2026-06-04 07:14:41 -07:00
gsxdsm
010976cee2 test: promote/board-workflows routes, concurrent sweep, canDropTask, migration forward paths (#1404 #1414 #1415 #1416 #1417) 2026-06-04 07:12:46 -07:00
gsxdsm
c21485a65a feat(engine): agent-native workflow tools — promote, reconcile-aware select, CRUD, trait catalog (#1408) 2026-06-04 07:03:53 -07:00
gsxdsm
571768f03a fix(dashboard): workflow:updated SSE invalidation + inline capacity feedback clears on task changes (#1406, #1410) 2026-06-04 07:03:43 -07:00
gsxdsm
b446403ea6 fix(ci): bump remaining schema-version assertions to 107 2026-06-04 04:58:04 -07:00
gsxdsm
d9b5bb4b4e fix(ci): spread real @fusion/core into partial test mocks; deterministic editor save test 2026-06-04 04:32:46 -07:00
gsxdsm
65c915bb36 fix(ci): lane columns snap-align center per mobile scroll-snap convention 2026-06-04 03:52:45 -07:00
gsxdsm
e711e6e0fd fix(ci): schema-version literal, CLI core-mock spreads, plugin-sdk type-only exports, restore pruned i18n keys 2026-06-04 03:38:05 -07:00
gsxdsm
da844b86f0 docs(review): record residual review findings 2026-06-04 02:53:36 -07:00
gsxdsm
30e2fd7b09 fix(review): apply autofix feedback 2026-06-04 02:50:54 -07:00
gsxdsm
eee715218e chore: lint cleanup, ignore generated i18n typings, mark plan completed 2026-06-04 02:16:55 -07:00
gsxdsm
60605fafa9 feat(core): workflowColumns integrity pass, graduation report, server-side trait validation, plugin post-commit hooks, docs + changeset (U12) 2026-06-04 02:13:48 -07:00
gsxdsm
3aa8d2d28b feat(dashboard): flag-gated multi-lane board — lane per workflow, trait-keyed columns, typed drag rejections, hold promote (U9) 2026-06-04 01:49:51 -07:00
gsxdsm
e5a0a199ea feat(dashboard): node editor authors columns, traits, hold and split/join nodes with inline validation (U10) 2026-06-04 01:46:51 -07:00
gsxdsm
26718a31cc feat(engine): plugin-contributed traits — async-only hooks, pre-evaluated gates, live-dependent disable guard (U8) 2026-06-04 01:43:26 -07:00
gsxdsm
66cffe904d feat(cli): TUI trait-flag bucket mapping + read-only Other (custom) bucket — no card silently dropped (U11) 2026-06-04 01:33:04 -07:00
gsxdsm
6a15a13917 feat(engine): in-txn capacity enforcement + generalized hold/release sweep with reservation-first ordering (U6) 2026-06-04 01:22:56 -07:00
gsxdsm
6491441102 feat(core): widen moveTask entry point to ColumnId for workflow-defined columns (KTD-1) 2026-06-04 01:03:34 -07:00
gsxdsm
2d28ea0c60 feat(engine): merge trait — enqueue-only orchestration, workflow-configurable strategy/fileScope, lost-work guards non-configurable (U7) 2026-06-04 01:03:34 -07:00
gsxdsm
ab78be718a feat(core): workflow switch/edit/delete reconciliation — no card left in an undefined column (U5) 2026-06-04 00:54:05 -07:00
gsxdsm
fcf175afb8 feat(engine): fan-out/join branch execution with crash-recoverable branch state, schema v107 (U13) 2026-06-04 00:54:05 -07:00
gsxdsm
4e1b0fab0d feat(core): workflow-resolved transitions behind workflowColumns flag, typed rejections, default-workflow hook parity (U4) 2026-06-04 00:41:12 -07:00
gsxdsm
2bebddb807 feat(core): typed transition contract + transitionPending marker, schema v106 (U3) 2026-06-04 00:19:58 -07:00
gsxdsm
a5ac822de4 feat(core): trait registry, 14 built-in traits, composition validator (U2) 2026-06-04 00:19:57 -07:00
gsxdsm
964744cd41 feat(core): WorkflowIr v2 — workflow-defined columns, hold/split/join nodes, v1 upgrade (U1) 2026-06-04 00:13:11 -07:00
gsxdsm
44cb67e5db docs(plan): workflow-defined custom columns via composable traits; supersede interpreter-cutover plan 2026-06-04 00:05:15 -07:00
gsxdsm
68c6702add Fix invisible workflow graph editor and bundle CE/Roadmap plugins
- WorkflowNodeEditor overlay was missing the `open` class, so the
  graph editor mounted with display:none — clicking the button just
  dismissed the steps view. Add `open` so the overlay renders.
- Add fusion-plugin-compound-engineering and fusion-plugin-roadmap to
  BUILTIN_PLUGINS so they show under Settings → Built-in Plugins.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 23:25:32 -07:00
gsxdsm
ff0750cd15 Fix invisible workflow graph editor and bundle CE/Roadmap plugins
- WorkflowNodeEditor overlay was missing the `open` class, so the
  graph editor mounted with display:none — clicking the button just
  dismissed the steps view. Add `open` so the overlay renders.
- Add fusion-plugin-compound-engineering and fusion-plugin-roadmap to
  BUILTIN_PLUGINS so they show under Settings → Built-in Plugins.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 23:25:28 -07:00
gsxdsm
962b97ce84 FN-5967: add first-task GitHub star prompt
Show a one-time GitHub star prompt after a task first reaches done.

- detect task status transitions into done and trigger the prompt only in project view
- add a dismissible GitHub star prompt component plus localStorage-backed persistence hook
- cover the new prompt behavior with component, hook, and transition helper tests
- document the prompt behavior and styling guidance in the dashboard guide

Files changed:
 docs/dashboard-guide.md                            |  3 +
 packages/dashboard/app/App.tsx                     | 21 +++++-
 .../dashboard/app/components/GitHubStarPrompt.css  | 76 ++++++++++++++++++++++
 .../dashboard/app/components/GitHubStarPrompt.tsx  | 53 +++++++++++++++
 .../app/components/__tests__/App.test.tsx          | 12 +++-
 .../components/__tests__/GitHubStarPrompt.test.tsx | 40 ++++++++++++
 .../hooks/__tests__/useGitHubStarPrompt.test.ts    | 64 ++++++++++++++++++
 .../dashboard/app/hooks/useGitHubStarPrompt.ts     | 46 +++++++++++++
 8 files changed, 313 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-5967

Fusion-Task-Lineage: 5fffdf4d-61d8-4ac8-bcf4-8b453b639b28
2026-06-03 22:35:28 -07:00
gsxdsm
4625d644a8 FN-5954: decouple PR metadata loading from preflight options
Make the Create Pull Request modal interactive before AI metadata finishes loading.

- load preflight checks and PR options independently from AI title/body generation with separate loading and error states
- preserve base-branch selection and remediation actions while refreshing preflight or regenerating metadata
- cover the faster modal flow in tests and document the immediate-render behavior in the dashboard guide

Files changed:
 docs/dashboard-guide.md                            |   3 +-
 packages/dashboard/app/components/PrCreateModal.css     |  11 +
 packages/dashboard/app/components/PrCreateModal.tsx     | 357 ++++++++++++++-------
 packages/dashboard/app/components/__tests__/PrCreateModal.test.tsx    | 110 ++++++-
 4 files changed, 355 insertions(+), 126 deletions(-)

Fusion-Task-Id: FN-5954

Fusion-Task-Lineage: 2595d220-ca7a-403c-935c-900034a20c67
2026-06-03 22:35:28 -07:00
gsxdsm
a4d3589a14 FN-5948: fix mobile chat empty-state rendering
Restore the chat message pane empty state on mobile without regressing desktop sidebar layouts.

- style chat message-pane empty states as centered framed cards and normalize mobile spacing tokens
- keep sidebar padded empty states left-aligned so loading and list placeholders preserve their desktop layout
- add mobile and desktop regression coverage for direct chats and chat rooms across empty, loading, populated, and streaming states

Files changed:
 packages/dashboard/app/components/ChatView.css     |  26 +-
 .../__tests__/ChatView.mobile-render.test.tsx      | 299 +++++++++++++++++++++
 2 files changed, 323 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-5948

Fusion-Task-Lineage: f4165f04-363d-4ade-8c10-6d242f943c6c
2026-06-03 22:31:23 -07:00
gsxdsm
8d31370b0b FN-5965: use temporary root in worktree recovery test
Harden executor worktree recovery coverage against fixed-path collisions.

- create a unique temporary root for the stale unregistered worktree test case
- derive the stale worktree path from that temporary root instead of a shared /tmp/test path
- initialize TaskExecutor with the same temporary root so setup and assertions stay aligned

Files changed:
 packages/engine/src/__tests__/executor-worktree.test.ts | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-5965

Fusion-Task-Lineage: 4436bd02-b7f7-4e62-8514-0aef6cb67813
2026-06-03 22:31:23 -07:00