Skip to content

Add CI workflow for pull requests#16

Closed
dannyshmueli wants to merge 115 commits into
hilash:mainfrom
dannyshmueli:ci/run-tests-on-pr
Closed

Add CI workflow for pull requests#16
dannyshmueli wants to merge 115 commits into
hilash:mainfrom
dannyshmueli:ci/run-tests-on-pr

Conversation

@dannyshmueli
Copy link
Copy Markdown
Contributor

@dannyshmueli dannyshmueli commented Apr 8, 2026

This adds a dedicated CI workflow that runs npm test and npm run test:unit on pull requests and pushes to main.

Hila Shmuel and others added 30 commits March 31, 2026 14:10
Remove all Amazingg.ai references from docs, code, and config. Delete old
project memory directory. Condense PROGRESS.md from 219 lines to 5 entries.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 1: Added better-sqlite3 dependency, created server/db.ts
(daemon) and src/lib/db.ts (Next.js API routes) with automatic migration
runner. Initial migration creates tables for sessions, messages, activity,
job_runs, and mission_tasks. Database uses WAL mode at /data/.cabinet.db.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 2: Created 6 agent library templates (CEO, Editor,
Content Marketer, SEO, Sales, QA) in /data/.agents/.library/ with
full persona.md definitions. Added GET /api/agents/library to list
templates and POST /api/agents/library/[slug]/add to instantiate
an agent from a template.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 3: New agent-list.tsx component with responsive card grid
showing agent emoji, name, type, status, role, and job count. Includes
library dialog for browsing and adding agents from templates grouped
by department. Replaces the old dashboard as the primary agents view.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 4: New agent-detail.tsx with Definition, Jobs, Skills,
Sessions, and Goals tabs. Definition shows metadata grid and persona
instructions. Jobs lists agent plays. Sessions shows heartbeat history.
Goals renders progress bars with color-coded completion levels.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 5: Jobs now live in /data/.agents/{slug}/jobs/ alongside
legacy /data/.jobs/. Added agentSlug to JobConfig, agent-scoped load/save
helpers in job-manager.ts, and REST endpoints for agent jobs with CRUD,
run, and toggle actions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 6: Added Team (Agents, Missions, Chat) and System
(Activity, Settings) nav sections to sidebar with NavButton component.
Extended SectionType with missions, mission, chat, activity types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 Step 7: App shell now routes to AgentList for agents section,
AgentDetail for agent detail, and placeholder views for missions, chat,
and activity. Onboarding redirects to agents view. Phase 1 complete.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 2: Rewrote onboarding wizard with welcome, 5 questions (company
name, description, goals, team size, priority), and smart team
suggestion step. New /api/onboarding/setup endpoint instantiates agents
from library templates, injects company context, creates chat channels.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 3: Complete mission system with file-based mission storage +
SQLite task tracking. REST API for CRUD on missions and tasks. UI
with mission list (progress bars), detail view (task management with
status toggling), and create dialog. Wired into app-shell routing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 4: Complete chat system with file-based channel config + SQLite
messages. REST API for channel CRUD and message posting/pinning. UI
with channel sidebar, message thread (date separators, auto-scroll),
compose input, and pin toggle. Wired into app-shell routing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 5: Activity system with SQLite event storage, paginated/filterable
REST API, and timeline UI grouped by date with color-coded event type
indicators and filter tabs. Wired into app-shell routing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 6: Created cabinet-daemon.ts with job scheduler (cron-based agent
job execution), WebSocket event bus, SQLite job run logging, and HTTP
trigger endpoint. Added @mention detection and activity logging in chat.
Updated npm scripts for single-command startup. All 6 PRD phases done.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Renamed agents/[slug]/jobs to agents/[id]/jobs to match the existing
agents/[id] route param name. Renamed inner [id] to [jobId] to avoid
ambiguity. Fixes Next.js "different slug names for same dynamic path" error.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Removed Mission Control, old Agents tree, and Plays from the tree view.
Moved Team (Agents, Missions, Chat) and System (Activity, Settings)
sections above the Knowledge Base tree with a "Knowledge Base" label.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ary templates

