Skip to content

feat(tui): add /tools so built-in capabilities are discoverable - #74

Merged
Ooooze merged 2 commits into
mainfrom
feat/tools-command
Aug 7, 2026
Merged

feat(tui): add /tools so built-in capabilities are discoverable#74
Ooooze merged 2 commits into
mainfrom
feat/tools-command

Conversation

@sosidudku1

@sosidudku1 sosidudku1 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Closes #71.

Why

A user asked the agent to create a folder on the desktop, searched /skills for "filesystem", found nothing, and concluded the agent could not touch files. The capability was never missing: the os.fs.* tools carry the frequent tier and sit in the prompt on every turn. Only their discoverability was.

Two things made the dead end unavoidable:

  1. No command listed the tool surface. The registry has /skills, /model, /memory, /mcp and others, but nothing for tools, so /skills was the only place to look and by design never contains them.
  2. "filesystem" cannot match anything. The tools are named os.fs.read, os.fs.write, os.fs.list. The word appears in no tool name, so even a working listing would have returned nothing for that query.

Change

  • /tools lists all built-in tools grouped by family (browser, os.fs, os.shell, os.web, memory.*, os.git, tasks, …), with a pointer to /skills for optional packs.
  • /tools <query> filters by alias, family prefix or substring. Aliases map the words users actually type onto the namespaces that exist: filesystem/files/disk to os.fs, terminal/bash to os.shell, network to os.http, images to vision, and so on. A miss says so explicitly and offers the next step rather than returning an empty result.
  • Config-aware listing. /tools does not print the static descriptor catalog. The listing runs through the same filterToolDescriptorsByConfig gates the runtime applies in bootstrap.ts, so families disabled in config (browser.enabled=false, web.search.enabled=false, memory.*, tasks.agentToolsEnabled, MCP with no servers configured) do not show up as available. Two gates are approximated from config because their runtime inputs are probed at bootstrap: vision uses vision.enabled alone, and the MCP gate uses the configured server list rather than live connections. A query that only matches disabled tools says they are turned off in config instead of claiming no such tool exists. The git alias routes to os.git (an earlier revision pointed it at os.shell, which hid all six os.git.* tools).
  • The Skills panel footer now reads built-in tools: /tools, so the dead end has an exit even for someone who never opens the palette.

Testing

19 tests on the listing: family grouping and sort order, the coverage of families users ask about, the filesystem alias resolving to os.fs.write (the exact query from the report), the git alias resolving to the os.git family, family-prefix and substring matching, case insensitivity, empty and unrelated queries, config gating (families disabled in config stay out, and a query that only matches disabled tools says they are turned off rather than nonexistent), and both render paths including the miss message.

src/tui/commands plus src/runtime/filter-disabled-tools: 85 passing. tsc clean. Full src/tui run shows the same pre-existing failures as main.

sosidudku1 and others added 2 commits August 7, 2026 16:37
Closes #71. A user asked the agent to create a folder, searched /skills
for "filesystem", found nothing, and concluded the agent could not touch
files. Two things made that unavoidable: there was no command listing the
tool surface at all, and the twelve filesystem tools are named os.fs.*,
so the word "filesystem" matches nothing even in a working listing.

- /tools lists all 63 built-in tools grouped by family, stating plainly
  that they are always available and separate from /skills
- /tools <query> filters by alias, family prefix or substring; aliases
  cover the words users actually type (filesystem, files, shell,
  terminal, web, network, images), and a miss says so and points at
  /tools and /skills instead of returning nothing
- the Skills panel footer now carries "built-in tools: /tools"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review follow-ups for the /tools listing:

- /tools now runs DEFAULT_TOOL_DESCRIPTORS through the same
  filterToolDescriptorsByConfig gates bootstrap.ts applies, so a user
  with browser.enabled=false no longer sees browser.* advertised as
  available. Vision uses vision.enabled alone (the mmproj probe is not
  visible from the TUI listing) and the MCP gate uses the configured
  server list instead of live connections; both approximations follow
  the user's stated config.
- The "git" alias pointed at os.shell, which hid all six os.git.*
  tools; it now resolves to os.git.
- A query that only matches config-disabled tools says they are turned
  off in config instead of pretending they do not exist.
- Single-segment tools (reply, finish) no longer render as
  "reply  reply" in the overview.
- The overview header says "enabled under the current config" instead
  of "always available, no install needed", and drops the em-dash.
- searchTools drops a redundant toLowerCase; the grep test asserts
  toContain instead of toEqual so new grep-like tools do not break it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Ooooze
Ooooze merged commit 5ea2167 into main Aug 7, 2026
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.

UX: users look for built-in tools (fs, git, browser) under /skills and conclude they are missing

2 participants