audit 2026-05-01: 64 of 65 fixes + interactive review app - #53
Conversation
Seed profile defaults now flow workspace.home.name → os.userInfo().username → empty string. The home greeting client filters the legacy 'You' name client-side so existing user.json files fall back to 'Good morning.' rather than reading 'Good morning, You.'. Closes audit-2026-05-01 #1.
…grey The team-schedule calendar marked every past heartbeat with no scheduled-conversation record as an amber 'did not run' warning. On a local-first product the most common cause is the daemon was off, not a real failure — so the calendar yelled about the normal state. Changes: - Drop amber AlertCircle icon from EventPill and dense day-cell chip - Rename missed copy 'did not run — click to run now' to 'no run logged — click to run now' across tooltips, aria-labels, titles - EventDot 'Click to run now →' line muted instead of amber Future work: daemon-uptime windows would let us distinguish skipped (daemon off) from failed (daemon up but agent errored). Until then, neutral is the honest treatment. Closes audit-2026-05-01 #19.
… at prompt build
Personas were storing literal cabinet names baked in. When the cabinet was
renamed, the agent's outputs still spoke the old name.
- New persona-templating helper: tiny exact-match {{ key.path }} substitution,
unknown keys left intact (visible failures > silent drops)
- heartbeat.ts both prompt sites resolve cabinet.name via the manifest and
user.name via user.json before rendering
- conversation-runner.ts header renders the body too (sync subset of context)
Available placeholders: cabinet.name / cabinet.slug / cabinet.path /
user.name / agent.name / agent.slug / today.
Closes audit-2026-05-01 #27.
Bulk-delete on Tasks was surfaced as a permanent toolbar icon next to the filter chips — too easy to mistake for a filter clear. The existing typed- DELETE confirmation modal already prevents accidental wipes, but the placement still invited the click. Now the trash button appears only when: - A source filter is active (Manual / Jobs / Heartbeat), or - An agent filter is selected, or - One or more tasks are in the bulk-selection state On the default 'All' view with no selection, bulk-wipe is unreachable. Closes audit-2026-05-01 #33.
Existing installs shipped with user.json {"name": "You"} baked in. The
homescreen greeting fix (#1) handled the client-side display, but the
Settings → Profile input still showed the literal 'You' because it's bound
to the stored value.
readUserProfile() now upgrades exact-case 'You' (the legacy literal) to the
seeded value — workspace home name, OS username, or empty. Case-sensitive
match means a user who typed 'you' lowercase is left alone.
Closes audit-2026-05-01 #39.
The schedule-mode dropdown trigger had title='When should this run?' while
the visible label was 'Run now' — screen readers heard a question and the
chosen action competing for the same control.
Title now mirrors the current selection ('Run now — change schedule');
aria-label explicitly frames it as a schedule control ('Schedule: Run now.
Click to change.').
Closes audit-2026-05-01 #2.
Polish batch — four small copy/casing fixes: - 'Import a pre-made zero-human team' → 'Start from a template' (#3) - Greeting H1 dropped from text-3xl/4xl to text-xl/2xl so the prompt card lands above the fold on 1280×720 viewports (#5) - '1 uncommitted files' pluralizes: '1 uncommitted file' / 'N uncommitted files' / 'All committed' (#6) - Template cards: '0 agents' → 'No agents'; '1 agents' → '1 agent'; same pattern for jobs and sub-cabinets in the import dialog (#7) Closes audit-2026-05-01 #3, #5, #6, #7.
- Sidebar drawer tabs swap from 'DATA / AGENTS / TASKS' (all-caps) to 'Data / Agents / Tasks' (sentence case) with font-semibold for active emphasis. Matches the rest of the sidebar voice. (#8) - URL hash path encoder splits on '/' and encodes per-segment so nested page paths render as '#/p/marketing/drafts/foo' instead of '#/p/marketing%2Fdrafts%2Ffoo'. Parser already split on '/' so no reader changes needed. (#11) Closes audit-2026-05-01 #8, #11.
… tab titles - Agents header pill 'depts' → 'department(s)' with proper pluralization (#20) - Settings 'Show hidden files' kbd hint shows ⌘⇧. on macOS / Ctrl+Shift+. on Windows/Linux instead of mixed ⌘+⇧+. (#43) - Agent route title-cases the slug: 'calendar-keeper' → 'Calendar Keeper — Cabinet' instead of lowercase 'calendar-keeper — Cabinet' (#25) - Settings sub-route title includes the active tab: 'Appearance — Settings — Cabinet' so back-button history isn't a row of identical entries (#62) Closes audit-2026-05-01 #20, #25, #43, #62.
…chrome - Sidebar tree: active row gets a 2px primary accent bar (before:: pseudo) + font-semibold; background tint muted so hover stays distinguishable (#15) - Agent skills: slug subscript only renders when name ≠ slug, so chips no longer read 'code-review-excellence code-review-excellence' (#29) - Provider dropdown: not-installed options are disabled (still visible); the currently-selected provider stays selectable so the agent doesn't lock out. Suffix changed from '(not installed)' to '— install required' for action-orientation (#30) Closes audit-2026-05-01 #15, #29, #30.
- Agents 'Org chart' button gets a descriptive title attribute (#21) - Routines empty state becomes a clickable dashed card 'Schedule a routine' that programmatically opens the existing Add-routine popover (#23) - Removed orphan 'Pick which agent runs this routine…' help paragraph (#24) - Kanban empty lanes (Your turn / Running / Just finished / Archive) render lane icon (spinning for Running) above the hint instead of flat captions (#34) - Status bar wrapper now <footer role='contentinfo' aria-label='Status bar'> for landmark navigation (#60, partial #48) - Settings page heading promoted from H2 to H1 (visual unchanged) (#59) Closes audit-2026-05-01 #21, #23, #24, #34, #59, #60.
…ette right-pane echo - Star count pill in the status bar gets a title hint explaining what it is and how to star Cabinet (#4) - Paper theme --ring lightness 0.47 → 0.34 to clear WCAG 4:1 against the warm parchment background; --sidebar-ring follows. Other themes left for a follow-up sweep (#54) - Search palette empty-state right pane no longer echoes the left pane's hint copy — keeps a subtle search glyph as a hero (#37) Closes audit-2026-05-01 #4, #37, #54.
#9 — DepthDropdown was a bare "Own" pill with no scope context, and its labels claimed "agents only" even though the filter spans pages, agents, and tasks. Labels are now scope-accurate ("This cabinet only" + per-option descriptions); the trigger title/aria and an sr-only prefix announce "Cabinet scope:" so the mental model is unambiguous; the popover gains a header and inline option descriptions. #10 — Prompt suggestion chips were a static set of 9. Pool grew to 16, surface 9 at a time (first chip pinned as a landmark, remaining 8 shuffled deterministically), and a small RefreshCw button re-rolls. Cabinet-aware suggestions remain a follow-up.
#12 — toolbar previously rendered 30+ icon buttons in one scroll. The 2026-04-25 fix replaced an "More ⋯" popover with a scroll fade, but the underlying density problem remained. Now: H1/H2/H3 collapse into a single "Aa ▾" dropdown that also surfaces Body. Less-frequent controls (alignment, sup/sub, divider, embed, video, RTL) move behind a "More ▾" overflow at the tail. Each menu item shows a check when active. Visible row drops to ~13 buttons. The pre-existing BubbleMenu carries inline marks on selection.
#14 — The filled brand-orange "+ New Task" button stole the eye away from the actual primary action on the editor surface. Replaced with a neutral outlined "+ New" pill. Dropdown is now context-aware: on a page, the first item is "New page in <folder>" with a small dialog to capture the title; everywhere else the menu leads with "New task" then "New routine". Filled brand color is reserved for surface-primary. #16 — Sub-cabinets, folders, and pages used to share an icon-tint- only distinction. Cabinets now use the LibraryBig icon shape, render their label at font-medium, and carry a persistent muted "Cabinet" pill (with hover ↗ glyph) on the right that opens the cabinet view. Folders keep Folder/FolderOpen, pages keep FileText. Three cues per row instead of one.
#17 — page tab title fell through to "Cabinet" with no page context. Added an explicit "page" case that prefers frontmatter.title from the editor store, falling back to the slug. Sidebar + breadcrumb already preferred title; the tab title now matches. #18 — autosave indicator went silent during typing bursts and after the 2s "Saved" flash. Added lastSavedAt to the editor store and two new states in the status bar: "Editing…" (pulse) while isDirty but not yet saving, and "Saved · 12s ago" (persistent, ticks every 10s) once idle. Save failed / Saving / Saved-flash still work as before.
#22 — agents intro paragraph is welcome on first visit, then a wall above the cards on every return. Persisted per-cabinet dismissal: the full headline + 2 paragraphs collapse to a single muted line "Your team works on a schedule." with a "Show explainer" link to re-open. #31 — there was no aria-live region for nav announcements at all. Added a polite SR-only region in AppShell and wired it to the same useEffect that writes document.title. Cleared then re-set on each update so repeat-string nav still triggers an announcement.
#35 — archive lane was collapsed by default, hiding overnight runs behind a vertical rail. Defaulted the persisted collapsed-lanes set to empty so archive expands on first load. Lane caps to ARCHIVE_PEEK (8) items with a "Show N more →" affordance — header still shows the full count. #36 — agent filter row sat below the header as a 12-pill scroller, adding a second filter row before the kanban. Replaced with an AgentFilterDropdown that lives inline in the header beside the trigger chips. Single-select preserved; FilterBar kept as a deprecated alias for the rename.
#38 — palette was search-only with no way to run actions. Added a SlashCommand registry with two command families today: /theme <name> across 15 themes (calls applyTheme + storeThemeName + next-themes setTheme) and /open <section> across home/agents/tasks/settings/help/ registry. Slash detection suppresses the search API; ↑/↓ navigate matches, ↵ runs, ⎋ closes. Empty-state hint teaches the affordance. Multi-day commands (/new page, /new task, /run agent, /cabinet, @ jumps, recent-commands ranking) deferred — registry structure is in place for them to land mechanically.
#40 — 9-tab horizontal strip replaced with a 212px vertical sidebar grouped under You / Workspace / App. Narrow viewports collapse to a horizontal scroll row at the top of the content pane; all hash routing and tab state preserved. #41 — fallback icon picker leaked lucide identifiers (BarChart3, ShieldCheck, PenTool) via title= and accessible name. New friendlyIconName() splits camelCase into "Bar chart 3" / "Shield check" / "Pen tool" with overrides for CPU/HDD/Wi-Fi/GitHub/GitLab. Title, aria-label, and search filter all use the friendly form. Search still matches the original lucide key for power users.
#42 — theme picker showed a name + dot only. Each theme card now renders a 70px miniature scoped to that theme's CSS custom properties (faux sidebar with active row, heading + body in theme typography, primary button + secondary chip, accent stripe). No image assets — the same vars the real app consumes. #44 — era themes only repainted colors. Added per-theme CSS scoped to [data-custom-theme="<name>"]: Win 95 4-corner button bevels + title-bar gradient + 12px body + 0ms transitions; Win XP Luna gradient pill buttons; Apple Aqua bubble buttons; Matrix green grid backdrop + uppercase tracking; Cyber neon hover bloom. CSS-only, prefers-reduced-motion respects matrix grid. #45 — no Match system option. Added cabinet-theme-mode + light/dark pair storage, resolveActiveTheme() helper, and a matchMedia listener in AppShell that re-applies the right variant on OS scheme changes. Settings shows a Match system card with two sub-dropdowns; manual selection auto-disables system mode.
#46 — terminal resize handles already existed but were too thin to discover and didn't persist. Made handles 4px (6px on hover) with brighter pill, role="separator" + aria-orientation, and persisted width/height to localStorage. #49 — Sync button tooltip went silent after pull. Now records lastSyncedAt and the tooltip + aria-label read "Last synced 12s ago" ticking every 30s via the existing relative-time helper. #50 — uncommitted indicator was a nag without a remedy. Added a commit form inside the existing popover: single-line message + Commit button posting to /api/git/commit. Inline error rendering, default message ("Update N files") when empty. Diff view + discard remain deferred (need /api/git/diff for working tree + destructive UX).
#52 — runtime picker tooltip joined model/effort/provider with bare "·" separators, reading as a fictional compound model name. Now explicitly labeled: "Model: Claude Opus 4.7 · Effort: Medium · via Claude Code". #53 — no single keyboard cheat sheet existed. Added a global "?" hotkey that opens KeyboardShortcutsModal with five groups, platform- aware glyphs (⌘/Ctrl), and a filter input. Slash commands included so the audit #38 surface is discoverable here too. #57 — no What's new surface after upgrades. New WhatsNewCard compares package.json version to localStorage.last-seen-version and shows a dismissible card with bullets for the current release. Card lives bottom-right; "Read full release notes" links to the GitHub release tag. Versions without an entry silently advance the watermark.
…mmit #58 — uncommitted count carried Cabinet-internal writes (.cabinet-state, .next, runtime-ports.json) and never refreshed on focus. Filter list in git-service drops internal paths from the user-facing count; status bar refreshes on window focus + visibilitychange. #61 — sidebar tree expand chevron was a role=button with no name and no keyboard handler. Added aria-label, aria-expanded, tabIndex, and Enter/Space activation. Terminal panel buttons (new tab, move position, close panel, per-tab close) gained aria-label + title. #63 — narrow-viewport amber banner appears below 960px window width. Per-session dismiss; re-evaluates on resize. Per-surface tightening (toolbar #12, filters #36, settings #40) already in place. #65 — "Cabinet is cool" exists only in user data/. Migrated the four heartbeat personas to {{cabinet.name}} so the persona-templating layer (#27) substitutes at prompt-build time.
Review feedback on the 2026-05-01 audit slideshow flagged 4 fixes that went the wrong way and one Pass-with-suggestion: #5 — H1 was halved too aggressively (text-xl/2xl). Bumped to text-2xl/3xl/4xl so desktops get the original presence while 13" laptops still keep the prompt above the fold. #8 — sentence-case drawer tabs reverted to uppercase tracking-wider. Cabinet name in the sidebar header also uppercased so the whole cabinet "header" reads as one family. #12 — heading dropdown + More overflow reverted. Editor toolbar is back to the single scrollable row + ChevronLeft/Right gradient fades on each edge. #16 — LibraryBig sub-cabinet icon reverted to the brand Archive at text-amber-400. The persistent "Cabinet" pill + font-medium label stay (they distinguish cabinets without changing the glyph). #53 — Help page's "Keyboard shortcuts" card now opens the searchable cheat-sheet modal directly (new shortcuts-modal HelpAction kind) so the modal is reachable via Help → Open cheat sheet, not just the `?` hotkey. Also includes the asset-route Cache-Control fix from earlier (HTML files now revalidate so re-generated in-Cabinet apps don't serve stale builds).
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (41)
📝 WalkthroughWalkthroughThis release (v0.4.0) introduces a comprehensive set of features and polish: era-based themes with system preference matching, a searchable keyboard shortcuts modal, agent persona templating, slash-command search, improved accessibility across UI components, persistent terminal/settings storage, inline git commits, and numerous refinements to home screens, archive views, and component labeling. ChangesTheme System & Era Themes
Help & Keyboard Navigation Features
Agent Persona Templating
Persistence, State Management & Editor Integration
Search, Navigation & Command Palette
Composer & Page Creation
Task Board & Kanban Refinements
UI Polish & Accessibility
Git & Asset Handling
Onboarding & Settings
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Review rate limit: 7/8 reviews remaining, refill in 7 minutes and 30 seconds.Comment |
…ider select (cabinetai#124, cabinetai#32, cabinetai#53, cabinetai#113) - heading-anchors: rewrite using PM DecorationSet instead of direct DOM id mutation; the dom-write approach was causing a MutationObserver feedback loop (PM reconciles attribute changes, removing the id, then we set it again — infinite). Decorations are PM-managed and loop-free. - drag-handle: add gutter '+' button that inserts a new paragraph and opens the slash menu (Notion-style discoverability, audit cabinetai#32) - agent-detail-v2: provider Field is now a <select> populated from /api/agents/providers; on change calls onSaveField("provider", v) (cabinetai#53) - slide-agents tour: remove inline 'heartbeat' definition from copy — the Agents page already explains it; tour now just names the feature (cabinetai#113)
Summary
Acts on the 2026-05-01 walkthrough audit (
data/cabinet-data/audits/audit-2026-05-01/, 65 findings: 7 P1 · 25 P2 · 33 P3) and includes a small in-Cabinet review app the user used to verify each fix.Tally: 55 fixed · 8 skipped (with rationale) · 2 deferred (#13 needs deeper grep, #48 needs care around the absolute-positioned AI input). User-supplied review feedback on the 25th commit re-fixed 4 entries that went the wrong way and addressed one Pass-with-suggestion (#53 → Help menu).
Highlights
{{cabinet.name}}/{{user.name}}/{{agent.name}}/{{today}}resolved at prompt-build time); responsive H1; shuffle for prompt suggestion chips.matchMedialistener; settings tab indocument.title./theme <name>,/open <section>).<footer>.?hotkey opens a searchable keyboard cheat-sheet modal (also reachable from Help → Open cheat sheet); deeper paper focus rings; tree expand chevron + terminal panel buttons gain labels.See
data/cabinet-data/audits/audit-2026-05-01/progress.mdandfeedback.md(both git-ignored underdata/) for the full per-issue breakdown and user verdicts.Test plan
npm run dev:allboots clean; no TS errors (npx tsc --noEmit)/theme paperapplies;/open settingsnavigates?opens keyboard shortcuts modal; Help → "Open cheat sheet" does the samereview/index.htmlrevalidates on next fetch (no stale 1h cache)🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
?)Bug Fixes
/from being percent-encodedImprovements