- Redesigned agent detail view with vertical sidebar navigation (Definition, Jobs, Sessions)
- Made all agent fields editable inline (department, type, heartbeat, workspace, persona body)
- Added CronPicker with 15 human-readable presets for heartbeat and job scheduling
- Jobs tab: full CRUD with add/remove/edit, description/prompt field, cron picker
- Sessions tab: uses real WebTerminal (Claude Code) instead of headless API
- AI panel terminal now fills full available height instead of fixed 300px
- Persona instructions render as formatted markdown (prose) with click-to-edit
- Sidebar: collapsible agent list with Lucide icons, General+Editor as defaults
- Added 14 new agent library templates (20 total): COO, CFO, CTO, Product Manager,
  UX Designer, Data Analyst, Social Media, Growth Marketer, Customer Success,
  Copywriter, DevOps, People Ops, Legal Advisor, Researcher
- Removed: Activity, Missions, Chat, Goals, Skills (simplify MVP)
- Settings moved to gear icon at sidebar bottom
- Updated PRD to reflect current architecture

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Security audit: updated .gitignore to exclude all user data (agent configs,
  memory, messages, chat, missions, company-specific KB content, database files)
- Added .env.example with documented variables
- Created README.md with quick start, architecture, agent library docs
- Created cli/ package (paperclipai) for `npx paperclipai init`
- Added logo-light.png to sidebar header and updated favicon
- Removed Skills tab from agent detail (simplify)
- No secrets, passwords, or company-specific data in tracked files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Users install with: npx create-cabinet@latest

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…project)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rewire agent Jobs tab to use /api/agents/{slug}/jobs (YAML-based, per-agent)
- Call scheduleJob() on create/update/toggle so jobs register with node-cron immediately
- Call initScheduler() on app startup to load existing jobs
- Add registerScheduledPlays() for plays with schedule triggers
- Add "schedule" case to trigger-engine
- Rewrite README with demo video and vivid website-style copy

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Agent heartbeats now run through daemon PTY (same as AI editor): live
  xterm.js terminal streams Claude output in real time when clicking Run Now
- Added POST /sessions to cabinet-daemon for HTTP-initiated PTY sessions
- Refactored heartbeat.ts: extracted buildHeartbeatContext + processHeartbeatOutput;
  added startManualHeartbeat() that creates PTY session and returns sessionId
- Added agentSessions slice to ai-panel-store with sessionStorage persistence
- New AgentLivePanel component: AI-editor-identical UX (session cards,
  live terminal, collapsible history, Run Now bar)
- AgentDashboard: clicking a persona opens AgentLivePanel
- README: replaced logo with demo.gif / demo.webm
- Added AI-claude-editor.md documentation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace plain input in agent session view with MentionInput component,
  enabling @pagename references with page content fetched as context
- Update PROGRESS.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Deleted agent-dashboard.tsx (never rendered — app uses AgentLivePanel)
- Deleted src/components/chat/ (ChatPage, ChannelList, ChannelView — unused)
- Deleted src/components/shared/mention-input.tsx (no longer imported)
- Deleted src/app/api/missions/, api/activity/, api/jobs/ (no frontend callers)
- Deleted src/app/api/ai/edit/ (legacy sync route, documented as unused)
- Deleted src/lib/missions/, src/lib/activity/ (only used by deleted routes)
- Removed setViewMode() backward-compat alias from app-store
- Extracted GeneralAgentView into general-agent-view.tsx

Build verified clean after removals.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Deleted play-manager.ts, trigger-engine.ts, all /api/plays routes,
  playbook-catalog.tsx, webhook/[slug] and triggers API routes
