Commit d5795b9c8fd0

Vincent Demeester <vincent@sbr.pm>
2026-02-18 16:09:16
refactor(dots): clean up Makefile
Removed ~40 lines of redundant manual symlink rules that the pattern rules already handle. Organized targets into logical sections and moved stranded rules back before .DEFAULT_GOAL.
1 parent 7804c0f
Changed files (1)
dots/Makefile
@@ -17,6 +17,8 @@ $(call rule.define,~/.config,$(dotfiles)/config)
 $(call rule.define,~/.pi,$(dotfiles)/pi)
 $(call rule.define,~/bin,$(dotfiles)/bin)
 
+##@ Desktop
+
 all += niri
 niri : ~/.config/niri/config.kdl
 
@@ -26,84 +28,34 @@ emacs : ~/.config/emacs
 all += nvim
 nvim : ~/.config/nvim
 
-all += claude-skills
-claude-skills : ~/.config/claude/skills
+##@ Claude Code
 
-all += claude-agents claude-settings claude-hooks claude-plugins claude-statusline claude-compat
+all += claude-skills claude-agents claude-settings claude-hooks claude-plugins claude-statusline claude-compat
+claude-skills : ~/.config/claude/skills
 claude-agents : ~/.config/claude/agents
 claude-settings : ~/.config/claude/settings.json
 claude-hooks : ~/.config/claude/hooks
 claude-plugins : ~/.config/claude/plugins/session-manager
 claude-statusline : ~/.config/claude/statusline.sh
-claude-compat : ~/.claude
-
-all += lazyworktree
-lazyworktree : ~/.config/lazyworktree/config.yaml
-
-all += ntfy-config ntfy-scripts
-ntfy-config : ~/.config/ntfy/client.yml
-ntfy-scripts : ~/.config/ntfy/handle-notification.sh ~/.config/ntfy/acknowledge-notification.sh ~/.config/ntfy/ntfy-update-config
-
-all += xmpp-research-bot
-xmpp-research-bot : ~/.config/xmpp-research-bot/commands.yaml
-
-all += aichat-config aichat-genconf aichat-roles
-aichat-config : ~/.config/aichat/config.yaml
-aichat-genconf : ~/.config/aichat/genconf.py
-aichat-roles : ~/.config/aichat/roles
-
-all += lazypr
-lazypr : ~/.config/lazypr/config.toml
-
-all += gh-news
-gh-news : ~/.config/gh-news/config.toml
-
-all += github-notif-manager
-github-notif-manager : ~/.config/github-notif-manager/config.yaml
-
-all += git-template copilot-hooks opencode-plugin pi-agent pi-agent-settings pi-agent-auth agent-skills agent-skill-manager-bin ai-config
-git-template : ~/.config/git/template
-copilot-hooks : ~/.config/copilot-hooks
-opencode-plugin : ~/.config/opencode/plugin
-pi-agent : ~/.pi/agent/extensions ~/.pi/agent/agents ~/.pi/agent/AGENTS.md ~/.pi/agent/README.md ~/.pi/agent/keybindings.json ~/.pi/agent/modes.json ~/.pi/agent/models.json ~/.pi/agent/sessions
-pi-agent-settings : pi-agent
-	@$(dotfiles)/pi/agent/ensure-settings.sh
-pi-agent-auth : pi-agent
-	@$(dotfiles)/pi/agent/ensure-auth.sh
-agent-skills : ~/.config/agent-skills
-agent-skill-manager-bin : ~/bin/agent-skill-manager
-ai-config : ~/.config/ai/skills ~/.config/ai/path-policies.json
-
-# Agent skill manager tool
-~/bin/agent-skill-manager : $(dotfiles)/config/agent-skills/agent-skill-manager force
-	@echo "→ Linking $(dotfiles)/config/agent-skills/agent-skill-manager → ~/bin/agent-skill-manager"
-	@mkdir -p ~/bin
-	@ln -snf $(dotfiles)/config/agent-skills/agent-skill-manager ~/bin/agent-skill-manager
 
 # Backward compatibility: symlink ~/.claude to ~/.config/claude
