* feat(worktree): setup script, .worktreeinclude, fresh base, recoverable removal
- Start new worktrees from the remote default branch, fetched first, with
--no-track; fall back to the current branch without a remote.
- Carry gitignored files listed in .worktreeinclude over from the main
checkout, copy-on-write (clonefile on macOS, copy_file_range elsewhere);
remote hosts copy through the Host trait under a size budget.
- Run .tty7/setup in the first pane before the agent, with TTY7_ROOT_PATH,
TTY7_WORKTREE_PATH, TTY7_WORKTREE_NAME and a per-worktree TTY7_PORT block.
The script only runs once its exact content is approved for the repo.
- The New Worktree dialog picks what the first pane starts (Shell or a
recent agent) and takes a task for agents that open on a first message.
- Removal snapshots the checkout, uncommitted work included, under
refs/tty7/trash/<name> first; the ref also retires the name. A branch
git refuses to delete is reported instead of silently kept.
- Hide .tty7/worktrees via info/exclude rather than a catch-all
.tty7/.gitignore, so .tty7/setup can be committed.
* feat(cli): tty7 worktree new/ls/rm
- worktree new: the GUI dialog's worktree from the command line — create,
carry .worktreeinclude, open a tab named after the branch, and type
.tty7/setup && <agent> [task] into it. Prints the path first.
- worktree ls: every checkout of the repo, tty7's marked, with the live
panes working in each.
- worktree rm: refuses while panes are inside unless --close-panes, and a
dirty checkout unless --force; reports the snapshot ref and a kept branch.
- Move shell_quote and the first-line builders into tty7-core so the GUI
and the CLI type the same line.
- Docs: CLI reference and the Worktrees page cover .worktreeinclude,
.tty7/setup, TTY7_PORT and recoverable removal.
* fix(worktree): run setup and the agent inside the worktree; Start is a dropdown
- The first line now opens with cd into the worktree: a shell's startup
files can move the pane, and setup then ran in (and wrote into) the main
checkout.
- The Start choice is a dropdown listing Shell and every agent this machine
offers, instead of a segmented switch capped at three.
* feat(search): replace the command palette with tabbed Search Everywhere
The palette was one flat list that every new kind of row had to be squeezed
into: tabs and SSH hosts rode along as "Switch to Tab: …" and "SSH: …"
commands, and the only way to narrow to one kind was a magic seed word.
Search Everywhere splits it into sources behind one trait — All, Actions,
Terminals, Hosts — each with its own empty-query layout and ranking. The All
tab shows each source's top rows, ordered by best match, with a row that
opens the full tab. Tab / Shift-Tab walk the tabs and keep the query.
- Terminals lists every open tab of every workspace (reusing the switcher's
tab rows) and jumps to it wherever it lives, plus the shells and agents.
- Hosts replaces the separate "Add Connection" input: a typed address or
full `ssh …` line offers to connect.
- Fixes Return doing nothing after a search that found nothing, or when the
search opens pre-filtered: gpui-component re-picks the row from a stale
frame; the delegate now re-arms the first row.
- Fixes `ssh -p 2222 me@box` being offered as a quick-connect address with
user `ssh -p 2222 me`.
The keymap action stays `TogglePalette` so custom bindings keep working.
* feat(search): a Sessions tab to resume past agent sessions
Search Everywhere gains a Sessions tab listing the Claude Code and Codex
sessions on this computer, read from ~/.claude/projects and
~/.codex/sessions ($CODEX_HOME). Sessions that ran in the focused tab's
directory lead; the All tab offers the last three of them before anything
is typed. Return opens a new tab in the session's directory and runs the
agent's resume command with its configured launch flags.
- Only each transcript's head and tail are read, off the window thread,
and cached by path, size and mtime: ~170ms cold for 50 sessions,
under 1ms warm. The search opens on the cached list and fills in.
- Titles: /rename name, then the agent's own title (ai-title, Codex's
session_index.jsonl), then the first thing typed, skipping harness
injections. Codex rollouts it ran for itself (subagent/internal) and
sessions never asked anything are left out.
- A session whose directory is gone is refused with a notice rather than
resumed where the agent cannot find it.
Every placeholder frame in docs/ now shows a real capture of the current
build: 20 screenshots plus two short looping clips (prompt editor, pane
drag). The README and the docs home page link a one-minute tour covering
agent status across repos, one agent driving another through the CLI,
the prompt editor, diffs, pane dragging, and sessions surviving a quit.
38 pages under docs/, written against the source rather than the README:
config keys and their clamps from core::config, default keybindings from
ui::keymap, every CLI verb and flag from tty7-cli, agent aliases and
hook/fork/resume support from core::cli_agent, and Settings paths taken
from the actual en-US strings.
docs/features.md and its zh-CN translation are retired — everything in
them now lives in a page of its own, plus the two things they carried
that nothing else did (IME input, the performance notes). README and
README.zh-CN point at docs/ instead.
Screenshots and videos are placeholders for now: docs/images/placeholder.svg
with a caption naming what each shot should be.
Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>