<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rulesets/scripts, branch main</title>
<subtitle>Claude Code skills, rules, and language bundles
</subtitle>
<id>https://git.cjennings.net/rulesets/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/rulesets/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/'/>
<updated>2026-04-19T17:58:16+00:00</updated>
<entry>
<title>feat(makefile): add deps, diff, lint targets and fzf-picker fallback</title>
<updated>2026-04-19T17:58:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-19T17:58:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=acc3e5a532e433ce6a93afe54a040d0270f42b39'/>
<id>urn:sha1:acc3e5a532e433ce6a93afe54a040d0270f42b39</id>
<content type='text'>
Ports useful quality-of-life targets from DeepSat's coding-rulesets
Makefile, adapted to this repo's two-scope (global + per-project)
structure.

New targets:
  make deps                       Install claude, jq, fzf, ripgrep,
                                  emacs via brew/apt/pacman. Idempotent
                                  (skips already-present tools). For
                                  new machines and VMs.

  make diff LANG=&lt;lang&gt; [PROJECT=&lt;path&gt;]
                                  Show unified diff between repo source
                                  and installed copies in a target
                                  project. CLAUDE.md excluded (seed-
                                  only, diverges by design).

  make lint                       Validate ruleset structure: top-level
                                  headings, 'Applies to:' headers on
                                  rule files, shebangs and exec bits on
                                  hook scripts.

Infrastructure:
  - Help migrated to awk-parsed ##@/## pattern; new targets document
    themselves via a single trailing `## ...` comment.
  - fzf-picker fallback: if PROJECT= is unset, install-lang and diff
    launch fzf over local .git dirs under $HOME. Keeps PROJECT=&lt;path&gt;
    for scripts/automation; only interactive users hit fzf.

  scripts/diff-lang.sh  Walks the file list the installer would copy,
                        diffs each against the target.
  scripts/lint.sh       Standalone ruleset structure validator.
</content>
</entry>
<entry>
<title>fix(install): don't duplicate gitignore header on re-run</title>
<updated>2026-04-19T17:46:32+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-19T17:46:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=8d4495d4bc62fc4695617e6d5cc62b47a6d43820'/>
<id>urn:sha1:8d4495d4bc62fc4695617e6d5cc62b47a6d43820</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor: generalize testing.md, split Python specifics, DRY install</title>
<updated>2026-04-19T17:36:04+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-19T17:36:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=019db5f9677902ba02d703a8554667d1b6e88f6b'/>
<id>urn:sha1:019db5f9677902ba02d703a8554667d1b6e88f6b</id>
<content type='text'>
claude-rules/testing.md is now language-agnostic (TDD principles, test
categories, coverage targets, anti-patterns). Scope header widened to
**/*. Python-specific content (pytest, fixtures, parametrize, anyio,
Django DB testing) moved to languages/python/claude/rules/python-testing.md.

Added languages/python/ bundle (rules only so far; no CLAUDE.md template
or hooks yet — Python validation tooling differs from Elisp). Added
install-python shortcut to the Makefile.

Updated scripts/install-lang.sh to copy claude-rules/*.md into each
target project's .claude/rules/. Bundles no longer need to carry their
own verification.md copy — deleted languages/elisp/claude/rules/verification.md.
Single source of truth in claude-rules/, fans out via install.

Elisp-testing.md now references testing.md as its base (matches the
python-testing.md pattern).
</content>
</entry>
<entry>
<title>feat: add per-project language bundles + elisp ruleset</title>
<updated>2026-04-19T16:57:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-19T16:57:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=18fcaf9f27d03849487078b30f667c3b574e6554'/>
<id>urn:sha1:18fcaf9f27d03849487078b30f667c3b574e6554</id>
<content type='text'>
Introduces a second install mode alongside the existing global symlinks:
per-project language bundles that copy a language-specific Claude Code
setup (rules, hooks, settings, pre-commit) into a target project.

Layout additions:
  languages/elisp/       - Emacs Lisp bundle (rules, hooks, settings, CLAUDE.md)
  scripts/install-lang.sh - shared install logic

Makefile additions:
  make help              - unified help text
  make install-lang LANG=&lt;lang&gt; PROJECT=&lt;path&gt; [FORCE=1]
  make install-elisp PROJECT=&lt;path&gt; [FORCE=1]   (shortcut)
  make list-languages    - show available bundles

Elisp bundle contents:
  - CLAUDE.md template (seed on first install, preserved on update)
  - .claude/rules/elisp.md, elisp-testing.md, verification.md
  - .claude/hooks/validate-el.sh (check-parens, byte-compile, run matching tests)
  - .claude/settings.json (permission allowlist, hook wiring)
  - githooks/pre-commit (secret scan + staged-file paren check)
  - gitignore-add.txt (append .claude/settings.local.json)

Hooks use \$CLAUDE_PROJECT_DIR with a script-relative fallback, so the
same bundle works on any machine or clone path. Install activates git
hooks via core.hooksPath=githooks automatically. Re-running install is
idempotent; CLAUDE.md is never overwritten without FORCE=1.
</content>
</entry>
</feed>
