36372f85b2
Nine bullets to six. Cut what the harness now ships by default: the scope-discipline bullet, "create/modify files freely" (subsumed), and the standalone refuse-dangerous-tasks bullet (restated the injection rule with examples, now merged into it). Adds progress-claim grounding for long unattended runs, per the Fable 5 guide. Codex gets both fragments now — link.sh concatenates them into ~/.agents/AGENTS.md, since Codex has no @import.
73 lines
2.5 KiB
Bash
Executable File
73 lines
2.5 KiB
Bash
Executable File
#!/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 <name>.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 <src> <dst>
|
|
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 "<!-- generated by agent-skills/bin/link.sh from claude-md/ — do not edit -->"
|
|
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"
|