Analyze Permissions
Purpose
Analyze accumulated permissions in settings.local.json and suggest smart wildcard patterns to consolidate into shared configuration. Reduces permission sprawl by replacing specific entries with safe wildcard patterns.
Arguments (parsed from user input)
- action: What to do -
analyze (default), apply, or cleanup
Example invocations:
/ai-analyze-permissions → analyze and suggest patterns
/ai-analyze-permissions apply → apply suggested patterns to shared config
/ai-analyze-permissions cleanup → just run the cleanup script
Process
Step 1: Read Current Permissions
Read these files:
- Project-local:
<project-root>/.claude/settings.local.json - accumulated "Always allow" permissions (per-project)
- Global:
~/.claude/settings.json - shared/base permissions across all projects
Note: settings.local.json is project-specific. Each repo has its own at <repo>/.claude/settings.local.json. The global ~/.claude/settings.json is shared across all projects.
Step 2: Analyze Patterns
For each entry in settings.local.json:
Check if already covered - Is there a wildcard in settings.json that covers this?
Bash(git commit -m "Fix bug") is covered by Bash(git commit:*)
Bash(curl https://api.example.com) is covered by Bash(curl:*)
Identify pattern opportunities - Group similar commands:
- Multiple
kubectl commands → suggest Bash(kubectl:*)
- Multiple
docker commands → suggest Bash(docker:*)
- Multiple WebFetch for same domain → suggest
WebFetch(https://example.com/*)
Decide global vs local - Where should the pattern live?
- Global (
~/.claude/settings.json): General-purpose tools used across projects (npx, python, docker compose, etc.)
- Local (
settings.local.json): Project-specific commands, or write operations you only want for that project (e.g., git push for a personal repo)
Assess safety - Consider if the pattern is safe for auto-approval:
- Read-only commands: Generally safe
- Commands with side effects: Flag for review
- Overly broad patterns: Warn about security implications
Step 3: Present Analysis
Output a structured report:
## Permission Analysis
### Settings Overview
- settings.local.json: X entries
- settings.json: Y entries (Z wildcards)
### Already Covered (can be removed)
These entries in settings.local.json are redundant:
| Entry | Covered by |
|-------|------------|
| Bash(git commit -m "...") | Bash(git commit:*) |
### Suggested New Patterns
These patterns would consolidate multiple specific entries:
| Pattern | Covers | Scope | Safety |
|---------|--------|-------|--------|
| Bash(kubectl:*) | 4 entries | global | Safe (read-heavy) |
| Bash(docker exec:*) | 3 entries | local | Review (can modify) |
### Uncategorized
These entries don't fit a pattern (one-offs):
- Bash(some-specific-command)
Step 4: Handle Actions
Based on the action argument:
analyze (default):
- Present the report
- Ask if user wants to apply suggestions
apply:
- For each suggested pattern, ask for confirmation
- Add approved global patterns to
~/.claude/settings.json by editing the permissions.allow array
- Add approved local patterns to
<project-root>/.claude/settings.json (project-level, not local)
- Run the cleanup script to remove now-redundant entries from
settings.local.json
cleanup:
- Run
<project-root>/.claude/skills/ai-analyze-permissions/scripts/cleanup-settings-local.sh
Step 5: Apply Patterns (if applying)
When adding patterns:
- Read the target settings file (
~/.claude/settings.json for global, <project-root>/.claude/settings.json for project)
- Add new entries to the
permissions.allow JSON array
- Write the updated JSON back (preserving all other fields)
- Run cleanup to remove now-redundant entries:
<project-root>/.claude/skills/ai-analyze-permissions/scripts/cleanup-settings-local.sh
Important: Adding patterns to settings.json never removes existing entries. The cleanup script only cleans settings.local.json. To clean settings.json itself, manually remove redundant entries.
Pattern Safety Guidelines
Safe to auto-approve (commonly needed):
Bash(npx:*), Bash(node:*), Bash(npm:*), Bash(pnpm:*) - JS/Node tooling
Bash(python:*), Bash(python3:*), Bash(pip:*) - Python tooling
Bash(cargo :*), Bash(cd :* && cargo:*) - Rust tooling
Bash(docker compose:*), Bash(docker ps:*) - Docker
Bash(kubectl get:*), Bash(kubectl describe:*) - K8s read operations
Bash(git:*) subcommands (add, commit, log, diff, etc.)
Bash(gh:*) read operations (pr view, issue list, api, etc.)
Bash(chmod:*), Bash(ln:*), Bash(wc:*), Bash(which:*) - basic utilities
Bash(ssh:*), Bash(tmux:*), Bash(bash:*), Bash(zsh:*) - shell/system
WebFetch(domain:*), WebSearch - web access
Require review (side effects):
Bash(kubectl delete:*), Bash(kubectl apply:*)
Bash(docker rm:*), Bash(docker exec:*)
Bash(aws s3 rm:*)
Bash(rm:*), Bash(mv:*)
Bash(git push:*) - consider keeping per-project in local settings
Never auto-approve:
Bash(sudo:*)
Bash(chmod 777:*)
- Patterns that could leak secrets
$ARGUMENTS
1---2name: ai-analyze-permissions3description: Use when Claude Code permissions have accumulated in settings.local.json and you want to audit, consolidate, or clean up tool permission patterns.4---5
6# Analyze Permissions
7
8## Purpose
9
10Analyze accumulated permissions in `settings.local.json` and suggest smart wildcard patterns to consolidate into shared configuration. Reduces permission sprawl by replacing specific entries with safe wildcard patterns.
11
12## Arguments (parsed from user input)
13
14- **action**: What to do - `analyze` (default), `apply`, or `cleanup`
15
16Example invocations:
17
18- `/ai-analyze-permissions` → analyze and suggest patterns
19- `/ai-analyze-permissions apply` → apply suggested patterns to shared config
20- `/ai-analyze-permissions cleanup` → just run the cleanup script
21
22## Process
23
24### Step 1: Read Current Permissions
25
26Read these files:
27
281. **Project-local**: `<project-root>/.claude/settings.local.json` - accumulated "Always allow" permissions (per-project)
292. **Global**: `~/.claude/settings.json` - shared/base permissions across all projects
30
31Note: `settings.local.json` is project-specific. Each repo has its own at `<repo>/.claude/settings.local.json`. The global `~/.claude/settings.json` is shared across all projects.
32
33### Step 2: Analyze Patterns
34
35For each entry in `settings.local.json`:
36
371. **Check if already covered** - Is there a wildcard in `settings.json` that covers this?
38 - `Bash(git commit -m "Fix bug")` is covered by `Bash(git commit:*)`
39 - `Bash(curl https://api.example.com)` is covered by `Bash(curl:*)`
40
412. **Identify pattern opportunities** - Group similar commands:
42 - Multiple `kubectl` commands → suggest `Bash(kubectl:*)`
43 - Multiple `docker` commands → suggest `Bash(docker:*)`
44 - Multiple WebFetch for same domain → suggest `WebFetch(https://example.com/*)`
45
463. **Decide global vs local** - Where should the pattern live?
47 - **Global (`~/.claude/settings.json`)**: General-purpose tools used across projects (`npx`, `python`, `docker compose`, etc.)
48 - **Local (`settings.local.json`)**: Project-specific commands, or write operations you only want for that project (e.g., `git push` for a personal repo)
49
504. **Assess safety** - Consider if the pattern is safe for auto-approval:
51 - Read-only commands: Generally safe
52 - Commands with side effects: Flag for review
53 - Overly broad patterns: Warn about security implications
54
55### Step 3: Present Analysis
56
57Output a structured report:
58
59```markdown
60## Permission Analysis
61
62### Settings Overview
63- settings.local.json: X entries
64- settings.json: Y entries (Z wildcards)
65
66### Already Covered (can be removed)
67These entries in settings.local.json are redundant:
68
69| Entry | Covered by |
70|-------|------------|
71| Bash(git commit -m "...") | Bash(git commit:*) |
72
73### Suggested New Patterns
74These patterns would consolidate multiple specific entries:
75
76| Pattern | Covers | Scope | Safety |
77|---------|--------|-------|--------|
78| Bash(kubectl:*) | 4 entries | global | Safe (read-heavy) |
79| Bash(docker exec:*) | 3 entries | local | Review (can modify) |
80
81### Uncategorized
82These entries don't fit a pattern (one-offs):
83
84- Bash(some-specific-command)
85```
86
87### Step 4: Handle Actions
88
89Based on the action argument:
90
91**analyze (default):**
92
93- Present the report
94- Ask if user wants to apply suggestions
95
96**apply:**
97
98- For each suggested pattern, ask for confirmation
99- Add approved global patterns to `~/.claude/settings.json` by editing the `permissions.allow` array
100- Add approved local patterns to `<project-root>/.claude/settings.json` (project-level, not local)
101- Run the cleanup script to remove now-redundant entries from `settings.local.json`
102
103**cleanup:**
104
105- Run `<project-root>/.claude/skills/ai-analyze-permissions/scripts/cleanup-settings-local.sh`
106
107### Step 5: Apply Patterns (if applying)
108
109When adding patterns:
110
1111. Read the target settings file (`~/.claude/settings.json` for global, `<project-root>/.claude/settings.json` for project)
1122. Add new entries to the `permissions.allow` JSON array
1133. Write the updated JSON back (preserving all other fields)
1144. Run cleanup to remove now-redundant entries: `<project-root>/.claude/skills/ai-analyze-permissions/scripts/cleanup-settings-local.sh`
115
116**Important**: Adding patterns to `settings.json` never removes existing entries. The cleanup script only cleans `settings.local.json`. To clean `settings.json` itself, manually remove redundant entries.
117
118## Pattern Safety Guidelines
119
120**Safe to auto-approve (commonly needed):**
121
122- `Bash(npx:*)`, `Bash(node:*)`, `Bash(npm:*)`, `Bash(pnpm:*)` - JS/Node tooling
123- `Bash(python:*)`, `Bash(python3:*)`, `Bash(pip:*)` - Python tooling
124- `Bash(cargo :*)`, `Bash(cd :* && cargo:*)` - Rust tooling
125- `Bash(docker compose:*)`, `Bash(docker ps:*)` - Docker
126- `Bash(kubectl get:*)`, `Bash(kubectl describe:*)` - K8s read operations
127- `Bash(git:*)` subcommands (add, commit, log, diff, etc.)
128- `Bash(gh:*)` read operations (pr view, issue list, api, etc.)
129- `Bash(chmod:*)`, `Bash(ln:*)`, `Bash(wc:*)`, `Bash(which:*)` - basic utilities
130- `Bash(ssh:*)`, `Bash(tmux:*)`, `Bash(bash:*)`, `Bash(zsh:*)` - shell/system
131- `WebFetch(domain:*)`, `WebSearch` - web access
132
133**Require review (side effects):**
134
135- `Bash(kubectl delete:*)`, `Bash(kubectl apply:*)`
136- `Bash(docker rm:*)`, `Bash(docker exec:*)`
137- `Bash(aws s3 rm:*)`
138- `Bash(rm:*)`, `Bash(mv:*)`
139- `Bash(git push:*)` - consider keeping per-project in local settings
140
141**Never auto-approve:**
142
143- `Bash(sudo:*)`
144- `Bash(chmod 777:*)`
145- Patterns that could leak secrets
146
147$ARGUMENTS