Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
afc9a35
docs: architecture-ralph baseline report
srid May 28, 2026
b7af5bd
refactor(server): break import cycles via surfaceCtx holder + pure un…
srid May 28, 2026
0893f3d
refactor(client/terminal): extract mobileTouch.ts — isolate iOS-Safar…
srid May 28, 2026
df3f152
feat(solid-xterm): new @kolu/solid-xterm package; extract WebGL lifec…
srid May 28, 2026
510b1e5
feat(solid-xterm): add attachXtermStyleSync for reactive theme + font…
srid May 28, 2026
fa8ce51
refactor(solid-xterm): move scrollLock into the framework
srid May 28, 2026
d0b0fde
docs: surface @kolu/solid-xterm in README + complete its README
srid May 28, 2026
353ff44
refactor(canvas): extract canvasGeometry — break GRID_SIZE boundary leak
srid May 28, 2026
dc7c369
feat(canvas-layout): new @kolu/canvas-layout package (extraction vali…
srid May 28, 2026
0a83184
feat(solid-canvas-viewport): new @kolu/solid-canvas-viewport package
srid May 28, 2026
a173431
refactor(recorder): remove Kolu-coupling from prospective framework m…
srid May 28, 2026
d4a391d
feat(solid-recorder): new @kolu/solid-recorder package — 4th framewor…
srid May 28, 2026
8647a71
feat(solid-anchored-popover): new @kolu/solid-anchored-popover — 5th …
srid May 28, 2026
08b04ff
refactor: rename terminal-themes → @kolu/terminal-themes
srid May 28, 2026
a614305
feat(browser-clipboard): new @kolu/browser-clipboard — 6th framework …
srid May 28, 2026
f10e283
feat(file-line-ref): new @kolu/file-line-ref — 7th framework this loop
srid May 28, 2026
7c673a7
refactor: rename unscoped workspace packages to @kolu/* prefix
srid May 28, 2026
b04e456
refactor: rename kolu-io → @kolu/dir-watch (externalization-ready pro…
srid May 28, 2026
0a2a0fe
chore: biome --write --unsafe across the repo + two manual fixups
srid May 28, 2026
abed7ff
docs(README): tag renamed packages with their @kolu/* names
srid May 28, 2026
a823660
docs(architecture-ralph): final wrap-up — dead ends, key findings, cu…
srid May 28, 2026
ea88140
blog(hickey-lowy): note the /lowy single-consumer calibration in flight
srid May 28, 2026
1073f84
Revert "blog(hickey-lowy): note the /lowy single-consumer calibration…
srid May 28, 2026
45e5782
Merge remote-tracking branch 'origin/master' into ralph
srid May 28, 2026
4af1c64
feat(solid-xterm): reshape behind one createSolidXterm primitive (v0.…
srid May 28, 2026
60383de
Merge remote-tracking branch 'origin/master' into ralph
srid May 28, 2026
2d6955b
Merge remote-tracking branch 'origin/master' into ralph
srid May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,20 +196,27 @@ pnpm monorepo:
| `packages/common/` | [oRPC](https://orpc.dev/) contract + [Zod](https://zod.dev/) schemas + cell descriptors |
| `packages/surface/` | Reactive state framework — typed `Cell<T>`, `Collection<K,T>`, `Stream<I,T>`, `Event<I,T>` over oRPC streams; SolidJS hooks (`useCell`, `useCollection`, `useStream`, `useEvent`) |
| `packages/solid-pierre/` | Solid-native wrappers around [`@pierre/trees`](https://www.npmjs.com/package/@pierre/trees) and [`@pierre/diffs`](https://www.npmjs.com/package/@pierre/diffs); encapsulates Pierre's imperative mount/render lifecycle behind `<FileTree>` and `<CodeView>` with required `onError` props. `<CodeView>` (Pierre's 1.2.x advanced-mode viewport) hosts files and/or diffs in one virtualized scroll — windowed-rendering is unconditional, so single-file callers ride the same path as future multi-file ones |
| `packages/solid-xterm/` | Solid-native pieces of xterm.js lifecycle. `createXtermWebgl` encapsulates the WebglAddon dance + Chrome's per-tab GPU context budget (via explicit `WEBGL_lose_context.loseContext()` before `addon.dispose()`); `attachXtermStyleSync` reactively syncs `term.options.theme/fontSize`; `createScrollLock` freezes incoming writes when the user scrolls up and flushes on return-to-bottom. Three encapsulated axes, one consumer (`client/src/terminal/Terminal.tsx`) — the same single-in-tree-consumer bar Surface and `solid-pierre` cleared |
| `packages/canvas-layout/` | Pure 2D layout for a tiled-workspace canvas. `arrangeRepoIslands` packs same-bucket tiles into square-ish clusters and packs the clusters across the canvas; `repackBucket` re-lays one bucket on tile-create; `findFreeTilePosition` cascade-places a new tile at a viewport-relative free spot. No SolidJS, no DOM, no Kolu domain types — every function is a deterministic projection from `Rect[]` to `Rect[]`. Single consumer (`client/src/canvas/`) |
| `packages/solid-canvas-viewport/` | Solid-native pan/zoom 2D canvas viewport. Wheel-toward-cursor zoom, click/middle/shift-drag pan, animated `centerOnRect` with `prefers-reduced-motion`, snap-to-grid. Decomposed by volatility: gesture input (`gestures.ts`), transform math (`transforms.ts` + `animatedPan.ts`), CSS output (`coordinates.ts` — `tileTransformCSS`). `useCanvasViewport()` orchestrates the three behind one `CanvasViewport` interface. Single consumer (`client/src/canvas/`) |
| `packages/solid-recorder/` | Solid-native browser tab + mic (+ optional webcam) recording. `useRecorder()` owns the idle→setup→recording→paused state machine, elapsed clock, device enumeration, and the WebM duration patch. `mic` / `webcam` are singleton domain state. `LevelMeter` + `WebcamOverlay` are the framework-supplied visual pieces. Notification surface (`onError` / `onSuccess` / `onWarning`) is injectable via `configureRecorderNotifications` — Kolu wires `solid-sonner` through it at app init. Single consumer (`client/src/recorder/`) |
| `packages/solid-anchored-popover/` | Minimal SolidJS popover-positioning primitive. `useAnchoredPopover({ triggerRef, open, onDismiss, anchor })` returns `{ panelRef, panelStyle }` and owns viewport-clamped positioning + outside-click + Escape dismiss. Six in-tree Kolu consumers (option menu, settings popover, record popover, mode-chip picker, activity-window chip, PR-unavailable tooltip) — the highest-reuse primitive Kolu had |
| `packages/browser-clipboard/` | Clipboard write that survives non-secure contexts. `navigator.clipboard` is exposed only in `https://…` / `localhost` / `127.0.0.1`; plain `http://` to a LAN address gets `navigator.clipboard === undefined`. `writeTextToClipboard(text)` tries the modern API and falls back to `document.execCommand("copy")` against a synthetic off-screen `<textarea>` ([caniuse 100/100](https://caniuse.com/mdn-api_document_execcommand_copy)). Separate `./xterm` entry point exports `SafeClipboardProvider` implementing xterm.js's `IClipboardProvider` so OSC 52 writes survive plain HTTP |
| `packages/file-line-ref/` | Source-reference parsing in `path:line[-end]` shape (VS Code's `:e file:N`, Vim, GitHub URL fragments, Linear). `parseLineRefs(text)` scans embedded references, `formatLineRef` renders, `resolveLineRefPath` resolves a parsed `path` against a worktree's file list considering absolute / cwd-relative / basename-only inputs |
| `packages/artifact-sdk/` | Self-contained comments-on-files toolkit. Three exports: `./core` (pure W3C TextQuoteSelector functions used by both runtimes), `./client` (parent-side iframe ↔ parent bridge + core re-exports), `./server` (one-line `mountArtifactSdk(app, ...)` that wires the SDK bundle route and an HTML-decoration middleware — esbuild bundles the in-iframe script at server startup, hash-keyed for cache busting). The host server never imports HTML rewriting logic |
| `packages/server/` | [Hono](https://hono.dev/) + `kolu-pty` for terminal lifecycle |
| `packages/integrations/pty/` | Generic PTY primitives — [node-pty](https://github.com/microsoft/node-pty) + [@xterm/headless](https://www.npmjs.com/package/@xterm/headless) wrapped behind a `PtyHandle` with OSC-driven cwd/title/preexec callbacks; only kolu-* dep is `kolu-shared` (Logger type) |
| `packages/client/` | [SolidJS](https://www.solidjs.com/) + [xterm.js](https://xtermjs.org/) + [Tailwind CSS v4](https://tailwindcss.com/) |
| `packages/integrations/claude-code/` | Claude Code detection — JSONL transcript tailing + Claude Agent SDK; exports a `claudeCodeProvider` `AgentProvider` |
| `packages/integrations/anyagent/` | Agent-agnostic shared contract (`AgentProvider` interface, `agentInfoEqual`), types (Logger, TaskProgress), and agent CLI parsing |
| `packages/integrations/anyagent/` | `@kolu/anyagent` — agent-agnostic shared contract (`AgentProvider` interface, `agentInfoEqual`), types (Logger, TaskProgress), and agent CLI parsing |
| `packages/integrations/codex/` | Codex detection — reads the highest-numbered `~/.codex/state_<N>.sqlite` for thread metadata and tails the matched rollout JSONL for state; exports a `codexProvider` |
| `packages/integrations/opencode/` | OpenCode detection — reads OpenCode's SQLite database via Node's built-in `node:sqlite`; exports an `opencodeProvider` `AgentProvider` |
| `packages/integrations/git/` | Pure git operations — `simple-git` wrapper: repo resolution, worktree lifecycle, diff review, path security; schemas re-exported by `kolu-common` |
| `packages/integrations/github/` | GitHub PR schemas + pure helpers (`deriveCheckStatus`, `classifyGhError`, `prResultEqual`); server wraps with `gh pr view` spawn via `KOLU_GH_BIN` |
| `packages/integrations/io/` | Filesystem & I/O primitives — refcounted shared `fs.watch` keyed by directory (`createDirFilenameWatcher`); zero `kolu-*` deps so any package can adopt without coupling |
| `packages/integrations/io/` | `@kolu/dir-watch` — refcounted shared `fs.watch` keyed by directory (`createDirFilenameWatcher`). Parent-dir target survives editor temp+rename atomicity; refcount singleton per resolved dir; idempotent unsubscribe with debounce-timer teardown. Zero `kolu-*` deps |
| `packages/transcript-core/` | Vendor-neutral transcript IR (`Transcript`, `TranscriptEvent`, typed `ToolInput` union) + structural transforms; per-agent loaders normalize into this shape |
| `packages/transcript-html/` | Static-export renderer — `marked` for prose, [`@pierre/diffs`](https://www.npmjs.com/package/@pierre/diffs) SSR for shiki-tokenized code/diffs, [Preact](https://preactjs.com/) JSX for chrome; emits one self-contained `.html` |
| `packages/terminal-themes/` | Terminal color scheme catalog + perceptual-distance picker — themes checked-in as JSON |
| `packages/terminal-themes/` | `@kolu/terminal-themes` — terminal color scheme catalog + perceptual-distance picker. Themes parsed from [iTerm2-Color-Schemes](https://github.com/mbadolato/iTerm2-Color-Schemes) (Ghostty format) and ship checked-in as `themes.json`. `pickTheme` minimizes perceptual background distance against peers so multi-terminal tiles read as visually distinct |
| `packages/memorable-names/` | ADJ-NOUN random name generator — word lists checked-in as JSON |

### Communication
Expand Down
7 changes: 7 additions & 0 deletions default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,14 @@ let
./tsconfig.base.json
./packages/surface
./packages/surface-nix-host
./packages/browser-clipboard
./packages/canvas-layout
./packages/file-line-ref
./packages/solid-anchored-popover
./packages/solid-canvas-viewport
./packages/solid-pierre
./packages/solid-recorder
./packages/solid-xterm
./packages/common
./packages/integrations
./packages/nonempty
Expand Down
Loading