#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
AGENTS_DIR="${REPO_ROOT}/.agents"
usage() {
cat <<'EOF'
Usage:
bash .agents/setup_agent.sh <agent-name>
Examples:
bash .agents/setup_agent.sh codex
bash .agents/setup_agent.sh claude
bash .agents/setup_agent.sh cursor
bash .agents/setup_agent.sh trae
The command creates .<agent-name>/ as a local adapter directory, links shared
agent content into it, and excludes that generated directory from Git.
EOF
}
die() {
echo "$*" >&2
exit 1
}
agent_name="${1:-}"
if [[ -z "${agent_name}" || "${agent_name}" == "-h" || "${agent_name}" == "--help" ]]; then
usage
exit 0
fi
if [[ ! "${agent_name}" =~ ^[A-Za-z0-9_-]+$ ]]; then
die "Invalid agent name: ${agent_name}"
fi
adapter_dir="${REPO_ROOT}/.${agent_name}"
exclude_entry="/.${agent_name}/"
exclude_file="${REPO_ROOT}/.git/info/exclude"
mkdir -p "${adapter_dir}"
link_or_replace() {
local source="$1"
local target="$2"
if [[ -L "${target}" ]]; then
rm "${target}"
elif [[ -e "${target}" ]]; then
die "Refusing to overwrite existing path: ${target}"
fi
ln -s "${source}" "${target}"
}
link_or_replace "../.agents/skills" "${adapter_dir}/skills"
link_or_replace "../.agents/knowledge" "${adapter_dir}/knowledge"
if [[ -d "${REPO_ROOT}/.git" ]]; then
mkdir -p "$(dirname "${exclude_file}")"
touch "${exclude_file}"
if ! grep -Fxq "${exclude_entry}" "${exclude_file}"; then
printf '%s\n' "${exclude_entry}" >> "${exclude_file}"
fi
fi