+claude-compat : ~/.claude
 ~/.claude : force
 	@echo "→ Creating backward compatibility symlink: ~/.claude -> ~/.config/claude"
 	@mkdir -p ~/.config
 	@ln -snf ~/.config/claude ~/.claude
 
-# Pi agent configuration - symlink individual files into pi's runtime directory
+##@ Pi Agent
 # Pi manages: ~/.pi/agent/{auth.json,settings.json}
-# We provide: extensions/, AGENTS.md, README.md
-# Sessions are symlinked to ai-sync for syncthing sharing
-~/.pi/agent/extensions : force
-	@echo "→ Linking $(dotfiles)/pi/agent/extensions -> ~/.pi/agent/extensions"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/extensions ~/.pi/agent/extensions
+# We provide everything else via the ~/.pi pattern rule.
+# Sessions are special: redirected to ai-sync for syncthing sharing.
 
-~/.pi/agent/AGENTS.md : force
-	@echo "→ Linking $(dotfiles)/pi/agent/AGENTS.md -> ~/.pi/agent/AGENTS.md"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/AGENTS.md ~/.pi/agent/AGENTS.md
-
-~/.pi/agent/README.md : force
-	@echo "→ Linking $(dotfiles)/pi/agent/README.md -> ~/.pi/agent/README.md"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/README.md ~/.pi/agent/README.md
+all += pi-agent pi-agent-settings pi-agent-auth
+pi-agent : ~/.pi/agent/extensions ~/.pi/agent/agents ~/.pi/agent/AGENTS.md ~/.pi/agent/README.md ~/.pi/agent/keybindings.json ~/.pi/agent/modes.json ~/.pi/agent/models.json ~/.pi/agent/sessions
+pi-agent-settings : pi-agent
+	@$(dotfiles)/pi/agent/ensure-settings.sh
+pi-agent-auth : pi-agent
+	@$(dotfiles)/pi/agent/ensure-auth.sh
 
 ~/.pi/agent/sessions : force
 	@echo "→ Linking ~/.local/share/ai-sync/pi-sessions -> ~/.pi/agent/sessions"
@@ -115,41 +67,70 @@ ai-config : ~/.config/ai/skills ~/.config/ai/path-policies.json
 	fi
 	@ln -snf ~/.local/share/ai-sync/pi-sessions ~/.pi/agent/sessions
 
-# Unified AI agent config - symlink skills to claude skills (shared)
-# Later can move to dots/config/ai/skills/ as canonical location
+##@ AI Shared Config
+
+all += agent-skills agent-skill-manager-bin ai-config
+agent-skills : ~/.config/agent-skills
+ai-config : ~/.config/ai/skills ~/.config/ai/path-policies.json
+
+# Skills shared with claude via cross-link
 ~/.config/ai/skills : force
 	@echo "→ Symlinking ~/.config/ai/skills -> ~/.config/claude/skills (shared)"
 	@mkdir -p ~/.config/ai
 	@ln -snf ~/.config/claude/skills ~/.config/ai/skills
 
-# Path validation policies for AI agents
-~/.config/ai/path-policies.json : $(dotfiles)/config/ai/path-policies.json force
-	@echo "→ Linking $(dotfiles)/config/ai/path-policies.json -> ~/.config/ai/path-policies.json"
-	@mkdir -p ~/.config/ai
-	@ln -snf $(dotfiles)/config/ai/path-policies.json ~/.config/ai/path-policies.json
+# agent-skill-manager lives under config/agent-skills, not bin/
+agent-skill-manager-bin : ~/bin/agent-skill-manager
+~/bin/agent-skill-manager : $(dotfiles)/config/agent-skills/agent-skill-manager force
+	@echo "→ Linking $< → $@"
+	@mkdir -p ~/bin
+	@ln -snf $< $@
 