- Unified runHeartbeat() and executeJob() to use PTY (cabinet daemon)
  instead of child_process.spawn — all Claude runs now go through PTY
- Removed plays field from AgentPersona, all UI components, and API responses
- Cleaned up 15+ files: agent-detail-panel, edit-agent-dialog, mission-control,
  pulse-strip, settings-page, agent-list, create-agent-dialog, tree-view
- Updated sidebar "Plays" label to "Jobs"; pulse strip now shows 5 metrics
- Build passes clean with no play routes in output

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hilash and others added 19 commits April 7, 2026 14:40
- Stage seed content (.seed/) during build: getting-started pages,
  cabinet-example, CLAUDE.md, 20 agent library templates, 56 playbooks
- Seed managed data dir on first launch (non-destructive merge)
- On subsequent launches, merge new templates without overwriting edits
- Enrich PATH in claude-code provider health check so CLI is found
  when Electron is launched from Finder (not terminal)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…er from GENERAL_AGENT

Extract duplicated ProviderInfo interface from 4 component files into
src/types/agents.ts. Remove hardcoded provider: "claude-code" from
GENERAL_AGENT so it falls through to the configured default at runtime.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Onboarding Step 4 now fetches all registered CLI providers instead of
  hardcoding Claude Code. Available providers show green; unavailable
  show "Not found" with a collapsible "Install instructions" button.
- Add installSteps field to AgentProvider interface for structured
  step-by-step install guides (title, detail, optional link).
- Add rich install steps to both claude-code and codex-cli providers.
- Include installMessage and installSteps in the /api/agents/providers
  response and the shared ProviderInfo type.
- Remove Codex CLI from the "Coming soon" list.
- Add Re-check button and restart hint for newly installed providers.
- Add .DS_Store to gitignore for data subdirectories.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set nativeButton={false} automatically when a render prop is passed,
preventing the console error about non-native button semantics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bump versions, regenerate release manifest, and fix test to derive
expected manifest version from package.json instead of hardcoding it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
copyReleaseTree was skipping data/ on init because it was in
PRESERVED_TOP_LEVEL. Now only skips preserved entries during upgrade,
so fresh installs get the seed content (getting-started, cabinet-example).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@hilash hilash closed this Apr 9, 2026
hilash added a commit that referenced this pull request Apr 25, 2026
Audit issue #16. The badge displayed three different numbers within a
single navigation (1,703 → 244 → 1,236):

- 244 was a hard-coded fallback served while loading or on rate-limit.
- 1,236 was a mid-animation snapshot caught between 0 and the real
  count-up target.
- aria-label/title and visible text read from different state, so they
  could disagree mid-render.

Fixes:

- New src/stores/github-stats-store.ts: shared { stars, loading,
  hasFetchedOnce } so the value survives navigation re-mounts. Initial
  state is null — never a fabricated fallback.
- src/app/api/github/repo/route.ts: drop GITHUB_STARS_FALLBACK = 244;
  return { stars: null } on failure / non-numeric. Lets the client
  render a placeholder instead of a fake number.
- status-bar.tsx: read stars from the store, animate exactly once per
  session (seeded from hasFetchedOnce), and render "★ Star" with no
  number while loading. Visible text, aria-label, and title now all
  read from the same displayStars source.
hilash added a commit that referenced this pull request Apr 28, 2026
…unity menu

Bundles four audit findings touching the bottom status bar.

#15 (uncommitted count vague)
- "X uncommitted" is now a button. Click opens a popover anchored to the
  status bar with the file list and a colored single-letter status badge
  (M / ? / A / D / R) per row. Capped at 50 entries; truncated state shows
  a "+N more — run git status" footer.
- getStatus in git-service grew the `files` and `truncated` fields on its
  return type. Existing call sites only read `uncommitted`, so the
  extension is non-breaking.

#18 (status bar overcrowded)
- Right cluster collapsed from four pills (Help / Discord / Contribute /
  Stars) to a single Help trigger that opens a community popover.
