Skip to content

[BUG] VSCode Extension: .claude/settings.local.json permissions not respected for Bash/Write/Edit operations (even with bypassPermissions mode) #15921

@elliottgaryusa

Description

@elliottgaryusa

Preflight Checklist

  • I have searched existing issues and this hasn't been reported yet
  • This is a single bug report (please file separate reports for different bugs)
  • I am using the latest version of Claude Code

What's Wrong?

GitHub Issue Draft for Claude Code Team

Related Work Item: BUGFIX-003
Target Repository: https://github.com/anthropics/claude-code/issues
Created: 2025-12-31
Status: Draft - Ready to submit


Issue Title

[Bug] VSCode Extension: .claude/settings.local.json permissions not respected for Bash/Write/Edit operations (even with bypassPermissions mode)


Issue Type

Bug Report


Environment

Claude Code Version: Latest (VSCode Extension)
VSCode Version: Latest
OS: Windows 11
Extension Environment: VSCode Claude Code Extension


Summary

The .claude/settings.local.json permission configuration system appears to only work for Read-type tools (Read, Glob, Grep) but does NOT respect allow/deny rules for Bash commands, Write operations, or Edit operations in the VSCode extension environment.

Critical Finding: Even with bypassPermissions mode enabled (which should bypass ALL permission checks), users still receive approval prompts for Bash, Write, and Edit operations.


Expected Behavior

When .claude/settings.local.json contains:

{
  "permissions": {
    "defaultMode": "dontAsk",
    "allow": [
      "Read(**)",
      "Glob",
      "Grep",
      "Task",
      "Bash(dir:*)"
    ],
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(credentials.json)",
      "Read(.aws/**)",
      "Read(.git/config)",
      "Read(../**)"
    ]
  }
}

AND VSCode setting claudeCode.initialPermissionMode is set to "acceptEdits" or "bypassPermissions",

Expected: All allowed operations should execute without approval prompts, including:

  • Bash commands matching Bash(dir:*)
  • Write operations (creating files)
  • Edit operations (modifying files)

Actual Behavior

What Works (No Prompts):

  • ✅ Read(**) tool
  • ✅ Glob tool
  • ✅ Grep tool

What Still Prompts (Despite Configuration):

  • ❌ Bash commands - ALL types (simple commands, pipelines, git operations)
  • ❌ Write tool - Creating new files
  • ❌ Edit tool - Modifying existing files

Critical Issue: Even with VSCode initialPermissionMode set to "bypassPermissions" (which should bypass ALL permission checks), the following still prompted:

  • Bash command: cat thoughts/project/work/doing/.limit
  • Write operation: Creating new file
  • Edit operation: Modifying existing file

Reproduction Steps

Configuration Setup

  1. Create .claude/settings.local.json in project root:
{
  "permissions": {
    "defaultMode": "dontAsk",
    "allow": [
      "Read(**)",
      "Glob",
      "Grep",
      "Task",
      "Bash(dir:*)"
    ],
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(credentials.json)",
      "Read(.aws/**)",
      "Read(.git/config)",
      "Read(../**)"
    ]
  }
}
  1. Open VSCode Settings (Ctrl+,)
  2. Search for "claude"
  3. Set Claude Code: Initial Permission Mode to "acceptEdits"
  4. Restart Claude Code session

Test Case 1: Read Operations (These Work)

  1. Use Read tool to read any project file
    • Result: No prompt ✅
  2. Use Glob tool to search files
    • Result: No prompt ✅
  3. Use Grep tool to search content
    • Result: No prompt ✅

Test Case 2: Bash Commands (These Fail)

  1. Execute: cat thoughts/project/work/doing/.limit
    • Result: Approval prompt appears ❌
  2. Execute: ls -la
    • Result: Approval prompt appears ❌
  3. Execute: git status
    • Result: Approval prompt appears ❌

Test Case 3: Write/Edit Operations (These Fail)

  1. Use Write tool to create new file
    • Result: Approval prompt appears ❌
  2. Use Edit tool to modify existing file
    • Result: Approval prompt appears ❌

Test Case 4: bypassPermissions Mode (Critical Finding)

  1. Change VSCode setting to "bypassPermissions"
  2. Repeat Bash/Write/Edit tests
    • Result: ALL still prompt ❌

