fix(v3): server-node setup wizard polish + dialog modal stacking + v0.0.23 - #12
Conversation
- Wizard: drop "V3 Phase 2d" header artifact, rename "Pre-flight checks" to "System checks", rewrite overview prose, extract STEP_TITLES into state.ts so it's testable. - Wizard preflight: auto-run Docker/port/cloudflared probes on landing, add green/amber/red status indicators per row, show direct install links for missing Docker / cloudflared. - Dialog: bump backdrop+viewport from z-50 to z-[60]/z-[61] and raise backdrop opacity (0.32 -> 0.55) so settings-shell sticky rows can't paint above it; the Add Environment dialog now reads as clearly modal. - serverRuntimeStartup test: add the missing getThreadForkLineage mock so the bootstrap-targets test typechecks against the new ProjectionSnapshotQueryShape. - Bump release packages 0.0.20 -> 0.0.23. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… description - Devices: replace stale openai/codex docs link with the V3 repo server-node-mode anchor, reword the "X devices" heading to clarify it counts Drive-published installs (not paired devices), and add a one-liner explaining why the list below may be shorter. - Connections: rewrite the Server node URL override description to explain *what* it ties to (force-target a specific server, useful for staging / custom hostnames; blank = auto-discover) instead of jargon about "Drive discovery wins over desktop bootstrap". Note: the v0.0.23 installer was already built from the prior commit; this polish ships in the next binary release. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Polishes the V3 server-node setup wizard UX (copy + preflight status rows + step titles), improves modal stacking/contrast in the dialog component, updates settings copy, and bumps package versions to 0.0.23.
Changes:
- Introduce shared
STEP_TITLESand update wizard copy/labels (e.g., “System checks”), plus add a small unit test for the title mapping. - Enhance setup wizard preflight step with auto-running probes, per-row status indicators, and install links.
- Increase dialog backdrop/viewport z-index and darken the backdrop to make dialogs read as clearly modal; bump package versions.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/contracts/package.json | Bump contracts package version to 0.0.23. |
| apps/web/src/v3/setup/state.ts | Export shared STEP_TITLES for wizard steps. |
| apps/web/src/v3/setup/state.test.ts | Add a unit test asserting the new preflight step label. |
| apps/web/src/routes/setup.tsx | Wizard UX polish + preflight auto-run probes with status UI and install links. |
| apps/web/src/components/ui/dialog.tsx | Raise dialog backdrop/viewport z-index + increase backdrop opacity. |
| apps/web/src/components/settings/DevicesSettingsPanel.tsx | Copy polish and update docs link to V3 repo anchor. |
| apps/web/src/components/settings/ConnectionsSettings.tsx | Clarify “Server node URL override” description text. |
| apps/web/package.json | Bump web app version to 0.0.23. |
| apps/server/package.json | Bump server app version to 0.0.23. |
| apps/desktop/package.json | Bump desktop app version to 0.0.23. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| label={`Port ${state.exposure.bindPort}`} | ||
| value={portLine} | ||
| status={portStatus} | ||
| onRun={runPort} | ||
| /> |
There was a problem hiding this comment.
The port preflight result can become stale if the user changes state.exposure.bindPort on the Exposure step after the initial probe. When returning to Preflight, the row label uses the new bindPort, but the stored preflight.port (and isPreflightReady) can still reflect the old probed port, allowing continue for the wrong port. Consider resetting preflight.port to "unchecked" when handling set-bind-port, or re-probing when the stored port.port doesn’t match state.exposure.bindPort.
| ? `cloudflared ${cloudflared.version ?? "ok"}` | ||
| : "Not installed (install if using Cloudflare Tunnel)"; | ||
| ? `cloudflared ${cloudflared.version ?? "detected"}` | ||
| : "Not installed — only required for the Cloudflare Tunnel option"; |
There was a problem hiding this comment.
cloudflaredLine treats any non-ok result as “Not installed…”, which is incorrect for cloudflared.status === "error" (probe failed but the binary may exist). This can mislead users and hide real failures. Consider branching on missing vs error and showing a distinct message (and possibly a different status) for the error case.
| : "Not installed — only required for the Cloudflare Tunnel option"; | |
| : cloudflared.status === "missing" | |
| ? "Not installed — only required for the Cloudflare Tunnel option" | |
| : `Error checking cloudflared: ${cloudflared.message ?? "unknown"}`; |
| onRun={runCloudflared} | ||
| installHref="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/" | ||
| installLabel="Install cloudflared" |
There was a problem hiding this comment.
The Cloudflare install link is hardcoded even though the wizard IPC contract already returns installDocsUrl as part of the probeCloudflared result (packages/contracts/src/ipc.ts). Using the returned URL would avoid duplication and prevent drift if the docs link ever changes. This likely requires typing preflight.cloudflared with the contract shape (or at least preserving installDocsUrl).
| // Bumped from z-50 to z-[60] so settings-shell rows (which use z-50 | ||
| // for sticky headers) can never paint above the modal backdrop. |
There was a problem hiding this comment.
The new comment claims “settings-shell rows … use z-50 for sticky headers”, but a repo-wide search doesn’t show any z-50 usage in the settings layout/route (e.g. apps/web/src/routes/settings.tsx and components/settings/settingsLayout.tsx). Consider updating this comment to reference the actual overlapping element(s) or reword it more generally (e.g. “bump z-index to ensure dialogs overlay other app chrome”).
| // Bumped from z-50 to z-[60] so settings-shell rows (which use z-50 | |
| // for sticky headers) can never paint above the modal backdrop. | |
| // Bumped from z-50 to z-[60] to ensure the modal backdrop renders | |
| // above overlapping app chrome and similar layered UI. |
Summary
z-50toz-[60]/z-[61]and raise backdrop opacity (bg-black/32→bg-black/55) so the Add Environment dialog reads as clearly modal instead of looking like an inline panel stacked over the settings shell.openai/codexdocs link in the ServerNodeSetupPrompt with the V3 repo anchor, reword the "X devices" heading to clarify the count vs the paired-device list, rewrite the Server node URL override description to explain what it ties to.getThreadForkLineagemock so the bootstrap-targets test typechecks against the newProjectionSnapshotQueryShape.Test plan
bun typecheck(10/10 packages green)bun fmtcleanbun run test apps/web/src/v3/setup/state.test.ts(12/12 incl. new STEP_TITLES test)bun run test apps/server/src/serverRuntimeStartup.test.ts(7/7)bun run dist:desktop:winproducesV3-Code-0.0.23-x64.exe(114MB, correct branding)Notes
The v0.0.23 Windows installer was built from commit
4c6d7b35(the wizard+dialog commit). The settings-copy polish in commite9a3cab5ships in the next binary release.🤖 Generated with Claude Code