- Star count rides as a small amber chip on the trigger so it stays
  visible at a glance — matches "live state stays in the bar" without
  losing the badge entirely.

#094 (not-installed rows lack one-click install)
- Each "Not installed" provider row in the server-status popover renders
  an Install pill. Provider IDs map to canonical install docs:
  claude-code, codex-cli, cursor-cli, gemini-cli, opencode, pi, grok-cli,
  copilot-cli. Unknown IDs fall back to a Google search.

#096 (stars source of truth) — already fixed via #16
- The github-stats-store + skeleton-until-loaded behavior shipped under
  #16 already collapsed the multi-source race. Verified: count reads
  "1,712" consistently across the new popover and the trigger chip with
  no flicker. No code change for this ticket.
pasogott pushed a commit to calumba-holding/cabinet that referenced this pull request Apr 30, 2026
Pre-Release tracker issues hilash#4, hilash#5, hilash#6, hilash#9, hilash#12, hilash#15, hilash#19 — low-risk
fixes that don't require design decisions.

hilash#5 greeting (home-screen.tsx):
- Fetch user from /api/user/profile (was /api/agents/config, which
  returned the company name — that's why the placeholder never filled
  and every returning user read "Good afternoon, there.").
- Drop the "there" fallback and the comma when no name is set; render
  "Good afternoon." instead.
- Split the heading: greeting stays as <h1>, the duplicate subhead
  "What are we working on today?" is removed — the composer placeholder
  "I want to create…" owns the prompt now (audit hilash#4 + hilash#39).

hilash#4 last-route (use-hash-route.ts):
- Mark each tab with a `cabinet.tab-visited` sessionStorage flag on
  first mount. Fresh tabs (no flag, no hash) land on home, not on
  whatever `cabinet.last-route` held. Manual in-tab reloads and
  hash-nav still restore the previous route.

hilash#6 template carousel a11y (home-screen.tsx):
- RegistryCarousel's infinite loop doubles the template array. The
  clone half is now wrapped in a div with `aria-hidden="true"` and
  `inert`, so screen readers announce each template once and keyboard
  tab-order skips the duplicates.

hilash#9 status bar marketing (status-bar.tsx):
- Removed the Chat / Contribute / ★-stars marketing trio from the
  bottom-right. Also ripped out the supporting machinery: the GitHub
  stats fetch, the star-counter easing animation, the StarExplosion
  particle burst, the unused state and refs, and the now-dead imports
  (~80 lines). GitHub + Discord will resurface inside About when we
  redo Settings (P1).

hilash#15 Next.js DevTools overlay (next.config.ts):
- Set `devIndicators: false`. The floating dev button was sitting on
  top of the sidebar "New Page" action (also covered audit #220).

hilash#19 mission-control backdrops (mission-control.tsx):
- The NL-agent-create dialog and the Start-All confirm dialog both
  used `<div onClick>` as click-outside-to-close. Now each backdrop is
  a <button> with `aria-label="Close dialog"`, so Escape/Enter dismiss
  the dialog just like the cancel action does.

hilash#12 live-region shout (no code change):
- Audit flagged a `role="alert" aria-live="assertive"` wrapping the
  greeting. A whole-repo grep for role="alert" and aria-live returns
  zero hits in `src/` — the issue isn't present in the current tree.
  Marked N/A in the tracker.

Tracker flipped for all seven in
data/getting-started/PRE-RELEASE-ISSUES/index.md.

Verified: `tsc --noEmit` clean; `eslint` on touched files adds zero
new findings (pre-existing baseline unchanged).

Remaining P0s: hilash#2 (tasks board 0-tasks), hilash#3 (hash route aliases),
hilash#7 (task detail stuck Loading), hilash#8 (agent Recent work fragments),
hilash#10 (mobile), hilash#11 (editor toolbar aria-labels), hilash#13 (22 fonts on
first paint), hilash#14 (duplicate API calls), hilash#16 (top-nav IA),
hilash#17 (empty cabinet default), hilash#18 (alert/confirm → toasts).
pasogott pushed a commit to calumba-holding/cabinet that referenced this pull request Apr 30, 2026
…re-Release)

