关于 update-allowed-tools
用于检查技能正文及同目录文件,并按实际可免除权限提示的规则更新 `allowed-tools`。适合维护 Claude 技能,涵盖无效授权识别和文件校验。
主要功能
- 01扫描技能及同目录文件
- 02对照工具使用与 allowed-tools
- 03识别无效权限条目
- 04编辑并校验 YAML frontmatter
适用场景
- 01审查技能权限授权
- 02移除无效权限条目
- 03补充可免提示的必要权限
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ vinta/ hal-9000 --skill update-allowed-tools安装后在 Claude Code 中输入/update-allowed-tools确认已加载。
详细介绍
调用此技能本身就是请求。如果用户消息看起来为空,这是正常且符合预期的,任务已在此处完整说明。切勿询问要做什么。
第 5 步中的规则完整且机械;请直接应用并编辑。不要调用顾问或寻求其他意见;这不会改变判定结果,只会让运行时间翻倍。
概述
分析技能的完整内容,包括 SKILL.md 及同一目录中的所有同级文件,找出其中引用或要求的工具,然后与技能的 allowed-tools frontmatter 对比,找出缺少的条目和不起作用的条目。
allowed-tools 仅用于权限机制:只有当某个条目能免去技能原本会遇到的权限提示时,它才有存在的价值。它不是技能所用工具的清单。它绝不会限制任何内容:所有工具始终都可调用,而且授权仅在调用该技能的这轮对话中有效。
用法
/update-allowed-tools <skill name>
/update-allowed-tools @path/to/SKILL.md
说明
-
解析参数:参数可以是 SKILL.md 文件路径,也可以是技能名称/描述。如果未提供文件路径,先在当前工作目录中使用 Glob 搜索技能(
**/skills/**/<name>/SKILL.md),然后搜索~/.claude/skills/<name>/SKILL.md。如果完全没有参数,运行git status,并将工作树中最近修改的技能文件作为目标。 -
读取技能文件,并将 YAML frontmatter 与正文分开。还要读取同一目录中的其他文件(由技能引用或随技能打包的文件)。
-
提取已声明的 allowed-tools:解析 frontmatter 中
allowed-tools:下的所有条目。 -
扫描所有技能内容(SKILL.md 正文及同级文件),查找工具用法。检查以下内容:
- 默认会提示权限的显式工具名称:
Write、Edit、Bash、WebFetch、WebSearch和mcp__*工具。 - Bash 命令模式:
git commit、make、npm、docker、python、curl等。条目格式为Bash(<command>:*)(git stash push需要Bash(git stash:*)),一种模式可覆盖其子命令。Bash(<command> *)与此规则相同,只是权限对话框采用这种形式;切勿将一种形式改写为另一种。 - Bash 规则会在每个复合命令中分别匹配各个子命令,以
&&、||、;、|和换行符为分隔符。因此,正文中写有cd X && git commit或git commit -m "$(...)"时,Bash(git commit:*)均无法覆盖。应将这些命令报告为正文修正项,而不是扩大规则范围。匹配前会移除包装命令timeout、time、nice、nohup、stdbuf和裸xargs,因此无需为它们单独添加条目;npx、docker exec等运行器不会被移除,因此条目应同时包含运行器和内部命令。 - 重定向目标(
> file、< file)会根据Edit或Read规则以及工作目录进行检查,而不按 Bash 规则检查,因此git diff > /tmp/x.diff需要Edit(//tmp/**),不需要 Bash 条目。 - 随附脚本通过
Bash(${CLAUDE_SKILL_DIR}/scripts/<name> *)运行时不会提示权限;${CLAUDE_PLUGIN_ROOT}的作用相同,但仅在插件技能中替换,即祖先目录中包含.claude-plugin/plugin.json的技能;在其他位置使用时,它不会匹配任何内容。 - 技能读取或编辑的文件路径。路径规则应写为
./path(相对于工作目录)、~/path或//path(绝对路径)。单斜杠形式的Edit(/path)会锚定到设置来源,在技能中含义不明确:应将其替换。
- 默认会提示权限的显式工具名称:
-
对比:针对正文中检测到的每个工具,检查
allowed-tools中是否有条目覆盖它。完全匹配即视为已覆盖(WebSearch可匹配WebSearch)。然后应用以下规则;任何规则判定为无效的条目均不得添加,若已存在则应移除。 无效条目:Read、Grep、Glob,以及工作目录中的任何Read(path):读取这些位置时从不提示。工作目录之外的Read(path)(Read(//tmp/**)、Read(~/.claude/**)) 是实际授权,因为首次读取工作目录外的内容时会提示。Write(path)、Glob(path)、NotebookEdit(path)、MultiEdit(path):Claude Code 只会根据Edit(path)和Read(path)规则检查文件权限,不会参考这些条目。创建文件也使用Edit(path)。- 对受保护路径执行
Edit,以及目标为受保护路径的 Bash 文件命令(rm、mv、cp、sed -i、>重定向):任何模式下的任何允许规则都不会预先批准对这些位置的写入。受保护目录包括.git、无论位于何处的.claude,因此~/.claude/**和.claude/**都受保护(.claude/worktrees除外),以及.vscode、.idea、.husky、.cargo、.devcontainer、.yarn、.mvn和.config/git;受保护文件包括.gitconfig、.gitmodules、.zshrc和.bashrc等 shell rc 文件、.npmrc、.pre-commit-config.yaml、.mcp.json和.claude.json。完整列表见 https://code.claude.com/docs/en/permission-modes#protected-paths。读取这些路径不受保护。 - 内置只读集合中的 Bash 命令,在所有模式下运行时都不会提示:
ls、cat、echo、pwd、head、tail、grep、find、wc、which、diff、stat、du、工作目录中的cd,以及只读形式的git命令,例如git status、git diff、git log、git branch、git show和git rev-parse。例外:如果正文运行find、sort、sed和git时使用了未加引号的 glob,这些命令在 Manual 模式下会提示,因此仅在这种情况下保留该条目。 Bash(*)、Bash(python*)以及其他授予任意代码执行权限的规则:进入时,自动模式会移除这些规则;而宽泛授权只会放宽所有其他安装该 skill 的用户的设置。裸Edit、裸Write或Edit(**)也同理:将每项编辑授权限定为该 skill 预期修改的路径(Edit(CLAUDE.md)、Edit(~/.config/**));如果该 skill 编辑的路径只有在运行时才能确定,则不要添加任何规则,让提示正常触发。Skill(...)、AskUserQuestion、Agent和Agent(<name>):调用 skill、询问用户以及启动子 Agent 默认都不会提示;如果用户通过 ask 或 deny 规则限制了这些操作,授权也无法覆盖这些规则。
-
更新 skill 文件:使用 Edit 工具,将缺失条目添加到 skill 的 YAML frontmatter 中的
allowed-tools列表,并移除不授予任何权限的条目。如果列表最终为空,则删除allowed-tools字段。然后报告添加了哪些条目、每个已移除条目导致其无效的规则,以及每个保留条目为何不受以上任何规则影响。 -
验证:重新读取更新后的文件,确认 YAML frontmatter 仍然语法有效(缩进正确、没有重复条目、列表格式正确)。