k-skill/korean-privacy-terms/scripts/install.sh
2026-04-20 12:06:57 +09:00

108 lines
4 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# korean-privacy-terms upstream installer.
#
# k-skill 측은 얇은 wrapper 만 유지하고, 인터뷰/렌더/설치 로직은 업스트림
# kimlawtech/korean-privacy-terms (Apache-2.0) 에 위임한다. 이 스크립트는
# scripts/upstream.pin 에 기록된 커밋 SHA 를 두 홈 디렉토리 스킬 경로
#
# ~/.claude/skills/korean-privacy-terms/upstream/
# ~/.agents/skills/korean-privacy-terms/upstream/
#
# 아래에 동일하게 체크아웃해 둔다. 레포 내부에 업스트림을 커밋하지 않으므로
# 실사용 전에는 반드시 이 스크립트를 한 번 실행해야 한다.
#
# 사용법:
# bash korean-privacy-terms/scripts/install.sh
#
# AGENTS.md 규칙에 따라 ~/.claude/skills 와 ~/.agents/skills 는 홈 디렉토리 구조
# 의 indirection(예: ~/.agents/skills 가 symlink 인 경우) 을 존중한다. 레포
# 내부에 repo-local .claude/ 또는 .agents/ 디렉토리는 생성하지 않는다.
set -euo pipefail
UPSTREAM_REPO="https://github.com/kimlawtech/korean-privacy-terms.git"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PIN_FILE="${SCRIPT_DIR}/upstream.pin"
SKILL_NAME="korean-privacy-terms"
if [[ ! -f "${PIN_FILE}" ]]; then
echo "[korean-privacy-terms] upstream.pin not found at ${PIN_FILE}" >&2
exit 1
fi
UPSTREAM_SHA="$(tr -d '[:space:]' <"${PIN_FILE}")"
if [[ ! "${UPSTREAM_SHA}" =~ ^[0-9a-f]{40}$ ]]; then
echo "[korean-privacy-terms] upstream.pin must contain a 40-char git SHA (got: ${UPSTREAM_SHA})" >&2
exit 1
fi
CACHE_DIR="${HOME}/.cache/k-skill/${SKILL_NAME}"
CLONE_DIR="${CACHE_DIR}/upstream"
mkdir -p "${CACHE_DIR}"
if [[ ! -d "${CLONE_DIR}/.git" ]]; then
echo "[korean-privacy-terms] cloning upstream into ${CLONE_DIR}"
if ! git clone --filter=blob:none "${UPSTREAM_REPO}" "${CLONE_DIR}" >&2; then
echo "" >&2
echo "[korean-privacy-terms] upstream clone failed (network required)." >&2
echo " upstream: ${UPSTREAM_REPO}" >&2
echo " 오프라인 환경에서는 이 스킬의 생성 흐름을 실행할 수 없다." >&2
echo " 네트워크를 확보한 뒤 다시 실행해달라." >&2
exit 1
fi
fi
echo "[korean-privacy-terms] syncing upstream to pinned SHA ${UPSTREAM_SHA}"
git -C "${CLONE_DIR}" fetch --tags origin "${UPSTREAM_SHA}" >&2 || git -C "${CLONE_DIR}" fetch origin >&2
git -C "${CLONE_DIR}" checkout --force --detach "${UPSTREAM_SHA}" >&2
HEAD_SHA="$(git -C "${CLONE_DIR}" rev-parse HEAD)"
if [[ "${HEAD_SHA}" != "${UPSTREAM_SHA}" ]]; then
echo "[korean-privacy-terms] HEAD (${HEAD_SHA}) does not match pinned SHA (${UPSTREAM_SHA})" >&2
exit 1
fi
# Dual-install targets. Both paths respect AGENTS.md indirection rules and do not
# introduce repo-local skill directories.
HOME_DIRS=(
"${HOME}/.claude/skills/${SKILL_NAME}"
"${HOME}/.agents/skills/${SKILL_NAME}"
)
for HOME_SKILL_DIR in "${HOME_DIRS[@]}"; do
HOME_UPSTREAM="${HOME_SKILL_DIR}/upstream"
mkdir -p "${HOME_SKILL_DIR}"
if [[ -e "${HOME_UPSTREAM}" || -L "${HOME_UPSTREAM}" ]]; then
rm -rf "${HOME_UPSTREAM}"
fi
# rsync-style copy preserves the git metadata so `git -C <path> rev-parse HEAD`
# still reports the pinned SHA after install. Prefer rsync when available;
# otherwise fall back to `cp -a` which is portable on macOS and Linux.
if command -v rsync >/dev/null 2>&1; then
rsync -a --delete "${CLONE_DIR}/" "${HOME_UPSTREAM}/"
else
cp -a "${CLONE_DIR}/" "${HOME_UPSTREAM}/"
fi
INSTALLED_SHA="$(git -C "${HOME_UPSTREAM}" rev-parse HEAD)"
if [[ "${INSTALLED_SHA}" != "${UPSTREAM_SHA}" ]]; then
echo "[korean-privacy-terms] ${HOME_UPSTREAM} HEAD (${INSTALLED_SHA}) does not match pin (${UPSTREAM_SHA})" >&2
exit 1
fi
echo "[korean-privacy-terms] installed upstream@${UPSTREAM_SHA} -> ${HOME_UPSTREAM}"
done
echo ""
echo "[korean-privacy-terms] done."
echo " pinned upstream SHA: ${UPSTREAM_SHA}"
echo " upstream repo: ${UPSTREAM_REPO}"
echo " 이 스킬이 생성하는 모든 문서는 참고용 초안이며 법률 자문이 아니다."
echo " 실서비스 배포 전 반드시 변호사 검토를 받아달라."