关于 permission-check
这是一个只读 Skill,用于检查 VS Code、CLI、项目和会话中的 Claude Code 权限设置,帮助定位覆盖冲突;读取主机全局文件前会先征求确认。
主要功能
- 01检查六层权限设置
- 02解析模式优先级与覆盖
- 03合并 allow 和 deny 规则
- 04标记常见配置问题
- 05隐藏无关主机设置
适用场景
- 01查找权限提示出现的原因
- 02诊断项目级 bypass 设置
- 03比较 VS Code 与 CLI 模式
- 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 层配置(优先级:越靠下优先级越高)
- VSCode 用户设置 —
~/Library/Application Support/Code/User/settings.json(macOS)、%APPDATA%/Code/User/settings.json(Windows)、~/.config/Code/User/settings.json(Linux)。键:claudeCode.initialPermissionMode。 - VSCode 工作区设置 —
<repo>/.vscode/settings.json。相同的键。优先于用户设置。 - CLI 用户设置 —
~/.claude/settings.json。键:permissions.defaultMode。 - CLI 项目设置 —
<repo>/.claude/settings.json。相同的键。优先于用户设置。 - CLI 项目本地设置 —
<repo>/.claude/settings.local.json。相同的键。优先于项目设置。 - 会话内模式 — 会话开始时根据第 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 步:标记常见故障模式
检查并明确指出:
- 仅在项目设置中设置绕过或自动模式: 第 4–5 层无法设置这些启动模式。在这些层设置绕过会使会话以手动模式启动;设置
auto则会回退到内置默认值(在 ≥ 2.1.283 版本中默认为自动模式)。解决方法:从项目文件中移除该设置,并在用户设置中或通过 CLI 标志设置绕过,或者使用内置的自动模式默认值。 - 层级不一致: CLI 用户设置为绕过,但 CLI 项目本地设置为
default→ 项目本地的default会生效(这是有效值),这就解释了为什么会出现提示。 - 仅 VSCode 设置了绕过: VSCode 层设置了绕过,但没有任何 CLI 层设置 → 终端中的 Claude Code 仍会提示;只有启用 Allow dangerously skip permissions 后,扩展才会遵循该设置。
- 允许列表为空且处于默认模式:
defaultMode: "default"且allow为空 → 每个工具都会提示,这是预期行为。 - 会话过期: 设置正确,但用户仍报告收到提示 → 几乎总是因为会话早于修复时间。建议执行“Cmd+Shift+P → Developer: Reload Window,然后启动新的 Claude Code 会话”。
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。