Clears 4 more P0s from the Pre-Release tracker: hilash#8, hilash#11, hilash#17, hilash#18.

hilash#18 replace alert() / window.confirm():
New ui helpers:
- src/lib/ui/toast.ts — showError/showSuccess/showInfo/showToast dispatch
  the existing `cabinet:toast` event picked up by SystemToasts.
- src/lib/ui/confirm.ts — promise-based `confirmDialog({ title, message,
  confirmText, cancelText, destructive })` that resolves to boolean.
- src/components/ui/confirm-dialog-host.tsx — base-UI Dialog that listens
  for the confirm event, renders the modal, auto-focuses the confirm
  button, and supports a destructive variant with the alert-triangle
  affordance.
- Mounted <ConfirmDialogHost /> in AppShell.

Migrated call sites (10 alert + 4 confirm):
- settings-page.tsx — provider disable conflict alert, data-dir save
  failure (×2), terminal-open failure, provider disable+migrate confirm.
- agent-detail-v2.tsx — delete-agent confirm + failure alert.
- version-history.tsx — restore-version confirm.
- task-conversation-page.tsx — delete-task confirm.
- edit-user-avatar-dialog.tsx — avatar size + upload failure alerts.
- edit-agent-identity-dialog.tsx — avatar size + upload failure alerts.
- onboarding-wizard.tsx — terminal-open failure alert.

No more browser-native dialogs breaking focus and visual consistency.

hilash#8 agent "Recent work" prompt fragments:
- src/lib/agents/conversation-store.ts `normalizeSingleArtifactCandidate`
  now rejects candidates that (a) don't contain a directory separator
  AND don't end in a file extension, or (b) have whitespace in the
  path-head, or (c) exceed 200 chars.
- Fixes the UX audit screenshot where the agent's "Recent work" rendered
  strings like `line per file you created or updated. Do not list
  multiple files on a single` and `"none\` so the block is well-formed.`
  as if they were file names.

hilash#11 editor toolbar aria-labels — N/A:
- Audit flagged "first 3–4 toolbar buttons have empty aria-label".
  Confirmed by inspection: `ToolButton` in editor-toolbar.tsx already
  sets `aria-label={label}` + `title={label}`, and every call site
  passes a label. Bubble menu + viewer toolbar also clean.

hilash#17 default empty cabinet — N/A:
- The 70+ CV files + songs flagged at /data root were archived to
  data-old-5/ on 2026-04-22 (see PROGRESS.md entry from that date).
  Current /data/ only auto-seeds getting-started/ on first run via
  seedGettingStartedDir() — no demo noise.

Tracker flipped in data/getting-started/PRE-RELEASE-ISSUES/index.md.

Verified: `tsc --noEmit` clean; eslint adds zero new findings for the
files I touched (pre-existing baseline of 21 warnings + 1 error in
onboarding-wizard unchanged).

Remaining P0s: hilash#2 (tasks board 0-tasks), hilash#3 (hash routes), hilash#7 (task
detail stuck Loading), hilash#10 (mobile), hilash#13 (22 fonts), hilash#14 (dupe APIs),
hilash#16 (top-nav IA).
pasogott pushed a commit to calumba-holding/cabinet that referenced this pull request Apr 30, 2026
…up, top-nav

