82 lines
5.6 KiB
Markdown
82 lines
5.6 KiB
Markdown
# Phase 3 — iOS Augmentation
|
||
|
||
> **Status:** blocked on Phase 2 MVP shipping.
|
||
> **Owners:** highly parallelisable — features are largely independent.
|
||
> **Repo:** `pi-remote-ios`.
|
||
> **Spec reference:** [`reference/SPEC-ios-app.md`](./reference/SPEC-ios-app.md) §5
|
||
> Groups B-06, B-07, B-08, B-09, C-03, C-04, C-05, D-01c, D-02, A-05 extensions.
|
||
|
||
## Goal
|
||
|
||
Make the iOS app distinctly nicer to use than a generic terminal client.
|
||
Each Phase 3 feature is independently shippable; no global blocker.
|
||
Features can land in any order, driven by daily use feedback.
|
||
|
||
## Acceptance Criteria
|
||
|
||
Per-feature checklist (each feature ships when its row passes):
|
||
|
||
| Feature | Acceptance |
|
||
|---|---|
|
||
| Slash-Command Palette | Long-press modifier bar opens palette, fuzzy search works, command injects correctly, argument forms render for commands with args. |
|
||
| Voice-to-Prompt | Mic button → preview → send works offline (iOS Speech). |
|
||
| Predictive Thumbnails | Switcher list shows live 40×12 capture-pane previews refreshed on open. |
|
||
| Scrollback Search | Cmd-F (HW kb) or pull-down gesture opens search; jump-to-match highlights and centres. |
|
||
| Hardware Keyboard Shortcuts | Cmd-K, Cmd-T, Cmd-1..9, Cmd-F, Cmd-Shift-P, Cmd-, route correctly. |
|
||
| Reachability | iPhone landscape: modifier bar mirrored for one-handed use. |
|
||
| Smart Paste (full) | Clipboard preview chip, multi-line preview sheet, bracketed-paste correctness. |
|
||
| Haptic Feedback | Subtle haptic on thinking→idle and thinking→awaiting transitions. |
|
||
| Theme + Font Picker UI | Settings UI exposes all bundled themes and fonts; iCloud-sync for custom. |
|
||
|
||
## Task Breakdown
|
||
|
||
| ID | Task | Touches | Depends on | Parallel With |
|
||
|---|---|---|---|---|
|
||
| T-3.1 | **Slash-Command Palette** (iOS-C-04). Long-press recogniser on ModifierBar, palette sheet, fuzzy-search engine, argument form generator from JSON schema returned by sidecar. | `Sources/UI/Input/SlashPalette/`, sidecar `/sessions/:id/commands` already exists (S-08) | Phase 2 | all others |
|
||
| T-3.2 | **Voice-to-Prompt** (iOS-C-05). `Sources/Voice/`, SFSpeechRecognizer, microphone permission, preview-edit-send flow. | `Sources/Voice/`, `Sources/UI/Input/ModifierBar.swift` (🎙 wiring) | Phase 2 | all others |
|
||
| T-3.3 | **Predictive Thumbnails** (iOS-D-01c). Add `GET /sessions/:id/thumbnail` on sidecar if not already (Phase 1 IC-2 includes it); poll on switcher open; render small SwiftTerm in `SessionRow`. | `Sources/UI/Sessions/SessionRow.swift`, `Sources/Core/Sessions/SessionRegistry.swift` | Phase 2 | all others |
|
||
| T-3.4 | **Scrollback Search** (iOS-D-02). Search bar over `ScrollbackCache`, in-memory index (linear search is fine at 5MB), highlight + jump in TerminalView. | `Sources/UI/Terminal/Search/`, `Sources/Core/Persistence/ScrollbackCache.swift` (read API) | Phase 2 | all others |
|
||
| T-3.5 | **Hardware Keyboard Shortcuts** (iOS-B-06). Register `UIKeyCommand` set in piRemoteApp + scene; route to app actions. Caps→Esc opt-in. | `Apps/piRemote/piRemoteApp.swift`, individual view controllers via scene delegate | Phase 2 | T-3.1 (Cmd-Shift-P depends on slash palette existing) |
|
||
| T-3.6 | **Reachability / One-Hand-Mode** (iOS-B-07). Landscape layout in `ModifierBar` mirrored; settings toggle. | `Sources/UI/Input/ModifierBar.swift` | Phase 2 | all others |
|
||
| T-3.7 | **Smart Paste full** (iOS-B-08 + iOS-B-09 bracketed-paste). Extend stub PasteSheet from Phase 2 with multi-line preview, char/line counter; track `\e[?2004h/l` from stream, switch paste-frame type accordingly. | `Sources/UI/Input/PasteSheet.swift`, `Sources/Core/Sessions/SessionConnection.swift` (state tracker) | Phase 2 | all others |
|
||
| T-3.8 | **Haptic Feedback** (iOS-C-03). `UIImpactFeedbackGenerator` hook in StatusBar state change. Setting to disable. | `Sources/UI/Status/StatusBar.swift`, Settings | Phase 2 | all others |
|
||
| T-3.9 | **Theme + Font Picker** (iOS-A-05 UI). Settings panes for theme/font selection, custom-theme editor (JSON or color pickers), iCloud KVS sync for custom. | `Sources/UI/Settings/`, `Sources/UI/Terminal/ThemeStore.swift` extensions | Phase 2 | all others |
|
||
|
||
## Inter-Task Conflicts
|
||
|
||
Most Phase 3 tasks touch unrelated files. Watch zones:
|
||
|
||
- **ModifierBar.swift** — T-3.1 (long-press), T-3.2 (mic), T-3.6 (mirror),
|
||
T-3.7 (paste). Coordinate via SYNC.md if more than one of these is in
|
||
flight simultaneously. Recommended order: T-3.1 → T-3.7 → T-3.6 → T-3.2.
|
||
- **SessionConnection.swift** — T-3.7 (bracketed-paste state) and any
|
||
follow-up to Phase 2 IC-2.1. Coordinate.
|
||
- **Settings UI** — T-3.6, T-3.8, T-3.9 all extend the same settings
|
||
surface. Land in series or merge carefully.
|
||
|
||
## Test Strategy
|
||
|
||
Per feature: a manual checklist row in `docs/PHASE-3-checklist.md`. No
|
||
heavy automation — these are visual / experiential features.
|
||
|
||
Critical regressions to watch for:
|
||
- Slash palette must not break input flow when dismissed (focus return).
|
||
- Voice must not steal focus from the WebSocket stream.
|
||
- Thumbnails must not block switcher rendering on slow links.
|
||
|
||
## Risks
|
||
|
||
- **R1.** SFSpeechRecognizer offline accuracy varies. Mitigation: allow
|
||
on-device-only mode (slower, more private) vs. server-assisted toggle.
|
||
- **R2.** UIKeyCommand routing is finicky across scenes. Mitigation:
|
||
centralise key handling in a single `KeyCommandRouter` actor.
|
||
- **R3.** Custom theme JSON schema drift between iCloud devices. Mitigation:
|
||
versioned schema, migrate on read.
|
||
|
||
## Exit
|
||
|
||
Phase 3 has no hard exit — features land continuously. A "Phase 3 closed"
|
||
event is when every task above is shipped or explicitly deferred. At that
|
||
point write `docs/PHASE-3-report.md` summarising what made it, what didn't,
|
||
and ideas that came out of daily use for a future Phase 4.
|