agentleFS
spence-growsspence-grows/claude-skills/skills/setup-project-permissions/SKILL.md

setup-project-permissions

Skill0 starsChanged 5 months agoMITView on GitHub

Use when the user wants to stop being prompted for bash, web search/fetch, or file-edit operations in a project, set up .claude/settings.local.json with their default no-prompt allow list, copy permissions from another project, or get the same blanket allows they have elsewhere applied to the current repo.

The file

We split this skill into the rules it gives an agent

8 rules. About 0 are common, 2 are distinctive, and 6 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    When NOT to use:

    line 22
  2. Very specific:

    Check target: Verify the user is in a project root (look for .git or package.json).

    line 29
  3. Very specific:

    Read existing: If the file exists, Read it.

    line 31
  4. Very specific:

    Verify gitignore: Check .gitignore for .claude/settings.local.json or .claude/settings.local*.

    line 32
  5. Very specific:

    Write: Write the merged JSON back, pretty-printed with 2-space indent.

    line 34
  6. Very specific:

    Refuse if settings.local.json is tracked by git: Run git check-ignore -v .claude/settings.local.json — if it returns no match, stop and …

    line 100
  7. Very specific:

    Preserve formatting on existing keys: Use Edit (not Write) when the file already exists and only the allow array needs updating.

    line 101
  8. Distinctive:

    When you say "add X to my default permissions" or "I always want Y allowed everywhere," update the Canonical allow list section of this …

    line 115

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Setup Project Permissions

Overview

One-shot config skill that ensures the current project's .claude/settings.local.json contains your canonical no-prompt allow list — broad blanket permissions (Bash, Web, file edits) plus the MCP servers and Skills you always-allow.

Always writes to settings.local.json, never settings.json — the local file is gitignored by default, so blanket permissions stay personal and never leak into team config.

When to use

  • "Set up permissions for this project"
  • "Stop prompting me for bash/web/edit"
  • "Apply my default permissions here"
  • "Copy the permissions I have in [other project] over"
  • Starting work in a fresh clone or new repo

When NOT to use:

  • Adding a single narrow permission ("allow gh pr merge") — just edit settings.local.json directly or use update-config.
  • Configuring hooks, env vars, or other settings.json fields — that's update-config.
  • Removing/tightening permissions — this skill only adds.

Workflow

  1. Check target. Verify the user is in a project root (look for .git or package.json). If not, ask which directory.
  2. Locate file. Path is <repo-root>/.claude/settings.local.json. Create the .claude/ directory if missing.
  3. Read existing. If the file exists, Read it. If not, treat existing allow as [].
  4. Verify gitignore. Check .gitignore for .claude/settings.local.json or .claude/settings.local*. If neither matches, surface this to the user before writing — blanket permissions in a tracked file would leak.
  5. Merge. Union the existing allow array with the canonical list below. Preserve all existing entries (project-specific paths, API-token commands, etc. stay put). Dedupe by exact string match.
  6. Write. Write the merged JSON back, pretty-printed with 2-space indent. Preserve other top-level keys (additionalDirectories, hooks, etc.) untouched.
  7. Report. Print a short summary: N entries added, M already present, total now K. Mention if .gitignore needed attention.

Canonical allow list

{
  "permissions": {
    "allow": [
      "Bash(*)",
      "WebSearch",
      "WebFetch",
      "Edit(**)",
      "Write(**)",
      "MultiEdit(**)",
      "NotebookEdit(**)",
      "Read(**)",

      "mcp__plugin_context-mode_context-mode__ctx_execute",
      "mcp__plugin_context-mode_context-mode__ctx_batch_execute",
      "mcp__plugin_context-mode_context-mode__ctx_execute_file",
      "mcp__plugin_context-mode_context-mode__ctx_fetch_and_index",
      "mcp__plugin_context-mode_context-mode__ctx_search",
      "mcp__plugin_context-mode_context-mode__ctx_upgrade",

      "mcp__plugin_claude-mem_mcp-search__smart_search",
      "mcp__plugin_claude-mem_mcp-search__smart_outline",

      "mcp__claude_ai_Notion__notion-search",
      "mcp__claude_ai_Notion__notion-fetch",
      "mcp__claude_ai_Notion__notion-create-pages",
      "mcp__claude_ai_Notion__notion-create-view",
      "mcp__claude_ai_Notion__notion-update-page",

      "Skill(gsd-resume-work)",
      "Skill(gsd-resume-work:*)",
      "Skill(superpowers:subagent-driven-development)",
      "Skill(superpowers:subagent-driven-development:*)",
      "Skill(superpowers:brainstorming)",
      "Skill(superpowers:brainstorming:*)",
      "Skill(superpowers:writing-plans)",
      "Skill(superpowers:writing-plans:*)",
      "Skill(schedule)",
      "Skill(schedule:*)"
    ]
  }
}

Quick reference

GroupEntriesWhy blanket
BashBash(*)You run scripts/builds/tooling constantly; per-command prompts kill flow
WebWebSearch, WebFetchResearch is always allowed
File editsEdit(**), Write(**), MultiEdit(**), NotebookEdit(**), Read(**)You work across the whole tree
context-mode MCP6 toolsDefault research/exec path in his global CLAUDE.md
claude-mem MCPsmart_search, smart_outlineMemory recall
Notion MCPsearch, fetch, create-pages, create-view, update-pageDefault Notion workflow
Skillsgsd-resume-work, superpowers:{brainstorming, writing-plans, subagent-driven-development}, scheduleSkills he invokes routinely

Safety rails

  • Never write to settings.json (the committed file). Always settings.local.json.
  • Never strip existing entries — only add. The user has project-specific paths and tokens in there.
  • Never include API tokens or secrets in the canonical list. If you see one in existing entries, leave it alone; just don't add new ones.
  • Refuse if settings.local.json is tracked by git. Run git check-ignore -v .claude/settings.local.json — if it returns no match, stop and warn the user that adding Bash(*) to a tracked file gives every collaborator the same blanket. Offer to add the gitignore rule first.
  • Preserve formatting on existing keys. Use Edit (not Write) when the file already exists and only the allow array needs updating; this avoids reformatting additionalDirectories or other sections.

Common mistakes

MistakeFix
Writing to settings.json instead of settings.local.jsonAlways target .local. Blanket permissions are personal.
Replacing the existing allow array instead of mergingUnion, dedupe by exact string. Existing entries stay.
Adding the list without checking .gitignoreRun git check-ignore -v first; warn if tracked.
Copy-pasting API-token-bearing commands across projectsTokens are project-scoped; don't carry them.
Updating without telling the user what changedAlways report: "added N, already had M, total K."

Updating the canonical list

When you say "add X to my default permissions" or "I always want Y allowed everywhere," update the Canonical allow list section of this file. The list is the source of truth — next invocation in any project pulls the new entry.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.