feat: Library surface + IPC-wired catalog - #23
Merged
Conversation
Adds the design system\'s chosen shell (rail · 7-harness list · INSTALL/REINSTALL/HEALTH inspector) and wires the catalog to real data from the main process. Library surface (src/renderer/App.tsx): - New Rail component (56px icon column) used when surface === library - New LibrarySurface: card list with filter pills (All / Installed / Available / Updates), search input, 2-letter avatar square, filled status badge, version label, main pane with model links + Configure/ Open buttons + description + "What you get" checklist - New LibraryInspectionPanel: right rail with 3 collapsible sections (INSTALL with KV pairs, REINSTALL with terminal code block, HEALTH with KV pairs + green badges) - Surfaced as the default surface on app load - Body daemon: hoists.layout.list() async over real IPC Renderer (src/renderer/styles/layout.css): - New .hoist-rail (56px icon-only nav) + .hoist-rail-item variants - New .hoist-body.is-rail layout mode (swap rail width token) - New .hoist-library grid with header / toolbar / list / main areas - New .hoist-library-row, .hoist-library-avatar, .hoist-library-main - New .hoist-library-filters / .hoist-library-filter (active pill) - New .hoist-rail-kv, .hoist-rail-kvrow, .hoist-rail-kvkey, .hoist-rail-kvval - New .hoist-terminal (recessed background, monospace) - New .hoist-rail-section-collapse (chevron rotates 180deg on open) Wired catalog (src/main/providers/harnesses.ts): - Extended HARNESS_CATALOG with avatar, models, features, status per entry - Exports HarnessCatalogEntry type + findHarnessCatalog() Wired IPC (src/shared/channels.ts + src/main/ipc.ts + src/preload/*): - New channel library:list - IPC handler maps catalog entries + discover results, marking installed vs installing via discover status, falling back to available for catalog entries that aren\'t on PATH - preload exposes window.hoist.library.list() returning LibraryEntry[] - LibraryEntry type added to preload/api.ts Verified: npm run typecheck/lint/build all green, and the running app now shows the 3 actually-installed harnesses on this machine (Claude Code 2.1.211, OpenCode 1.18.3, Codex CLI available) rather than the 7-row mock catalog.
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.
Summary
Two things in one PR:
Library surface — the 3-pane shell from the design system (rail · 7-harness list · INSTALL/REINSTALL/HEALTH inspector). This is the "chosen shell" from
design.penLayouts Lab.Real IPC wiring — the Library's catalog now resolves through
window.hoist.library.list()→ IPClibrary:list→discoverAll(HARNESS_CATALOG), so the running app shows the harnesses actually installed on this machine (Claude Code 2.1.211, OpenCode 1.18.3, Codex CLI available) instead of the 7-row mock catalog.What changed
src/renderer/App.tsx— new Rail component (56px icon-only nav), new LibrarySurface (filter pills · search · status-coloured list · main pane with model links + Configure/Open · "What you get" checklist), new LibraryInspectionPanel (right rail with 3 collapsible sections). Library is the default surface on app load.src/main/providers/harnesses.ts— HARNESS_CATALOG extended withavatar,models,features,statusper entry. ExportsHarnessCatalogEntrytype +findHarnessCatalog().src/shared/channels.ts— newlibrary:listchannel.src/main/ipc.ts—libraryListhandler joins catalog entries withdiscoverAll()results. An entry isinstalledif the binary is on PATH, otherwise it falls back to its catalogstatus(e.g.availablefor Codex since we can't discover it).src/preload/api.ts+src/preload/index.ts—window.hoist.library.list()returnsLibraryEntry[].LibraryEntryusesdescto match the catalog (cleaner thandescription).src/renderer/styles/layout.css—.hoist-rail(56px),.hoist-body.is-railgrid,.hoist-librarygrid (header / toolbar / list / main),.hoist-library-row,.hoist-library-avatar,.hoist-library-main,.hoist-library-filters,.hoist-rail-kv,.hoist-terminal. ~375 lines added..gitignore—design.pen(binary, not for repo).Verified
The Library surface renders the actual installed harnesses on this machine: Claude Code 2.1.211, OpenCode 1.18.3, Codex CLI available. Right rail shows the INSTALL / REINSTALL / HEALTH sections with real KV data.
What didn't change
harness.discover,vault.list,gateway.list) but the renderer hasn't been switched yet — that's a follow-up.installMethodsto the catalog entry.