Skip to content

audit 2026-05-01: 64 of 65 fixes + interactive review app - #53

Merged
hilash merged 25 commits into
mainfrom
audit-2026-05-01-fixes
May 2, 2026
Merged

audit 2026-05-01: 64 of 65 fixes + interactive review app#53
hilash merged 25 commits into
mainfrom
audit-2026-05-01-fixes

Conversation

@hilash

@hilash hilash commented May 2, 2026

Copy link
Copy Markdown
Collaborator

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

See data/cabinet-data/audits/audit-2026-05-01/progress.md and feedback.md (both git-ignored under data/) for the full per-issue breakdown and user verdicts.

Test plan

  • npm run dev:all boots clean; no TS errors (npx tsc --noEmit)
  • Home: greeting + name fallback (no "You."); H1 doesn't push prompt below the fold on a 13" viewport
  • Sidebar: drawer tabs in caps; cabinet-name header in caps; sub-cabinets show Archive icon (amber)
  • Editor: toolbar = single scrollable row with ChevronLeft/Right edge fades; tab title uses frontmatter; "Saved · Xs ago" persists after the 2s flash
  • Tasks: archive expanded by default; agent filter is a dropdown in the header
  • Settings: vertical sidebar (768px+), horizontal scroll fallback below; theme cards show miniature previews; "Match system" pair switches with OS color-scheme
  • Search palette: /theme paper applies; /open settings navigates
  • ? opens keyboard shortcuts modal; Help → "Open cheat sheet" does the same
  • Era themes: Windows 95 buttons have 4-corner bevels + navy title-bar gradient; Win XP Luna gradients; Apple Aqua bubble buttons; Matrix grid backdrop
  • Asset cache: re-generated review/index.html revalidates on next fetch (no stale 1h cache)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Searchable keyboard shortcuts modal (trigger with ?)
    • Slash command mode in search palette
    • "What's new" release card on home screen
    • Match system theme mode for OS-level dark/light switching
    • Page creation from the new task button
    • Inline git commit form in status bar
    • Era-themed visual modes (Win95, XP, Apple, Matrix, Cyber)
  • Bug Fixes

    • Fixed URL path encoding to prevent / from being percent-encoded
    • Asset cache headers now properly differentiate HTML (no-cache) vs other files
    • Terminal panel dimensions now persist across sessions
    • Git status filtering excludes internal runtime files
  • Improvements

    • Enhanced keyboard navigation and screen reader support throughout
    • Improved agent/cabinet filtering UI with dropdown redesigns
    • Better save timing display ("Saved · Xs ago")
    • Refined theme picker with visual thumbnails
    • Updated profile handling and legacy user migration
    • Help section restructured with improved onboarding

hilash added 25 commits May 1, 2026 11:37
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).
@coderabbitai

coderabbitai Bot commented May 2, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: afa2d18e-c221-402e-b70c-20ba9a48bbb6

📥 Commits

Reviewing files that changed from the base of the PR and between 81dedcf and 1f6c491.

📒 Files selected for processing (41)
  • RELEASE_NOTES_v0.4.0.md
  • src/app/api/assets/[...path]/route.ts
  • src/app/globals.css
  • src/components/agents/agent-detail-v2.tsx
  • src/components/agents/agents-workspace.tsx
  • src/components/agents/edit-agent-identity-dialog.tsx
  • src/components/cabinets/depth-dropdown.tsx
  • src/components/cabinets/schedule-calendar.tsx
  • src/components/composer/new-task-button.tsx
  • src/components/composer/start-work-dialog.tsx
  • src/components/composer/task-runtime-picker.tsx
  • src/components/editor/editor-toolbar.tsx
  • src/components/help/demos/cabinets-demo.tsx
  • src/components/help/help-page.tsx
  • src/components/help/keyboard-shortcuts-modal.tsx
  • src/components/help/whats-new-card.tsx
  • src/components/home/home-screen.tsx
  • src/components/layout/app-shell.tsx
  • src/components/layout/narrow-viewport-hint.tsx
  • src/components/layout/status-bar.tsx
  • src/components/onboarding/onboarding-wizard.tsx
  • src/components/search/search-palette.tsx
  • src/components/settings/settings-page.tsx
  • src/components/sidebar/tree-node.tsx
  • src/components/sidebar/tree-view.tsx
  • src/components/tasks/board/filter-bar.tsx
  • src/components/tasks/board/kanban-view.tsx
  • src/components/tasks/board/tasks-board.tsx
  • src/components/terminal/terminal-tabs.tsx
  • src/hooks/use-global-hotkeys.ts
  • src/hooks/use-hash-route.ts
  • src/lib/agents/conversation-runner.ts
  • src/lib/agents/heartbeat.ts
  • src/lib/agents/icon-catalog.ts
  • src/lib/agents/persona-templating.ts
  • src/lib/cabinets/overview.ts
  • src/lib/cabinets/visibility.ts
  • src/lib/git/git-service.ts
  • src/lib/themes.ts
  • src/lib/user/profile-io.ts
  • src/stores/editor-store.ts

