Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
ab42b98
Rewrite playground tutorial as interactive TUI
nedtwigg May 5, 2026
40bf2f2
Polish tutorial runner: reset menu, in-place busy demo, esc hint
nedtwigg May 5, 2026
0d429bb
Quiet the tutorial pane between user actions
nedtwigg May 5, 2026
5dbbe82
Drive fake adapter activity monitor from sendOutput
nedtwigg May 5, 2026
a5419cd
Wait for attention to clear before ringing instead of swallowing the …
nedtwigg May 5, 2026
bdda080
Revert activity-monitor change; outlast attention in the busy demo in…
nedtwigg May 5, 2026
0af5e2e
Snapshot the tutorial runner's UI states
nedtwigg May 5, 2026
b86a442
Italic-and-indented tutorial item hints
nedtwigg May 5, 2026
b5588b1
Highlight every hotkey in the tutorial in cyan
nedtwigg May 5, 2026
f92ba45
Tighten alert section hints and word-wrap long ones
nedtwigg May 5, 2026
a265518
Rewrite Copy paste section: actionable items + word-wrapped prose
nedtwigg May 5, 2026
64fa5e9
Suppress the default scenario on the tutorial pane
nedtwigg May 6, 2026
7f688a8
Type ItemId as a literal union of stable item ids
May 6, 2026
0f9b9c8
Remove unused playScenarioNow on FakePtyAdapter
May 6, 2026
80ee553
Persist tutorial progress under one localStorage key
May 6, 2026
393fb8c
Take store deps in TutDetector constructor; trim narrating comments
May 6, 2026
55a5594
Centralize ANSI escape constants in lib/src/lib/ansi.ts
May 6, 2026
f74d9cc
Fix playground tutorial autostart race
May 6, 2026
fceaa70
Support Ctrl Arrow pane swaps
May 6, 2026
e1f05c9
Reconcile tutorial spec with implementation
May 6, 2026
3e8c1c7
Skip transition detection on first observation per id
May 6, 2026
5e53597
Ignore busy-demo trigger while one is already running
May 6, 2026
bbfc39d
Stop the spinner timer when leaving the Alert section
May 6, 2026
6affcaa
Fix tutorial first selection detection
May 6, 2026
59df042
Fix tutorial arrow navigation detection
May 6, 2026
f98f54a
Avoid eager mouse selection import
May 6, 2026
f6657fa
Gate al-busy and al-ring on a status transition
May 6, 2026
e2fe83b
Fix tutorial alert enable detection
May 6, 2026
a96b9e1
Clarify ascii splash override step
May 6, 2026
b25bbc7
Avoid duplicate playground prompts
May 6, 2026
696ad54
Widen the fake-busy guard margin from 1ms to 250ms
May 6, 2026
357b017
Reuse the shared DEFAULT_MOUSE_SELECTION_STATE constant
May 6, 2026
900dcc2
Drop detector prev-state entries when their pane disappears
May 6, 2026
53571c6
Warn when tutorial auto-start exhausts its retry budget
May 6, 2026
decba32
Tag scenarios with endsWithPrompt instead of hardcoding pane ids
May 6, 2026
5a6c851
Route the kill event through fireEvent like every other Wall event
May 6, 2026
8f0ae05
Make playground tutorial interactive on load
May 6, 2026
f4ab4d1
Drive playground tutorial auto-start from a pty-spawn event
May 6, 2026
363d82e
Fix tutorial q navigation
May 6, 2026
8dc104d
Add skipActivity opt-out to FakePtyAdapter.sendOutput
May 6, 2026
457e78c
Resume tutorial spinner when re-entering Alert mid-demo
May 6, 2026
025c6e6
Seed kb-arrows from dockview's active panel, not wall selection
May 6, 2026
4d23cc9
Cancel Playground busy-demo timers on unmount
May 6, 2026
e5dba24
docs: align tutorial spec with runner behavior
May 6, 2026
7e050e4
Notify listeners before persisting in markComplete
May 6, 2026
10fb5a9
Stop pumpActivity ticks when the pty is gone
May 6, 2026
936ff49
Fix tutorial alert demo target
May 6, 2026
f1c7aa9
Don't credit kb-arrows for the focus change after a Cmd/Ctrl+Arrow swap
May 6, 2026
5765c4f
Snapshot shell keys before disposing in PlaygroundShellRegistry
May 6, 2026
6a1e105
Throw on unknown sectionId in TutRunner.renderSection
May 6, 2026
1e33fc8
Centralize scenario lookup in FakePtyAdapter
May 6, 2026
02069a3
Type the DockviewApi surface TutDetector actually consumes
May 6, 2026
55ed8ac
Reject double-attach in TutDetector
May 6, 2026
9364b27
Derive busy-demo tick interval from cfg.alert.busyCandidateGap
May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ The primary job of a spec is to be an accurate reference for the current state o
- **`docs/specs/layout.md`** — Tiling layout, pane/door containers, dockview configuration, modes (passthrough/command), keyboard shortcuts, selection overlay, spatial navigation, minimize/reattach, inline rename, session lifecycle, session persistence, and theming. Read this when touching: `Wall.tsx`, `Baseboard.tsx`, `Door.tsx`, `TerminalPane.tsx`, `spatial-nav.ts`, `layout-snapshot.ts`, `terminal-registry.ts`, `session-save.ts`, `session-restore.ts`, `reconnect.ts`, `index.css`, `theme.css`, or any keyboard/navigation/mode behavior.
- **`docs/specs/alert.md`** — Activity monitoring state machine, alert trigger/clearing rules, attention model, TODO lifecycle (soft/hard), bell button visual states and interaction, door alert indicators, and hardening (a11y, motion, i18n, overflow). Read this when touching: `activity-monitor.ts`, `alert-manager.ts`, the alert bell or TODO pill in `Wall.tsx` (TerminalPaneHeader), alert indicators in `Door.tsx`, or the `a`/`t` keyboard shortcuts. Layout.md defers to this spec for all alert/TODO behavior.
- **`docs/specs/vscode.md`** — VS Code extension architecture: hosting modes (WebviewView + WebviewPanel), PTY lifecycle and buffering, message protocol between webview and extension host, session persistence flow, reconnection protocol, theme integration, CSP, build pipeline, and invariants (save-before-kill ordering, PTY ownership, alert state merging). Read this when touching: `extension.ts`, `webview-view-provider.ts`, `message-router.ts`, `message-types.ts`, `pty-manager.ts`, `pty-host.js`, `session-state.ts`, `webview-html.ts`, `vscode-adapter.ts`, or `pty-core.js`.
- **`docs/specs/tutorial.md`** — Playground tutorial on the website: 3-pane initial layout, `tut` command and TutorialShell, 6-step progressive tutorial with detection logic, theme picker, FakePtyAdapter extensions, and Wall event hooks. Read this when touching: `website/src/pages/Playground.tsx`, `website/src/lib/tutorial-shell.ts`, `website/src/lib/tutorial-detection.ts`, `lib/src/components/ThemePicker.tsx`, `lib/src/lib/themes/`, `lib/src/lib/platform/fake-scenarios.ts` (tutorial scenarios), or the `onApiReady`/`onEvent`/`initialPaneIds` props on Wall.
- **`docs/specs/tutorial.md`** — Playground tutorial on the website: 3-pane layout, interactive `tut` TUI runner with three sections (keyboard navigation, alerts/TODOs, copy/paste), per-item detection wired to `WallEvent` / activity store / mouse-selection store, single-key `mouseterm-tut-v3` localStorage scheme, theme picker, and FakePtyAdapter extensions (`sendOutput`, `pumpActivity`, `setInputHandler`). Read this when touching: `website/src/pages/Playground.tsx`, `website/src/lib/tut-runner.ts`, `website/src/lib/tut-detector.ts`, `website/src/lib/tutorial-state.ts`, `website/src/lib/tut-items.ts`, `website/src/lib/tutorial-shell.ts`, `lib/src/components/ThemePicker.tsx`, `lib/src/lib/themes/`, `lib/src/lib/platform/fake-scenarios.ts` (tutorial scenarios), the `WallEvent` union, or the `onApiReady`/`onEvent`/`initialPaneIds` props on Wall.
- **`docs/specs/theme.md`** — Theme system: two-layer CSS variable strategy, theme data model, conversion pipeline, bundled themes, localStorage store, shared ThemePicker component, standalone AppBar picker, runtime OpenVSX installer. Read this when touching: `lib/src/lib/themes/`, `lib/src/components/ThemePicker.tsx`, `lib/src/theme.css`, `lib/scripts/bundle-themes.mjs`, `standalone/src/AppBar.tsx` (theme picker), `standalone/src/main.tsx` (theme restore), or `website/src/components/SiteHeader.tsx` (themeAware mode).
- **`docs/specs/mouse-and-clipboard.md`** — Terminal-owned text selection, copy (Raw / Rewrapped), bracketed paste, smart URL/path extension, mouse-reporting override UI (icon + banner), and the state matrix for which layer owns mouse events. Read this when touching: `lib/src/lib/mouse-selection.ts`, `lib/src/lib/mouse-mode-observer.ts`, `lib/src/lib/clipboard.ts`, `lib/src/lib/rewrap.ts`, `lib/src/lib/selection-text.ts`, `lib/src/lib/smart-token.ts`, `lib/src/components/SelectionOverlay.tsx`, `lib/src/components/SelectionPopup.tsx`, the mouse icon / override banner / Cmd+C-V handling in `lib/src/components/Wall.tsx`, or the parser hooks + mouse listeners in `lib/src/lib/terminal-registry.ts`.

