Optimus-claude permissions
Configures Claude Code permissions for safe agent autonomy. Creates settings.json with allow/deny rules and a path-restriction hook. Use after /optimus:init to enable autonomous agent workflows, or standalone to lock down a project's permission boundaries.
git clone https://github.com/oprogramadorreal/optimus-claude
T=$(mktemp -d) && git clone --depth=1 https://github.com/oprogramadorreal/optimus-claude "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/permissions" ~/.claude/skills/oprogramadorreal-optimus-claude-permissions && rm -rf "$T"
skills/permissions/SKILL.mdOptimus Permissions
Configure safe permission rules and a path-restriction hook so Claude Code agents can work autonomously inside the project without constant permission prompts, while blocking destructive operations outside the project.
Security Model
| Operation | Inside Project | Outside Project |
|---|---|---|
| Read/Search | Allow | Allow |
| Write/Edit | Allow | Ask user |
| Write/Edit precious unversioned file | Ask user | Ask user |
| Delete (rm/rmdir) | Allow | BLOCKED |
| Delete precious unversioned file | BLOCKED | BLOCKED |
| Git on feature branch | Allow | — |
| Git on protected branch | BLOCKED | — |
Step 1: Detect Existing Configuration
- Check if
exists. If so, read its full content — it will be preserved during merge..claude/settings.json - Check if
(or.claude/hooks/restrict-paths.sh
) already exists. Note whether this is a fresh install or an update — report this to the user in Step 5.restrict-paths.* - Check if
exists at the project root. If so, extract all MCP server names (top-level keys) for Step 4..mcp.json
Print a brief detection summary to the user: what exists, what will be created/updated.
Step 2: Create Directory Structure
mkdir -p .claude/hooks
Step 3: Install Path-Restriction Hook
Copy the hook template to the project (overwrites any existing version):
- Source:
$CLAUDE_PLUGIN_ROOT/skills/permissions/templates/hooks/restrict-paths.sh - Destination:
.claude/hooks/restrict-paths.sh
Copy the file contents exactly — do not modify the template.
Step 4: Create or Update settings.json
Use the template from
$CLAUDE_PLUGIN_ROOT/skills/permissions/templates/settings.json as the base configuration.
If .claude/settings.json
does NOT exist
.claude/settings.jsonCreate it from the template. If
.mcp.json was found in Step 1, add mcp__<server-name> entries to the permissions.allow list for each server.
If .claude/settings.json
already exists
.claude/settings.jsonMerge the template into the existing file:
-
permissions.allow — add any entries from the template that are not already present. If
was found, also add.mcp.json
entries. Never remove existing entries.mcp__<server-name> -
permissions.deny — add any entries from the template that are not already present. Then check for extra git deny patterns: collect all deny entries containing the word
(as a command, not as part of words likegit
) from both the existing settings and the template. If the existing settings have git deny entries not present in the template, list them and usegithub
— header "Git patterns", question "Your settings have extra git deny patterns that may block feature-branch workflow (commit/push) needed by /optimus:tdd: [list patterns]. Replace with the template's set?":AskUserQuestion- Replace with template set (Recommended) — "Remove extra git deny patterns, keep the template's. Branch protection is still enforced by the hook."
- Keep all — "Preserve existing patterns. Skills that need git commit/push may not work."
If Replace: remove all existing git deny entries, add the template's git deny set. Non-git deny entries are untouched. If Keep all: no changes.
-
hooks.PreToolUse — add the hook entry from the template. If a PreToolUse array already exists, append to it (avoid duplicates if an entry already references
).restrict-paths.sh -
Preserve everything else — existing
, custom sections, and any other configuration must remain untouched.hooks.PostToolUse
Merge principles
- Never remove existing allow/deny entries or hooks — except git deny patterns, which are reconciled with the user when existing patterns go beyond the template (see step 2 above)
- Never overwrite the file — read, merge, write
- The result must be valid JSON
Step 5: Verify and Report
Run through this checklist. Fix any issues before reporting.
exists and contains the hook logic.claude/hooks/restrict-paths.sh
exists and contains:.claude/settings.json
with at least the 13 tool entries from the templatepermissions.allow
with at least the 30 deny patterns from the templatepermissions.deny
with an entry referencinghooks.PreToolUserestrict-paths.sh
- If the file had existing PostToolUse hooks or other content, verify it is preserved
Report to the user:
- Files created or updated
- Number of tools in the allow list, number of deny patterns
- If MCP servers were detected, list them
- Brief security model reminder: writes outside project will prompt, deletes outside project are blocked, reads are unrestricted
- Trust model reminder: commands not on the deny list will execute without prompts inside the project (database operations, file deletions, network requests, etc.). See the skill's README for the full trust model
- Git branch protection is active — git operations (commit, push, rebase, reset, merge) are allowed on feature branches but blocked on protected branches (master, main, develop, dev, development, staging, stage, prod, production, release). Customize the
array inPROTECTED_BRANCHES.claude/hooks/restrict-paths.sh - Precious file protection is always active — the hook automatically protects well-known sensitive files (
,.env
,*.key
,*.pem
, etc.) that are not tracked by git*.sqlite - Sandboxing note: this skill provides defense-in-depth, not OS-level isolation. For full sandboxing, see the skill's README ("Where This Fits" section) which covers built-in sandboxing, devcontainers, and platform-specific recommendations
- Scan for precious unversioned files in the project:
find . -maxdepth 4 \( -name ".env*" -o -name "local.settings.json" -o -name "credentials.*" -o -name "secrets.*" -o -name "docker-compose.override.yml" -o -name "appsettings.*.json" -o -name "*keyfile*.json" -o -name "newrelic.config" -o -name "*.key" -o -name "*.pem" -o -name "*.pfx" -o -name "*.p12" -o -name "*.cert" -o -name "*.crt" -o -name "*.jks" -o -name "*.sqlite" -o -name "*.sqlite3" -o -name "*.db" -o -name "*.db-shm" -o -name "*.db-wal" -o -name "*.db-journal" -o -name "*.mdf" -o -name "*.ldf" -o -name "*.ndf" -o -name "*.bak" -o -name "*.dump" -o -name "*.sql.gz" -o -name "*.suo" -o -name "*.user" \) -not -path "./.git/*" -not -path "*/node_modules/*" -not -path "*/obj/*" -not -path "*/bin/*" 2>/dev/null- If any are found and not git-tracked, report them as protected files
- If the scan discovers unversioned files that look sensitive but do not match built-in patterns (e.g., custom config files like
), ask the user if they want to add custom patterns to theconfig.local.yaml
function inis_precious()
. Note: custom edits to this file will be replaced if the user re-runs.claude/hooks/restrict-paths.sh
. For persistent customizations, edit the template in the plugin source instead./optimus:permissions
Recommend the next step based on project state:
- If
does not exist →.claude/CLAUDE.md
to set up coding guidelines and project structure/optimus:init - If already initialized →
to establish test coverage, or/optimus:unit-test
to start developing with test-driven workflow/optimus:tdd
Tell the user: Tip: for best results, start a fresh conversation for the next skill — each skill gathers its own context from scratch.