diff --git a/CLAUDE.md b/CLAUDE.md
index 96733e9d..103a1ec4 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -33,6 +33,9 @@ dispatch/
├── e2e/ # Playwright E2E tests
├── bin/ # dispatch-dev, dispatch-server, install-dispatch, etc.
├── scripts/ # e2e-isolated.sh, generate-icon-colors.ts
+├── plugins/
+│ └── dispatch/ # official Dispatch plugin (skills for Claude Code + Codex)
+├── release-notes/ # release notes + assisted-update metadata
├── .dispatch/ # repo-level Dispatch config
│ ├── config.json # repo-level settings (e.g. Linear integration)
│ ├── job-state/ # persistent state files for recurring jobs
diff --git a/apps/web/src/components/app/docs-sections/tools.tsx b/apps/web/src/components/app/docs-sections/tools.tsx
index 8286df94..62d4c1ae 100644
--- a/apps/web/src/components/app/docs-sections/tools.tsx
+++ b/apps/web/src/components/app/docs-sections/tools.tsx
@@ -44,6 +44,15 @@ export function ToolsContent() {
The tools above would be available to agents as repo_lint
, repo_test, and repo_db_reset.
+ Every entry needs a name, a description, and
+ a non-empty command array. The command is executed
+ directly rather than through a shell, so pipes, globs, and{" "}
+ && don't work — put anything shell-shaped in a
+ script and point command at that. A malformed entry
+ aborts the whole manifest, so a typo in one tool makes every{" "}
+ repo_ tool disappear.
+
repo_dev_up with{" "}
{'{ cwd: "/path", live: true }'}, Dispatch runs{" "}
./bin/dev up --cwd /path --live. Parameters that are
- omitted or false are skipped.
+ omitted, false, or an empty string are skipped. Every parameter is
+ optional to the agent, and name, type, and{" "}
+ flag are required in the definition — the{" "}
+ description is what the agent reads to decide what to
+ pass, so it's worth writing.
+
+ + A repo tool call doesn't fail on a non-zero exit. The command's stdout + comes back as the tool's text result, with the exit code, stdout, and + stderr in the structured payload, so the agent can read a failure and + react to it instead of just seeing an error. Write scripts that fail + loudly on stderr. +
++ Dispatch puts no time limit on a repo tool command (lifecycle hooks + below do get one), though the agent's own MCP client may give up on a + very long call. +
+
+ .dispatch/tools.json is re-read from disk on every tool
+ listing — no server restart needed. The limit is on the agent's side:
+ a CLI fetches its tool list once when the session starts and holds it.
+ So an edited command runs the new version on the next call, but a
+ newly added tool usually isn't callable until the agent reconnects or
+ a new session starts.