Skip to content

Clickable links in the terminal, and the demo opens the review page - #51

Merged
Ermag merged 10 commits into
mainfrom
ux/links
Nov 7, 2026
Merged

Ermag merged 10 commits into
mainfrom
ux/links

Conversation

@Ermag

@Ermag Ermag commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Stacked on #49 (both touch the end of setup's and demo's output). Retarget to main once #49 merges.

Before: Links in rowbit setup output, and in the agent's reply after a write was held, weren't clickable in Philip's terminal (Ghostty). Rowbit printed plain URLs, so whether they were clickable depended on the terminal noticing them. Ghostty, for example, only opens a plain URL on ⌘-click.

After:

  • Terminal links: the review page address (from setup, demo and serve) and the scopes docs link are marked as links with OSC 8. This only happens in terminals known to show OSC 8 links: Ghostty, iTerm2, WezTerm, kitty, VS Code, Windows Terminal, Hyper, Rio, Warp and VTE-based terminals. The link text is the URL itself, so copying it still works. Output that isn't going to a terminal, Terminal.app, tmux and screen all get the plain URL. ROWBIT_HYPERLINKS=1 or 0 overrides the detection.
  • Demo: rowbit demo (and setup --sample) opens the review page in the browser once the page answers, and says so. --no-open turns this off. It only happens when the demo runs in a terminal, so CI is unaffected.
  • Agents: the MCP server instructions and the skill now ask the agent to give the review link as a Markdown link ([Review change 4](…)). Clients that render Markdown, Claude Code included, then show it as a clickable link.
  • Spec: a new "Links in the terminal" section in setup.md.

How:

  • Unit tests cover terminal detection (known terminals, tmux, the override) and the escape sequence.
  • The existing demo and setup tests still match the plain URLs, since their output isn't a terminal.

Review fixes (v0.2.3 review):

  • Visible link target: agents give the review link with the URL itself as the link text (<http://…/changes/4>), so people see where it goes. This changes the MCP instructions, the skill and the spec. (Point feedback to a GitHub discussion and refresh the README #3)

  • Opening the browser: rowbit demo opens it from a callback once its own server has bound the address, so it never opens another server left on that port. It doesn't open over SSH, or on Linux without a display. https:// public URLs work. (Apply approved changes by primary key, and undo them #10)

  • Nits: control characters are stripped from OSC 8 links, and new tests cover the browser checks.

  • Tests cover the new behaviour

  • docs/spec/ is updated if this changes the change lifecycle or rowbit.yml

Ermag added 2 commits November 7, 2026 15:47
Without --dir and with no Rowbit files in the current folder, commands
now look at every setup in ~/.rowbit and the demo (linked as
~/.rowbit/demo), use the only one and say which, list them when there
are several, and say to run rowbit setup when there are none. So
`cd my-app && rowbit connect claude-code` works.

Each client entry gets a token of its own, labelled with the client and
project, so connecting a second project no longer signs out the first;
rowbit agents lists them.

Signed-off-by: Ermag <ermag.bg@gmail.com>
Review page addresses and docs links are OSC 8 links in terminals known
to show them (Ghostty, iTerm2, WezTerm, kitty, VS Code, ...), plain
elsewhere; ROWBIT_HYPERLINKS overrides. rowbit demo opens the review
page in the browser once it answers (--no-open skips). The MCP
instructions and the skill ask agents to give the review link as a
Markdown link.

Signed-off-by: Ermag <ermag.bg@gmail.com>
@Ermag Ermag added the feature New behaviour; release notes: New label Nov 7, 2026
@Ermag Ermag mentioned this pull request Nov 7, 2026
2 tasks done
Ermag added 7 commits November 7, 2026 15:59
…ew is written

- rowbit agents lists each token with an id; rowbit agents revoke
  <agent> --connection <id> signs out one, --single only the token from
  before 0.2.3.
- A reconnect's old token is revoked only once the client entry holding
  the new one is written, so a failed connect leaves the old entry working.
- Printed tokens are labelled with their time, so they don't replace
  one another.
- --new-token revokes the single token from before 0.2.3; without it,
  connect says the agent still has one.
- Marking a token used can't bring back a revoked connection's row.
- needs_files finds connect's arguments wherever it sits; "here"
  compares canonical paths; a setup named demo isn't called the demo.

Signed-off-by: Ermag <ermag.bg@gmail.com>
- Agents give the review link with the URL as its text, so people see
  where it goes.
- rowbit demo opens the browser once its own server has bound, never
  another left on the port; not over SSH or on Linux without a display.
- Control characters are removed from OSC 8 links.

Signed-off-by: Ermag <ermag.bg@gmail.com>
Signed-off-by: Ermag <ermag.bg@gmail.com>
@Ermag
Ermag changed the base branch from ux/connect-anywhere to main November 7, 2026 21:25
@Ermag
Ermag merged commit 803724a into main Nov 7, 2026
14 checks passed
@Ermag
Ermag deleted the ux/links branch November 7, 2026 21:31
Ermag added a commit that referenced this pull request Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New behaviour; release notes: New

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant