v0.5.0 Plan B: extension UX polish + bug fixes #1
Reference in New Issue
Block a user
Delete Branch "feature/v0.5.0-plan-b-extension-ux"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements Plan B for v0.5.0 polish + harden:
ERROR_COPYmap — every snake_case error code returned by the service worker router now maps to a friendly title/body/CTA. The popup'shumanizeErrorregex chain and the fullscreen tab's rawstate.errorrenders both replaced. A generated test discovers codes via live grep so the registry can't drift. (Closes B2.)InputEvent('input', { bubbles: true })after programmaticinput.valueassignment so the meter re-rates the new password.colorizePassword()pure utility splits passwords into character-class runs (digit/symbol/letter), with CSS custom-property defaults and achrome.storage.sync-backed color scheme. Applied to field-history viewer, popup item-detail, fullscreen item-detail (shared code path), and generator preview. Boot-timeapplyColorScheme()wired to both popup and vault. Settings Display section with live swatch and reset..form-lowerwrapper with the samemax-width: 960px; margin: 0 autoenvelope as.form-grid. Popup unchanged (gated onsurface === 'fullscreen').finishSetup()opensvault.htmlin a new tab and best-effort closes the setup tab after successful device registration.Spec:
docs/superpowers/specs/2026-05-02-v0.5.0-polish-harden-design.mdPlan:
docs/superpowers/plans/2026-05-02-v0.5.0-plan-b-extension-ux.mdTest plan
npx vitest run— 336 passed, 8 known pre-existing failures (all device-related)npm run build— webpack compiled (pre-existing WASM module errors in service-worker, unrelated to this work)cargo build -p relicario-wasm --target wasm32-unknown-unknown— cleanViewport sweep notes
Manual viewport sweep requires loading the built extension in Chrome with a configured vault. Recommend PM/reviewer to verify P3 form layout visually.
P2 smoke note
Setup → vault tab handoff requires a Gitea instance for the full flow. Core logic verified by Vitest (
chrome.tabs.createcalled withvault.html; tab-close failure is swallowed).- Create crates/relicario-cli/src/device.rs: local key storage under ~/.config/relicario/devices/<name>/, current-device tracking, and git signing config (gpg.format=ssh, user.signingkey, core.sshCommand) - Add Device command to CLI with add/revoke/list subcommands - cmd_device add: generates two ed25519 keypairs (signing + deploy), registers deploy key via Gitea API, stores keys at 0600, configures git SSH signing, updates .relicario/devices.json and commits - Gitea config read from flags or RELICARIO_GITEA_{URL,TOKEN,OWNER,REPO} - --no-gitea flag skips API registration for non-Gitea remotes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>renderForm() takes an optional { surface: 'popup' | 'fullscreen' } parameter. When 'fullscreen', the Identity and Credentials field groups render as glass cards inside a .form-grid (two columns, stacks at <=720px). Popup keeps its single-column layout.Title left ('new login' / 'edit login'), subtitle below cycles between 'no changes' and 'unsaved · esc to cancel' on input events. Right side shows the platform-aware save hint ('⌘+S to save' / 'Ctrl+S to save'). The actual ⌘+S keymap arrives in Phase 3 — this is a visual hint only.Programmatic input.value = newPassword does not fire input events, so the strength-meter listener at shared/form-affordances/password-tools.ts:65 never re-rates the new value — meter stays stuck on the prior reading. Extract applyGeneratedPassword(input, value) helper that sets value, type, then dispatches new InputEvent('input', { bubbles: true }). Vitest covers the dispatch + a sanity check that bubbling listeners fire.Pull request closed