89 lines
4.0 KiB
Markdown
89 lines
4.0 KiB
Markdown
# Plan — ConPTY Interactive Sessions
|
||
|
||
Spec: `docs/superpowers/specs/2026-07-23-conpty-interactive-sessions-design.md`
|
||
Date: 2026-07-23
|
||
|
||
Execution: subagent-driven-development, sonnet model, TDD where meaningful,
|
||
build + test + commit per task. Stage files explicitly by path (never
|
||
`git add -A`). Terminal rendering is visual — flagged for the user's visual pass.
|
||
|
||
## Task 0 — Spike: embed a ConPTY terminal running `claude`
|
||
|
||
Not TDD; a throwaway proof. Add a temporary window/view that embeds each
|
||
candidate control and launches `claude` in a known worktree.
|
||
|
||
- Evaluate **SvcSystems.UI.Terminal** and **Iciclecreek.Avalonia.Terminal**.
|
||
- Acceptance: the real `claude` TUI renders correctly — colors, resize/reflow,
|
||
and a live permission prompt is usable; input reaches the CLI.
|
||
- Output: pick one library; note the control API (start with cwd/exe/args/env,
|
||
process-exited event, dispose/kill). Record the decision in the spec.
|
||
- Remove the throwaway harness before Task 1 (or keep as a manual dev sample,
|
||
not wired into the app).
|
||
|
||
**Stop for the user's visual verification of the spike before continuing.**
|
||
|
||
## Task 1 — Worker: interactive launch-spec endpoint
|
||
|
||
- Add a Worker service/hub method that, given a taskId, prepares the worktree
|
||
(session-skills seeding, agent files, MCP config, env — reuse the autonomous
|
||
run prep path) and returns a `LaunchSpec { cwd, exe, args, env }`.
|
||
- Reuse `WindowsTerminalLauncher.BuildResumeCommand` for exe/args.
|
||
- Guards mirror `ResumeTaskInTerminal` (not Running/Queued, persisted SessionId,
|
||
worktree Active/Kept). Never-run task → spec without `--resume` (fresh start).
|
||
- Tests (Worker.Tests, real SQLite/git): guard cases, spec contents for a
|
||
resumable task, fresh-start case. No real `claude` in tests.
|
||
|
||
## Task 2 — Worker: ad-hoc launch-spec
|
||
|
||
- Method to build a `LaunchSpec` for a free session in a given directory:
|
||
MCP config + env set up, no task/session-skills seeding.
|
||
- Tests: env/MCP presence, arbitrary cwd.
|
||
|
||
## Task 3 — UI: terminal host control + view model
|
||
|
||
- Wrap the chosen library in an app control/view (e.g. `InteractiveTerminalView`
|
||
+ `InteractiveTerminalViewModel`) that starts from a `LaunchSpec` and exposes
|
||
running/exited state.
|
||
- `IWorkerClient`: add methods to fetch the task and ad-hoc launch specs; wire
|
||
the SignalR client + hub method.
|
||
- Update hand-rolled `IWorkerClient`/hub fakes in BOTH test projects.
|
||
- Tests: view model starts/stops lifecycle with a fake terminal backend;
|
||
fake worker returns a spec.
|
||
|
||
## Task 4 — Command Center: host interactive panes + entry points
|
||
|
||
- `MonitorPaneView`: autonomous panes keep the streamed log; interactive panes
|
||
host the terminal control.
|
||
- Entry points: "Open interactive session" from a task (task-based) and a
|
||
"New session" action (ad-hoc, pick directory).
|
||
- Layout toggle: focus (tabs) ↔ overview (grid); reuse/extend the existing
|
||
`UniformGrid` column logic for the grid mode.
|
||
- Tests: view-model level (pane kind selection, layout toggle state). Rendering
|
||
is a visual-pass item.
|
||
|
||
## Task 5 — Remove the streaming interactive stack
|
||
|
||
Only after Tasks 1–4 land and the terminal path works.
|
||
|
||
- Worker: delete `StreamingClaudeSession`, `InteractiveSessionService`,
|
||
interactive `WorkerHub` methods + broadcast events, DI registrations.
|
||
Verify `LiveSessionRegistry` / `IdleSessionReaper` usage first; remove only if
|
||
unreferenced.
|
||
- UI: remove composer bits on `TaskMonitorViewModel`, the composer/queued portion
|
||
of `SessionTerminalView`, `IWorkerClient` interactive methods.
|
||
- Update fakes and delete now-dead tests. Full build + all test projects green.
|
||
|
||
## Task 6 — Docs
|
||
|
||
- Update `docs/open.md` with visual-verification items (spike render, terminal
|
||
resize/focus, grid vs tabs).
|
||
- Update affected per-project `CLAUDE.md` (Worker interactive removal, UI new
|
||
terminal host).
|
||
|
||
## Verification gates
|
||
|
||
- After Task 0: user visual pass on the spike.
|
||
- After Task 4: user visual pass on Command Center (task + ad-hoc, tabs + grid,
|
||
permission prompt round-trip).
|
||
- Never claim the terminal UI works without the user running it.
|