fix(onboarding): surface unavailable-agent install cards in the Local CLI empty state (#4662) - #4733
Conversation
|
Thanks @maxmilian β opened as a draft, so I'll hold off on the full review until you mark it 'Ready for review'. Ping me whenever it's ready. β open-design team |
|
Thanks @lefarcen β heads-up that this is already out of draft: I flipped it to Ready for review at 07:55 UTC, just before your note landed (07:58), so it likely read the stale draft state. It's ready for the full review whenever you/the pool reviewer can pick it up. π |
|
Thanks for the heads-up β I picked up the ready-for-review state now. π§ͺ This PR changes a user-facing onboarding flow, so it needs a manual QA pass before merge. Please hold off self-merging for now; we'll loop QA in once it's merge-ready. |
|
Hi @lefarcen β I noticed this got converted back to draft on the 27th. Just want to make sure I'm not blocking anything: is there a change you'd like me to make, or is the draft state just parking it out of the merge queue while it waits for manual QA? Happy to address whatever's needed β let me know and I'll turn it around. π |
|
Hey @maxmilian β no new change request from me right now. From what I can see, the draft state is just parking this while the remaining manual gates finish: design is already approved, QA has been queued, and I don't need anything else from you unless QA or the code reviewer turns up something specific. So for now you're not blocking this one β if another reviewer asks for a follow-up, we'll call it out directly here. |
|
Hi @maxmilian! This PR looks quiet for a bit, so I'm checking in to make sure it doesn't get stuck. If you are waiting on review, feedback, or a specific unblock from the team, feel free to say so here. If faster coordination helps, you can also drop into our contributors channel in Discord: We want to help move this forward instead of letting it stall. |
|
Quick status for @maxmilian: this isn't waiting on a code change from you right now. The remaining blocker on my side is design sign-off for the onboarding UI change; once that's in, QA can take the manual pass. If either reviewer needs a follow-up, we'll call it out here. |
β¦ CLI empty state (nexu-io#4662) When onboarding's Local CLI step detected zero usable agents, the empty state showed only the `settings.noAgentsDetected` sentence + a Rescan button β none of the install cards, Install/Docs links, or per-agent diagnostics that Settings > Local CLI already provides. Extract the unavailable-agent install-card grid out of SettingsDialog into a shared `UnavailableAgentGrid` component and reuse it in both SettingsDialog and the onboarding empty state, so the two views stay in sync as agents are added. Settings behavior is unchanged (the component takes the AMR-attribution / external-open handlers as props); onboarding passes the unavailable agents it already has from the scan result. Adds a falsifiable regression test for the onboarding empty-state render path (cards + Install/Docs links + diagnostic row). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51d9f9c to
ca33936
Compare
|
Rebased onto the latest The conflict was textual: upstream's Since this branch also lifts ~82 lines out of
#4662 is still open and no equivalent fix has landed upstream, so this is still the change that closes it. Still parked on the manual QA pass as far as I know β no action needed from me unless QA or design turns something up. |
|
Thanks for rebasing and for re-running the checks after the conflict. From our side this still looks like the same onboarding fix on the new head, so there isn't anything new needed from you right now β it's still waiting on the remaining design sign-off before QA picks it up. |
|
Just keeping this alive so it doesn't get swept into auto-close β still nothing outstanding on my end. It's rebased onto latest |
|
Thanks for the keep-alive. I re-checked the current head and the changed paths are still the same onboarding install-card extraction in This can stay parked as a draft while design sign-off lands; once that clears, QA is the next step. If either gate turns up something concrete, we'll call it out here. |
Fixes #4662
Why
Onboarding β Local coding agent is one of the first screens a new user hits. When no usable local CLI agent is detected, the empty state showed only a flat "No agents detected yetβ¦" sentence + a Rescan button β a dead end at the exact moment the user most needs install guidance. Settings β Local CLI already renders rich per-agent install cards (Install/Docs links + diagnostics), so onboarding was strictly worse than Settings for the same situation. This surfaces the same cards in onboarding so the empty state becomes actionable.
(Filed by QA during #4632; the maintainer confirmed it's current behavior β not a fixture artifact β and suggested the shared-component approach.)
What users will see
In onboarding β Local coding agent, when no usable agent is detected, the empty state now shows the same unavailable-agent install cards as Settings: each supported CLI's icon + name + short description, Install / Docs links, and per-agent diagnostics (e.g. "β¦ was not found on your PATH" with a fix action). The "No agents detected yet" sentence stays as the intro. Settings is unchanged.
Surface area
(No new deps, API/contract, or i18n keys β reuses the existing Settings card markup + translation keys.)
Screenshots
Before β bare empty state (reporter's capture in the issue):
After β onboarding empty state now surfaces the install cards:
Bug fix verification
apps/web/tests/components/EntryShell.onboarding-unavailable-agents.test.tsxexpect(grid).toBeTruthy()(the.agent-grid-unavailablegrid is absent) against the pre-fix bare empty state, and passes with the fix. A second test βwires the diagnostic Install fix-button to openExternalUrlβ was also confirmed red without the onboardingonOpenFixUrlwiring, then green with it.Validation
SettingsDialog.tsx) into a sharedUnavailableAgentGridcomponent, reused in both Settings and onboarding (the maintainer-preferred "option 2"). Settings behavior is preserved byte-for-byte β the AMR-attribution / external-open handlers are passed in as props; onboarding excludes AMR (it has its own connect flow) and wires the diagnostic fix-buttons toopenExternalUrl.pnpm typecheck(all packages): clean (exit 0)pnpm --filter @open-design/web test: 344 files / 3436 passed, 1 skipped, 0 failed