You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Related #46
Reframes the first-run wizard as a persistent, idempotent setup surface
driven by the activation funnel telemetry (SynapBus #27345, 78.2% → 11.7%
cliff at IDE connect). Replaces the linear v1 flow with three idempotent
tabs (Clients · Servers · Verify), a top-pinned sidebar entry with an
animated badge, and a passive Verify tab that flips green automatically
on the first successful MCP `initialize` round-trip — closing the loop
on the cliff in-product.
## Changes
Spec
- specs/046-local-first-onboarding/spec.md: appended a "v2 — Wizard
Surface Redesign" section. v1 text preserved verbatim.
Backend (Go)
- internal/httpapi/onboarding.go: extended /api/v1/onboarding/state with
first_mcp_client_ever, mcp_clients_seen_ever, incomplete_tab_count.
ShouldShowWizard semantics widened to cover Verify.
- internal/httpapi/server.go + internal/server/server.go +
internal/runtime/runtime.go: new GetActivationFirstMCPClient() reads
Spec 044's existing FirstMCPClientEver / MCPClientsSeenEver from the
ActivationStore. No new BBolt buckets, no new MCP hook.
- internal/httpapi/import.go: ImportFromPathRequest gains skip_quarantine
query param ("Import as active") and a rename map applied after
parsing — so the wizard can disambiguate cross-source name collisions
like "mcpproxy" appearing in both Claude Code and Claude Desktop.
Frontend (Vue 3 + Pinia)
- frontend/src/components/OnboardingWizard.vue: full rewrite as a 3-tab
modal at min(960px, 90vw) × min(640px, 85vh). Tabs are bidirectionally
clickable; per-tab idempotent state.
- Clients tab: detected sort -> always-pinned trio (Claude Code /
Codex / Gemini) -> "Show N more" collapse. Inline security
expander.
- Servers tab: sectioned checkbox list with indented server rows
under each section header; per-section "select all" with proper
indeterminate state; cross-source name collisions render an inline
rename pill ("→ <renamed>"); sticky non-scrollable footer with
selection count, conflict count, and two equal-width action buttons
(Import & quarantine, Import as active). Compact toggles for
Docker isolation and quarantine_enabled with inline Docker-
availability warning. Educational note about post-hoc scanning.
- Verify tab: passive, flips green on FirstMCPClientEver. Three
sample prompts annotated with the built-in tool each one exercises.
Recent Activity panel below shows the last 5 records with status
badges and "View all in Activity Log" link.
- frontend/src/components/SidebarNav.vue: top-pinned "Setup" entry
above Dashboard for personal edition.
- frontend/src/views/Dashboard.vue: removed the v1 "Run setup wizard"
button.
- frontend/src/stores/onboarding.ts + types/api.ts + services/api.ts:
store gains firstMCPClientEver, mcpClientsSeenEver, incompleteTabCount
computeds. importServersFromPath supports skip_quarantine + rename.
OpenAPI
- oas/swagger.yaml + oas/docs.go: ImportFromPathRequest gains rename.
Verification
- specs/046-local-first-onboarding/verification/: 7 Playwright-captured
PNGs and a self-contained report.html (1.4 MB, base64-embedded
screenshots).
## Testing
- internal/httpapi unit + contract tests pass; mocks updated.
- frontend vue-tsc clean.
- Playwright sweep on a fresh data dir: all scenarios pass; out-of-band
curl confirms rename produces mcpproxy_claude_code /
mcpproxy_claude_desktop with quarantined=true.
0 commit comments