This suggests the permission system is not properly integrated for these operation types.


Root Cause Analysis

Based on extensive testing, the VSCode extension appears to have two separate permission pathways:

Pathway 1 (Works): Read-type tools (Read, Glob, Grep, Task)

  • These properly respect .claude/settings.local.json allow/deny rules
  • Correctly work with defaultMode: "dontAsk"

Pathway 2 (Broken): Bash/Write/Edit operations

  • These do NOT respect .claude/settings.local.json allow/deny rules
  • Do NOT respect VSCode initialPermissionMode setting
  • Even bypassPermissions mode (which should skip ALL checks) still prompts

Hypothesis: Bash/Write/Edit operations may use a different permission check mechanism that is not connected to the configuration system.


Impact

Severity: Medium-High

User Impact:

  • Users cannot configure non-destructive read-only operations (like checking WIP limits) without approval prompts
  • Workflow friction persists despite correct configuration
  • bypassPermissions mode not working as expected is particularly concerning

Workaround:

  • None available for Bash/Write/Edit operations
  • Users must manually approve each operation

Additional Context

Testing Environment Details

  • Tested with fresh VSCode restart after each configuration change
  • Verified only one .claude/settings.local.json file exists (no conflicts)
  • Tested all four initialPermissionMode values: default, acceptEdits, plan, bypassPermissions
  • Bash patterns tested: Bash(cat:*), Bash(ls:*), Bash(pwd), Bash(git status), Bash(dir:*)

Configuration Files Verified

.claude/settings.local.json:

{
  "permissions": {
    "defaultMode": "dontAsk",
    "allow": [
      "Read(**)",
      "Glob",
      "Grep",
      "Task",
      "Bash(dir:*)"
    ],
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(credentials.json)",
      "Read(.aws/**)",
      "Read(.git/config)",
      "Read(../**)"
    ]
  }
}

VSCode settings.json:

{
    "claudeCode.initialPermissionMode": "acceptEdits"
}

Expected vs Actual Permission Matrix

Tool/Operation .claude/settings.local.json acceptEdits Mode bypassPermissions Mode Expected Actual
Read(**) ✅ Configured N/A N/A No prompt ✅ No prompt
Glob ✅ Configured N/A N/A No prompt ✅ No prompt
Grep ✅ Configured N/A N/A No prompt ✅ No prompt
Bash(dir:*) ✅ Configured ✅ Enabled ✅ Bypass ALL No prompt ❌ Still prompts
Write N/A ✅ Enabled ✅ Bypass ALL No prompt ❌ Still prompts
Edit N/A ✅ Enabled ✅ Bypass ALL No prompt ❌ Still prompts

Suggested Fix

  1. Verify Bash/Write/Edit operations use the same permission check pathway as Read/Glob/Grep tools
  2. Ensure bypassPermissions mode actually bypasses all permission checks (currently not working)
  3. Document permission system architecture so users understand which settings control which operations

Related Issues

(Search for similar issues - #15772 ]


Questions for Claude Code Team

  1. Is .claude/settings.local.json supposed to work for Bash/Write/Edit operations in VSCode extension?
  2. Should bypassPermissions mode eliminate ALL prompts? (Currently it doesn't for Bash/Write/Edit)
  3. Is there separate configuration needed for Bash/Write/Edit permissions in VSCode?
  4. Is this behavior expected, or is it a bug?

Reported By: SpearIT Project Framework Team
Date: 2025-12-31
Contact: (Add your GitHub username when submitting)

What Should Happen?

Expected: All allowed operations should execute without approval prompts, including:

  • Bash commands matching Bash(dir:*)
  • Bash commands like (cat, ls, grep)

Error Messages/Logs

Steps to Reproduce

See description above.

Claude Model

Sonnet (default)

Is this a regression?

I don't know

Last Working Version

No response

Claude Code Version

Model: Claude Sonnet 4.5 (model ID: claude-sonnet-4-5-20250929) - VSCode ext 2.0.75

Platform

Anthropic API

Operating System

Windows

Terminal/Shell

PowerShell

Additional Information

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions