VS Code extension 2.1.131 silently ignores `claudeCode.initialPermissionMode` and `claudeCode.claudeProcessWrapper` (regression vs 2.1.128)
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
- Install 2.1.131 of the VS Code extension.
- Place the settings above in
~/.vscode-server/data/User/settings.json. Developer: Reload Window.- 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-modepush, near offset 152 in the minified file) is shaped likeif(w)$.push("--permission-mode",w); if(F)$.push("--allow-dangerously-skip-permissions");. Whatever resolveswfromclaudeCode.initialPermissionModeappears to be returning"default"instead of"bypassPermissions"on 2.1.131. - The
claudeProcessWrapperlookup 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 toclaudeCode.*— 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.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