Closes 5 P0 Pre-Release issues (hilash#2, hilash#3, hilash#7, hilash#14, hilash#16) plus partial hilash#10.

hilash#3 hash-route aliases (use-hash-route.ts):
- parseHash now accepts bare `/#/tasks`, `/#/tasks/<id>`, `/#/agents`,
  `/#/agents/<slug>`, `/#/jobs` scoped to the root cabinet. Shared
  links of those shapes render the right view instead of redirecting
  to Home (audit hilash#11, hilash#12).

hilash#7 task detail connect timeout (task-conversation-page.tsx):
- Added an 8 s connect watchdog on the initial fetchTask(): after the
  deadline the status pill flips `connecting → unreachable`, the
  header drops the literal "Loading…" string in favor of the first
  line of the prompt (or "Task unavailable" on error), and a Retry
  button appears that increments `retryNonce` to re-run the fetch.
  The error path now also flips to "error" tone with the same button.

hilash#2 tasks board 0-tasks recovery (tasks-board-v2.tsx):
- Header count uses `filteredTasks.length` whenever *any* filter is
  active (agent or trigger), not just when agentFilter is set. An
  amber banner surfaces "N tasks hidden by filters · Clear filters"
  when `tasks.length > 0 && filteredTasks.length === 0`, so a stale
  `cabinet.tasks.v2.trigger = "heartbeat"` in localStorage can no
  longer silently wipe the board.

hilash#14 API dedup (src/lib/api/dedup-fetch.ts + wiring):
- New dedupFetch() that returns the same Promise for identical
  in-flight GETs/HEADs. Optional short-TTL cache is opt-in per call.
  Passes POST/DELETE/PUT through untouched.
- Wired at the hot first-paint call sites flagged by audit #188:
  use-provider-icons, app-store.loadProviders, app-shell config
  fetch, cabinet-view config fetch, mission-control config fetch,
  status-bar (both /api/health endpoints + /api/agents/providers/
  status), data-dir-cache health fetch, use-cabinet-update
  system/update fetch. The providers ×3 / overview ×5 / health ×3
  burst collapses to one request each.

hilash#16 top-nav IA (new src/components/layout/top-nav.tsx):
- 40 px header row mounted above <main> in AppShell.
- Home / Agents / Tasks / Jobs / Settings tabs (icon + label, or
  icon-only below `sm`). aria-selected wired to current section;
  click routes via setSection() using the current cabinet scope.
- Mobile-only hamburger at the left that toggles sidebarCollapsed,
  giving the existing mobile slide-in sidebar a visible entry point.

hilash#10 mobile (partial):
- Covered by the TopNav hamburger + label hiding at <sm. Status-bar
  horizontal-overflow polish and mobile editor toolbar remain
  deferred for a dedicated pass.

hilash#13 fonts:
- Still blocked on the ongoing theme-initializer WIP (not touched).

Verified: `tsc --noEmit` clean across src/; eslint on touched files
adds zero new findings (pre-existing baseline unchanged).

Remaining P0s: hilash#10 (rest of mobile), hilash#13 (fonts — waiting on theme WIP).
hilash added a commit that referenced this pull request May 2, 2026
#16 review feedback round 2 — the persistent "CABINET ↗" pill on every
cabinet row was busy. The Archive icon already says "this is a cabinet";
the trailing pill is for the click affordance, not identity.

Reverts to the original treatment: subtle "Open" pill, hidden at rest,
fades in on row hover (and on focus for keyboard reach). Same hover
styling as the prior version, ArrowUpRight glyph dropped along with
its lucide import.
pasogott pushed a commit to calumba-holding/cabinet that referenced this pull request May 2, 2026
hilash#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.

hilash#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.
pasogott pushed a commit to calumba-holding/cabinet that referenced this pull request May 2, 2026
Review feedback on the 2026-05-01 audit slideshow flagged 4 fixes that
went the wrong way and one Pass-with-suggestion:

hilash#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.

hilash#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.

hilash#12 — heading dropdown + More overflow reverted. Editor toolbar is
back to the single scrollable row + ChevronLeft/Right gradient fades
on each edge.

hilash#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).

hilash#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).
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.

2 participants