Connect view — unknown/denied tri-state + remediation banner

Spec 075 (macOS TCC-safe Connect) · MCP-2833 · frontend/src/components/ConnectModal.vue · branch fe-2833-connect-tristate

3 / 3Playwright scenarios passed
224vitest unit tests passed
5access outcomes rendered distinctly
PASS US1 + US2 — Tri-state listing (denied / malformed / unknown / connected / absent)

Expected

  • access_state=denied (Claude Code): a 'Blocked' badge AND an actionable remediation banner naming the cause and the exact `tccutil reset SystemPolicyAppData com.smartmcpproxy.mcpproxy` command, with a Copy button.
  • access_state=malformed (Cursor): a distinct 'Unreadable config' badge — NOT a denial banner.
  • access_state=unknown, installed (Codex): neutral — a 'Connect' action plus an explicit 'Check access' affordance; no eager content read, no banner.
  • content-resolved connected (OpenCode): a 'Disconnect' button.
  • absent (VS Code): 'Config not found'.

Observed

All five outcomes render distinctly. The denied row shows the blocked badge + remediation banner (full tccutil command) + Copy/Re-check; malformed shows its own badge; the unknown row stays neutral with a Check-access link; connected shows Disconnect; absent shows Config not found.

01-tristate-listing.png
01-tristate-listing.png
PASS US2 — One-click copy of the reset command

Expected

  • Clicking 'Copy reset command' writes exactly `tccutil reset SystemPolicyAppData com.smartmcpproxy.mcpproxy` to the clipboard and the button confirms with 'Copied ✓'.

Observed

Clipboard content asserted equal to the exact tccutil command; button label flips to 'Copied ✓'.

02-copied-command.png
02-copied-command.png
PASS US1 — Explicit 'Check access' resolves an unknown client on demand

Expected

  • Initially one denial banner (the pre-denied Claude Code row); the Codex row is neutral (unknown).
  • Clicking 'Check access' on Codex calls the per-client GET (the only content-read endpoint, scoped to the user action) and, when it returns denied, surfaces a second remediation banner — without a full connect attempt.

Observed

Banner count goes 1 → 2 after the explicit Check-access click; the newly resolved denial renders its own remediation banner.

03-check-access-resolves-denied.png
03-check-access-resolves-denied.png