149 lines
3.6 KiB
Bash
Executable File
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"
|