Skip to content

NEXUS-4033: Offer session skills in the core task composer - #2790

Open
gilgtm wants to merge 1 commit into
gil/nexus-4029-task-referencesfrom
gil/nexus-4033-core-skills
Open

gilgtm wants to merge 1 commit into
gil/nexus-4029-task-referencesfrom
gil/nexus-4033-core-skills

Conversation

@gilgtm

@gilgtm gilgtm commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Offers / skill chips for the addressed local agent (c99d0ce51).

  • Listing: in the desktop app, / at a word start lists the skills of the one local Claude or Codex agent that the viewer's message addresses.
    • Claude's skills come from ~/.claude/skills; Codex's from ~/.codex/skills and ~/.agents/skills.
    • They show under a "Skills for " heading. Completion rows gain an optional group.
    • Several addressed agents make the menu ask for one. A remote agent, another person's agent, a person, or a browser build lists nothing.
  • The chip: a chosen skill is a chip for that agent. It opens its short description and location in place, as a nested popover. It sends as literal text plus the signed buzz-tokens-v1 tag, and no skill content is copied into the message.
  • Native listing: local_skills_list reads only SKILL.md front matter, through the bounded listing helper. It skips front matter over 16 KiB and refuses more than 512 skills.
  • Agent grant: a local agent gets one prompt line naming each SKILL.md, only when the message's author is the agent's owner and the chip names that agent.

Compared with the previous version of this PR

The previous version offered session skills through the removed task mode's skills source. Skills now come from the agent's own folders on this machine, for any chat that addresses one local agent.

buzz-review-completed

Testing

Local runs on macOS, on the stack rebased onto main 9596cd3db:

  • The pushed heads differ from the tested adbdf424e chain only in tests/browser/solo-rename.spec.mjs. 02f9c0277 makes the new plugin-owned lifecycle test wait for the chat's row before filing it, after the hosted flake check caught it racing the roster load. With that fix, the full solo-rename.spec.mjs passed 180/180 at 02f9c0277 (10 repeats, Chromium and WebKit) and 120/120 at c99d0ce51 (5 repeats).
  • At this PR's head adbdf424e: pnpm check (Biome, TypeScript and the design checks) and the icon check passed. Vitest for the files the flake check selects for this PR: 1485 passed, 16 skipped.
  • Rust at adbdf424e: cargo fmt --check and cargo clippy -p Buzz --all-targets -- -D warnings passed. local_skills and host_files tests at this head: 4 and 24 passed. cargo-deny check passed at the stack tip.
  • At the stack tip adbdf424e: full Vitest, 20556 passed and 23 skipped (includes browser-host/channel-kit.test.mjs).
  • Browser journeys at the stack tip, Chromium and WebKit: the full tests/browser/solo-rename.spec.mjs, repeated 5 times, passed 120/120. The 34 other specs that the flake check relates to the stack, run once in each engine: 343 passed, 3 skipped by their own conditions. The full browser suite was not run locally.
  • No plugin harness pin includes this commit, so the plugin harness did not exercise it.

Native testing: Gil ran the native desktop app on this stack at adbdf424e, with the matching Nexus plugin build. Gil confirmed that these native-only paths passed:

Agent testing did not reach these paths: the agent ran no native app, no real relay and no real agent.

Known gaps

  • Gil exercised skill listing natively, and it passed. Agent testing did not reach skill listing or the SKILL.md prompt line.

Hosted or local failures that this stack does not cause:

  • tests/browser/typing.spec.mjs:290 ("a growing channel/thread composer lifts history with it at the bottom") intermittently fails with React error Add complete reaction toggles to the message menu #185 on main too. Locally it failed 12 of 12 runs at 9596cd3db and 9 of 12 at a later main commit.
  • On macOS, cargo test -p Buzz crashes the library test binary (SIGSEGV), and some host_command deadline tests fail. Both happen the same way at base 9596cd3db, before this stack. Hosted Linux CI is the reference for these.

Test changes

Titles are compared only in the test files each range changes. Tests that moved or were renamed are matched by title.

Removed by this PR's diff (0)
  • none
Added by this PR's diff (6)
  • src/bundled/claude-code/runtime.test.ts: names a skill its owner chose for this agent by chip, never one chosen for another agent
  • src/bundled/mentions/SkillCompletion.test.tsx: lists nothing unless one addressed agent is the viewer's own local Claude or Codex agent
  • src/bundled/mentions/SkillCompletion.test.tsx: matches / and name characters at a word start, never mid-word or past a space
  • src/bundled/mentions/SkillCompletion.test.tsx: offers the one addressed local agent's skills as chips for that agent, listed once per query
  • src/bundled/mentions/SkillCompletion.test.tsx: shows a failed listing with Retry, which lists again
  • src/features/agent-harness/referenced-folders.test.ts: names only skills the owner chose for this agent, quoted
In the previous version of this PR, not carried over (8)
  • src/features/host/service.test.ts: inspects paths with the calling plugin grant and preserves missing/dangling/error results
  • src/features/messages/MessageComposer.test.tsx: shows a task chat's skill details through its source, without a failing or malformed report
  • src/features/messages/composer-token.test.tsx: opens a skill chip's details in place by pointer or key, and dismisses only them
  • src/features/messages/composer-token.test.tsx: returns the caret right after a skill chip when its details close toward it
  • src/features/solo/task-skill-completion.test.tsx: matches / only after a boundary, up to the next slash
  • src/features/solo/task-skill-completion.test.tsx: offers a task chat's skills for its one tagged agent or primary and rechecks them on selection
  • src/features/solo/task-skill-completion.test.tsx: refuses a task source whose skills cannot be called
  • src/features/solo/task-skill-completion.test.tsx: reports an empty or failed load, and offers nothing outside a task chat or without a skills source

In the desktop app, `/` at a word start lists the skills of the one
local Claude or Codex agent that the viewer's message addresses. The
skills come from that agent's own skill folders on this machine:
`~/.claude/skills` for Claude, and `~/.codex/skills` and
`~/.agents/skills` for Codex. Skills appear under a "Skills for <agent>"
heading, with their own icon. Completion rows now carry an optional
group, so a later commands group can go first in the same `/` menu.
If several agents are addressed, the menu asks for one. A remote
agent, someone else's agent, a person or a browser build lists
nothing. One open `/` query lists once across keystrokes, and Retry
lists again after a failed read.

A chosen skill is a chip for that agent. The chip opens its short
description and location in place, as a nested popover. Like other
chips, it sends as literal text plus the signed `buzz-tokens-v1` tag.
No skill content is copied into the message.

`local_skills_list` reads only the SKILL.md front matter in the given
skill folders, using the bounded listing helper that the folder chips
use. It skips front matter larger than 16 KiB and refuses a listing of
more than 512 skills.

A local Claude or Codex agent gets one prompt line naming each SKILL.md
only when the message's author is the agent's owner and the chip names
that agent. Another author's chip, or a chip for another agent, adds
nothing. The agent reads the file itself.

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Gil Birman <gil@squareup.com>
@gilgtm
gilgtm force-pushed the gil/nexus-4033-core-skills branch from adbdf42 to c99d0ce Compare November 10, 2026 06:17
@gilgtm
gilgtm marked this pull request as ready for review November 10, 2026 06:38
@gilgtm
gilgtm requested a review from a team as a code owner November 10, 2026 06:38

This branch has not been deployed

No deployments
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