#!/usr/bin/env bash # Symlink centralized skills/commands/hooks/context into each agent's config dir. # For non-Nix machines (NixOS boxes use nix/home.nix instead). # Idempotent. Backs up any pre-existing real dir once to .bak. set -euo pipefail REPO="$(cd "$(dirname "$0")/.." && pwd)" # targets: agent config skill roots. Claude Code reads ~/.claude/skills, # Codex reads ~/.agents/skills. Both consume the same SKILL.md dirs. CLAUDE_SKILLS="$HOME/.claude/skills" CODEX_SKILLS="$HOME/.agents/skills" CLAUDE_CMDS="$HOME/.claude/commands" # commands are Claude-only; Codex ignores CLAUDE_HOOKS="$HOME/.claude/hooks" # hooks are Claude-only CLAUDE_HOME="$HOME/.claude" # CLAUDE.md fragments, pulled in via @name.md AGENTS_HOME="$HOME/.agents" # Codex global config root # Per-FILE links, never a whole-dir link: ~/.claude/hooks and ~/.claude itself hold # machine-local files this repo does not own, and a dir symlink would hide them. # backups go OUTSIDE the skill dirs — a *.bak left inside gets discovered as a # duplicate skill by both Claude Code and Codex. BACKUP="$HOME/.agent-skills-backup" link() { # link local src="$1" dst="$2" if [ -e "$dst" ] && [ ! -L "$dst" ]; then mkdir -p "$BACKUP" mv "$dst" "$BACKUP/$(basename "$(dirname "$dst")")-$(basename "$dst").bak" echo "backed up existing $dst -> $BACKUP/" fi ln -sfn "$src" "$dst" echo "linked $dst -> $src" } mkdir -p "$CLAUDE_SKILLS" "$CODEX_SKILLS" "$CLAUDE_CMDS" "$CLAUDE_HOOKS" "$AGENTS_HOME" for d in "$REPO"/skills/*/; do name="$(basename "$d")" link "$d" "$CLAUDE_SKILLS/$name" link "$d" "$CODEX_SKILLS/$name" done for f in "$REPO"/commands/*.md; do [ -e "$f" ] || continue link "$f" "$CLAUDE_CMDS/$(basename "$f")" done for f in "$REPO"/hooks/*.py "$REPO"/hooks/*.sh; do [ -e "$f" ] || continue link "$f" "$CLAUDE_HOOKS/$(basename "$f")" done for f in "$REPO"/claude-md/*.md; do [ -e "$f" ] || continue link "$f" "$CLAUDE_HOME/$(basename "$f")" done # Codex reads ~/.agents/AGENTS.md and has no @import, so the fragments are # concatenated into a real file. Re-run this script after editing claude-md/. rm -f "$AGENTS_HOME/AGENTS.md" { echo "" echo cat "$REPO/claude-md/operating.md" echo cat "$REPO/claude-md/writing.md" } > "$AGENTS_HOME/AGENTS.md" echo "generated $AGENTS_HOME/AGENTS.md" echo "done." echo "hooks still need wiring in ~/.claude/settings.json — see hooks/README.md"