001 — Install hooks into settings.local.json, not settings.json
Date: 2026-04-16 Status: Accepted
Context
When stride (or any tool) installs hooks into a target repo, it needs to write hook configuration somewhere in .claude/. There are two options:
settings.json— committed to version control, shared by the teamsettings.local.json— gitignored, local to the developer's machine
Previously, the installer merged hook config into settings.json.
Decision
Install hook config into settings.local.json.
This applies to stride, codefu, and any future tool that installs hooks into a target repo.
Why
settings.json belongs to the target repo. Writing into it means:
- Git noise — every install/uninstall creates a diff in committed files
- Merge conflicts — if the target repo updates its own hooks, installs from the toolchain collide
- Coupling — the target repo's committed settings become dependent on which tools each developer has installed
settings.local.json is gitignored — it's the developer's machine-local layer. Installing there means:
- No changes to version-controlled files
- Each developer can install/uninstall independently
- The target repo's committed hooks remain untouched
Claude Code concatenates and deduplicates hook arrays across settings.json and settings.local.json, so hooks from both files run together. There is no clobbering.
Consequences
- The install script writes to
.claude/settings.local.jsoninstead of.claude/settings.json - The uninstall script strips hooks from
.claude/settings.local.jsoninstead of.claude/settings.json - Target repos that previously had stride hooks in
settings.jsonshould move them tosettings.local.json(or re-run the installer)