Development record
Sensible Permissions From Day One
Press Release
abcd detects your project type and pre-populates
.claude/settings.local.jsonwith sensible permissions. When/abcd:ahoy installruns in a Python project, you get pip/pytest/uv permissions out of the box. Swift project?swift build/swift test/xcodebuild. Go?go test/go build/golangci-lint. The permission-prompt friction during the first hour of using a new abcd-managed project drops to near zero — you spend time on the work, not on approving safe operations."Every fresh project I'd hit the same dozen permission prompts before getting to actual work," said Henry, junior developer. "abcd handed me a settings.local.json that just worked. I edited a few entries; I didn't have to start from scratch."
Why This Matters
abcd's /abcd:ahoy doesn't touch .claude/settings.local.json. Users start with whatever permissions they had (often nothing project-specific) and accumulate them by repeatedly approving Bash commands. This is friction that adds up, especially for autonomous-mode work where every prompt interrupts a run-seam loop or Claude Code session.
~/.claude/templates/settings.local.json.template from abcd v0 already shows the pattern: a base permission set + per-language additions. Lift the pattern; detect the project type during ahoy; install a sensible starting set with transparent confirm.
What's In Scope
- Project-type detection (file-based heuristics:
pyproject.toml→ Python,Package.swift→ Swift,go.mod→ Go,package.json→ TypeScript/JavaScript,Cargo.toml→ Rust,Dockerfile→ Docker) - Per-type permission templates shipping in the plugin
/abcd:ahoystep: detect type, show user the proposed.claude/settings.local.jsoncontent, transparent confirm- Conflict handling: if
.claude/settings.local.jsonexists, offer merge / replace / skip - Templates committed and versioned as plugin assets embedded under
internal/
What's Out of Scope
- Auto-detecting non-language project shapes (CI/CD repos, doc repos, config repos) — too many heuristics
- Updating existing settings.local.json on plugin upgrade (one-shot at install only)
- Permission-prompt analytics (covered by a different concern)
Acceptance Criteria
BDD format, per
itd-1-acceptance-gates. These gates are checked byintent-fidelity-reviewerwhen this intent moves toshipped/.
- Given a fresh repo containing
pyproject.tomland no existing.claude/settings.local.json, when the user runs/abcd:ahoy installand accepts the proposed permissions, then.claude/settings.local.jsonis created with the Python permission template (pip, pytest, uv, ruff) AND the install summary lists exactly which entries were added. - Given the same repo already has a
.claude/settings.local.jsonwith custom entries, when/abcd:ahoy installruns, then the user is offered three explicit options (merge / replace / skip) AND the chosen action is recorded in the install report. - Given a multi-language repo (e.g.,
pyproject.tomlANDpackage.json), when/abcd:ahoy installdetects project type, then both Python and TypeScript permission templates are offered as a merged proposal AND the user can deselect either before applying. - Given a Swift repo (
Package.swiftpresent), when/abcd:ahoy installruns, then the resultingsettings.local.jsonincludesswift build,swift test,xcodebuild, plus the base permissions common across all project types. - Given the user wants to inspect what would be installed without committing, when they run
/abcd:ahoy dry-run, then the proposedsettings.local.jsoncontent is printed to stdout and no file is written. - Given an abcd-managed project on a later plugin upgrade, when the user runs
/abcd:ahoy install(idempotent re-install), then the existingsettings.local.jsonis NOT modified — permission templates are install-time only, not auto-upgraded — AND a hint is shown about how to re-apply the latest template manually if desired.
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the security-isolation SOTA note.
- The host now calls the layer this intent fills the fragile one: Bash patterns "that try to constrain command arguments are fragile", a deny rule "doesn't match the same program by path or inside
sh -c", and "For filesystem and network enforcement that doesn't depend on the command text, use sandboxing"; an allow rule also "approves an unsandboxed retry";Write(path)rules "never match", onlyEdit(path)andRead(path)do (Claude Code permissions). - The file's lifecycle:
.claude/settings.local.jsonis "You, in this one project only"; precedence managed >--settings> local > project > user, list keys merge; standing approvals are written at the repository root "resolved through worktrees to the main checkout"; the host adds the file to the user's global git excludes (Claude Code settings). - Each harness has a different file and grammar: Codex
sandbox_modeandapproval_policywith writable roots; opencodepermissionrules inopencode.jsonwhere "Most permissions default to"allow"" and.envreads are denied; Gemini CLI sandbox profiles (Codex sandboxing; opencode permissions; Gemini CLI sandbox). - Project-type detection has a reference: Linguist detects by extension, filename and heuristics and honours
.gitattributeslinguist-languageoverrides (Linguist).
Path 2: one abcd-owned project-type profile (tools, build and test commands) rendered to each harness's file by an adapter, preferring the host's sandbox with auto-allow to prefix allows where it exists; the renderer is the seam. The draft as written names one host's private file, which the host-agnostic rule and the reach to other harnesses both argue against. The independent fit-challenge runs at plan time.
Open Questions
- (SOTA 2026-10-23) Whether a template should allow network tools at all (
curl,wget), given the egress intent exists to narrow exactly that. - What's the right default base permission set across all project types?
- How granular is the project-type detection (Python with FastAPI vs Python with PyTorch — different needs)?
- Where does the user see what was added — in the ahoy summary, in
.claude/settings.local.jsonitself with comments, both?
Audit Notes
Empty. Populated by intent-fidelity-reviewer when intent moves to shipped/.
Frontmatter
| id | itd-18 |
|---|---|
| type | intent |
| lifecycle | drafts |
| kind | standalone |
| severity | minor |
.abcd/development/intents/drafts/itd-18-permission-template-per-project-type.md
open on GitHub ↗ · commit history ↗
Referenced by1
- itd-21Start a New Project With abcd Conventionsbuilt on by