Files
htsy-skill/scripts/install-htsy-skill.sh

149 lines
3.6 KiB
Bash
Executable File

#!/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"