Claude Code Configuration¶
Claude Code reads configuration from a layered set of files. claude-harnesses ships content for each layer.
Layers (high precedence first)¶
- Project local:
.claude/settings.local.json(gitignored). - Project shared:
.claude/settings.json(committed). - User:
~/.claude/settings.json. - Plugin components installed via
/plugin install. - Built-in defaults.
What goes where¶
| Content | Where | Why |
|---|---|---|
| Permissions presets | .claude/settings.json (project-shared) |
Same posture for everyone on the repo |
| Personal hook overrides | .claude/settings.local.json |
Don't make your teammates inherit your kill-switches |
| Hooks from a plugin | Auto-merged when plugin installs | Stays in sync with plugin updates |
| MCP server config | .mcp.json |
Shared so the team's tool surface matches |
| Skills | .claude/skills/<name>/ (committed) or via plugin |
Skills are workflow content; share them |
| Subagents | .claude/agents/<name>.md (committed) or via plugin |
Same |
| Slash commands | .claude/commands/<name>.md (committed) or via plugin |
Same |
| CLAUDE.md | repo root | Auto-loaded by Claude Code |
Auto-loaded files¶
CLAUDE.mdat repo root — always loaded.~/.claude/CLAUDE.md— your personal global preamble..claude/rules/*.md— additional rule files (loaded via theRead/instruction loader).
Practical setup¶
Most projects want this:
- Run
bash /path/to/claude-harnesses/scripts/install.sh --target . --pack safety --pack verification --pack pr-guardian --claude-md strict --settings default --ledger. - Commit the result.
- Add
.claude/settings.local.jsonto.gitignore(it usually already is). - Each contributor picks personal kill-switches in
settings.local.json.