Add CI workflow for pull requests#16
Closed
dannyshmueli wants to merge 115 commits into
Closed
Conversation
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>
- 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>
Add Codex CLI provider support
…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
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).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This adds a dedicated CI workflow that runs npm test and npm run test:unit on pull requests and pushes to main.