diff --git a/desktop/src/features/onboarding/ui/SetupStep.tsx b/desktop/src/features/onboarding/ui/SetupStep.tsx index aa02486706..75d8c84a1d 100644 --- a/desktop/src/features/onboarding/ui/SetupStep.tsx +++ b/desktop/src/features/onboarding/ui/SetupStep.tsx @@ -612,7 +612,7 @@ function RuntimeProvidersSection({
{orderedItems.length > 0 ? ( -
+
{orderedItems.map((runtime) => ( - No supported agent harnesses were detected yet. Install Claude Code - or Codex, then check again. + No supported agent harnesses were detected yet. Install a supported + harness, then check again.

)} diff --git a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs index b10aa19154..221702ebb2 100644 --- a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs +++ b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs @@ -12,11 +12,11 @@ function runtime(id, availability, status) { return { id, availability, authStatus: { status } }; } -test("only Claude Code and Codex are visible in onboarding", () => { +test("all bundled harnesses are visible in onboarding", () => { assert.equal(runtimeIsVisibleInOnboarding("claude"), true); assert.equal(runtimeIsVisibleInOnboarding("codex"), true); - assert.equal(runtimeIsVisibleInOnboarding("goose"), false); - assert.equal(runtimeIsVisibleInOnboarding("buzz-agent"), false); + assert.equal(runtimeIsVisibleInOnboarding("goose"), true); + assert.equal(runtimeIsVisibleInOnboarding("buzz-agent"), true); assert.equal(runtimeIsVisibleInOnboarding("custom"), false); }); @@ -30,7 +30,7 @@ test("visible onboarding runtimes use the product order", () => { assert.deepEqual( getVisibleOnboardingRuntimes(runtimes).map(({ id }) => id), - ["claude", "codex"], + ["claude", "codex", "goose", "buzz-agent"], ); }); @@ -55,16 +55,17 @@ test("readiness requires an available and authenticated runtime", () => { ); }); -test("ready onboarding runtimes exclude hidden ready harnesses", () => { +test("ready onboarding runtimes exclude unknown and non-ready harnesses", () => { const runtimes = [ runtime("goose", "available", "not_applicable"), runtime("codex", "available", "logged_out"), runtime("buzz-agent", "available", "not_applicable"), runtime("claude", "available", "logged_in"), + runtime("custom", "available", "not_applicable"), ]; assert.deepEqual( getReadyOnboardingRuntimes(runtimes).map(({ id }) => id), - ["claude"], + ["claude", "goose", "buzz-agent"], ); }); diff --git a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts index 51339e2afe..cd491dfcc5 100644 --- a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts +++ b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts @@ -1,6 +1,11 @@ import type { AcpRuntimeCatalogEntry } from "@/shared/api/types"; -export const ONBOARDING_RUNTIME_ORDER = ["claude", "codex"]; +export const ONBOARDING_RUNTIME_ORDER = [ + "claude", + "codex", + "goose", + "buzz-agent", +]; const VISIBLE_ONBOARDING_RUNTIME_IDS = new Set( ONBOARDING_RUNTIME_ORDER, diff --git a/desktop/tests/e2e/onboarding-agent-defaults.spec.ts b/desktop/tests/e2e/onboarding-agent-defaults.spec.ts index e1d8b11b6f..f425c0f437 100644 --- a/desktop/tests/e2e/onboarding-agent-defaults.spec.ts +++ b/desktop/tests/e2e/onboarding-agent-defaults.spec.ts @@ -57,9 +57,7 @@ async function readSavedRuntime(page: Parameters[0]) { }); } -test("setup shows only Claude Code and Codex as detected harnesses", async ({ - page, -}) => { +test("setup shows all bundled harnesses as detected", async ({ page }) => { await installMockBridge( page, { @@ -77,10 +75,8 @@ test("setup shows only Claude Code and Codex as detected harnesses", async ({ await expect(page.getByTestId("onboarding-runtime-claude")).toBeVisible(); await expect(page.getByTestId("onboarding-runtime-codex")).toBeVisible(); - await expect(page.getByTestId("onboarding-runtime-goose")).toHaveCount(0); - await expect(page.getByTestId("onboarding-runtime-buzz-agent")).toHaveCount( - 0, - ); + await expect(page.getByTestId("onboarding-runtime-goose")).toBeVisible(); + await expect(page.getByTestId("onboarding-runtime-buzz-agent")).toBeVisible(); await expect(page.getByRole("checkbox")).toHaveCount(0); }); @@ -525,8 +521,8 @@ test("defaults auto-selects the only ready visible harness", async ({ page, { acpRuntimesCatalog: [ - runtime("buzz-agent", "available", { status: "not_applicable" }), - runtime("goose", "available", { status: "not_applicable" }), + runtime("buzz-agent", "not_installed", { status: "not_applicable" }), + runtime("goose", "not_installed", { status: "not_applicable" }), runtime("claude", "available", { status: "logged_in" }), runtime("codex", "available", { status: "logged_out" }), ], @@ -626,10 +622,10 @@ test("defaults requires a choice when multiple visible harnesses are ready", asy ).toBeVisible(); await expect( page.getByTestId("global-agent-default-harness-option-goose"), - ).toHaveCount(0); + ).toBeVisible(); await expect( page.getByTestId("global-agent-default-harness-option-buzz-agent"), - ).toHaveCount(0); + ).toBeVisible(); await page.getByTestId("global-agent-default-harness-option-codex").click(); await expect(harness).toHaveText("Codex"); await expect(page.getByTestId("onboarding-finish")).toBeEnabled();