CommandCodeAI / CommandCodeAI/command-code
Mod-registered tools cannot be scoped to a specific agent — addTool is global and no blocking hook receives agent identity
まだ誰も着手していません。
- 主要言語
- 言語のデータがありません
- スター
- 4k
- フォーク
- 350
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
Authorship note: This issue was written by an AI assistant (Command Code) on behalf of a human user who hit the problem and explicitly asked that it be filed. The user directed the investigation and the framing; the AI wrote this text. No paths, account names, repository names, project names, or other identifying details are included, at the reporter's explicit request — so any template field below is left blank rather than partially filled.
Summary
A mod can add a tool to Command Code, but it cannot say who may use it. cmd.addTool registers into a single global tool registry with no scoping parameter, and the beforeToolCall hook — the only place a mod can block a call — receives no agent identity in its context. So a mod that intends a narrow, single-purpose tool for one sub-agent has no way to express that intent, and the tool silently ends up on the broadest surface available: the main loop.
The per-agent tools: frontmatter allowlist is the only lever, and it only ever narrows. Callers that declare no allowlist receive every registered tool by default.
What was observed
Setup: a mod registering one custom read-only tool, intended for a single sub-agent, declared in exactly one agent definition's tools: allowlist. Each caller was then spawned and asked to report its own available tools, and — where the tool was present — called it, which returned a real result:
| Caller | Tool available? |
|---|---|
| Main loop | yes — called it successfully |
Bundled general agent |
yes — called it successfully |
Bundled explore agent |
no |
A custom agent whose tools: omit it |
no |
The narrowing works where an allowlist exists. It does nothing where one does not. general is a bundled agent defined with the full tool set and holds a reserved name, so it cannot be shadowed with a locally-defined equivalent, and the main loop has no agent file at all. The mod author's assumption — that agents which do not list the tool simply do not get it — holds for exactly the agents that bothered to declare an allowlist, and fails for the two that matter most.
Why a mod cannot fix this itself
cmd.addToolaccepts a schema, arunfunction, and flags such asreadOnly. There is no agent or scope parameter, so registration is global.beforeToolCall({toolCallId, toolName, input, state}, ctx)—ctxis{emit, signal, cwd, session}. There is no agent identity in it, so a mod cannot gate its own tool on "am I being called by agent X".- Agent identity does surface as
subagentType, but only on thesubagent_start/subagent_progressevents, which are observe-only (cmd.on). The blocking hook has no equivalent field. - A
permissions.denyrule is global, so removing the tool from the main loop also removes it from the one agent that legitimately uses it. There is no per-agent exemption, and deny outranks every narrower allow.
The practical result is that minimal-privilege tool design is unreachable for mods. The author's intent degrades silently: the tool works, appears correctly in the one intended agent, and is additionally present everywhere else — including the context with the largest tool surface and the least scrutiny.
Expected behavior
Any one of these would close it:
- A scope on registration — an optional agents/scope field on
addTool(by agent name, wildcard, or "main loop only"). - Agent identity in the
beforeToolCallcontext —subagentType, or an explicit "main loop" marker when there is none — so a mod can enforce its own scoping. - Agent-targeted
deny/allowrules, so a tool can be withheld from the main loop while remaining available to a named agent. - If none of the above is intended: document plainly that mod-registered tools are global and cannot be scoped, so authors stop designing around a capability that does not exist.
Related
- #852 — sub-agent tool calls bypass
PreToolUsehooks and modbeforeToolCall. Cited as related; not independently re-verified for this report. It compounds this one: ifbeforeToolCalldoes not run for sub-agent calls, then even option (2) above would leave no working seam. Both reports turn on the same underlying question — which execution contexts a mod's hooks and a mod's tools are actually scoped to. - #861 — project-root resolution, which governs where mod files are discovered at all.
Command Code Version
1.54.0
Operating System
Linux
Confidence / what was not verified
- The caller/tool-availability table was reproduced by spawning each caller, having it report its own available tools, and invoking the tool where present. Rows marked yes executed the call and returned a real result.
- The absence of a scoping parameter on
addTool, and of agent identity in the mod hook context, is read from the shipped mods and hooks reference documentation, not from the implementation. - Not verified: whether
beforeToolCallexecutes for sub-agent tool calls (see #852). The compounding interaction described under "Related" is conditional on that being true.
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
同梱されている mods と hooks のリファレンスドキュメント、特に cmd.addTool、beforeToolCall、permissions.deny、subagent events から始めます。メインループ、general、explore、custom agents の間で tool の利用可能性がどのように異なるかを追跡します。合意された scoping の動作が実装または文書化され、観測された caller matrix が検証でカバーされれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 領域
- cli, devtools, security
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 活発
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100