mcpField
P
permission-check

permission-check

github.com/pedrohcgsAgent 工作流1.7k37 次安装4 周前更新
代码仓库

关于 permission-check

这是一个只读 Skill,用于检查 VS Code、CLI、项目和会话中的 Claude Code 权限设置,帮助定位覆盖冲突;读取主机全局文件前会先征求确认。

主要功能

  1. 01检查六层权限设置
  2. 02解析模式优先级与覆盖
  3. 03合并 allow 和 deny 规则
  4. 04标记常见配置问题
  5. 05隐藏无关主机设置

适用场景

  1. 01查找权限提示出现的原因
  2. 02诊断项目级 bypass 设置
  3. 03比较 VS Code 与 CLI 模式
  4. 04排查会话中的旧模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pedrohcgs/claude-code-my-workflow --skill permission-check

安装后在 Claude Code 中输入/permission-check确认已加载。

详细介绍

权限检查

用途

呈现 Claude Code 遵循的每一层权限模式信息,让用户一眼看清提示为何会(或不会)触发。Claude Code 会通过 6 层堆栈解析权限模式;其中任何一层配置错误,都可能造成难以通过目视排查的静默覆盖。

6 层配置(优先级:越靠下优先级越高)

  1. VSCode 用户设置 — ~/Library/Application Support/Code/User/settings.json(macOS)、%APPDATA%/Code/User/settings.json(Windows)、~/.config/Code/User/settings.json(Linux)。键:claudeCode.initialPermissionMode。
  2. VSCode 工作区设置 — <repo>/.vscode/settings.json。相同的键。优先于用户设置。
  3. CLI 用户设置 — ~/.claude/settings.json。键:permissions.defaultMode。
  4. CLI 项目设置 — <repo>/.claude/settings.json。相同的键。优先于用户设置。
  5. CLI 项目本地设置 — <repo>/.claude/settings.local.json。相同的键。优先于项目设置。
  6. 会话内模式 — 会话开始时根据第 1–5 层设置,之后可通过 Shift+Tab(CLI)或模式指示器(VS Code / Desktop)更改;/permissions 管理允许/拒绝规则,而非模式。会话结束前,此模式具有最终效力。

覆盖此堆栈的两条规则(Anthropic 的权限模式文档,2026-09-26 再次核验):

  • 第 4 和第 5 层不会将 auto 或 bypassPermissions 作为初始模式。此处的 bypassPermissions 会被忽略,终端会话将以 Manual(default)模式启动;此处的 auto 会被忽略,改用内置默认模式。其他所有模式值均可从任意层生效。
  • VS Code 扩展不会读取第 4–5 层来确定初始模式;它使用 claudeCode.initialPermissionMode(不接受 auto),而绕过权限的设置需要启用扩展中的 允许危险地跳过权限 开关。如果没有覆盖设置,Claude Code ≥ 2.1.283 会以 auto 模式启动。

因此,首先检查“在项目设置中设置了 bypass,但该设置不会生效”的情况,再检查下方的会话中途覆盖。

关键要点: initialPermissionMode 只在会话开始时生效。如果你在会话中途切换了模式(或会话在设置更改前已启动),文件级设置虽然正确,但运行时模式却不同。这种情况,以及仅在项目设置中设置了 bypass,是造成“bypass 不起作用”困惑的两个常见原因。

隐私约定

主机全局设置文件(~/.claude/settings.json、VSCode 用户设置)可能包含:

  • 与本项目无关的其他项目路径和机密信息
  • 在本仓库之外添加的 API 密钥、令牌或服务提供商凭据
  • 用户所在组织或雇主设置的权限策略

此技能旨在实现纵深防御:阶段 A 会自动运行,且只读取仓库本地文件。 只有在用户明确确认后,阶段 B 才会读取主机全局文件,绝不会静默读取。报告主机全局层时,请遮盖所有与 permissions.*、claudeCode.* 或 allowDangerouslySkipPermissions 无直接关系的键。

协议

阶段 A:仓库本地层(自动运行)

立即读取这些文件——它们已提交到仓库(或在仓库内被 gitignore),不会跨越信任边界:

VSCODE_WS="${CLAUDE_PROJECT_DIR}/.vscode/settings.json"
CLI_PROJECT="${CLAUDE_PROJECT_DIR}/.claude/settings.json"
CLI_LOCAL="${CLAUDE_PROJECT_DIR}/.claude/settings.local.json"

对于每个存在的文件,提取:

  • VSCode 工作区: claudeCode.initialPermissionMode 和 allowDangerouslySkipPermissions(不带 claudeCode. 前缀——如果看到带前缀的 claudeCode.allowDangerouslySkipPermissions,将其标记为会被静默忽略的拼写错误)
  • CLI 项目 / 项目本地: permissions.defaultMode、permissions.allow、permissions.deny

文件不存在也没关系——报告“未找到”,而不是报错。

仅根据这三层打印解析后的 defaultMode,并应用上述两条覆盖规则——如果 bypassPermissions 或 auto 仅出现在第 4 或第 5 层,则报告为已忽略,而不是解析后的模式。如果这些信息已经解释了提示行为(例如,仅在 .claude/settings.json 中设置了 bypass),则在此处停止,并给出诊断及修复方案:将其移至 ~/.claude/settings.json、传入 --permission-mode bypassPermissions,或使用自动模式。

阶段 B:主机全局层(需要用户明确确认)

如果阶段 A 无法得出结论——例如,所有仓库本地层都一致为 bypass,但用户仍然会看到提示——询问用户:

“为了完成诊断,我需要读取此仓库之外的两个文件:

  • ~/.claude/settings.json(CLI 用户级设置)
  • 你的 VSCode 用户设置(macOS 上为 ~/Library/Application Support/Code/User/settings.json;Linux/Windows 路径有所不同)

这些文件可能包含无关路径或机密信息。我会对不属于 permissions.*、claudeCode.* 或 allowDangerouslySkipPermissions 的键进行脱敏。是否继续?”

只有在用户确认后,才读取:

# VSCode user (platform-dependent path; try all three)
case "$(uname -s)" in
    Darwin)  VSCODE_USER="${HOME}/Library/Application Support/Code/User/settings.json" ;;
    Linux)   VSCODE_USER="${HOME}/.config/Code/User/settings.json" ;;
    MINGW*|MSYS*|CYGWIN*) VSCODE_USER="${APPDATA}/Code/User/settings.json" ;;
    *)       VSCODE_USER="" ;;
esac

CLI_USER="${HOME}/.claude/settings.json"

报告文件内容时,仅提取相关键:

  • CLI 用户:permissions.defaultMode、permissions.allow、permissions.deny
  • VSCode 用户:所有以 claudeCode. 开头的键

绝不要打印整个文件。将其他所有内容脱敏为 (other keys redacted)。

步骤 2:计算解析后的状态

解析后的 defaultMode 是设置该值的优先级最高层中的值。报告:

  • defaultMode 优先级竞争中胜出的层。
  • 合并后的 allow 列表(合并所有 CLI 层)。
  • 合并后的 deny 列表(取并集;即使其他位置允许,任何 deny 都会阻止该操作)。
  • VSCode 是否显示 bypass,而 CLI 显示其他值(反之亦然)——这是需要标记的合理冲突。
步骤 3:报告运行时模式

当前会话中的实时模式可通过状态行查看(参见 .claude/scripts/statusline.sh)。告诉用户:

“如果状态行显示模式徽标([AUTO]、[BYPASS]、[PLAN]、[AUTO-EDIT]、[PROMPT]),那就是当前会话中的实时模式。如果它与上方解析出的 defaultMode 不一致,则可能是会话中途切换(Shift+Tab)更改了模式,或者上方的解析结果已经解释了这一点——例如,仅在项目设置中设置了 bypass,因此显示 [PROMPT]。如果没有徽标,说明 Claude Code 未报告该模式;请查看 Claude Code 面板中的模式指示器。”

如果未配置状态行,则发出警告并指向 .claude/scripts/statusline.sh。

第 4 步:标记常见故障模式

检查并明确指出:

  1. 仅在项目设置中设置绕过或自动模式: 第 4–5 层无法设置这些启动模式。在这些层设置绕过会使会话以手动模式启动;设置 auto 则会回退到内置默认值(在 ≥ 2.1.283 版本中默认为自动模式)。解决方法:从项目文件中移除该设置,并在用户设置中或通过 CLI 标志设置绕过,或者使用内置的自动模式默认值。
  2. 层级不一致: CLI 用户设置为绕过,但 CLI 项目本地设置为 default → 项目本地的 default 会生效(这是有效值),这就解释了为什么会出现提示。
  3. 仅 VSCode 设置了绕过: VSCode 层设置了绕过,但没有任何 CLI 层设置 → 终端中的 Claude Code 仍会提示;只有启用 Allow dangerously skip permissions 后,扩展才会遵循该设置。
  4. 允许列表为空且处于默认模式: defaultMode: "default" 且 allow 为空 → 每个工具都会提示,这是预期行为。
  5. 会话过期: 设置正确,但用户仍报告收到提示 → 几乎总是因为会话早于修复时间。建议执行“Cmd+Shift+P → Developer: Reload Window,然后启动新的 Claude Code 会话”。
  6. deny 优先: deny 列表中的任何匹配项都会阻止该工具,无论 allow 如何设置,也无论处于何种模式,包括绕过模式——这正是受限数据项目使用拒绝规则的原因。

输出格式

=== PERMISSION STATE ===

Layer 1 — VSCode user:       bypassPermissions      (allowDangerouslySkipPermissions: true)
Layer 2 — VSCode workspace:  (not set)
Layer 3 — CLI user:          bypassPermissions      (allow: ["*"])
Layer 4 — CLI project:       (not set)              (allow: ["Edit(**)", "Bash(*)", ...])
Layer 5 — CLI project-local: bypassPermissions      NOT HONOURED — a project-layer bypass starts the session in Manual

Resolved defaultMode: default (Manual) — Layer 5's bypass overrides Layer 3 and is not honoured
Merged allow:         Edit(**), Write(**), Bash(*), ...
Merged deny:          (none)

=== RUNTIME ===

Check the status line (or the mode indicator). Expected here: [PROMPT] — the ignored Layer 5 bypass explains it.
Remove the bypass from Layer 5 and keep it in Layer 3 (or rely on auto mode) to get [BYPASS] / [AUTO].
Any other mismatch with the resolved mode is an in-session override — Shift+Tab cycles modes.

=== DIAGNOSIS ===

No layer drift detected. If you are still seeing prompts:
  1. Session is stale (started before settings were applied) — reload window + new session.
  2. VSCode extension bug — check extension version and file an issue.
  3. Tool was previously denied in this session — that denial is remembered. New session clears it.

如果任何层级设置不一致,请将“No layer drift detected”替换为具体标记的问题。

注意事项

  • 此技能为只读,不会修改设置。
  • 如果未设置 $CLAUDE_PROJECT_DIR,则回退到 git rev-parse --show-toplevel。
  • 支持平台识别:根据 VSCode 用户路径识别 macOS、Linux 或 Windows。

评论

支持 Markdown