#!/usr/bin/env bash set -euo pipefail DEFAULT_REPO_URL="https://git.ikuban.com/server/htsy-skill.git" REPO_URL="${HTSY_SKILL_REPO_URL:-$DEFAULT_REPO_URL}" SOURCE_DIR="" DEST_DIR="${HTSY_SKILL_DEST:-}" SKILLS_DIR="${AGENT_SKILLS_DIR:-}" AGENT="${HTSY_SKILL_AGENT:-}" TMP_DIR="" TMP_DEST="" usage() { cat <<'USAGE' Install the htsy agent skill. Usage: scripts/install-htsy-skill.sh --agent claude|claude-project|codex [--source PATH] scripts/install-htsy-skill.sh --dest PATH [--source PATH] scripts/install-htsy-skill.sh --skills-dir PATH [--source PATH] Options: --source PATH Path to the htsy skill directory. Defaults to ./htsy when run from this repository. --agent NAME Install target: claude, claude-project, or codex. --dest PATH Exact destination skill directory, for example /path/to/skills/htsy. --skills-dir PATH Parent skills directory. The installer writes PATH/htsy. --repo URL Repository URL used when ./htsy is not available. -h, --help Show this help. Environment: AGENT_SKILLS_DIR Parent skills directory. The installer writes AGENT_SKILLS_DIR/htsy. CODEX_HOME Codex home directory when --agent codex is used. CLAUDE_HOME Claude home directory when --agent claude is used. HTSY_SKILL_AGENT Default value for --agent. HTSY_SKILL_REPO_URL Repository URL fallback. HTSY_SKILL_DEST Destination skill directory. USAGE } while [ "$#" -gt 0 ]; do case "$1" in --source) SOURCE_DIR="${2:-}" shift 2 ;; --dest) DEST_DIR="${2:-}" shift 2 ;; --skills-dir) SKILLS_DIR="${2:-}" shift 2 ;; --agent) AGENT="${2:-}" shift 2 ;; --repo) REPO_URL="${2:-}" shift 2 ;; -h|--help) usage exit 0 ;; *) echo "Unknown option: $1" >&2 usage >&2 exit 2 ;; esac done if [ -z "$DEST_DIR" ]; then if [ -n "$SKILLS_DIR" ]; then DEST_DIR="$SKILLS_DIR/htsy" else case "$AGENT" in claude|claude-user) DEST_DIR="${CLAUDE_HOME:-$HOME/.claude}/skills/htsy" ;; claude-project) DEST_DIR="$PWD/.claude/skills/htsy" ;; codex) DEST_DIR="${CODEX_HOME:-$HOME/.codex}/skills/htsy" ;; "") echo "Specify --agent claude|claude-project|codex, --skills-dir, or --dest." >&2 usage >&2 exit 2 ;; *) echo "Unknown agent: $AGENT" >&2 usage >&2 exit 2 ;; esac fi fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cleanup() { if [ -n "$TMP_DEST" ]; then rm -rf "$TMP_DEST" fi if [ -n "$TMP_DIR" ]; then rm -rf "$TMP_DIR" fi } trap cleanup EXIT if [ -z "$SOURCE_DIR" ]; then if [ -f "$REPO_ROOT/htsy/SKILL.md" ]; then SOURCE_DIR="$REPO_ROOT/htsy" else if ! command -v git >/dev/null 2>&1; then echo "git is required when the local htsy/ directory is unavailable." >&2 exit 1 fi TMP_DIR="$(mktemp -d)" git clone --depth 1 "$REPO_URL" "$TMP_DIR/htsy-skill" SOURCE_DIR="$TMP_DIR/htsy-skill/htsy" fi fi if [ ! -f "$SOURCE_DIR/SKILL.md" ]; then echo "Invalid source: $SOURCE_DIR does not contain SKILL.md" >&2 exit 1 fi DEST_PARENT="$(dirname "$DEST_DIR")" mkdir -p "$DEST_PARENT" TMP_DEST="$DEST_PARENT/.htsy-install.$$" rm -rf "$TMP_DEST" mkdir -p "$TMP_DEST" cp -R "$SOURCE_DIR/." "$TMP_DEST/" rm -rf "$DEST_DIR" mv "$TMP_DEST" "$DEST_DIR" TMP_DEST="" echo "Installed htsy skill to: $DEST_DIR" echo "Verify: $DEST_DIR/SKILL.md"