From 5cf07c81fe085ce33385a8104e7431c55b3e5019 Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 16 Apr 2026 01:22:37 -0700 Subject: [PATCH] feat(FN-1897): rewrite onboarding step copy for mixed-audience clarity - Rewrite AI Setup step description to explain what Fusion does with AI models - Update GitHub step text to clarify what linking enables (issue import, PR sync) - Refresh First Task step to be more actionable and inviting - Update completion message to guide users to the board - Revise helper text across all steps to be warmer and less technical - Update test assertions to match new copy --- .../app/components/ModelOnboardingModal.tsx | 36 ++++++++++--------- .../__tests__/ModelOnboardingModal.test.tsx | 10 +++--- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/dashboard/app/components/ModelOnboardingModal.tsx b/packages/dashboard/app/components/ModelOnboardingModal.tsx index 460e21d00..a6104675c 100644 --- a/packages/dashboard/app/components/ModelOnboardingModal.tsx +++ b/packages/dashboard/app/components/ModelOnboardingModal.tsx @@ -641,14 +641,15 @@ export function ModelOnboardingModal({ {step === "ai-setup" && (

- Connect an AI provider and choose a default model. You can - authenticate via OAuth or enter an API key. + Fusion uses AI models to plan, write, and review code for you. + Connect an AI provider below to get started — you can use a hosted + service or enter an API key.

{/* Show helper text when providers exist but none are authenticated */} {authProviders.length > 0 && !authProviders.some((p) => p.authenticated) && (

- You can add API keys or log in to providers later from Settings. + Skip this step if you'd like — you can always add providers later from Settings.

)} @@ -805,13 +806,13 @@ export function ModelOnboardingModal({ Default Model (Optional)

- Select a default model for AI tasks. You can change this later - in Settings. + Pick a default model for AI tasks, or leave this blank to choose + later. Models vary in speed, capability, and cost.

{availableModels.length === 0 ? (
- No models available. Please configure a provider first. + No models available yet. Connect a provider above to see model options.
) : (
@@ -841,15 +842,16 @@ export function ModelOnboardingModal({ {step === "github" && (

- Connect GitHub to import issues and manage pull requests. This is - optional — you can still use Fusion without GitHub. + Linking GitHub lets you import issues as tasks and keep pull + requests in sync with your work. This is entirely optional — + Fusion works without it.

{!hasGithubProvider ? (

- GitHub integration is not configured. You can set it up later + GitHub integration isn't set up yet. You can enable it later in Settings → Authentication.

@@ -962,14 +964,14 @@ export function ModelOnboardingModal({
Import from GitHub - Bring in issues from your repositories + Turn GitHub issues into tasks you can track here

- You can always create tasks later from the board or use{" "} - fn task create from the CLI. + You can create tasks anytime from the board, or use{" "} + fn task create in the terminal.

)} @@ -978,8 +980,8 @@ export function ModelOnboardingModal({

- You're ready to start using Fusion! Check out the dashboard to - create your first task. + Setup complete! Head to the board to create your first task, or + explore the dashboard to see what's available.

)} diff --git a/packages/dashboard/app/components/__tests__/ModelOnboardingModal.test.tsx b/packages/dashboard/app/components/__tests__/ModelOnboardingModal.test.tsx index 48533f443..79057c2d2 100644 --- a/packages/dashboard/app/components/__tests__/ModelOnboardingModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/ModelOnboardingModal.test.tsx @@ -308,7 +308,7 @@ describe("ModelOnboardingModal", () => { await navigateToGitHubStep(); - expect(screen.getByText(/GitHub integration is not configured/)).toBeTruthy(); + expect(screen.getByText(/GitHub integration isn't set up yet/)).toBeTruthy(); expect(screen.getByText("Continue without GitHub →")).toBeTruthy(); }); @@ -1179,7 +1179,7 @@ describe("ModelOnboardingModal", () => { }); // Helper text should be visible when no providers are authenticated - expect(screen.getByText("You can add API keys or log in to providers later from Settings.")).toBeTruthy(); + expect(screen.getByText("Skip this step if you'd like — you can always add providers later from Settings.")).toBeTruthy(); }); it("does not show helper text on AI Setup when a provider is authenticated", async () => { @@ -1198,7 +1198,7 @@ describe("ModelOnboardingModal", () => { }); // Helper text should NOT be visible when a provider is authenticated - expect(screen.queryByText("You can add API keys or log in to providers later from Settings.")).toBeNull(); + expect(screen.queryByText("Skip this step if you'd like — you can always add providers later from Settings.")).toBeNull(); }); it("shows helper text on GitHub step when GitHub is available but not connected", async () => { @@ -1214,7 +1214,7 @@ describe("ModelOnboardingModal", () => { await navigateToGitHubStep(); // Helper text should be visible when GitHub is available but not connected - expect(screen.getByText("You can connect GitHub later from Settings → Authentication.")).toBeTruthy(); + expect(screen.getByText("No worries if you're not ready — connect GitHub anytime from Settings → Authentication.")).toBeTruthy(); }); it("does not show helper text on GitHub step when GitHub is connected", async () => { @@ -1230,7 +1230,7 @@ describe("ModelOnboardingModal", () => { await navigateToGitHubStep(); // Helper text should NOT be visible when GitHub is connected - expect(screen.queryByText("You can connect GitHub later from Settings → Authentication.")).toBeNull(); + expect(screen.queryByText("No worries if you're not ready — connect GitHub anytime from Settings → Authentication.")).toBeNull(); }); });