-# Generate ntfy client.yml from template with passage secrets injected
+##@ Dev Tools
+
+all += git-template copilot-hooks opencode-plugin lazyworktree lazypr
+git-template : ~/.config/git/template
+copilot-hooks : ~/.config/copilot-hooks
+opencode-plugin : ~/.config/opencode/plugin
+lazyworktree : ~/.config/lazyworktree/config.yaml
+lazypr : ~/.config/lazypr/config.toml
+
+##@ GitHub
+
+all += gh-news github-notif-manager
+gh-news : ~/.config/gh-news/config.toml
+github-notif-manager : ~/.config/github-notif-manager/config.yaml
+
+##@ Notifications
+
+all += ntfy-config ntfy-scripts
+ntfy-scripts : ~/.config/ntfy/handle-notification.sh ~/.config/ntfy/acknowledge-notification.sh ~/.config/ntfy/ntfy-update-config
+
+# Generated from template with passage secrets
+ntfy-config : ~/.config/ntfy/client.yml
 ~/.config/ntfy/client.yml : $(dotfiles)/config/ntfy/client.yml.in $(dotfiles)/config/ntfy/ntfy-update-config force
-	@echo "⚙️  Generating $$@ from template with passage secrets"
+	@echo "⚙️  Generating $@ from template with passage secrets"
 	@$(dotfiles)/config/ntfy/ntfy-update-config
 
-# Generate aichat config.yaml from template with dynamic model fetching
+##@ Chat / LLM
+
+all += aichat-config aichat-genconf aichat-roles xmpp-research-bot
+aichat-genconf : ~/.config/aichat/genconf.py
+aichat-roles : ~/.config/aichat/roles
+xmpp-research-bot : ~/.config/xmpp-research-bot/commands.yaml
+
+# Generated from template with dynamic model fetching
+aichat-config : ~/.config/aichat/config.yaml
 ~/.config/aichat/config.yaml : $(dotfiles)/config/aichat/config.yaml.in $(dotfiles)/config/aichat/genconf.py force
-	@echo "⚙️  Generating ~/.config/aichat/config.yaml with dynamic models and passage secrets"
+	@echo "⚙️  Generating $@ with dynamic models and passage secrets"
 	@mkdir -p ~/.config/aichat
-	@$(dotfiles)/config/aichat/genconf.py > ~/.config/aichat/config.yaml 2>/dev/null
+	@$(dotfiles)/config/aichat/genconf.py > $@ 2>/dev/null
+
+##@ Meta
 
 all : $(all) pi-extensions-install
 	@echo "✅ All dotfiles installed!"
 
-help:
-	@echo "Available targets:"
-	@echo "  all                    - Install all dotfiles and pi extensions (default)"
-	@echo "  pi-extensions-install  - Install npm dependencies for pi agent extensions"
-	@echo ""
-	@echo "Individual components:"
-	@$(foreach target,$(all),echo "  $(target)";)
-
 # Install npm dependencies for pi agent extensions
 pi-extensions-install:
 	@echo "⚡ Installing npm dependencies for pi agent extensions..."
@@ -162,26 +143,13 @@ pi-extensions-install:
 	done
 	@echo "✅ Pi agent extensions dependencies installed!"
 
+help:
+	@echo "Available targets:"
+	@echo "  all                    - Install all dotfiles and pi extensions (default)"
+	@echo "  pi-extensions-install  - Install npm dependencies for pi agent extensions"
+	@echo ""
+	@echo "Individual components:"
+	@$(foreach target,$(all),echo "  $(target)";)
+
 .PHONY: all $(all) pi-extensions-install help
 .DEFAULT_GOAL := all
-
-
-~/.pi/agent/keybindings.json : force
-	@echo "→ Linking $(dotfiles)/pi/agent/keybindings.json -> ~/.pi/agent/keybindings.json"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/keybindings.json ~/.pi/agent/keybindings.json
-
-~/.pi/agent/modes.json : force
-	@echo "→ Linking $(dotfiles)/pi/agent/modes.json -> ~/.pi/agent/modes.json"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/modes.json ~/.pi/agent/modes.json
-
-~/.pi/agent/models.json : force
-	@echo "→ Linking $(dotfiles)/pi/agent/models.json -> ~/.pi/agent/models.json"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/models.json ~/.pi/agent/models.json
-
-~/.pi/agent/agents : force
-	@echo "→ Linking $(dotfiles)/pi/agent/agents -> ~/.pi/agent/agents"
-	@mkdir -p ~/.pi/agent
-	@ln -snf $(dotfiles)/pi/agent/agents ~/.pi/agent/agents