#!/usr/bin/env bash # claude-his-fetch — pull current His context from a private host over SSH. # The public package ships zero infrastructure context; the runbook lives on a # host you control and is fetched into a per-user cache that ~/.claude/ symlinks # to. Re-run periodically (cron, or on demand) to refresh. set -euo pipefail HOST="${HIS_CONTEXT_HOST:-hertz}" SRC="${HIS_CONTEXT_PATH:-/opt/his-context/}" CACHE="${HIS_CONTEXT_CACHE:-${HOME}/.cache/claude-his-agent}" mkdir -p "${CACHE}" echo "claude-his-fetch: ${HOST}:${SRC} -> ${CACHE}" if ! command -v rsync >/dev/null 2>&1; then echo "claude-his-fetch: rsync not found; install rsync (apt/pacman) and retry" >&2 exit 3 fi # Reuses the user's existing SSH credentials; trust boundary is whatever # already authorises the user on $HIS_CONTEXT_HOST. rsync -a --delete -e ssh "${HOST}:${SRC}" "${CACHE}/" # Sanity — these are the two files ~/.claude symlinks expect to exist. test -r "${CACHE}/agent.md" || { echo "fetch failed: missing agent.md" >&2; exit 2; } test -r "${CACHE}/skill/SKILL.md" || { echo "fetch failed: missing skill/SKILL.md" >&2; exit 2; } agent_bytes=$(wc -c <"${CACHE}/agent.md") skill_bytes=$(wc -c <"${CACHE}/skill/SKILL.md") echo "claude-his-fetch: OK (${agent_bytes}B agent, ${skill_bytes}B skill)"