v1.8.3 (tool-call compaction), themes-v1, v1.9 (settings pane + per-project defaults + bulk archive), and v1.11 (agents Tier 2) were all marked Planned/in-flight in the roadmap despite being merged on main. Reconcile the Batch summary table and reorder the Order of operations to start at v1.10. Drop the stale "Active work" section — themes-v1 description belongs in the past tense now. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
205 lines
11 KiB
Markdown
205 lines
11 KiB
Markdown
# BooCode — Roadmap
|
||
|
||
Last updated: 2026-05-17
|
||
|
||
## Overview
|
||
|
||
BooCode is a standalone code-chat tool at `/opt/boocode/`. Read-only by design in v1.x — pick a project, chat with a local LLM that has file-inspection tools, get streaming responses over WebSocket.
|
||
|
||
Live at `https://code.indifferentketchup.com` (Caddy → Authelia → Tailscale → `100.114.205.53:9500`).
|
||
|
||
**Architectural commitments:**
|
||
|
||
- No embeddings. File-view tools + sidecar analyzers replace RAG.
|
||
- Read-only in v1.x. Write tools land in BooCoder (separate container, post-v1.x).
|
||
- One Postgres (`boocode_db`), one frontend SPA, container-per-service for new capabilities.
|
||
|
||
## Current state
|
||
|
||
- **main:** v1.8.1 (`b09d0ff` was last known tip prior to v1.8.2).
|
||
- **Just merged / committed to main:** v1.8.2 — tool-loop fixes (read-only loop cap raised, "tool loop depth exceeded" error surfaced with continue button, `max_tool_calls` AGENTS.md frontmatter, `messages.metadata` column).
|
||
- **In flight RIGHT NOW:** **v1.x-themes** branch — Claude Code implementing 18-theme system. See "Active work" below.
|
||
|
||
## Active work
|
||
|
||
### v1.x-themes — Theme system (in flight)
|
||
|
||
**Spec source:** locked in this session. Anchors below derived from `/mnt/user-data/uploads/boocode-theme-previews.html` (16 themes extracted) + spec §3 family rules for the two missing (`fuchsia-noir`, `midnight-sapphire`).
|
||
|
||
**18 themes, grouped:**
|
||
|
||
| Family | IDs |
|
||
|---|---|
|
||
| Neutral dark | obsidian (default), gunmetal |
|
||
| Brown / warm | espresso, volcanic-brown |
|
||
| Orange / amber | copper, gold |
|
||
| Red | oxblood, crimson |
|
||
| Purple | elderflower, plum |
|
||
| Pink / magenta | steel-pink, fuchsia-noir |
|
||
| Green | matrix, sage |
|
||
| Blue | cobalt, midnight-sapphire |
|
||
| Light-only | ivory, chalk |
|
||
|
||
**Dark anchors (bg, card, border, muted-fg, accent):**
|
||
|
||
```
|
||
obsidian #0c0c0e #15151a #1f1f23 #6b6b75 #8b5cf6
|
||
gunmetal #0d1117 #161b22 #21262d #7d8590 #388bfd
|
||
espresso #1c1410 #241a14 #2e2218 #8a7058 #c8a880
|
||
volcanic-brown #140906 #1e0e0a #2e1610 #7a4030 #cc4a1a
|
||
copper #100800 #1c1408 #2e1f0a #8a6040 #b87333
|
||
gold #0e0800 #1a1200 #2a1f00 #a07c30 #d4af37
|
||
oxblood #0a0303 #180606 #2a0808 #7a3028 #8b1a1a
|
||
crimson #0e0404 #1a0808 #2e0a0a #8a3030 #dc143c
|
||
elderflower #100818 #1c1024 #2c1830 #8a78a0 #b89cd8
|
||
plum #0c0814 #180e20 #241830 #7a4878 #8e4585
|
||
steel-pink #0e0408 #1a080e #2e0c1a #9a4070 #cc33aa
|
||
fuchsia-noir #0a0610 #14081a #2a0c2e #8a3878 #ff1493
|
||
matrix #000a00 #031403 #0a200a #208030 #00ff41
|
||
sage #0a0e08 #141a10 #1e2e1a #7a8870 #9caf88
|
||
cobalt #020817 #061434 #0c2244 #3060a0 #0047ab
|
||
midnight-sapphire #02050e #060c1f #0e1a36 #4a6088 #1e3a8a
|
||
ivory #fdfcf8 #f5f2e8 #e8e4d8 #8a8478 #3a3328 (light-only)
|
||
chalk #fafaf7 #f0f0ec #e5e5e0 #75756e #2a2a28 (light-only)
|
||
```
|
||
|
||
**Light-variant derivation (for the 16 dark themes):**
|
||
- Lightest anchor → background
|
||
- Accent darkens ~15% (HSL L − 15pp)
|
||
- Foreground = near-black tinted toward family hue
|
||
- Surfaces / borders scale up symmetrically
|
||
|
||
**Fallback:** `ivory` or `chalk` + dark mode → `obsidian` dark.
|
||
|
||
**Token map (shadcn nova set):**
|
||
```
|
||
background ← anchor 1
|
||
card / popover ← anchor 2
|
||
border / muted ← anchor 3
|
||
muted-foreground ← anchor 4
|
||
primary / accent ← anchor 5
|
||
foreground ← derived: anchor-5 hue, ~92% L, ~25% S
|
||
--destructive ← red family, unchanged across themes
|
||
--ring ← per-theme accent
|
||
--radius ← 0.5rem locked
|
||
fonts ← Inter + JetBrains Mono locked
|
||
```
|
||
|
||
**Wiring locked:**
|
||
- Schema: `settings.theme_id TEXT NOT NULL DEFAULT 'obsidian'`, `settings.theme_mode TEXT NOT NULL DEFAULT 'dark' CHECK IN ('dark','light','system')`
|
||
- API: GET `/api/settings` extended, PATCH whitelists 18 theme ids → 400 otherwise
|
||
- CSS: `apps/web/src/styles/themes/*.css` (18 + `_tokens.css`), imported from `globals.css` (NOT `index.css`)
|
||
- `.theme-<id>` + `.theme-<id>.dark` composed on `<html>`
|
||
- `apps/web/src/lib/theme.ts` (new): `THEMES` const, `applyTheme(id, mode)`, `useTheme()` hook. matchMedia subscribed only when `mode === 'system'`
|
||
- `apps/web/src/App.tsx`: `useTheme()` at top
|
||
- Settings page: card grid, mode toggle (radio: Dark/Light/System). No header dropdown.
|
||
- shadcn primitives: `card`, `radio-group` installed via `pnpm dlx shadcn@latest add`. `button`, `label` already present.
|
||
- FOUC mitigation: localStorage cache + inline `<script>` in `index.html` sets `<html>` class before React hydrates
|
||
|
||
**Out of scope (v1):**
|
||
- Custom user palettes (no color picker)
|
||
- Per-project / per-session themes
|
||
- Shiki syntax-highlighting themes
|
||
- Header quick-switcher
|
||
|
||
**Verify after Claude Code hands back:**
|
||
- `fuchsia-noir` and `midnight-sapphire` visual check — derived, not from preview. Swap hexes if they read wrong.
|
||
- Light variants of the 16 dark themes — algorithmic. Spot-check 3-4 across families (warm/cool/dark/saturated).
|
||
- FOUC on hard reload, theme-switch persistence, system-mode matchMedia teardown.
|
||
|
||
## Batch summary
|
||
|
||
| Version | Theme | Status |
|
||
|---|---|---|
|
||
| v1.0 | Initial scaffold, read-only tools, WS streaming | ✅ Merged |
|
||
| v1.1-batch1 | Markdown, Copy + Regen, tok/s + ctx, AI naming | ✅ Merged |
|
||
| v1.1-batch2 | Sidebar restructure | ✅ Merged |
|
||
| v1.1-batch3 | Pane system, FileBrowserPane + Shiki, cross-tab | ✅ Merged |
|
||
| v1.1-batch3.5 | Chip infra, `@file`, line-select | ✅ Merged |
|
||
| v1.2 | Chats inside sessions, right-rail, `/compact`, archive, force-send | ✅ Merged |
|
||
| v1.2-project-ux | Project archive, sidebar context, Gitea API, bootstrap | ✅ Merged |
|
||
| v1.3 | Tab-close + chat-archive | ✅ Merged |
|
||
| v1.4 | Fork message, delete message, header polish (was original Batch 5) | ✅ Merged |
|
||
| v1.5 | resolveProjectPath, BOOTSTRAP_ROOT, vitest pin | ✅ Merged |
|
||
| v1.5.1 | Bootstrap hotfix (git in container, SSH keypair, known_hosts) | ✅ Merged (`4a9f207`) |
|
||
| v1.6 | Mobile pass: drawer, single-pane, long-press, IME-safe, pull-to-refresh, swipe-close | ✅ Merged |
|
||
| v1.6.1 | RightRail mobile wrapper fix | ✅ Merged |
|
||
| Tool-loop bump | MAX_TOOL_LOOP_DEPTH 5→15 | ✅ Merged |
|
||
| v1.6.2 | Workspace + Session+Project headers, ChatTabBar new-chat, RightRail mobile drawer | ✅ Merged |
|
||
| v1.7 | Drag-drop file + paste-as-attachment (was Batch 6) | ✅ Merged |
|
||
| v1.8 | Settings drawer + `git_status` added to ALL_TOOL_NAMES (was Batch 7) | ✅ Merged |
|
||
| v1.8.1 | WS reconnect toast tuning (silent/gray/red thresholds), pane status indicators | ✅ Merged |
|
||
| v1.8.2 | Tool-loop fixes: read-only cap raised, "depth exceeded" error + continue, `max_tool_calls` frontmatter, `messages.metadata` | ✅ Merged |
|
||
| **v1.x-themes** | **18 themes, settings page, dark/light/system, FOUC mitigation** | **🔄 Claude Code in flight** |
|
||
| v1.8.3 | Tool call UI compaction: collapse-by-default, group consecutive same-tool, result preview cap | Planned (small, frontend-only) |
|
||
| v1.9 | Settings pane (system prompt per project + session, web search toggle, `+` button) | Planned (spec locked, was on branch `v1.9-settings-pane`) |
|
||
| v1.10 | Web search backend: SearXNG `web_search` + `web_fetch` | Planned |
|
||
| v1.11 | Agents Tier 2: `AGENTS.md`, per-agent temp/tools whitelist, AgentPicker in ChatInput | Planned |
|
||
| v1.12 | BooTerm: separate container, xterm.js + node-pty + tmux | Planned |
|
||
| v1.13 | Architect: codecontext sidecar (MCP, tree-sitter, no embeddings) | Planned |
|
||
| v1.13b | Architect: repo health (call graph, circular deps, dead code) | Planned |
|
||
| v1.14 | Tool approval + plan/act mode (cline-style) | Planned |
|
||
| Post-v1.x | Append-only event log (OpenHands V1) | Planned |
|
||
| Post-v1.x | BooCoder pending-changes (plandex) | Planned |
|
||
| Post-v1.x | BooCoder runtime isolation (per-session Docker sandbox) | Planned |
|
||
| Optional | Multi-provider LLM abstraction (pi-ai) | Skip unless need surfaces |
|
||
| Far future | Workflow graphs (microsoft/agent-framework concepts) | v2.x topic |
|
||
|
||
## Flagged follow-ups (not in a batch yet)
|
||
|
||
- Agents in `/data/AGENTS.md` don't list `git_status` in their `tools:` blocks. Out of scope until pre-BooCoder cleanup pass.
|
||
- v1.9 dispatch had item (g): verify `useUserEvents` broadcasts `project_updated` on PATCH `/projects/:id`. Add if missing.
|
||
- v1.8.2 follow-up: confirm `messages.metadata` migration ran clean in prod DB after deploy.
|
||
|
||
## Order of operations
|
||
|
||
1. **v1.x-themes** finishes (Claude Code in flight). Audit + smoke test. Merge.
|
||
2. **v1.8.3** — tool call UI compaction. Small frontend batch, addresses current pain.
|
||
3. **v1.9** — settings pane. Branch already named `v1.9-settings-pane`. Spec locked.
|
||
4. **v1.10** — web search backend.
|
||
5. **v1.11** — agents.
|
||
6. **v1.12** — BooTerm.
|
||
|
||
Track B (architect, no UI dep, can run parallel anytime): v1.13 → v1.13b → v1.14.
|
||
|
||
## Architecture target state
|
||
|
||
| Container | Port | Mount | Purpose | Status |
|
||
|---|---|---|---|---|
|
||
| `boocode` | `100.114.205.53:9500` | `/opt:/opt:ro` | Chat + read-only tools + SPA | Live |
|
||
| `boocode_db` | `127.0.0.1:5500` | `boocode_pgdata` volume | Postgres 16-alpine | Live |
|
||
| `codecontext` | `100.114.205.53:8765` (internal) | project root :ro | MCP server for architect tools | v1.13 |
|
||
| `booterm` | `100.114.205.53:9501` | `/opt/repos:/opt/repos:rw` | Terminals (tmux + node-pty) | v1.12 |
|
||
| `boocoder` | `100.114.205.53:9502` | per-session sandbox | Write tools | Post-v1.x |
|
||
|
||
## Schema additions ahead
|
||
|
||
- v1.x-themes (current): `settings.theme_id`, `settings.theme_mode`
|
||
- v1.9: `projects.default_system_prompt`, `projects.default_web_search_enabled`, `sessions.web_search_enabled`
|
||
- v1.11: `sessions.agent_id`
|
||
- v1.13b: `repo_health_cache (project_id, file_hashes_sig, payload JSONB, created_at)`
|
||
- v1.14: `sessions.tool_approval_mode`, `sessions.approved_tools`
|
||
- Post-v1.x: `session_events`; deprecate `messages` long-tail
|
||
- Post-v1.x: `pending_changes`
|
||
|
||
## Decisions log
|
||
|
||
- Embeddings dropped from BooCode. File-view tools + sidecar analyzers replace RAG.
|
||
- Old Batch 11 (aider PageRank port) → replaced by codecontext sidecar (v1.13).
|
||
- Old Batch 12 (Harrier indexer) → removed entirely.
|
||
- Batch 9 reordered ahead of 5–8, decoupled from Batch 7 (2026-05-16). Subsequently superseded — settings pane (v1.9) and themes (v1.x-themes) jumped ahead. Agents now slated as v1.11.
|
||
- Theme work split into its own version (v1.x-themes) rather than blocked behind v1.9 (2026-05-17). Branched off main after v1.8.2 committed.
|
||
|
||
## Workflow
|
||
|
||
Each batch:
|
||
1. Verify previous merged.
|
||
2. Dispatch via Paseo to Claude Code at `/opt/boocode` (or OpenCode for smaller batches).
|
||
3. Recon → blocking questions → implement → hand back.
|
||
4. Compliance review in separate Claude chat.
|
||
5. Deploy: `docker compose up --build -d`.
|
||
6. Smoke test.
|
||
7. Sam commits and pushes.
|
||
|
||
Sam reviews all diffs. Sam commits. Never git pull/push/commit on his behalf.
|