docs: finalize TUI nav + archiving spec and implementation plan

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 12:02:45 -04:00
parent 32f7e0ded7
commit 138e4e04bc
2 changed files with 752 additions and 3 deletions
@@ -48,11 +48,13 @@ Archiving is a **recoverable delete**: it kills the session's tmux window/harnes
| Key | View | Action |
|-----|-----------|----------------------------------------------------------------|
| `x` | active | Archive selected session — gated behind the same confirm dialog as delete |
| `x` | active | Archive selected session — **instant, no confirmation** (non-destructive: row + worktree kept, harness resumable) |
| `A` | both | Toggle the Sessions column between **active** and **archived** |
| `u` | archived | Restore (unarchive) the selected session |
| `d` | both | Hard delete (unchanged; in archived view the window is already gone) |
Archive is instant because it loses nothing: it kills the live tmux window (a resumable process) but keeps the DB row, `harness_session_id`, and any worktree on disk. Restore is equally instant. Hard `delete` retains its existing confirmation flow (worktree sessions still prompt via `ConfirmDeleteScreen`).
### View toggle
- A `_show_archived: bool` flag on the app. `action_toggle_archived` flips it and refreshes the Sessions list for the currently-selected project.
@@ -77,7 +79,7 @@ Archived sessions always render as `dead` (their window was killed). No pane cap
- `unarchive_session` makes the row reappear in the active list.
- `list_sessions(project_id, archived=True)` returns only archived rows.
**TUI tests (`tests/test_tui*.py`, following existing patterns):**
- `x` triggers archive (with confirm), `A` toggles the view and header text, `u` restores.
**TUI tests (`tests/test_tui.py`, following existing patterns):**
- `x` triggers archive (instant, no dialog), `A` toggles the view and header text, `u` restores.
- `h`/`l` move focus to the projects/sessions lists respectively.
- Footer/`check_action` adaptation: `x` hidden in archived view, `u` hidden in active view.