blob: e42662e71965d839a85e869fb9cd702424c1cfab (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
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: 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)
@echo "Skills:"
@for skill in $(SKILLS); do \
if [ -L "$(SKILLS_DIR)/$$skill" ]; then \
echo " skip $$skill (already linked)"; \
elif [ -e "$(SKILLS_DIR)/$$skill" ]; then \
echo " WARN $$skill exists and is not a symlink — skipping"; \
else \
ln -s "$(CURDIR)/$$skill" "$(SKILLS_DIR)/$$skill"; \
echo " link $$skill → $(SKILLS_DIR)/$$skill"; \
fi \
done
@echo ""
@echo "Rules:"
@for rule in $(RULES); do \
name=$$(basename $$rule); \
if [ -L "$(RULES_DIR)/$$name" ]; then \
echo " skip $$name (already linked)"; \
elif [ -e "$(RULES_DIR)/$$name" ]; then \
echo " WARN $$name exists and is not a symlink — skipping"; \
else \
ln -s "$(CURDIR)/$$rule" "$(RULES_DIR)/$$name"; \
echo " link $$name → $(RULES_DIR)/$$name"; \
fi \
done
@echo ""
@echo "done"
uninstall:
@echo "Skills:"
@for skill in $(SKILLS); do \
if [ -L "$(SKILLS_DIR)/$$skill" ]; then \
rm "$(SKILLS_DIR)/$$skill"; \
echo " rm $$skill"; \
else \
echo " skip $$skill (not a symlink)"; \
fi \
done
@echo ""
@echo "Rules:"
@for rule in $(RULES); do \
name=$$(basename $$rule); \
if [ -L "$(RULES_DIR)/$$name" ]; then \
rm "$(RULES_DIR)/$$name"; \
echo " rm $$name"; \
else \
echo " skip $$name (not a symlink)"; \
fi \
done
@echo ""
@echo "done"
list:
@echo "Skills:"
@for skill in $(SKILLS); do \
if [ -L "$(SKILLS_DIR)/$$skill" ]; then \
echo " ✓ $$skill (installed)"; \
else \
echo " - $$skill"; \
fi \
done
@echo ""
@echo "Rules:"
@for rule in $(RULES); do \
name=$$(basename $$rule); \
if [ -L "$(RULES_DIR)/$$name" ]; then \
echo " ✓ $$name (installed)"; \
else \
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)"
|