📝 Walkthrough

Walkthrough

This 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.

Changes

Theme System & Era Themes

Layer / File(s) Summary
Theme Data & Utilities
src/lib/themes.ts
Added ThemeMode type and helpers for "match system" mode; darkened paper theme's ring color; new functions to get/store theme mode and theme pairs, find themes by name, and resolve active theme via prefers-color-scheme.
Era Theme Styling
src/app/globals.css
Added Win95, WinXP, Apple Aqua, Matrix, and Cyber era themes with CSS overrides for button bevels, gradients, grid backgrounds, and neon glows; reduced-motion disables Matrix background.
Settings UI
src/components/settings/settings-page.tsx
New "Match system" card at top of Appearance tab with light/dark variant selectors; manual theme selection reverts to manual mode from system mode; new ThemeThumbnail component renders miniature UI using theme CSS variables.
App Shell Integration
src/components/layout/app-shell.tsx
Added listener for prefers-color-scheme changes when system mode is active to re-apply resolved theme without reload.

Help & Keyboard Navigation Features

Layer / File(s) Summary
Keyboard Shortcuts Modal
src/components/help/keyboard-shortcuts-modal.tsx
New component with static categorized shortcut groups; filters by description/key tokens; renders platform-appropriate key glyphs; opens via global cabinet:open-shortcuts event.
What's New Card
src/components/help/whats-new-card.tsx
New component reads localStorage for last-seen version, compares to current version, conditionally renders release info from RELEASE_HIGHLIGHTS, includes dismiss and GitHub release link.
Help Page Wiring
src/components/help/help-page.tsx
Changed "shortcuts" card action from demo to shortcuts-modal kind; added cabinet:open-shortcuts event dispatch in help card click handler.
Global Hotkeys
src/hooks/use-global-hotkeys.ts
Added ? (Shift+/) shortcut to open keyboard shortcuts modal, blocked on editable elements.
Layout Integration
src/components/layout/app-shell.tsx
Added KeyboardShortcutsModal and WhatsNewCard to top-level app shell; added SR-only announcer region for page title changes.

Agent Persona Templating

Layer / File(s) Summary
Templating Engine
src/lib/agents/persona-templating.ts
New module with PersonaTemplateContext type and renderPersonaBody() function; replaces {{ key.path }} placeholders with context values (cabinet name/slug/path, agent name/slug, user name, today date).
Icon Friendly Names
src/lib/agents/icon-catalog.ts
Added friendlyIconName(key) helper to convert lucide icon identifiers to readable labels (e.g., PenTool → "Pen tool").
Agent Context Building
src/lib/agents/conversation-runner.ts, src/lib/agents/heartbeat.ts
Updated buildAgentContextHeader and new buildPersonaPromptBody() to render persona body via templating with cabinet/agent/user/date context; heartbeat and quick-response now use rendered persona instead of raw text.
Visibility Labels
src/lib/cabinets/visibility.ts
CABINET_VISIBILITY_OPTIONS now includes description field; updated "own agents only" label to "This cabinet only"; exported readCabinetReferenceByPath for template context.

Persistence, State Management & Editor Integration

Layer / File(s) Summary
Editor State
src/stores/editor-store.ts
Added lastSavedAt timestamp tracking; cleared on new page load; set on successful save for "Saved Xs ago" display.
Terminal Persistence
src/components/terminal/terminal-tabs.tsx
Height/width now initialized from and persisted to localStorage with min clamps; resize handles improved with larger hit areas and ARIA attributes; tab buttons gain accessibility labels.
Status Bar Enhancements
src/components/layout/status-bar.tsx
Added 10s auto-update interval for "Saved · Xs ago" label; inline git commit form in uncommitted popover; git sync timestamp tracking with "Last synced …" tooltip; footer semantic element with accessibility attributes; git status refreshes on tab focus and visibility change.
Viewport & Session Hints
src/components/layout/narrow-viewport-hint.tsx
New component; renders <960px dismissible banner; dismissal persisted to sessionStorage; mounts with lazy innerWidth check.
Agents Workspace Intro
src/components/agents/agents-workspace.tsx
Per-cabinet intro dismissal via localStorage; shows full explainer on first visit, compact hint on repeat; clickable empty routine card replaces static text.

Search, Navigation & Command Palette

Layer / File(s) Summary
Slash Commands
src/components/search/search-palette.tsx
New command mode (triggered by / prefix); defines section-open and theme commands; matches commands by keyword scoring; keyboard navigation within command list; single-select filtering by description/key tokens.
Hash Route Encoding
src/hooks/use-hash-route.ts
Updated to encode/decode path segments individually instead of whole path, preserving / in URL bar (e.g., a/b/c no longer becomes a%2Fb%2Fc).

