aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile46
1 files changed, 44 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 450dc1a..fdbb70b 100644
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,8 @@ SKILLS_DIR := $(HOME)/.claude/skills
RULES_DIR := $(HOME)/.claude/rules
HOOKS_DIR := $(HOME)/.claude/hooks
CLAUDE_DIR := $(HOME)/.claude
+CODEX_DIR := $(HOME)/.codex
+CODEX_HOOKS := $(CURDIR)/.codex/hooks.json
LOCAL_BIN := $(HOME)/.local/bin
AI_LAUNCHER := $(CURDIR)/claude-templates/bin/ai
SKILLS := $(patsubst %/SKILL.md,%,$(wildcard */SKILL.md))
@@ -15,7 +17,7 @@ HOOKS := $(wildcard hooks/*.sh hooks/*.py)
OPTIN_HOOKS := hooks/destructive-bash-confirm.py
DEFAULT_HOOKS := $(filter-out $(OPTIN_HOOKS),$(HOOKS))
CLAUDE_CONFIG := $(wildcard .claude/*.json) $(wildcard .claude/.*.json) $(wildcard .claude/*.sh)
-LANGUAGES := $(notdir $(wildcard languages/*))
+LANGUAGES := $(notdir $(patsubst %/,%,$(wildcard languages/*/)))
TEAMS := $(notdir $(wildcard teams/*))
PDFTOOLS_VENV ?= $(HOME)/.local/venvs/pdftools
@@ -220,6 +222,30 @@ install: ## Symlink skills, rules, config, hooks, and bin scripts into place
fi \
fi
@echo ""
+ @echo "Agent entry (codex):"
+ @mkdir -p "$(CODEX_DIR)"
+ @if [ -L "$(CODEX_DIR)/AGENTS.md" ]; then \
+ echo " skip AGENTS.md (already linked)"; \
+ elif [ -e "$(CODEX_DIR)/AGENTS.md" ]; then \
+ echo " WARN AGENTS.md exists and is not a symlink — skipping"; \
+ else \
+ ln -s "$(CURDIR)/claude-templates/AGENTS.md" "$(CODEX_DIR)/AGENTS.md"; \
+ echo " link AGENTS.md → $(CODEX_DIR)/AGENTS.md"; \
+ fi
+ @if [ -L "$(CODEX_DIR)/hooks.json" ]; then \
+ target=$$(readlink "$(CODEX_DIR)/hooks.json"); \
+ if [ "$$target" = "$(CODEX_HOOKS)" ]; then \
+ echo " skip hooks.json (already linked)"; \
+ else \
+ echo " WARN hooks.json links elsewhere ($$target) — skipping"; \
+ fi; \
+ elif [ -e "$(CODEX_DIR)/hooks.json" ]; then \
+ echo " WARN hooks.json exists and is not a symlink — skipping"; \
+ else \
+ ln -s "$(CODEX_HOOKS)" "$(CODEX_DIR)/hooks.json"; \
+ echo " link hooks.json → $(CODEX_DIR)/hooks.json"; \
+ fi
+ @echo ""
@echo "Hooks (default):"
@for hook in $(DEFAULT_HOOKS); do \
name=$$(basename $$hook); \
@@ -255,6 +281,15 @@ install: ## Symlink skills, rules, config, hooks, and bin scripts into place
echo " link $$name → $(LOCAL_BIN)/$$name"; \
fi \
done
+ @for link in "$(LOCAL_BIN)"/*; do \
+ [ -L "$$link" ] || continue; \
+ target=$$(readlink "$$link"); \
+ case "$$target" in "$(CURDIR)/claude-templates/bin/"*) ;; *) continue ;; esac; \
+ if [ ! -e "$$target" ]; then \
+ rm "$$link"; \
+ echo " prune $$(basename "$$link") (dangling → $$target)"; \
+ fi \
+ done
@echo ""
@echo "done"
@@ -296,6 +331,13 @@ uninstall: ## Remove global symlinks from ~/.claude/
else \
echo " skip commands (not a symlink)"; \
fi
+ @if [ -L "$(CODEX_DIR)/hooks.json" ] \
+ && [ "$$(readlink "$(CODEX_DIR)/hooks.json")" = "$(CODEX_HOOKS)" ]; then \
+ rm "$(CODEX_DIR)/hooks.json"; \
+ echo " rm codex hooks.json"; \
+ else \
+ echo " skip codex hooks.json (not our symlink)"; \
+ fi
@echo ""
@echo "ai launcher:"
@if [ -L "$(LOCAL_BIN)/ai" ]; then \
@@ -509,7 +551,7 @@ test: ## Run all test suites (pytest + ERT + bats)
echo "ert: $$(basename "$$f")"; \
emacs --batch -q -l ert -l "$$f" -f ert-run-tests-batch-and-exit; \
done
- @set -e; for f in scripts/tests/*.bats .ai/scripts/tests/*.bats; do \
+ @set -e; for f in scripts/tests/*.bats .ai/scripts/tests/*.bats languages/*/tests/*.bats; do \
[ -e "$$f" ] || continue; \
echo "bats: $$(basename "$$f")"; \
bats "$$f"; \