"Always allow" permission not persisted when ~/.claude is a symlinked directory
"Always allow" permission not persisted when ~/.claude is a symlinked directory
Related: #3575 (symlinked settings.json — closed as fixed)
Environment
- Claude Code: 2.1.50
- OS: macOS Darwin 25.3.0
- Shell: zsh
- Setup:
~/.claude -> ~/dotfiles/.claude(entire directory is a symlink to a dotfiles repo)
Bug Description
Bash commands that redirect output to /tmp/ trigger a permission dialog with the option "Yes, and always allow access to tmp/ from this project". Selecting this option has no effect — the same dialog reappears on the very next matching command within the same session, on resumed sessions (claude --resume), and on new sessions.
No settings file is created anywhere after clicking "always allow".
Steps to Reproduce
- Symlink the
~/.claudedirectory to a dotfiles repo:
``bash``
ln -s ~/dotfiles/.claude ~/.claude
- Configure
~/.claude/settings.jsonwith bash permissions:
``json``
{
"permissions": {
"allow": [
"Bash(kubectl get *)",
"Bash(kubectl describe *)",
"Read(//tmp/**)"
]
}
}
- Have Claude run a bash command that writes to
/tmp/:
``bash``
kubectl get pods -o wide > /tmp/pods.txt
- Permission dialog appears:
```
Do you want to proceed?
- Yes
- Yes, and always allow access to tmp/ from this project
- No
```
- Select option 2
- Have Claude run another bash command with
> /tmp/redirect:
``bash``
kubectl get nodes -o wide > /tmp/nodes.txt
- Same dialog appears immediately. Makes no difference whether it is the same session, a resumed session (
claude --resume), or a new session.
Expected Behavior
After selecting "always allow", the permission persists and the dialog does not reappear.
Actual Behavior
- Permission is not persisted — dialog reappears every time
- No
settings.jsonorsettings.local.jsonfiles are created in any project directory under~/.claude/projects/(verified: glob across all project directories returns zero results) - No
.claude/directory is created at the project root - No error or warning indicates the persistence failed
Workaround
Adding Edit(//tmp/**) to the global ~/.claude/settings.json allow list resolves the prompt. Note: // prefix is required for absolute paths per gitignore spec.
Test Results
| Check | Result |
|---|---|
| ~/.claude symlink resolves correctly | Yes — settings.json loads, permissions work |
| settings*.json in ~/.claude/projects/*/ after "always allow" | None found |
| .claude/settings.local.json in project root after "always allow" | Not created |
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