docs: update all docs for polish session — copy/paste, theme hot-swap, tests, drag-resize

- progress.md: add session log for copy/paste, theme hot-swap, tree enhancements,
  session resume, drag-resize, testing, CI, Deno PoC
- phases.md: mark completed items (copy/paste, drag-resize, tree click, subtree cost,
  session resume, CI signing)
- task_plan.md: update theme decision (hot-swap works), add new decisions
- CLAUDE.md: add test paths, test commands, vitest dep
- .claude/CLAUDE.md: fix stale deferred items and theme limitation
- README.md: update feature summary
- TODO.md: move 7 completed items, update active list
- CHANGELOG.md: add session entries under [Unreleased]
This commit is contained in:
Hibryda 2026-03-06 15:10:32 +01:00
parent c15fe7d912
commit f349f3bb14
9 changed files with 154 additions and 33 deletions

View file

@ -109,7 +109,7 @@ bterminal-v2/
- [x] CSS Grid layout with sidebar + main area + optional right panel
- [x] Responsive breakpoints (ultrawide / standard / narrow)
- [ ] Pane resize via drag handles (deferred — current presets sufficient for MVP)
- [x] Pane resize via drag handles (splitter overlays in TilingGrid with mouse drag, min/max 10%/90%)
- [x] Layout presets: 1-col, 2-col, 3-col, 2x2, master+stack
- [ ] Save/restore layout to SQLite (Phase 4)
- [x] Keyboard: Ctrl+1-4 focus pane, Ctrl+N new terminal
@ -119,7 +119,7 @@ bterminal-v2/
- [x] Catppuccin Mocha theme for xterm.js
- [x] PTY spawn from Rust (portable-pty), stream to frontend via Tauri events
- [x] Terminal resize -> PTY resize (100ms debounce)
- [ ] Copy/paste (Ctrl+Shift+C/V) — deferred
- [x] Copy/paste (Ctrl+Shift+C/V) — via attachCustomKeyEventHandler
- [x] SSH session: spawn `ssh` command in PTY (via shell args)
- [x] Local shell: spawn user's $SHELL
- [x] Claude Code CLI: spawn `claude` in PTY (via shell args)
@ -154,7 +154,7 @@ bterminal-v2/
- [x] Agent status indicator (starting/running/done/error)
- [x] Start/stop agent from UI (prompt form + stop button)
- [x] Auto-scroll with scroll-lock on user scroll-up
- [ ] Session resume (SDK `resume: sessionId`)
- [x] Session resume (follow-up prompt in AgentPane, resume_session_id passed to SDK)
- [x] Keyboard: Ctrl+Shift+N new agent
- [x] Sidebar: agent session button
@ -187,8 +187,12 @@ bterminal-v2/
## Phase 5: Agent Tree + Polish [status: complete] — Post-MVP
- [x] Agent tree visualization (SVG, compact horizontal layout) — AgentTree.svelte + agent-tree.ts utility
- [ ] Click tree node -> focus agent pane (onNodeClick prop exists, not wired)
- [ ] Aggregate cost per subtree (subtreeCost util exists, not displayed in UI)
- [x] Click tree node -> scroll to message (handleTreeNodeClick in AgentPane, scrollIntoView smooth)
- [x] Aggregate cost per subtree (subtreeCost displayed in yellow below each tree node label)
- [x] Terminal copy/paste (Ctrl+Shift+C/V via attachCustomKeyEventHandler)
- [x] Terminal theme hot-swap (onThemeChange callback registry in theme.svelte.ts, TerminalPane subscribes)
- [x] Pane drag-resize handles (splitter overlays in TilingGrid with mouse drag)
- [x] Session resume (follow-up prompt, resume_session_id to SDK)
- [x] Global status bar (terminal/agent counts, active agents pulse, token/cost totals) — StatusBar.svelte
- [x] Notification system (toast: success/error/warning/info, auto-dismiss 4s, max 5) — notifications.svelte.ts + ToastContainer.svelte
- [x] Agent dispatcher toast integration (agent complete, error, sidecar crash notifications)
@ -220,7 +224,9 @@ bterminal-v2/
- Builds .deb + AppImage, uploads as GitHub Release artifacts
- [x] Build verified: .deb (4.3 MB), AppImage (103 MB)
- [x] Auto-updater plugin integrated (tauri-plugin-updater Rust + @tauri-apps/plugin-updater npm + updater.ts)
- [ ] Auto-update signing key + update server setup (needed for full auto-update flow)
- [x] Auto-update latest.json generation in CI (version, platform URL, signature from .sig file)
- [x] release.yml: TAURI_SIGNING_PRIVATE_KEY env vars passed to build step
- [ ] Auto-update signing key generation + TAURI_SIGNING_PRIVATE_KEY secret in GitHub repo
### System Requirements
- Node.js 20+ (for Agent SDK sidecar)

View file

