aboutsummaryrefslogtreecommitdiff
path: root/CLAUDE.md
blob: 3bce8b23c8462779fba7d982fc2ab6d042af0463 (plain)
1
2
3
4
5
6
7
8
9
10
11
# rulesets — project invariants

## Canonical vs mirror

`claude-templates/.ai/` is canonical; `.ai/` at the repo root is a committed mirror kept in sync by `scripts/sync-check.sh` (enforced by `githooks/pre-commit`). Always edit the canonical side, then run `scripts/sync-check.sh --fix` and commit both together. An edit made only in the `.ai/` mirror gets reverted by the next sync — it has happened, and the revert is silent.

Same shape for language bundles: `languages/` is canonical; the `.claude/` copies installed into consuming projects are synced output, never edited in place.

## Tests

`make test` runs pytest + ERT + bats. Bats suites live in `scripts/tests/` and `.ai/scripts/tests/` and are glob-discovered, so new test files are picked up without Makefile edits.