From 18fcaf9f27d03849487078b30f667c3b574e6554 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 19 Apr 2026 11:57:23 -0500 Subject: feat: add per-project language bundles + elisp ruleset 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= PROJECT= [FORCE=1] make install-elisp PROJECT= [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. --- Makefile | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'Makefile') diff --git a/Makefile b/Makefile index 92933b7..e42662e 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,27 @@ SKILLS_DIR := $(HOME)/.claude/skills RULES_DIR := $(HOME)/.claude/rules SKILLS := c4-analyze c4-diagram debug add-tests respond-to-review review-pr fix-issue security-check RULES := $(wildcard claude-rules/*.md) +LANGUAGES := $(notdir $(wildcard languages/*)) -.PHONY: install uninstall list +.PHONY: help install uninstall list \ + install-lang list-languages install-elisp + +help: + @echo "rulesets — Claude Code skills, rules, and language bundles" + @echo "" + @echo " Global install (symlinks into ~/.claude/):" + @echo " make install - Install skills and rules globally" + @echo " make uninstall - Remove the symlinks" + @echo " make list - Show install status" + @echo "" + @echo " Per-project language rulesets:" + @echo " make install-lang LANG= PROJECT= [FORCE=1]" + @echo " make install-elisp PROJECT= [FORCE=1] (shortcut)" + @echo " make list-languages - Show available language bundles" + @echo "" + @echo " FORCE=1 overwrites an existing CLAUDE.md (other files always overwrite)." + @echo "" + @echo "Available languages: $(LANGUAGES)" install: @mkdir -p $(SKILLS_DIR) $(RULES_DIR) @@ -77,3 +96,17 @@ list: echo " - $$name"; \ fi \ done + +# --- Per-project language rulesets --- + +list-languages: + @echo "Available language rulesets (languages/):" + @for lang in $(LANGUAGES); do echo " - $$lang"; done + +install-lang: + @test -n "$(LANG)" || { echo "ERROR: set LANG= (try: make list-languages)"; exit 1; } + @test -n "$(PROJECT)" || { echo "ERROR: set PROJECT="; exit 1; } + @bash scripts/install-lang.sh "$(LANG)" "$(PROJECT)" "$(FORCE)" + +install-elisp: + @$(MAKE) install-lang LANG=elisp PROJECT="$(PROJECT)" FORCE="$(FORCE)" -- cgit v1.2.3