Composer & Page Creation

Layer / File(s) Summary
New Task/Page Dropdown
src/components/composer/new-task-button.tsx
Replaced split-button layout with context-aware DropdownMenu; added page-creation dialog + form; when context is a page, includes "New page in " option; slugifies title and creates page via createPage; dialog wiring preserves existing task/routine behavior.
Scheduling UI
src/components/composer/start-work-dialog.tsx
WhenChip now uses computed schedule-aware title and explicit aria-label (replacing generic "When should this run?").
Runtime Picker Labels
src/components/composer/task-runtime-picker.tsx
Updated triggerTitle template to explicitly show model name, effort tier (or Default), and provider name segments.

Task Board & Kanban Refinements

Layer / File(s) Summary
Kanban Archive Collapse
src/components/tasks/board/kanban-view.tsx
Changed collapsed-lane default from "archive" to empty; added archiveExpanded state to cap archive display at ARCHIVE_PEEK (8 tasks); "Show N more" button toggles full view; counts remain full-width aware.
Agent Filter Dropdown
src/components/tasks/board/filter-bar.tsx
Replaced horizontal scrolling agent pills with new AgentFilterDropdown; single-select menu with "All agents" option; FilterBar now aliases AgentFilterDropdown for backwards compatibility.
Tasks Board Header
src/components/tasks/board/tasks-board.tsx
Integrated AgentFilterDropdown into board header alongside trigger chips; bulk-delete button now hidden unless trigger/agent filter or selection exists; removed page-level FilterBar.

UI Polish & Accessibility

Layer / File(s) Summary
Sidebar Styling
src/components/sidebar/tree-node.tsx, src/components/sidebar/tree-view.tsx
Selected row now uses accent-70 background + left 2px bar + semibold text; chevron made keyboard/screen-reader accessible with tabIndex, aria-expanded, Enter/Space handlers; cabinet badge adds ArrowUpRight icon; header/drawer text now uppercase with wider letter tracking.
Component Labels & Icons
src/components/agents/agent-detail-v2.tsx, src/components/agents/edit-agent-identity-dialog.tsx, src/components/cabinets/depth-dropdown.tsx, src/components/cabinets/schedule-calendar.tsx, src/components/help/demos/cabinets-demo.tsx
Provider options now disable unavailable ones (except selected) with "install required" suffix; skill chips show slug subscript only when different from name; depth dropdown gains expanded 2-line layout and "Cabinet scope" header; missed schedule now neutral/muted instead of amber; demo option label updated to "This cabinet only".
Home Screen & Navigation
src/components/home/home-screen.tsx
Quick-action chips now show stable head + deterministic shuffled subset; refresh button re-rolls the shuffle; agent/job/sub-cabinet counts use singular/plural labels; profile name strips legacy "You" placeholder.
Editor Toolbar
src/components/editor/editor-toolbar.tsx
Added audit comments clarifying toolbar composition.
User Profile Migration
src/lib/user/profile-io.ts
Legacy upgrade for "You" → OS-derived display name; new inferOsName() fallback from os.userinfo().username; removed hardcoded "You" default.

Git & Asset Handling

Layer / File(s) Summary
Asset Cache Control
src/app/api/assets/[...path]/route.ts
Extension-based caching: .htmlno-cache, must-revalidate; other assets → public, max-age=3600; applied to both 206 range and 200 full-file responses.
Git Internal Paths
src/lib/git/git-service.ts
Added INTERNAL_PATH_PATTERNS regex set to hide Cabinet-internal runtime/build files from user-visible uncommitted count and file list; getStatus() filters before returning.

Onboarding & Settings

Layer / File(s) Summary
Onboarding Text
src/components/onboarding/onboarding-wizard.tsx
Team-build carousel CTA changed from "Import a pre-made zero-human team" to "Start from a template".
Settings Navigation
src/components/settings/settings-page.tsx
Replaced horizontal tab strip with grouped vertical rail (desktop) and horizontal row (mobile); page heading changed to h1; enhanced icon picker search to match both keys and friendly names; updated macOS shortcut hint with proper modifier glyphs.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 A v0.4 hop through Cabinet's burrow so deep:
Eras dance in Windows and Apple so fine,
Search with a slash, shortcuts peek and align,
Persona templates whisper and weave,
Themes match the system—no more to deceive!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch audit-2026-05-01-fixes

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.

❤️ Share
Review rate limit: 7/8 reviews remaining, refill in 7 minutes and 30 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

@hilash
hilash merged commit 47798c0 into main May 2, 2026
1 check was pending
dwebster pushed a commit to dwebster/cabinet that referenced this pull request May 4, 2026
…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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant