Skip to content

feat: land the stacked release features on main - #133

Merged
jlrickert merged 8 commits into
mainfrom
release/to-main
Oct 13, 2026
Merged

jlrickert merged 8 commits into
mainfrom
release/to-main

Conversation

@jlrickert

Copy link
Copy Markdown
Owner

Summary

Lands the stacked features on main. PRs #125–#132 were reviewed and merged, but each merged into the branch below it in the stack, so only #124 reached main. This is those eight commits rebased onto main, unchanged:

  1. Tool categories and the explore_* public directory (feat(mcp): sort tools into categories and explore the public directory #125)
  2. Covers follow note links, cover role none, settings aliases (feat(flight): follow note links in covers and block KEGs with none #126)
  3. Personal namespace in tap auth status (feat(auth): show the personal namespace the hub reports #127)
  4. node_edit unified diff patches (feat(keg): edit a node's content with a unified diff #128)
  5. Restorable trash (feat(keg): keep removed nodes in a restorable trash #129)
  6. node_merge and keg_replace (feat(mcp): merge nodes and replace text across a keg #130)
  7. tap url and the url tool (feat: link to Hub pages with tap url and the url tool #131)
  8. tap info (feat(cli): show the CLI's context with tap info #132)

The rebase applied without conflicts, and the resulting tree is identical to the tip of feat/tap-info that #132 merged.

Tests

Each commit built and passed go test ./... in the stacked PRs; CI runs on this branch.

Every agent tool now belongs to one category (Session, Memory, Explore,
or Manage) and its description opens with that label. Orientation prints
what each category is for, and the tool inventory and skills are
reorganized around it. Only Explore tools are marked open-world.

Searching is reserved for note content and the hub's public directory.
keg_search, flight_search, and namespace_search are replaced by
explore_kegs, explore_flights, and explore_people (and `tap explore
kegs|flights|people`), backed by POST /api/v1/explore. The caller's own
KEGs, flights, and namespaces are listed, never searched: keg_list now
carries titles and descriptions, and namespace_list and invitation_list
are always available.

The REST contract revision moves to 2026-10-12, since the namespace
search route is gone.
On a Hub a flight's cover reaches the KEGs its covered notes link to, up
to the cover entry's depth, instead of settings relationships. A cover
entry with role none blocks a KEG however it is reached, and covers
nothing even when another entry names it.

KEG settings links are renamed aliases, since they now only name KEGs
for keg:~alias/N links. Settings written with links are still read when
aliases is absent, and LinkEntry remains as a deprecated alias of
AliasEntry. keg_check reports keg: links that cannot be followed: one
missing the @ of a qualified reference, or an alias the settings do not
name.
whoami now carries personal_namespace, the user namespace the hub found
the account owning rather than one assumed from the username. Relayed MCP
tools are granted from it, so `tap auth status` shows it, or says the hub
found none. An older hub that does not report it prints no line.
node_edit accepts patch, a unified diff against the node's current body,
as an alternative to content, so a small change to a long note sends
only the changed lines. Every hunk's context and removed lines must
match the body exactly and in one place; a patch that does not fit is
refused with the lines it expected and nothing is written. A patch is a
content write, held to expected_content_hash, and keeps the body's line
endings. Remote kegs send it to the hub as content_patch.

An update may keep a body that already opens with frontmatter, written
before the no-frontmatter rule, but no update can introduce one.
Where a repository keeps a trash, removing a node moves it there with
its snapshots, files, and images, and leaves links to it alone, so
restoring it is lossless. trash_list shows removed nodes and why they
went, and trash_restore puts 1-100 of them back at their ids. A purge
deletes them for good and points links that still name them at node 0.

A trashed id stays reserved: no node can be moved onto it, and an
archive import that lands on one moves the trashed node to a fresh id
first, so it stays restorable. Remote kegs use the hub's /trash routes.
node_merge folds a duplicate into a target in one write: the target
takes the merged body (content or patch), links to the source are
pointed at the target, and the source goes to the trash as merged, so it
restores as it was.

keg_replace finds and replaces text across a keg in one atomic write,
literal or regex, narrowed by a query and optionally including
metadata. dry_run reports every node that would change. A node the write
would refuse is reported with its error and left alone while the rest
are written. Both are MCP-only for now.
`tap url [REF]` prints the Hub web link for the current keg, a node, a
keg, a flight, or a namespace; --open also opens it in the browser and
--json adds the kind and canonical reference. The MCP url tool returns
the same link so an agent can hand the reader something clickable. The
command builds the link from configuration alone, so it skips the
startup credential refresh.
`tap info` shows the hub and the user signed in to it, the default keg,
the active flight, and the kegs that flight covers with your role in
each, noting the config tier that set each default. A hub that cannot
be reached is a warning; the local defaults still print. `tap use` and
`tap info` share one resolution of those defaults.
@jlrickert
jlrickert merged commit 02b05c2 into main Oct 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant