- settings.test.ts mocks @fusion/core; add SUPPORTED_LOCALES to the mock so the
new language enum import resolves (shard 1).
- LanguageSelector.css used the banned --text-secondary token; switch to the
canonical --text-muted (shard 2 text-token-canonicalization guard).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Extract a shared normalizeToSupportedLocale helper in @fusion/i18n used by
both the CLI env detection and the dashboard navigator detection
(convertDetectedLanguage), fixing multi-subtag navigator tags (zh-Hans-CN)
and unifying Chinese script resolution.
- Add a cross-tab storage listener to useLanguage so a language change in one
tab propagates to others.
- Dedup the namespace lists into packages/i18n/namespaces.json, consumed by
config.ts and all three build scripts (no more 3-way drift risk).
- Add tests: dashboard i18n/index.ts (document.lang mirror, init non-blocking),
useLanguage concurrent-hydration race + cross-tab adoption,
normalizeToSupportedLocale, namespace-source consistency.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Validate GlobalSettings.language at the write boundary (store.ts) via
validateLocale, so invalid locales are dropped not persisted (api-contract P1).
- Fix detectEnvLocale: Traditional-script env tags (zh_Hant/zh_Hant_TW/zh_HK/
zh_MO) now resolve to zh-TW instead of Simplified; use replaceAll for
multi-underscore POSIX tags (adversarial P2). Add coverage.
- Agent-native parity: add 'language' to the CLI settings allowlist
(VALID_SETTINGS + GLOBAL_ONLY + enum) so 'fn settings set language' works
like the dashboard switcher.
- Document --lang in the bin.ts help table (api-contract P3).
- Derive the expected locale-chunk count from the locales dir instead of a
hardcoded 5 (maintainability), and add prebuild:client so a raw vite build
on a fresh clone still syncs catalogs (adversarial P2).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Establish the terminal-UI migration pattern: route BoardView's loading/empty
labels through useTranslation("cli"), keeping single-letter keybinding
accelerators literal via interpolation ([{{key}}]). Add the keys to the en cli
catalog, sync the four locales, and regenerate the CLI import map. Tests cover
the migrated label and accelerator preservation. The remaining TUI labels are
deferred long-tail work; the pattern is in place.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a synchronous Node-side i18next instance built from the generated
@fusion/i18n CLI catalog map (no async backend, first frame localized), with
locale precedence --lang flag -> GlobalSettings.language -> env (LC_ALL/LANG/..)
-> en. Wrap the Ink DashboardApp render in <I18nextProvider> and thread a
--lang flag through runDashboard.
Upgrade ink 6.8 -> 7.0 (native CJK double-width measurement) and raise the
react/@types/react peer floor to ^19.2.0. A spike test confirms react-i18next
works under Ink's custom reconciler: localized first frame + re-render on
changeLanguage (including CJK), retiring the KTD1 unknown.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Split the dashboard quality Vitest lane into bounded heap-managed shards to avoid signal exits.
- replace the single dashboard quality test command with sequential app and API shard scripts
- add a heap wrapper plus Vitest config shard definitions for foundation, component, App, ChatView, and SettingsModal coverage
- add guard tests for the sharded dashboard test configuration and restore spinner-animation.css.test.ts to foundation-ui coverage
- update the CLI package-config test expectations for the new dashboard test script layout
Files changed:
packages/cli/src/__tests__/package-config.test.ts | 8 +-
packages/dashboard/package.json | 18 +-
packages/dashboard/scripts/run-vitest-with-heap.mjs | 41 ++++
packages/dashboard/src/__tests__/dashboard-test-config-guard.test.ts | 77 ++++++
packages/dashboard/vitest.config.ts | 273 ++++++++++++++++++++-
5 files changed, 407 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-5849
Fusion-Task-Lineage: 522f3963-4647-4a59-bb6b-a3dacfbf620e
Resolve goal tool lookups to the canonical project store from Fusion worktree directories.
- recognize both legacy .worktrees and .fusion/worktrees paths when resolving the project root for pi extensions
- add CLI coverage proving fn_goal_list and fn_goal_show return dashboard-created goals from a Fusion worktree cwd
- extend core worktree-resolution tests and keep the branch conflict recovery test worktree path isolated in tmpdir
- add a patch changeset for the published CLI fix
Files changed:
.changeset/fn-5851-goal-store-resolution.md | 5 +
packages/cli/src/__tests__/goal-store-resolution.test.ts | 104 +++++++++++++++++++++
packages/core/src/__tests__/pi-extensions.test.ts | 14 ++-
packages/core/src/pi-extensions.ts | 12 ++-
packages/engine/src/__tests__/branch-conflicts-recovery.test.ts | 2 +-
5 files changed, 130 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5851
Fusion-Task-Lineage: ec4c8239-b953-4df7-9f72-02e17e4b0851
Clarifies test expectations around onboarding auto-launch and non-matching integration tips.
- Rename the onboarding marker test to describe central DB gating accurately.
- Assert task-list routing when onboarding is skipped after central DB creation.
- Avoid accidental matching SHA construction in the git advance pending test.
Files changed:
packages/cli/src/__tests__/bin.test.ts | 8 ++++++--
packages/dashboard/src/__tests__/routes-git.test.ts | 3 ++-
2 files changed, 8 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5848
Fusion-Task-Lineage: c730deb9-875d-4371-9d92-f85281bcb658
CLI onboarding auto-launch now skips once the persisted completion marker is present.
- Load `cliOnboardingCompletedAt` from global settings before launching onboarding when the central DB is missing.
- Preserve existing skip precedence for non-TTY, command, flag, environment, and central DB guards.
- Add unit and backcompat coverage for completion-marker and skipped-central-DB scenarios.
- Document the updated auto-launch behavior and add a patch changeset.
Files changed:
.changeset/fn-5847-onboard-autolaunch-marker.md | 5 ++
docs/cli-reference.md | 12 +--
.../onboard-autolaunch-backcompat-e2e.test.ts | 7 ++
.../onboard-autolaunch-backcompat.test.ts | 8 ++
.../__tests__/onboard-autolaunch-bypass.test.ts | 7 ++
.../commands/__tests__/onboard-autolaunch.test.ts | 93 ++++++++++++++++++++++
packages/cli/src/commands/onboard-autolaunch.ts | 46 ++++++++++-
7 files changed, 171 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5847
Fusion-Task-Lineage: db3e474e-e4b8-4299-8087-07b6cd1f4518
Align onboarding HELP text and CLI reference with current fn onboarding behavior.
- Document onboarding auto-launch conditions around missing central DB and interactive command flow.
- Add and clarify onboarding escape hatches: --skip-onboarding and FUSION_SKIP_ONBOARDING.
- Add an onboard docs parity test to keep HELP and docs aligned for key onboarding terms.
- Add a patch changeset for @runfusion/fusion describing the documentation/help update.
Files changed:
.changeset/fn-5813-onboard-docs.md | 5 ++++
docs/cli-reference.md | 21 +++++++++-----
packages/cli/src/bin.ts | 4 ++-
packages/cli/src/commands/__tests__/onboard-docs.test.ts | 33 ++++++++++++++++++++++
4 files changed, 55 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5813
Fusion-Task-Lineage: 14a74ad9-5f09-471a-878d-aa120a28ef41
Expose the plugin SDK as a published CLI subpath while preserving existing workspace behavior.
- add a prepack transform helper that injects the ./plugin-sdk and ./package.json exports only in packed manifests
- split tsup config into dedicated CLI and plugin-sdk builds so dist/plugin-sdk JS and DTS are emitted with @fusion deps inlined
- add coverage for definePlugin/validatePluginManifest behavior and manifest/build export guarantees
- document the new published @runfusion/fusion/plugin-sdk surface for plugin authors
Files changed:
docs/agents.md | 2 +
packages/cli/scripts/prepare-publish-manifest.mjs | 61 +++++++++++++++-------
packages/cli/src/__tests__/plugin-sdk-export.test.ts| 50 ++++++++++++++++++
packages/cli/tsup.config.ts | 31 +++++++++--
4 files changed, 121 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-5842
Fusion-Task-Lineage: b6b481ae-aaac-46c0-a6f7-8cc1e9eed1ce
Prevent onboarding autolaunch when invocation is non-interactive or an existing central+project setup is detected.
- Add a project initialization probe in onboard autolaunch flow and skip when both central DB and project DB already exist.
- Preserve skip behavior for serve/daemon and all non-TTY invocations so agent/headless runs never block.
- Expand CLI autolaunch coverage with backward-compat and seam tests, and add a changeset for the published package.
Files changed:
.changeset/fn-5808-onboard-backcompat-guard.md | 5 +
.../onboard-autolaunch-backcompat.test.ts | 135 +++++++++++++++++++++
.../commands/__tests__/onboard-autolaunch.test.ts | 9 ++
packages/cli/src/commands/onboard-autolaunch.ts | 16 ++-
4 files changed, 164 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-5808
Fusion-Task-Lineage: b859aa93-44d5-4d93-bc07-8149b95b4042
Add a new interactive onboarding CLI flow that guides first-time setup end to end.
- add new `fn onboard` command wiring in CLI entrypoint and usage help
- implement `runOnboard()` with sequential prompts for central DB, provider auth, init, test mode, and project maxConcurrent
- persist `cliOnboardingCompletedAt` marker in global settings with `--force` rerun support
- add onboarding command tests and global settings regression coverage
- document `fn onboard` usage and options in CLI reference
- add a minor changeset for published `@runfusion/fusion`
Files changed:
.changeset/fn-5805-onboard-command.md | 5 +
docs/cli-reference.md | 20 ++
packages/cli/src/bin.ts | 10 +
packages/cli/src/commands/__tests__/onboard.test.ts| 193 ++++++++++++++++
packages/cli/src/commands/onboard.ts | 249 +++++++++++++++++++++
packages/core/src/__tests__/global-settings.test.ts| 11 +
packages/core/src/index.ts | 2 +-
packages/core/src/settings-schema.ts | 1 +
packages/core/src/types.ts | 4 +
9 files changed, 494 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-5805
Fusion-Task-Lineage: b1bcaf27-9bd7-4569-b685-225a97fa1200
Export BranchGroupPrState from @fusion/core, narrow task.branchContext
before group lookup, and populate the full PrInfo shape when
reconstructing the group PR from branch_groups metadata.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
macos-13 runners are too scarce — the darwin-x64 leg sat queued for hours
and blocked the release publish job (which needs all build legs). Ship the
CLI Apple-Silicon-only for macOS; desktop macOS DMG/ZIP stays universal.
Removed from release.yml + test-release.yml matrices, updated ci-workflow
assertions (5→4 targets) and RELEASING.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(b) Windows desktop build flakily failed with "Property 'ok'/'status' does
not exist on type 'Response'" because the workspace resolved multiple
@types/node versions (incl. an ancient 12.20.55 from @manypkg/find-root that
predates global fetch types). plugin-sdk compiles with lib:["ES2022"] and no
DOM lib, so Response comes solely from @types/node — nondeterministic across
runners. Pin via pnpm.overrides "@types/node": "^25.5.2"; collapses the
lockfile to one version. Verified: plugin-sdk build + desktop + full
workspace typecheck all pass.
Also: build-exe-cross tests cross-compiled all 5 platforms on every CI run
(auto-enabled via Boolean(process.env.CI)) — a release-build dependency in
the normal lane. Made them opt-in (FUSION_TEST_BUILD_EXE=1) and pointed the
root test:slow-cli at the CLI slow lane instead of test:pre-release, so
everyday CI no longer depends on release builds. test:pre-release and
test-release.yml still validate binaries deliberately.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds collision retry logic to the `fn update` CLI command to handle binary path conflicts, including test coverage and a getting-started guide update.
Fusion-Task-Id: FN-5632
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5632
Adds bundled plugin resolution for `@runfusion/fusion`, including a dist candidate check in `bundled-plugin-install.ts` and regression tests covering the install path, with a patch changeset prepared.
Fusion-Task-Id: FN-5630
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5630
Prior attempt accepted either fs.watch failure path (sync throw vs async
error event) — but on Linux Node, fs.watch with `recursive: true` on a
missing directory silently succeeds (returns a no-op watcher, never
throws, never emits an error). Neither catch arm fires, so the warning
the test wants to assert never appears.
Switch to a NUL-byte-embedded path. Node validates the path argument up
front and throws ERR_INVALID_ARG_VALUE synchronously on every platform,
guaranteeing the `watch:fs-watch-setup` catch arm runs. Restore the
strict assertions on phase + message.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
FN-5615 improves TUI token visibility by dynamically sizing the system panel height and clarifying the manual token copy hint, with regression tests added in the dashboard-tui app and a changeset for the patch release.
Fusion-Task-Id: FN-5615
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5615
Complete the standalone build pipeline fix by setting `DEV=false` during bun compile to eliminate React DevTools from production executables, with hardened regression tests and documentation.
Fusion-Task-Id: FN-5611
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5611