Expand Down
8 changes: 5 additions & 3 deletions docs/specs/layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ The content area is a tiling layout of panes, powered by dockview. Each pane occ
- `group.model.onWillDrop`: `event.position === 'center'` → intercepted and converted to a **swap**
- All other positions and kinds are allowed — these create splits

**Center drop = swap.** Dropping a pane onto the center of another swaps their session content (same as `Cmd+Arrow`). The overlay is allowed so the user sees a valid drop target, but `group.model.onWillDrop` intercepts it, calls `swapTerminals()` + swaps titles, then `preventDefault()` to block the merge.
**Center drop = swap.** Dropping a pane onto the center of another swaps their session content (same as `Cmd/Ctrl+Arrow`). The overlay is allowed so the user sees a valid drop target, but `group.model.onWillDrop` intercepts it, calls `swapTerminals()` + swaps titles, then `preventDefault()` to block the merge.

### Pane header

Expand Down Expand Up @@ -129,6 +129,8 @@ Extreme case: a single door with a very long title, with more doors on both side

## Modes

Wall starts in `command` mode by default. Embedders may pass `initialMode="passthrough"` when the first pane is an already-running interactive surface that should receive keyboard input immediately.

### Passthrough mode
- All keyboard input routes to the active session's xterm.js instance
- Only the mode-exit gesture (LCmd → RCmd) is intercepted
Expand Down Expand Up @@ -162,7 +164,7 @@ All handled in a single capture-phase `keydown` listener on `window`. Every hand
| `"` | Horizontal split — new pane to the right | — |
| `%` | Vertical split — new pane below | — |
| Arrow keys | Spatial navigation between panes | Left/Right between doors, Up to panes |
| `Cmd+Arrow` | Swap session content with neighbor | — |
| `Cmd/Ctrl+Arrow` | Swap session content with neighbor | — |
| `Enter` | Enter passthrough mode | Restore session + enter passthrough |
| `,` | Inline rename | — |
| `x` | Kill with confirmation | Restore session + kill confirmation |
Expand Down Expand Up @@ -210,7 +212,7 @@ A breadcrumb tracks the last navigation direction and origin pane. Pressing the

Down from the bottom-most pane navigates to the first door in the baseboard. Up from a door navigates to the last pane. Left/Right navigates between doors.

### Cmd+Arrow swap
### Cmd/Ctrl+Arrow swap

Swaps session **content** between two panes — the layout shape is unchanged. Uses `swapTerminals()` from terminal-registry which swaps registry entries and reattaches DOM elements to each other's containers. Also swaps dockview panel titles. Selection follows the moved session. Uses the same back-navigation breadcrumb as arrow keys.

Expand Down
Loading
Loading