diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 6adcd59..1c16cd6 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,5 +1,7 @@ # Roadmap +> **Status (2026-07-13):** Wave 1-4 (all 8 items) implemented + committed on `develop` — see docs/PROGRESS_LOG.md for the per-feature commits. Remaining: Wave 5 (fan-out board, access token, Android parity) + the deferred backlog. + Prioritized backlog of features to build next, derived from a grounded analysis of the codebase + the existing planning docs (5 exploration lenses → 24 candidates → this synthesis). Each item keeps **what it touches** (real files/subsystems) and a @@ -29,7 +31,7 @@ build sequence (dependencies noted). ## Wave 1 — ship first (high-trust / high-delight, independent) -- [ ] **Approval preview — see-what-you-approve** ⭐ _(strongest)_ +- [x] **Approval preview — see-what-you-approve** ⭐ _(strongest)_ Show the pending `Bash` command or `Edit`/`Write` diff *above* Approve/Reject, so remote one-tap approval stops being blind (today you could tap Approve on `rm -rf build`). *The core walk-away trust gap.* @@ -41,7 +43,7 @@ build sequence (dependencies noted). Pure side-channel. **Effort: M.** Risk: truncate + strip control chars + cap bytes, `textContent`/diff-render only, unknown tools fall back to today's name-only bar. -- [ ] **Clickable URLs & file paths in the terminal** +- [x] **Clickable URLs & file paths in the terminal** Tap the dev-server URL or file path Claude prints instead of soft-keyboard copy gymnastics (paths reuse `POST /open-in-editor`). TECH_DOC named `@xterm/addon-web-links` in v0.2; never built. **Touches:** frontend only — `public/terminal-session.ts` (add the addon + a path-matcher @@ -51,7 +53,7 @@ build sequence (dependencies noted). ## Wave 2 — the unlocking primitive -- [ ] **Server-side PTY-inject + queued follow-up prompt** _(unlocks a family)_ +- [x] **Server-side PTY-inject + queued follow-up prompt** _(unlocks a family)_ A thin Origin/loopback-guarded route that writes text into a session's PTY, plus a per-session queue that fires one entry when Claude goes idle ("now run the tests", then "now open a PR"). Walk-away = give a task and leave; queuing lets the session advance itself. @@ -66,21 +68,21 @@ build sequence (dependencies noted). ## Wave 3 — read-only side-channel batch (review from the phone) -- [ ] **Diff against a base branch** (`?base=`) +- [x] **Diff against a base branch** (`?base=`) Review a whole agent branch vs `main` before landing, not just uncommitted changes. `src/http/diff.ts` already deferred this (FR-B1.9) and named its mitigation: `git rev-parse --verify` allow-list before any revision reaches the CLI. **Touches:** optional `base` on `getDiff()` (guarded `git rev-parse --verify ` + trailing `--`, then `git diff ...`); branch-picker in `public/diff.ts`. **Effort: S/M.** -- [ ] **PR + CI/checks status via `gh`** (read-only) +- [x] **PR + CI/checks status via `gh`** (read-only) Per-project/session chip: PR state · checks passing · mergeable — glance from the phone, re-engage only when red. No `gh` usage exists in `src/` yet; `gh` emits JSON (no parsing pain). **Touches:** new `src/http/gh.ts` (mirror `diff.ts`'s `runGit`); `GET /projects/pr?path=` guarded by `isValidGitDir`; `PrStatus` in `src/types.ts`; FE chip in project detail. Capability-probe + empty-degrade when `gh` absent/unauthed. **Effort: M.** -- [ ] **Quick wins** (small, cheap, high-delight) +- [x] **Quick wins** (small, cheap, high-delight) - [ ] **Sync chip on project cards** — ahead/behind + last-commit, folded into the existing per-repo metadata pass in `src/http/projects.ts` (no new route). **S.** - [ ] **Cost budget guard + push alert** — `costUsd` already flows via statusLine @@ -95,7 +97,7 @@ build sequence (dependencies noted). ## Wave 4 — close the git loop -- [ ] **Worktree lifecycle: remove / prune** (create is now fixed) +- [x] **Worktree lifecycle: remove / prune** (create is now fixed) Delete losing worktrees + land the winner from any device — closes the create-only loop. **Touches:** `removeWorktree`/`pruneWorktrees` in `src/http/worktrees.ts` (same execFile no-shell + timeout, validate target in `git worktree list` & not main, reuse realpath @@ -103,7 +105,7 @@ build sequence (dependencies noted). make the existing `locked`/`prunable` tags actionable. **Effort: S–M.** Risk: destructive — require `--force` + confirm for dirty trees, reject the main worktree, safe error messages. -- [ ] **Stage / commit / push from the diff viewer** +- [x] **Stage / commit / push from the diff viewer** Claude's done, you reviewed on the phone — now commit + push without typing git into a mobile terminal. Highest-risk git write; bound the MVP to per-file stage-toggle + commit + push-current-branch only; **defer discard/checkout**; realpath-contain paths, cap msg length,