aboutsummaryrefslogtreecommitdiff
path: root/Makefile
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)"