@ -135,8 +135,51 @@ Architecture decision: Uses `claude` CLI with `--output-format stream-json` inst
- [x] New npm dependencies: shiki, @tauri-apps/plugin-updater
- [x] New Rust dependency: tauri-plugin-updater
### Session: 2026-03-06 (continued) — Polish, Testing, Extras
#### Terminal Copy/Paste + Theme Hot-Swap
- [x] Copy/paste in TerminalPane via Ctrl+Shift+C/V (attachCustomKeyEventHandler: C copies selection, V reads clipboard and writes to PTY)
- [x] Theme hot-swap: onThemeChange() callback registry in theme.svelte.ts, TerminalPane subscribes and updates term.options.theme on flavor change
- [x] All open terminals now update immediately when theme flavor changes
#### Agent Tree Enhancements
- [x] Click tree node -> scroll to corresponding message (handleTreeNodeClick in AgentPane, scrollIntoView with smooth behavior)
- [x] Subtree cost display: yellow cost text below each tree node label (subtreeCost from agent-tree.ts, NODE_H increased from 32 to 40)
- [x] Each message div has id="msg-{msg.id}" for scroll targeting
#### Session Resume
- [x] Follow-up prompt input appears after session completes or errors (if sdkSessionId exists)
- [x] startQuery(text, resume=true) passes resume_session_id to SDK via agent_query
- [x] Styled .follow-up input + button in done-bar and error-bar sections
#### Pane Drag-Resize Handles
- [x] Splitter overlays in TilingGrid (positioned with fixed CSS, outside grid to avoid layout interference)
- [x] Column splitters: vertical bars between grid columns with mousemove drag
- [x] Row splitters: horizontal bars between grid rows with mousemove drag
- [x] customColumns/customRows $state override preset grid-template; reset on preset change
- [x] Supports 2-col, 3-col, and 2-row layouts with min 10% / max 90% ratio clamping
- [x] .dragging class disables user-select during drag; splitter hover shows accent color at 40% opacity
#### Auto-Update Workflow Enhancement
- [x] release.yml: TAURI_SIGNING_PRIVATE_KEY + PASSWORD env vars passed to build step
- [x] Generates latest.json for auto-updater (version, pub_date, platform URL, signature from .sig file)
- [x] Uploads latest.json alongside .deb and .AppImage as release artifacts
#### Deno Sidecar Evaluation
- [x] Created agent-runner-deno.ts proof-of-concept (Deno.Command for claude CLI, TextLineStream for NDJSON)
- [x] Same NDJSON protocol as Node.js version; compiles to single binary with deno compile
- [ ] Not yet integrated with Rust SidecarManager; needs real-world testing
#### Testing Infrastructure
- [x] Vitest added: vitest ^4.0.18 dev dependency, vite.config.ts test config, npm run test script
- [x] sdk-messages.test.ts: tests for adaptSDKMessage() — init, text, thinking, tool_use, tool_result, cost, unknown types
- [x] agent-tree.test.ts: tests for buildAgentTree(), countTreeNodes(), subtreeCost()
- [x] Cargo: tempfile 3 dev dependency added
- [x] session.rs tests: SessionDb CRUD (sessions, SSH sessions, settings, layout), uses tempfile::tempdir()
- [x] ctx.rs tests: CtxDb error handling with missing database (conn=None)
### Next Steps
- [ ] Testing: vitest for sdk-messages adapter, cargo test for sidecar
- [ ] Phase 5 remaining: click tree node -> focus pane, subtree cost display
- [ ] Auto-update signing key + update server setup
- [ ] Session resume (SDK resumeSessionId)
- [ ] Auto-update signing key generation + TAURI_SIGNING_PRIVATE_KEY secret in GitHub repo
- [ ] Deno sidecar: test with real claude CLI, benchmark vs Node.js, integrate with sidecar.rs
- [ ] E2E testing with Playwright
- [ ] Session groups/folders in sidebar

View file

@ -130,9 +130,12 @@ See [phases.md](phases.md) for the full phased implementation plan (Phases 1-6).
| Build-from-source installer over pre-built binaries | install-v2.sh checks deps and builds locally. Pre-built binaries via GitHub Actions CI (.deb + AppImage on v* tags). Auto-update deferred until signing key infrastructure is set up. | 2026-03-06 |
| ctx read-only access from Rust | Open ~/.claude-context/context.db with SQLITE_OPEN_READ_ONLY. Never write — ctx CLI owns the schema. Separate CtxDb struct in ctx.rs with Option<Connection> for graceful absence. | 2026-03-06 |
| SSH via PTY shell args | SSH sessions spawn TerminalPane with shell=/usr/bin/ssh and args=[-p, port, [-i, keyfile], user@host]. No special SSH library — PTY handles it natively. | 2026-03-06 |
| Catppuccin 4 flavors at runtime | CSS variables overridden at runtime for non-Mocha flavors. Existing terminals don't hot-swap (limitation accepted); new terminals pick up the active theme. | 2026-03-06 |
| Catppuccin 4 flavors at runtime | CSS variables overridden at runtime. onThemeChange() callback registry in theme.svelte.ts allows open terminals to hot-swap themes. | 2026-03-06 |
| Detached pane via URL params | Pop-out windows use ?detached=1&type=terminal URL params. App.svelte conditionally renders single pane without sidebar/grid chrome. Simple, no IPC needed. | 2026-03-06 |
| Shiki over highlight.js | Shiki provides VS Code-grade syntax highlighting with Catppuccin theme. Lazy singleton pattern avoids repeated WASM init. 13 languages preloaded. | 2026-03-06 |
| Vitest for frontend tests | Vitest over Jest — zero-config with Vite, same transform pipeline, faster. Test config in vite.config.ts. | 2026-03-06 |
| Deno sidecar evaluation | Proof-of-concept agent-runner-deno.ts created. Deno compiles to single binary (better packaging). Same NDJSON protocol. Not yet integrated. | 2026-03-06 |
| Splitter overlays for pane resize | Fixed-position divs outside CSS Grid (avoids layout interference). Mouse drag updates customColumns/customRows state. Resets on preset change. | 2026-03-06 |
## Open Questions