aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-19 11:57:23 -0500
committerCraig Jennings <c@cjennings.net>2026-04-19 11:57:23 -0500
commit18fcaf9f27d03849487078b30f667c3b574e6554 (patch)
tree67e3ede717fbf9fbfe10c46042451e15abeeb91f /Makefile
parentf8c593791ae051b07dba2606c18f1deb7589825e (diff)
downloadrulesets-18fcaf9f27d03849487078b30f667c3b574e6554.tar.gz
rulesets-18fcaf9f27d03849487078b30f667c3b574e6554.zip
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=<lang> PROJECT=<path> [FORCE=1] make install-elisp PROJECT=<path> [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.
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile35
1 files changed, 34 insertions, 1 deletions
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=<lang> PROJECT=<path> [FORCE=1]"
+ @echo " make install-elisp PROJECT=<path> [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=<language> (try: make list-languages)"; exit 1; }
+ @test -n "$(PROJECT)" || { echo "ERROR: set PROJECT=<path>"; exit 1; }
+ @bash scripts/install-lang.sh "$(LANG)" "$(PROJECT)" "$(FORCE)"
+
+install-elisp:
+ @$(MAKE) install-lang LANG=elisp PROJECT="$(PROJECT)" FORCE="$(FORCE)"