diff options
| author | Craig Jennings <c@cjennings.net> | 2026-04-19 12:46:59 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-04-19 12:46:59 -0500 |
| commit | 129b13f85ede90b50ac9e2131bddf30659fa57a9 (patch) | |
| tree | f1c09b852b3ebb9de2312779d5796127dafa8134 /CLAUDE.md | |
| parent | 72a52a14455335be97a7d2b4820ec86c259d9236 (diff) | |
| download | chime-129b13f85ede90b50ac9e2131bddf30659fa57a9.tar.gz chime-129b13f85ede90b50ac9e2131bddf30659fa57a9.zip | |
chore: add Claude Code ruleset via ~/code/rulesets install-elisp
Installs the Elisp ruleset from the rulesets repo:
- CLAUDE.md (project instructions template)
- .claude/rules/ (testing, verification, elisp, elisp-testing)
- .claude/hooks/validate-el.sh (check-parens + byte-compile + run
matching tests on every .el edit via PostToolUse)
- .claude/settings.json (permission allowlist + hook wiring)
- githooks/pre-commit (secret scan + staged-file paren check)
core.hooksPath set to githooks/ so the pre-commit activates automatically.
Hooks use \$CLAUDE_PROJECT_DIR with a script-relative fallback, so a
fresh clone works without path edits.
.gitignore extended with personal-override entries (settings.local.json,
.cache/) and byte-compile artifacts (*.elc, *.eln).
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..9b95e4f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,66 @@ +# CLAUDE.md + +## Project + +Elisp project. Customize this section with your own description, layout, and conventions. + +**Typical layout:** +- `init.el`, `early-init.el` — entry points (Emacs config projects) +- `modules/*.el` — feature modules +- `tests/test-*.el` — ERT unit tests +- `tests/testutil-*.el` — shared test fixtures and mocks + +## Build & Test Commands + +If the project has a Makefile, document targets here. Common pattern: + +```bash +make test # All tests +make test-file FILE=tests/test-foo.el # One file +make test-name TEST=pattern # Match test names +make validate-parens # Balanced parens in modules +make validate-modules # Load all modules to verify they compile +make compile # Byte-compile (writes .elc) +make lint # checkdoc + package-lint + elisp-lint +``` + +Alternative build tools: `eldev`, `cask`, or direct `emacs --batch` invocations. + +## Language Rules + +See rule files in `.claude/rules/`: +- `elisp.md` — code style and patterns +- `elisp-testing.md` — ERT conventions +- `verification.md` — verify-before-claim-done discipline + +## Git Workflow + +- Conventional commit prefixes: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:` +- Pre-commit hook in `githooks/` scans for secrets and runs `check-parens` on staged `.el` files +- Activate on fresh clone: `git config core.hooksPath githooks` + +## Problem-Solving Approach + +Investigate before fixing. When diagnosing a bug: +1. Read the relevant module and trace what actually happens +2. Identify the root cause, not a surface symptom +3. Write a failing test that captures the correct behavior +4. Fix, then re-run tests + +## Testing Discipline + +TDD is the default: write a failing test before any implementation. If you can't write the test, you don't yet understand the change. Details in `.claude/rules/elisp-testing.md`. + +## Editing Discipline + +A PostToolUse hook runs `check-parens` + `byte-compile-file` on every `.el` file after Edit/Write/MultiEdit. Byte-compile warnings (free variables, wrong argument counts) are signal — read them. + +Prefer Write over cumulative Edits for nontrivial new code. Small functions (under 15 lines) are near-impossible to get wrong; deeply nested code is where paren errors hide. + +## What Not to Do + +- Don't add features beyond what was asked +- Don't refactor surrounding code when fixing a bug +- Don't add comments to code you didn't change +- Don't create abstractions for one-time operations +- Don't commit `.env` files, credentials, or API keys — pre-commit hook catches common patterns but isn't a substitute for care |
