Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions desktop/src/features/onboarding/ui/SetupStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ function RuntimeProvidersSection({

<div className="flex w-full flex-1 flex-col items-center justify-center gap-8 py-10">
{orderedItems.length > 0 ? (
<div className="grid min-w-0 w-full max-w-[592px] grid-cols-1 gap-4 md:grid-cols-2">
<div className="grid min-w-0 w-full max-w-[1200px] grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4">
{orderedItems.map((runtime) => (
<RuntimeCard
installResults={installResults}
Expand All @@ -629,8 +629,8 @@ function RuntimeProvidersSection({
className="max-w-[560px] rounded-2xl bg-white/70 px-6 py-6 text-sm text-muted-foreground"
data-testid="onboarding-acp-empty"
>
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.
</p>
)}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});

Expand All @@ -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"],
);
});

Expand All @@ -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"],
);
});
Original file line number Diff line number Diff line change
@@ -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<string>(
ONBOARDING_RUNTIME_ORDER,
Expand Down
18 changes: 7 additions & 11 deletions desktop/tests/e2e/onboarding-agent-defaults.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,7 @@ async function readSavedRuntime(page: Parameters<typeof installMockBridge>[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,
{
Expand All @@ -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);
});

Expand Down Expand Up @@ -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" }),
],
Expand Down Expand Up @@ -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();
Expand Down
Loading