mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-10-04 08:01:59 +00:00
* feat(panel): add Search and GitHub tabs to the right panel The right panel grows from three tabs to five. Five word labels do not fit the panel's 280px resting width, so the tab row now draws a glyph per tab and names it in a tooltip. Both new panes are placeholders here; the content search and the GitHub issues/PR browser land on top of this. * feat(panel): find in files in the right panel's Search tab The Search tab replaces its placeholder with a content search over the active tab's project -- the same roots the Files tab shows -- on the host that project lives on. Hits arrive as you type (debounced, with a generation counter so a stale answer never lands), grouped by file with a count, each line excerpted with its matches highlighted. Clicking a hit opens the built-in editor at that line and column; Enter searches again. Match-case, whole-word and regex toggles sit at the end of the field, and the tab focuses its field whenever it is brought forward. Host::search_content is new on the Host trait, implemented once in host::content_search (ignore walk + regex) and run by LocalHost directly and by tty7-server over a new SearchContent control request. The walk honours .gitignore with or without a repository, skips dot-entries, binary files and files over 1 MB, and reports a capped search as truncated. The request is gated on a new `content-search` hello feature, so a server that predates it is never sent it; the panel says the server needs updating instead of showing no results. Conformance cases cover local and the stdio server alike. * feat(panel): browse GitHub issues and pull requests in the right panel The GitHub tab follows the focused pane's repository: its root is resolved the way the Source Control tab does, its remotes are read through the Host (the tree may be on another machine), and the github.com remote is bound, upstream over origin in a fork, with a menu to pick another. The list switches between issues and pull requests, open and closed, 50 rows a page with Load more; rows carry a state glyph distinct by shape, labels (click one to filter by it) and relative times. A row opens the detail in place: title, state, author, labels, description and comments as Markdown, and for a pull request its branches, size and changed files. A file opens in the diff overlay through a new supplied-patch DiffSource, so GitHub's patch renders exactly like a local one without a git probe. Read-only, and sign-in reuses the GitHub CLI: GH_TOKEN, GITHUB_TOKEN, then `gh auth token`, found on PATH or at the Homebrew locations a Finder launch cannot see. Signed out, public repositories still work; 401, 403, 404 and rate limits are told apart and explained. Requests go out from this machine over the installer's ureq stack and proxy settings, on threads of their own, cached per repository with background revalidation. Remote images in issue text become links instead of loading, and non-web link targets are disarmed. The Info tab gains a GitHub row that opens the branch on the remote it tracks, or the repository for a branch never pushed. * docs: list ShowRightPanelGitHub with the other panel actions * feat(panel): one-line GitHub rows, a pill for the current tab - GitHub list rows are one line: state glyph, #number, title. Labels and the age of the last update appear on hover, from state rather than a group_hover display switch, which gpui cannot paint. - The current right panel tab sits on the sidebar's selected fill; ink alone could not tell five same-weight glyphs apart. - The GitHub glyph is a 1.8px outline like the other tab icons, not the filled mark. - The detail byline names both times (opened / updated) so it no longer reads as disagreeing with the list's update age. * feat(github): show screenshots pasted into issues Images GitHub hosts itself (github.com/user-attachments, a repo's /assets, *.githubusercontent.com) now render in issue and PR text, each in a paragraph of its own so the text view draws it at its size rather than at line height. Images from any other host stay links, so opening an issue still tells no third party that you read it. gpui held a null HTTP client, so no remote image could load; the app now installs the update check's reqwest client (same user agent and proxy) at launch. * fix(github): load private-repo screenshots, give inline code a neutral fill - Pasted attachments (github.com/user-attachments/assets/<uuid>) want a browser session on a private repository, which an API token is not. The detail and comment requests now ask for the full media type, and each attachment is swapped for the signed private-user-images URL the rendered body_html carries for the same uuid. - Inline code in rendered Markdown (the GitHub tab and the editor's preview) sits on a faint neutral fill instead of the theme accent, which is also the selection colour. Needs gpui-component 6af19d91 for TextViewStyle::inline_code_background. * style(panel): tidy the GitHub and Search tabs' top rows - GitHub drops its heading row on macOS. It existed only to hold the refresh tile, and no other tab has one; refresh now sits with the repository's other actions, in the repo row and a detail's header. - Search's Aa / ab / .* toggles are muted while off instead of body ink. - Search's idle note puts the folder on its own line, spelled ~/…, so the narrow column no longer breaks the path at a slash. * feat(panel): order the right panel's tabs Info, Files, Search, Changes, GitHub Info stays first as the default and the pane's overview; after it come two pairs, the project's files (Files, Search) and its version control from local to remote (Changes, GitHub), where Changes and GitHub were split by the file tabs before. The palette, the Keybindings list and the docs follow the same order. * style(panel): drop the change count from the Changes tab Beside one glyph of five, the number read as a badge on that tab alone, and the Changes tab already leads with the same count under its own heading. right_panel_tabs no longer needs the row's width, which it only measured to decide whether the count fit. * style(icons): fit the GitHub glyph to the other tab icons' size The Lucide mark filled its whole 24px box, edge to edge, where tty7's own icons keep about 3.5px clear, so at 15px it drew a size larger than the four tabs beside it. Scale it to 0.9 about the centre, and raise the stroke to 2.0 so it still renders at the others' 1.8. * style(icons): a simpler GitHub glyph Drop the Lucide mark's tail and redraw the head and legs on tty7's own grid: the same ~15px live area and 1.8 stroke as the other tab icons, no scale transform. The legs keep it reading as the Octocat; a head alone read as any cat. * test(github): find gh on PATH in the blank-variable token test The test placed gh only at /opt/homebrew/bin/gh, which gh_candidates never offers on Windows, so the Windows CI job panicked at unwrap. Put gh on a PATH directory spelled with the platform's exe name instead. * fix(github): close image and link bypasses in the issue Markdown sanitiser Checked against markdown-rs (the parser TextView uses), several inputs got past the line-based rewrite: - is_github_hosted cut the host only at `/`, so `https://evil.io?.githubusercontent.com/x.png` (and `#`, `\`, `/`) counted as GitHub-hosted and was fetched from evil.io. The host now ends at the first of `/?#\` and may hold only DNS characters. - `<img src>` values were written into `` unescaped, so a `)` in the value closed the image and opened a second one from any host. Written destinations are now percent-encoded. - `<image>` (which the HTML parser reads as `<img>`) passed as an ordinary tag and loaded its src. - A kept link target was copied without scanning; when the parser ended the link elsewhere (open title, unbalanced paren) a `` inside it came alive. Markup characters in it are now encoded. - `file:///...` and similar character references passed is_safe_target and decoded to a `file:` link. References are decoded before judging. The rewrite still cannot see every construct the way the parser does (code spans inside tag attributes, fences the parser rejects, multi-line link definitions), so the detail view now also checks the parsed tree: a block containing a non-GitHub image, an unsafe link or definition, or raw `<img>` is drawn as its plain source instead. * fix(github): hide gh's console, bound Retry-After, and reject URL authorities with ?#\ - run gh through proc::output_within with hide_console, so a Windows GUI launch does not flash a console window and stdout is drained while gh runs. - saturating_add a hostile Retry-After instead of overflowing i64. - parse_github_url no longer accepts `https://evil.io#@github.com/o/r`. * fix(search): no panic on an unbounded time budget, and read files through the size cap ContentLimits arrive off the wire on a server; Instant + u64::MAX ms panicked. A file that grew between the size check and the read was read whole; it is now read through a take() at the cap. * fix(panel): keep Load more on an empty filtered page, and drop another host's hits - /issues pages filtered to one kind can come back empty while later pages hold matches; the GitHub list said "No issues" and hid Load more. It now reads on through up to five such pages and keeps Load more offered. - While a new search runs, the previous hits stay on screen; if they came from another host, a click opened their path on the active host. They are now kept only when the host is the same.
103 lines
5.5 KiB
Plaintext
103 lines
5.5 KiB
Plaintext
---
|
|
title: "Search Everywhere"
|
|
description: "One key for every action, open tab, past agent session and host — each in a tab of its own."
|
|
---
|
|
|
|
<kbd>⌘ P</kbd> (<kbd>Ctrl ⇧ P</kbd> on Linux and Windows) opens Search
|
|
Everywhere. Type to filter, <kbd>↑</kbd> <kbd>↓</kbd> to move, <kbd>⏎</kbd> to
|
|
run, <kbd>⇥</kbd> / <kbd>⇧ ⇥</kbd> to move between its tabs. Press the key again
|
|
or <kbd>Esc</kbd> to close it.
|
|
|
|
## Tabs
|
|
|
|
| Tab | What it holds |
|
|
|---|---|
|
|
| **All** | The best few rows from each tab below, each under the tab's name. The tab holding the best match comes first, so <kbd>⏎</kbd> always runs the best answer anywhere. When a tab has more rows than fit, a *N more in …* row opens that tab with your query still typed. |
|
|
| **Actions** | Every action tty7 can perform, whether or not it has a keybinding — the fastest way to reach the ones that deliberately ship unbound, like pane resize and swap. |
|
|
| **Terminals** | Every open tab of every workspace, this window's first and most recently used first, then every way to open a new one: the shells this machine has (*Shell: zsh*) and the coding agents on your `PATH` (*Agent: Claude Code*). |
|
|
| **Sessions** | Past Claude Code and Codex sessions on this computer — the ones that ran in the focused tab's directory first, then the rest, newest first. <kbd>⏎</kbd> resumes one. |
|
|
| **Hosts** | Your saved SSH hosts, most used first — and whatever address you type. |
|
|
|
|
With nothing typed, **All** leads with this window's other tabs, most recent
|
|
first, so <kbd>⌘ P</kbd> <kbd>⏎</kbd> takes you back to the tab you were just
|
|
in. The actions you run most follow under *Actions*, and the last few agent
|
|
sessions that ran in this directory under *Sessions*.
|
|
|
|
## Actions
|
|
|
|
With nothing typed, the Actions tab lists what you use most under *Recent*,
|
|
then everything else in groups — the groups are the map of the app:
|
|
|
|
| Group | Examples |
|
|
|---|---|
|
|
| **Tabs & Panes** | New Tab · New Worktree Tab… · Split Right · Zoom Pane · Focus Pane Left · Resize Pane Up · Swap Pane Next · Reopen Closed Tab · Copy Working Directory · Fork Session |
|
|
| **Workspaces** | New Workspace… · Switch Workspace… · Rename Workspace… · Stop Workspace… · Delete Workspace… |
|
|
| **View** | Show/Hide Left Sidebar · Show/Hide Right Panel · Show Code Panel · Tab Bar: Move to Top · Right Panel: Info / Files / Search / Changes / GitHub · Change Theme… · Enter Full Screen · Toggle Unified / Side-by-Side Diff |
|
|
| **Git** | Commit · Stage All Changes · Unstage All · Discard All · Create Branch… · Sync · Push · Pull · Fetch |
|
|
| **Terminal** | Clear Scrollback · Find in Terminal… · Find Next / Previous · Copy · Cut · Paste · Select All |
|
|
| **SSH** | Add Connection… · Manage Profiles… · Reconnect · Remote Files · Port Forwarding |
|
|
| **Agents** | New Agent Tab · Send Selection · Send Git Diff for Review · Copy Session ID |
|
|
| **Application** | Settings… · Keyboard Shortcuts · Check for Updates… · Documentation · Join the Discord · Report an Issue… · Restart Server… |
|
|
|
|
Entries that do something destructive say so under the name — *Delete
|
|
Workspace…* is subtitled "ends its shells and forgets the layout", *Restart
|
|
Server…* is "ends every running shell; layout is kept".
|
|
|
|
Every action is found by its name in any language tty7 ships, so an English
|
|
query finds a Chinese or Japanese label.
|
|
|
|
**Change Theme…** opens the theme list in place: moving through it previews
|
|
each theme on the window, <kbd>⏎</kbd> keeps it, <kbd>Esc</kbd> puts the old one
|
|
back and returns to where you were.
|
|
|
|
## Resuming a past session
|
|
|
|
The **Sessions** tab lists the sessions Claude Code and Codex keep on this
|
|
computer (`~/.claude/projects`, and `~/.codex/sessions` or `$CODEX_HOME`), each
|
|
under the title the agent gave it — or the name you gave it with `/rename`, or
|
|
failing both what you first asked — with where it ran, its branch and when it
|
|
was last used. Search matches the title, the directory, the branch and the
|
|
session id.
|
|
|
|
<kbd>⏎</kbd> opens a new tab in the directory the session ran in and resumes it
|
|
there (`claude --resume <id>`, `codex resume <id>`), with the flags
|
|
`agent_launch` gives the agent. An agent only finds a session from the directory
|
|
it started in, so a session whose directory is gone is not resumed; tty7 says
|
|
so instead.
|
|
|
|
The list is read in the background when the search opens, so a session started
|
|
a moment ago may appear a beat after the rest. Windows on a remote workspace do
|
|
not list sessions: they are this computer's, and a new tab there opens on the
|
|
other machine.
|
|
|
|
## Connecting to a host
|
|
|
|
Type an SSH address — in the **Hosts** tab, or straight into **All** — and it
|
|
offers to connect to it, or to save it as a host:
|
|
|
|
```
|
|
me@devbox
|
|
me@devbox:2222
|
|
[::1]:22
|
|
```
|
|
|
|
A full command line works too — `ssh -p 2222 -J jump me@devbox` connects with
|
|
exactly those options, and `ssh devbox` resolves an alias from
|
|
`~/.ssh/config` the way `ssh` would. A bare word on its own is a search, not
|
|
an address.
|
|
|
|
Saved hosts are listed by name; <kbd>⌘ E</kbd> on one opens it for editing
|
|
instead of connecting. **SSH: Add Connection…** in the Actions tab takes you to
|
|
the Hosts tab. [SSH →](/remote/ssh)
|
|
|
|
## Sending context to an agent
|
|
|
|
Two actions hand what is in front of you to the coding agent running in the
|
|
pane, as a ready-made prompt:
|
|
|
|
- **Agent: Send Selection** — the current selection.
|
|
- **Agent: Send Git Diff for Review** — the repository's `git diff`.
|
|
|
|
If no agent is running, tty7 says so rather than typing into your shell.
|
|
[Agents →](/agents/overview)
|