diff --git a/README.md b/README.md index 11ddb1e4..97a32492 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Type `quil` after a reboot — every tab, pane, working directory, layout split, | Focus mode + a dozen project tabs. | Per-type setup: dir browser, resume strategy, permission toggles. | | **Resize with the mouse** | **Right-click pane menu** | | Dragging a split border with the mouse to resize neighboring panes | Right-click context menu with per-pane actions and the target pane highlighted | -| Drag any split border — nested panes clamp to minimums, PTYs see one resize on release. | Per-pane actions under the cursor: history, notes, lazygit, attention pin, restart, close. | +| Drag any split border — nested panes clamp to minimums, PTYs see one resize on release. | Per-pane actions under the cursor: history, notes, lazygit, attention pin, move to another tab, restart, close. | | **Command palette: jump anywhere** | **…and run anything** | | Command palette showing Go to pane and Tabs sections for cross-workspace navigation | Command palette Pane section listing actions with their keybindings | | `Alt+Shift+P` fuzzy-finds every pane and tab — navigation grouped at the top. | Every action grouped below, each showing its keybinding; type to filter instantly. | @@ -101,6 +101,11 @@ Under the active project each pane also shows the checkout it sits in — branch ten panes in one repository cost one `git` invocation, and a probe that does not answer keeps its last value marked stale rather than guessing. +Too many projects? Right-click one → **Move to group…** and collapse the groups +you are not using; a collapsed group still shows its agents' badges. Right-click +a tab to rename it, recolour it, re-lay-out its panes or move it to another +project, and hold `Alt` to drag a pane beside another, swap them, or onto another tab. + | Key | Action | |---|---| | `Alt+Shift+S` | Toggle the sidebar | diff --git a/docs/competitive-analysis.md b/docs/competitive-analysis.md index 72042e75..817120f6 100644 --- a/docs/competitive-analysis.md +++ b/docs/competitive-analysis.md @@ -177,7 +177,7 @@ Legend: ✅ full · 🟡 partial/different · ❌ absent · ❓ not re-verified | Repo config + lifecycle hooks | 🟡 | ✅ | ❌ | | Profiles (per-project workspaces) | 🟡 | ✅ | 🟡 (projects, v1.47 — a project scopes tabs and a root directory, not a saved profile) | | Auto-stop idle sessions | 🟡 | ✅ | ❌ | -| Groups / favorites / snooze / archive / trash | 🟡 | ✅ | ❌ | +| Groups / favorites / snooze / archive / trash | 🟡 | ✅ | 🟡 (project groups in the sidebar, v1.79 — named, collapsible, reorderable; no favorites, snooze, archive or trash) | | Self-update (in-app) | ✅ | ✅ | ✅ (check + stage in the background, prompt in the TUI, rename-aside swap with rollback applied at next launch) | | Self-update as a *CLI subcommand* | ✅ | ✅ | ❌ (there is no `quil update`; the CLI switch is daemon/mcp/notify/sandbox/version/remote/restart/status) | | Pane notes (per-pane editor) | ❌ | ❌ | ✅ | @@ -220,7 +220,7 @@ current to-do list. | 17 | Themes + light/dark auto-switch | herdr, aoe | 8–18 presets, follows host OSC 10/11. Quil's theming is minimal. | S–M | ★★ | new | | 18 | Session fork | aoe | Branch a conversation into a new independent session, parent untouched. | M | ★★ | new | | 19 | Repo config + lifecycle hooks (`on_create`/`on_launch`/`on_destroy`) | aoe | Per-project `.quil.toml` hooks. Natural extension of workspace files. | M | ★★ | workspace-files | -| 20 | Session lifecycle management (auto-stop idle, groups/favorites/snooze/archive) | aoe | Keep a large fleet tidy: reap idle sessions, organize + archive them. | M | ★★ | new | +| 20 | Session lifecycle management (auto-stop idle, groups/favorites/snooze/archive) | aoe | Keep a large fleet tidy: reap idle sessions, organize + archive them. The grouping half is partly covered since v1.79: projects (not single sessions) go into named, collapsible sidebar groups. Auto-stop, favorites, snooze and archive are still open. | M | ★★ | new | Runners-up considered but cut from the top 20: named sessions, live server handoff, ACP structured view (novel but very large), `agent explain` detection diff --git a/docs/configuration.md b/docs/configuration.md index 913f03fe..81a52ed3 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -438,6 +438,10 @@ When a pane plugin asks for a working directory (`prompts_cwd`, e.g. Claude Code Quil records the last project list seen on each remote destination in `~/.quil/remote-projects-.json` (plus a bare `remote-projects.json` for the local daemon), so a host that is unreachable at launch can still be shown by name in the sidebar instead of vanishing. This file is managed by Quil — no hand-editing. A stale copy is harmless: it self-heals on the next successful broadcast from that host, and is removed automatically when the host is disconnected. +## Project groups + +The sidebar's project groups (see [Features → Project groups](features.md#project-groups)) are stored in `~/.quil/project-groups.json`: each group's name, whether it is collapsed, and its projects. The file belongs to this machine, not to a daemon — no daemon reads it, which is what lets one group hold local and remote projects. It is managed by Quil — no hand-editing. Two Quil windows on one machine share it and the last change wins. A file Quil cannot read or parse is moved aside to `project-groups.json.bak` (or the next free `.bak.N`) and the sidebar starts with no groups, so nothing overwrites it. + ## How edits get persisted - **Edits via the F1 → Settings dialog** auto-save on TUI exit. The setter for each row flips `m.configChanged = true`; `main.go` writes the file atomically via temp + rename. diff --git a/docs/features.md b/docs/features.md index 6c33d07d..70f4f88d 100644 --- a/docs/features.md +++ b/docs/features.md @@ -188,6 +188,9 @@ The same six are in the command palette (acting on the active tab) and can be bo | Close tab | `Alt+W` | | Cycle tab color | `Alt+C` (8 colours) | | Switch to tab N | `Alt+1` .. `Alt+9` | +| Rename, pick a colour, tidy the layout, move to another project | Right-click the tab — see [Mouse: tab context menu](keybindings.md#mouse-tab-context-menu) | + +A rename or colour change is saved at once, so a daemon stopped straight after it comes back with the new name. ### New tab, with the pane you actually want @@ -212,7 +215,7 @@ checkout. ### Mouse & keyboard -Full mouse support — click tabs to switch, click panes to focus, scroll wheel for terminal history. Drag panes to select text. Drag a tab (in the tab bar or by its name in the project sidebar) or a project row to reorder it; the item moves once the pointer passes the middle of its neighbour, so the drag never flips back and forth. `Alt+Shift+PgUp`/`PgDn` and `Alt+Shift+Up`/`Down` do the same from the keyboard for tabs and projects. Right-click a tab (in the bar or the sidebar) for a context menu to rename it, pick its color, tidy its layout, or move it to another project on the same machine — see [Mouse: tab context menu](keybindings.md#mouse-tab-context-menu). Hold `Alt` and drag a pane to move it beside another pane, swap the two, or drop it on a tab — see [Rearranging a tab's panes](#rearranging-a-tabs-panes). All keybindings are configurable via `config.toml`. +Full mouse support — click tabs to switch, click panes to focus, scroll wheel for terminal history (over vim, lazygit, Claude Code or another app that takes the mouse, the wheel scrolls the app instead, and a sideways wheel or trackpad swipe does nothing). Drag panes to select text. Drag a tab (in the tab bar or by its name in the project sidebar) or a project row to reorder it; the item moves once the pointer passes the middle of its neighbour, so the drag never flips back and forth. `Alt+Shift+PgUp`/`PgDn` and `Alt+Shift+Up`/`Down` do the same from the keyboard for tabs and projects. Right-click a tab (in the bar or the sidebar) for a context menu to rename it, pick its color, tidy its layout, or move it to another project on the same machine — see [Mouse: tab context menu](keybindings.md#mouse-tab-context-menu). Hold `Alt` and drag a pane to move it beside another pane, swap the two, or drop it on a tab — see [Rearranging a tab's panes](#rearranging-a-tabs-panes). All keybindings are configurable in `bindings.toml`. When there are more tabs than fit, the mouse wheel over the tab bar scrolls the strip left/right instead of switching tabs or reaching the pane beneath it; markers (`«N` / `N»`) show how many tabs are hidden on each side. Clicking a tab keeps the current scroll position; switching some other way (keyboard, the palette, an MCP tool) snaps the bar back to centering on whichever tab is now active. diff --git a/docs/keybindings.md b/docs/keybindings.md index 0388a0c1..dc047621 100644 --- a/docs/keybindings.md +++ b/docs/keybindings.md @@ -111,6 +111,8 @@ actions, command palette). | Mouse click on tab | Switch to that tab | | Mouse drag a tab | Reorder — the tab moves once the pointer passes the middle of a neighbour, so a narrow tab dragged over a wide one never flips back and forth; intermediate tabs slide one slot at a time | | Mouse click / drag a tab name in the project sidebar | Switch to that tab / reorder it — drag the name up or down past the middle of another tab's group of rows | +| Right-click a tab (tab bar or sidebar) | Rename tab, Set color…, Layout…, Move to project… — see [Mouse: tab context menu](#mouse-tab-context-menu) | +| Mouse wheel over the tab bar | Scroll the tab strip when tabs overflow, without switching tabs; `«N` / `N»` count the tabs hidden on each side | The active tab is prefixed with `* ` in the tab bar so it's visible even when [tab colors](configuration.md#keybindings) override the bold weight. @@ -131,6 +133,7 @@ The active tab is prefixed with `* ` in the tab bar so it's visible even when [t | `Alt+Shift+L` | Force a full screen redraw — clears rendering artifacts (scrambled/misplaced characters) without restarting. Mnemonic: `Ctrl+L` redraws a shell. | | `Alt+Shift+I` | Open the active pane's input history — one row per prompt you submitted, newest first. `↑/↓` navigate, `PgUp/PgDn/Home/End` jump, `Enter` opens the full text in a soft-wrapped read-only viewer (drag or `Ctrl+A` to select, right-click or `Enter` to copy), `Esc` closes. Only AI panes whose plugin sets `record_history` (Claude Code) capture history; other pane types show an empty state. | | `Alt+A` | Open the pane context menu for the active pane (`quick_actions`). Same menu as right-click — see [Mouse: pane context menu](#mouse-pane-context-menu) below. | +| Right-click a pane → Move to tab… | Send the pane, still running, to another tab on the same machine | ### Mouse: pane context menu diff --git a/docs/roadmap.md b/docs/roadmap.md index 4c4e1ef4..0a1bcf4d 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -543,6 +543,16 @@ default-deny firewall needs `NET_ADMIN`, which Quil does not grant); bind-mount IO on Docker Desktop is ~20× slower and inotify does not cross it on Windows, so file watchers need polling; repositories with submodules are unsupported. +### v1.76.0–v1.79.0: Reorganise Tabs, Panes and Projects +> Move work where it belongs without restarting it. + +- **Tab bar wheel scroll (v1.76.0)** — the wheel over the tab bar scrolls the strip instead of the pane under it, without switching tabs; `«N` / `N»` count the tabs hidden on each side. A sideways wheel notch over vim, lazygit or Claude Code no longer scrolls it down +- **Tab context menu (v1.77.0)** — right-click a tab in the tab bar or the sidebar: Rename tab, Set color…, Move to project… (another project on the same machine, panes still running). A rename or recolour is now saved at once instead of at the next 30 s snapshot +- **Move a pane to another tab, and tidy a tab's layout (v1.78.0)** — *Move to tab…* on the pane menu; the pane keeps running and spirals into the target's last pane, and a tab left empty closes. The tab menu's *Layout…* offers Even out, Columns, Rows, Grid, Main + stack and Spiral, also in the palette and as unbound `tab.layout_*` actions. `Alt`+drag a pane to place it beside another, swap the two, or drop it on a tab +- **Project groups (v1.79.0)** — named, collapsible groups in the sidebar with rolled-up badges; drag headers to reorder, drag projects in and out, *Move to group…* on the project menu. Kept on this machine in `project-groups.json`, so one group can mix local and remote projects. Rows under the pointer and rows being dragged are highlighted + +**Known limit:** another Quil window attached to the same daemon keeps its own arrangement of a tab and can overwrite a new layout with it — multi-client layout sync is a separate item. + --- @@ -832,6 +842,8 @@ review the diff. OSC 10/11 colors (herdr ships 18, AoE 8). Quil's theming is minimal today. 16. **Session lifecycle management** — auto-stop idle sessions plus groups / favorites / snooze / archive to keep a large fleet tidy (AoE). + **Groups partly shipped (v1.79.0):** projects, not single sessions, go into + collapsible sidebar groups. Auto-stop, favorites, snooze and archive are open. ### M18: Remote & Web *(largest builds; deliberate "later")* diff --git a/docs/tmux-comparison.md b/docs/tmux-comparison.md index b2557395..9399ba9c 100644 --- a/docs/tmux-comparison.md +++ b/docs/tmux-comparison.md @@ -54,11 +54,15 @@ prefix = "ctrl+a" ## Coverage at a glance -| | Count | -|---|---| -| Same key, same meaning | 27 | -| Close analogue on a different key | 12 | -| No Quil equivalent | 23 | +Counted per table row below, so a row such as `1`–`9` counts once. + +| | Status | Rows | +|---|---|---| +| Same key, same meaning | `exact` | 15 | +| Close analogue | `analogue`, `approximate` | 11 | +| Reachable, no default key | `mouse only`, `no key` | 6 | +| Deliberately unbound | `by design` | 1 | +| No Quil equivalent | `absent` | 15 | The tmux column throughout is the default prefix table for **tmux 3.x as shipped**. If you have a `.tmux.conf`, your bindings differ and this document says nothing about them. @@ -96,15 +100,15 @@ The tmux column throughout is the default prefix table for **tmux 3.x as shipped | `;` | last-pane | Pane history back (`Alt+Backspace`) | analogue | | `C-←` / `M-←` | resize-pane by 1 / 5 cells | Drag the split border | mouse only | | `q` | display-panes | — | absent | -| `{` / `}` | swap-pane -U / -D | — | absent | +| `{` / `}` | swap-pane -U / -D | `Alt`+drag a pane onto the middle of another | mouse only | | `!` | break-pane | — | absent | | `Space` | next-layout | — | absent | -| `M-1`–`M-5` | select-layout (preset layouts) | — | absent | -| `E` | select-layout -E (spread) | — | absent | +| `M-1`–`M-5` | select-layout (preset layouts) | Tab menu → Layout…, or `tab.layout_*` | no key | +| `E` | select-layout -E (spread) | Tab menu → Layout… → Even out, or `tab.layout_even` | no key | | `C-o` / `M-o` | rotate-window | — | absent | | `m` / `M` | mark / unmark pane | — | absent | -**The layout cluster is a concept gap, not a to-do.** tmux treats a window's panes as an arrangeable set with named layouts you cycle through. Quil uses a binary split tree that you shape directly, so there is nothing to cycle *to* — `Space`, `M-1`–`M-5`, `E`, `{`/`}` and the rotate keys have no meaning in that model. +**Layouts are applied, not cycled.** tmux treats a window's panes as an arrangeable set with named layouts you cycle through. Quil keeps a binary split tree that you shape directly, and the tab menu's *Layout…* rebuilds that tree in one of six shapes — Even out, Columns, Rows, Grid, Main + stack, Spiral. The six are keymap actions (`tab.layout_even` … `tab.layout_spiral`) that ship unbound and that the `tmux` preset does not bind, so `M-1`–`M-5` and `E` have an equivalent but no key until you give them one. There is still no layout to cycle *to* (`Space`) and no rotate. Swapping two panes is a mouse gesture: hold `Alt` and drag one onto the middle of the other. `break-pane` has no equivalent — *Move to tab…* on the pane menu moves a pane into an existing tab, not a new one. ## Copy mode and buffers diff --git a/site/src/data/competitors.ts b/site/src/data/competitors.ts index 2f7817db..3a222346 100644 --- a/site/src/data/competitors.ts +++ b/site/src/data/competitors.ts @@ -304,7 +304,7 @@ export const competitors: Record = { keyGap: "Zero persistence across host reboots. You can bolt on tmux-resurrect or tmux-continuum, but even those only restore layout and working directories — not AI session state, not running processes, not scrollback.", migrationNote: - "Coming from tmux? Quil uses familiar keybindings (Ctrl+T new tab, Alt+H / Alt+V to split). Everything's remappable in ~/.quil/config.toml so you can reuse your tmux muscle memory verbatim.", + "Coming from tmux? Put `preset = \"tmux\"` in ~/.quil/bindings.toml for a Ctrl+B prefix keymap (Ctrl+B c for a new tab, Ctrl+B % to split). Any action can be rebound there too, including the six tab layouts that ship unbound.", faq: [ { question: "Can I run Quil and tmux side by side?", @@ -531,7 +531,7 @@ export const competitors: Record = { { feature: "Breadth of agents supported", quil: "partial", them: "yes", note: "Quil: 3 deep (Claude Code, OpenCode, Codex) + tools. AoE: ~13 terminal + 7 ACP." }, { feature: "Session fork / import from disk", quil: "no", them: "yes" }, { feature: "Sound + push notifications", quil: "partial", them: "yes", note: "Quil raises real Windows toasts when an agent parks on a prompt or finishes a turn, and clicking one routes you to the pane that sent it. Still missing: sound, macOS/Linux, and anything that reaches a phone — AoE's Web Push does, which is the point of its browser surface." }, - { feature: "Session lifecycle mgmt (auto-stop idle, groups, archive)", quil: "no", them: "yes" }, + { feature: "Session lifecycle mgmt (auto-stop idle, groups, archive)", quil: "partial", them: "yes", note: "Quil groups projects, not single sessions: named sidebar groups that collapse to one row and still show their agents' state. It has no auto-stop for idle sessions and no archive." }, ], faq: [ { diff --git a/site/src/data/features.ts b/site/src/data/features.ts index eab66406..abfb794f 100644 --- a/site/src/data/features.ts +++ b/site/src/data/features.ts @@ -232,6 +232,8 @@ export const features: Feature[] = [ "Blocked is a separate state from finished. The agents' hook events always carried the distinction — Notification, PermissionRequest, permission.ask — but the old UI only needed \"mark unseen\", so they were collapsed into one. A permission prompt and a completed turn now look different, because they need different things from you.", "Alt+Shift+A jumps to whichever agent has been blocked longest, anywhere in the workspace, and cycles on repeated presses. Oldest-first rather than sidebar order: with several agents running, the one waiting longest is the one costing you time.", "Each pane row also shows the checkout it sits in — branch, `wt` for a linked worktree, `↑N`/`↓N` against upstream. Refreshed on a background ticker and cached per checkout, so ten panes in one repository cost one git invocation. `git status --porcelain` is deliberately not among them: it's the one call that can take seconds on a large repo without fsmonitor. A probe that doesn't answer keeps its last value and marks it stale rather than guessing.", + "Too many projects for one column? Put them in named groups — right-click a project → Move to group… A group can mix local and remote projects. Click its header to collapse it to one row that still carries its projects' badges (and the project you are in); drag headers to reorder groups, and drag a project onto a header or back onto PROJECTS to move it in or out. Groups are kept on this machine, in project-groups.json.", + "The row under the pointer is shaded, the one you are dragging stands out, and while a project is dragged the group it would land in turns green — in the PANES section too, where pointing at a tab shades its whole block.", "Existing workspaces migrate on first load into a single project named Default, tab order preserved. No prompt, no data loss, nothing to opt into.", ], }, @@ -263,10 +265,11 @@ export const features: Feature[] = [ detail: [ "Binary split tree, each split with its own direction and ratio.", "Click any pane to focus it; the scroll wheel traverses terminal history.", - "Over a pane running something that handles its own mouse input — claude-code, opencode, codex, vim, htop, lazygit — the wheel scrolls that program's viewport instead. Those apps run on the alternate screen and never fill Quil's scrollback, so the wheel is forwarded to them as the mouse sequence they expect. The daemon is what detects this, so it stays correct even when you reattach to a session that was already running.", + "Over a pane running something that handles its own mouse input — claude-code, opencode, codex, vim, htop, lazygit — the wheel scrolls that program's viewport instead. Those apps run on the alternate screen and never fill Quil's scrollback, so the wheel is forwarded to them as the mouse sequence they expect. The daemon is what detects this, so it stays correct even when you reattach to a session that was already running. A sideways wheel or trackpad swipe is ignored there rather than read as a scroll down.", "Click the scrollbar to jump the thumb; click-and-drag scrolls continuously. The hit zone is three cells wide so off-by-one clicks register as scroll instead of text selection.", "Spatial pane navigation: Alt+Left/Right/Up/Down focuses the closest neighbour in that direction. Three tie-breakers (gap, perpendicular overlap, perpendicular center distance) match tmux/vim/iTerm muscle memory.", "Drag any tab in the tab bar to reorder it — intermediate tabs slide one slot at a time. A click without motion still switches tabs. The active tab is prefixed with `* ` so it's visible at a glance even when colored.", + "More tabs than fit? The mouse wheel over the tab bar scrolls the strip without switching tabs, and `«N` / `N»` say how many tabs are hidden on each side.", "Tab and Shift+Tab are deliberately NOT bound globally — they fall through to the PTY so shell completion and Claude Code's mode-cycling work naturally. Splits live on Alt+Shift+H / Alt+Shift+V to keep Alt+V free for Claude Code's image paste.", "Focus mode (Ctrl+E) expands the active pane full-screen while others keep running in the background.", ], @@ -279,12 +282,13 @@ export const features: Feature[] = [ "Every key resolves to a named action, and anything Quil can't honour — a duplicate, a collision with a built-in, an unparseable spec — shows up as a warning in the shortcuts dialog instead of failing silently.", category: "interaction", detail: [ - "Rebind any of 41 actions in `~/.quil/config.toml`. Comma-separate alternatives in one field (`rename_pane = \"alt+f2,alt+shift+r\"`) when a key is unreliable on one platform — macOS eats most F-keys unless you enable standard function keys.", + "Rebind any of 66 actions in `~/.quil/bindings.toml`. Comma-separate alternatives in one field (`\"pane.rename\" = \"alt+f2,alt+shift+r\"`) when a key is unreliable on one platform — macOS eats most F-keys unless you enable standard function keys.", "A binding that can't fire now says so. F1 → Shortcuts puts a warning row at the top naming the key, which action won, and what will never run: duplicates, a key another action resolves first, collisions with built-ins (F1, Ctrl+N, Alt+1-9, the paste aliases, the text-selection chords), unparseable specs, and unknown action names.", - "One bad line costs you one binding, not your keymap — a spec that fails to parse falls back to that action's default and leaves the other 40 alone.", + "One bad line costs you one binding, not your keymap — a spec that fails to parse falls back to that action's default and leaves the other 65 alone.", "Spelling is normalized: modifier names fold and reorder (`Ctrl+Shift+A` = `shift+ctrl+a`), named keys alias (`escape`/`esc`, `pgdn`/`pagedown`, `meta`/`super`). Single-character keys keep their case, because on macOS with Option-as-Meta `alt+m` and `alt+M` are genuinely different presses.", "The shortcuts dialog is generated from the action table rather than hand-written, so it can't drift from what the keys actually do — the hand-maintained version had quietly lost seven of eight project bindings.", - "Groundwork for a tmux-style prefix keymap: the parser already reads `\"ctrl+b c\"` sequences and reports them as not-yet-dispatched. The prefix engine and named presets (`default`, `tmux`) are the next two stages.", + "Multi-key sequences (`\"ctrl+b c\"`) and two presets: `preset = \"tmux\"` in bindings.toml switches to a tmux-style prefix keymap, and `preset = \"default\"` switches back.", + "Some actions ship unbound, for you to give a key: the six tab layouts (`tab.layout_even`, `tab.layout_columns`, `tab.layout_rows`, `tab.layout_grid`, `tab.layout_main`, `tab.layout_spiral`) and the two project-group actions (`project.group_toggle`, `project.groups_collapse_all`).", ], }, { @@ -326,16 +330,32 @@ export const features: Feature[] = [ icon: "layout-panel-left", title: "Right-click pane menu", blurb: - "Right-click any pane for a per-pane action menu — history, focus, notes, lazygit, rename, mute, attention pin, restart, close — no keybinding memorization required.", + "Right-click any pane for a per-pane action menu — history, focus, notes, lazygit, rename, move to another tab, mute, attention pin, restart, close — no keybinding memorization required.", category: "interaction", detail: [ "Right-click a pane (or press Alt+A for the active pane) to open a popup targeting the pane under the cursor — its border lights up so there's never doubt which pane the actions will hit, and the menu header shows the pane's name.", - "Nine actions in three groups: view (input history, enter/exit focus mode, notes, lazygit), pane settings (rename, mute notifications, mark attention), and destructive (restart, close — both keep their confirmation dialogs).", - "Hover highlights the row under the mouse; arrow keys / j / k navigate; unavailable actions grey out (input history without an AI pane, lazygit without the binary installed).", - "Mark attention pins a green border that survives focusing the pane — a manual \"don't let me forget this one\" flag, cleared only by unmarking.", + "Thirteen actions in three groups: view (input history, enter/exit focus mode, notes, lazygit, hunk), pane settings (rename, move to tab, mute notifications, mark for deletion, mark attention, clear attention), and destructive (restart, close — both keep their confirmation dialogs).", + "Hover highlights the row under the mouse; arrow keys / j / k navigate; unavailable actions grey out (input history without an AI pane, lazygit or hunk without the binary installed, move to tab with nowhere to move to).", + "Mark attention pins a purple border and ◆ that survive focusing the pane — a manual \"don't let me forget this one\" flag, cleared only by unmarking.", "Right-click with a text selection active still copies it — the menu only opens on a plain right-click.", ], }, + { + slug: "rearrange-tabs-and-panes", + icon: "layout-panel-left", + title: "Rearrange tabs and panes, still running", + blurb: + "Move a pane to another tab, a tab to another project, or re-lay-out a whole tab in one click. Nothing restarts — every process, its history and its directory stay as they were.", + category: "interaction", + detail: [ + "Right-click a tab — in the tab bar or in the sidebar — for Rename tab, Set color… (a list of the colours, each painted in its own colour), Layout… and Move to project…. Right-clicking does not switch to the tab.", + "Move to project… sends the tab, panes and all, to another project on the same machine. You stay in the project you were in.", + "Move to tab… on the pane menu sends one pane to another tab on the same machine. It splits the last pane there, alternating direction, so moved panes spiral in instead of forming thin columns; a tab left with no panes closes.", + "Layout… rebuilds the tab as Even out, Columns, Rows, Grid, Main + stack or Spiral. The same six are in the command palette and can be bound to keys. A layout that would make a pane too small is refused.", + "Hold Alt and drag a pane: drop it on the edge of another pane to place it on that side, on the middle to swap the two, or on a tab in the tab bar to move it there. Esc cancels.", + "A tab's new name or colour is saved at once, so it survives a daemon stopped straight afterwards.", + ], + }, { slug: "pane-notes", image: "https://cdn.stukans.com/quil/screenshots/focus-with-notes-800.webp",