mcpField
U
update-allowed-tools

update-allowed-tools

github.com/vintaAgent 工作流14258 次安装1 天前更新
代码仓库

关于 update-allowed-tools

用于检查技能正文及同目录文件,并按实际可免除权限提示的规则更新 `allowed-tools`。适合维护 Claude 技能,涵盖无效授权识别和文件校验。

主要功能

  1. 01扫描技能及同目录文件
  2. 02对照工具使用与 allowed-tools
  3. 03识别无效权限条目
  4. 04编辑并校验 YAML frontmatter

适用场景

  1. 01审查技能权限授权
  2. 02移除无效权限条目
  3. 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

说明

  1. 解析参数:参数可以是 SKILL.md 文件路径,也可以是技能名称/描述。如果未提供文件路径,先在当前工作目录中使用 Glob 搜索技能(**/skills/**/<name>/SKILL.md),然后搜索 ~/.claude/skills/<name>/SKILL.md。如果完全没有参数,运行 git status,并将工作树中最近修改的技能文件作为目标。

  2. 读取技能文件,并将 YAML frontmatter 与正文分开。还要读取同一目录中的其他文件(由技能引用或随技能打包的文件)。

  3. 提取已声明的 allowed-tools:解析 frontmatter 中 allowed-tools: 下的所有条目。

  4. 扫描所有技能内容(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) 会锚定到设置来源,在技能中含义不明确:应将其替换。
  5. 对比:针对正文中检测到的每个工具,检查 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 规则限制了这些操作,授权也无法覆盖这些规则。
  6. 更新 skill 文件:使用 Edit 工具,将缺失条目添加到 skill 的 YAML frontmatter 中的 allowed-tools 列表,并移除不授予任何权限的条目。如果列表最终为空,则删除 allowed-tools 字段。然后报告添加了哪些条目、每个已移除条目导致其无效的规则,以及每个保留条目为何不受以上任何规则影响。

  7. 验证:重新读取更新后的文件,确认 YAML frontmatter 仍然语法有效(缩进正确、没有重复条目、列表格式正确)。

评论

支持 Markdown