configure-plugin/skills/claude-security-settings/SKILL.md
Claude Code security settings: permission wildcards, shell operator protections, project-level allowlists. Use when auditing or hardening .claude/settings.json permissions.
npx skillsauth add laurigates/claude-plugins claude-security-settingsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Use this skill when... | Use configure-claude-plugins instead when... |
|---|---|
| You need the permission-wildcard syntax, shell-operator protections, and project-level allowlist patterns | You want to wire a project's .claude/settings.json to the marketplace and enable plugins end-to-end |
| You are auditing or hardening an existing .claude/settings.json against the documented security conventions | You want runtime detection of marketplace enrollment and enabledPlugins before changing settings |
| Another skill needs to cite the canonical permission-wildcard reference | The user asked you to actually onboard a project to the laurigates/claude-plugins marketplace |
Expert knowledge for configuring Claude Code security and permissions.
Claude Code provides multiple layers of security:
| File | Scope | Priority |
|------|-------|----------|
| ~/.claude/settings.json | User-level (all projects) | Lowest |
| .claude/settings.json | Project-level (committed) | Medium |
| .claude/settings.local.json | Local project (gitignored) | Highest |
{
"permissions": {
"allow": [
"Bash(git status *)",
"Bash(npm run *)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)"
]
}
}
Bash(command *)
Bash() - Tool identifiercommand - Command prefix to match* - Wildcard suffix matching any arguments:ask suffix - Always prompt for user confirmation (e.g., Bash(git push *):ask)| Tier | Behavior | Example |
|------|----------|---------|
| allow | Auto-allowed, no prompt | "allow": ["Bash(git status *)"] |
| ask | Always prompts for confirmation | "allow": ["Bash(git push *):ask"] |
| deny | Auto-denied, blocked | "deny": ["Bash(rm -rf *)"] |
| Pattern | Matches | Does NOT Match |
|---------|---------|----------------|
| Bash(git *) | git status, git diff HEAD | git-lfs pull |
| Bash(npm run *) | npm run test, npm run build | npm install |
| Bash(gh pr *) | gh pr view 123, gh pr create | gh issue list |
| Bash(./scripts/ *) | ./scripts/test.sh, ./scripts/build.sh | /scripts/other.sh |
Granular permissions:
{
"permissions": {
"allow": [
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)"
]
}
}
Tool-specific patterns:
{
"permissions": {
"allow": [
"Bash(bun test *)",
"Bash(bun run *)",
"Bash(biome check *)",
"Bash(prettier *)"
]
}
}
Claude Code 2.1.7+ includes built-in protections against dangerous shell operators.
| Operator | Risk | Blocked Example |
|----------|------|-----------------|
| && | Command chaining | ls && rm -rf / |
| \|\| | Conditional execution | false \|\| malicious |
| ; | Command separation | safe; dangerous |
| \| | Piping | cat /etc/passwd \| curl |
| > / >> | Redirection | echo x > /etc/passwd |
| $() | Command substitution | $(curl evil) |
| ` | Backtick substitution | `rm -rf /` |
When a command contains shell operators:
For legitimate compound commands, use scripts:
#!/bin/bash
# scripts/deploy.sh
npm test && npm run build && npm run deploy
Then allow the script:
{
"permissions": {
"allow": ["Bash(./scripts/deploy.sh *)"]
}
}
{
"permissions": {
"allow": [
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git branch *)",
"Bash(npm list *)",
"Bash(bun pm ls *)"
]
}
}
{
"permissions": {
"allow": [
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git branch *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git push *)",
"Bash(git pull *)",
"Bash(git fetch *)",
"Bash(git checkout *)",
"Bash(git merge *)",
"Bash(git rebase *)"
]
}
}
{
"permissions": {
"allow": [
"Bash(gh pr *)",
"Bash(gh run *)",
"Bash(gh issue *)",
"Bash(gh workflow *)"
]
}
}
{
"permissions": {
"allow": [
"Bash(bun test *)",
"Bash(npm test *)",
"Bash(vitest *)",
"Bash(jest *)",
"Bash(biome *)",
"Bash(eslint *)",
"Bash(prettier *)"
]
}
}
{
"permissions": {
"allow": [
"Bash(pre-commit *)",
"Bash(gitleaks *)",
"Bash(trivy *)"
]
}
}
mkdir -p .claude
cat > .claude/settings.json << 'EOF'
{
"permissions": {
"allow": [
"Bash(git status *)",
"Bash(git diff *)",
"Bash(npm run *)"
]
}
}
EOF
echo ".claude/settings.local.json" >> .gitignore
cat > .claude/settings.local.json << 'EOF'
{
"permissions": {
"allow": [
"Bash(docker *)"
]
}
}
EOF
| Context | Command |
|---------|---------|
| View project settings | cat .claude/settings.json \| jq '.permissions' |
| View user settings | cat ~/.claude/settings.json \| jq '.permissions' |
| Check merged permissions | Review effective settings in Claude Code |
| Validate JSON | cat .claude/settings.json \| jq . |
Settings merge with this priority (highest wins):
.claude/settings.local.json (local).claude/settings.json (project)~/.claude/settings.json (user)| Syntax | Meaning |
|--------|---------|
| Bash(cmd *) | Match cmd with any arguments |
| Bash(cmd arg *) | Match cmd arg with any following |
| Bash(./script.sh *) | Match specific script |
Block specific commands:
{
"permissions": {
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(chmod 777 *)"
]
}
}
| Error | Cause | Fix |
|-------|-------|-----|
| Permission denied | Pattern doesn't match | Add more specific pattern |
| Shell operator blocked | Contains &&, \|, etc. | Use script wrapper |
| Settings not applied | Wrong file location | Check path and syntax |
| JSON parse error | Invalid JSON | Validate with jq . |
Bash(git status *) over Bash&& and \| workflowstools
Scaffold a new ComfyUI custom-node repo (pyproject, CI, release-please, vitest+pytest, JS extension skeleton) in the picker/gesture vein. Use when bootstrapping or init-ing a comfyui node pack.
tools
Orchestrate a ComfyUI node pack from idea to registry: scaffold, create + seed the repo, open the gitops adoption PR. Use when releasing or spinning up a new comfyui node pack.
testing
macOS EndpointSecurity/EDR high CPU & battery drain. Use when Kandji ESF / XProtect pegs a core; trace the exec storm via powermetrics + eslogger.
development
odiff pixel-by-pixel image diffing. Use when comparing screenshots, detecting visual regressions, diffing before/after PNGs, asserting golden images.