VS Code extension 2.1.131 silently ignores `claudeCode.initialPermissionMode` and `claudeCode.claudeProcessWrapper` (regression vs 2.1.128)

Resolved 💬 2 comments Opened May 6, 2026 by solefroni Closed Jun 4, 2026

Summary

Claude Code VS Code extension 2.1.131 silently ignores claudeCode.initialPermissionMode and claudeCode.claudeProcessWrapper user settings. Child Claude processes are launched with --permission-mode default regardless of the configured bypassPermissions, and a configured wrapper script is bypassed entirely. Same machine, version 2.1.128 (running side-by-side in another window) honors both settings correctly — so this is a regression introduced in 2.1.131.

Environment

  • Claude Code VS Code extension: 2.1.131 (~/.vscode-server/extensions/anthropic.claude-code-2.1.131-linux-x64/)
  • OS: Ubuntu 24.04.4 LTS, x64, VS Code Server (remote SSH)
  • Comparison version on disk and running in another VS Code window: 2.1.128

Settings

~/.vscode-server/data/User/settings.json:

{
  "claudeCode.allowDangerouslySkipPermissions": true,
  "claudeCode.initialPermissionMode": "bypassPermissions"
}

I also tried adding "claudeCode.claudeProcessWrapper": "/abs/path/to/wrapper" (an executable shell script that logs every invocation) — the wrapper was never invoked, log file remained empty across reloads.

~/.claude/settings.json is a permissive allow list (Bash(*), Read(*), Write(*), etc.) — these allow rules are respected (verified: bash with pipes / redirects / chaining all run without prompts), so the regression is specifically scoped to mode and wrapper handling in the extension's launch logic, not allow-rule matching.

No /etc/claude-code/managed-settings.json. No project-level .claude/settings.json overrides. No CLAUDE_CONFIG_DIR env var.

Reproduction

  1. Install 2.1.131 of the VS Code extension.
  2. Place the settings above in ~/.vscode-server/data/User/settings.json.
  3. Developer: Reload Window.
  4. Run ps -ef | grep claude.

Expected

Child Claude process cmdline contains --permission-mode bypassPermissions. If claudeProcessWrapper is set, the binary is launched via the wrapper.

Actual on 2.1.131

…/anthropic.claude-code-2.1.131-linux-x64/resources/native-binary/claude \
  --output-format stream-json --verbose --input-format stream-json \
  --max-thinking-tokens 31999 --permission-prompt-tool stdio \
  --resume <id> --setting-sources=user,project,local \
  --permission-mode default \
  --debug --debug-to-stderr --enable-auth-status --no-chrome --replay-user-messages

Note --permission-mode default — should be bypassPermissions. The wrapper script (when set) is also bypassed: the native binary is launched directly, not via the configured wrapper path.

Working comparison on 2.1.128 (same machine, same settings file, same reload, just a different VS Code window with the older extension)

…/anthropic.claude-code-2.1.128-linux-x64/resources/native-binary/claude.real \
  …(same flags)… \
  --permission-mode bypassPermissions \
  …

User-visible effect

bypassPermissions mode is documented to skip permission prompts including writes inside .git, .claude, .vscode, .idea, .husky. Because the mode never engages on 2.1.131, writes to e.g. ~/.claude/CLAUDE.md and ~/.claude/settings.json always prompt — even though the user has explicitly opted into bypass mode in settings. This made it impossible for an agent session to update its own config without interactive approval on each write.

Notes from poking at extension.js

  • The spawn-args builder (around the --permission-mode push, near offset 152 in the minified file) is shaped like if(w)$.push("--permission-mode",w); if(F)$.push("--allow-dangerously-skip-permissions");. Whatever resolves w from claudeCode.initialPermissionMode appears to be returning "default" instead of "bypassPermissions" on 2.1.131.
  • The claudeProcessWrapper lookup near offset 805 (let x=e6("claudeProcessWrapper"); if(x){if(K=[V],B)K.unshift(B);V=x}) appears to no-op too.
  • The settings-migration block (around offset 310) migrates a known list of keys from the legacy claude-code.* namespace to claudeCode.* — verified the settings I'm using are already in the post-migration namespace, so nothing should be wiping them.

Happy to provide debug logs, the full extension launch trace, or anything else useful.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