#!/usr/bin/env bash set -euo pipefail PROJECT_ROOT=$(cd "$(dirname "$0")/.." && pwd) SSH_HOST=${CRYPSTIE_DEPLOY_HOST:-crypstie@sergeych.net} REMOTE_ROOT=${CRYPSTIE_SKILLS_ROOT:-/home/crypstie/agent-skills} TOKEN_FILE=${CRYPSTIE_NPM_TOKEN_FILE:-${PROJECT_ROOT}/.node_token} DEPLOY_NPM=1 DEPLOY_SKILLS=1 usage() { echo "Usage: scripts/deploy [--npm-only | --skills-only]" } case "${1:-}" in "") ;; --npm-only) DEPLOY_SKILLS=0 ;; --skills-only) DEPLOY_NPM=0 ;; -h|--help) usage; exit 0 ;; *) usage >&2; exit 2 ;; esac cd "$PROJECT_ROOT" npm test STAGING=$(mktemp -d) trap 'rm -rf -- "$STAGING"' EXIT if [[ "$DEPLOY_NPM" == 1 ]]; then PACKAGE_NAME=$(node -p "require('./package.json').name") PACKAGE_VERSION=$(node -p "require('./package.json').version") if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version --json >/dev/null 2>&1; then echo "npm: ${PACKAGE_NAME}@${PACKAGE_VERSION} is already published; skipping" else if [[ ! -r "$TOKEN_FILE" ]]; then echo "npm: token file is not readable: $TOKEN_FILE" >&2 exit 1 fi TOKEN=$(tr -d '\r\n' < "$TOKEN_FILE") if [[ -z "$TOKEN" ]]; then echo "npm: token file is empty: $TOKEN_FILE" >&2 exit 1 fi NPMRC="$STAGING/npmrc" (umask 077; printf '//registry.npmjs.org/:_authToken=%s\n' "$TOKEN" > "$NPMRC") npm publish --access public --userconfig "$NPMRC" unset TOKEN rm -f -- "$NPMRC" fi fi if [[ "$DEPLOY_SKILLS" == 1 ]]; then DISCOVERY="$STAGING/discovery" node scripts/build-skill-discovery.js "$DISCOVERY" >/dev/null REMOTE_STAGING="${REMOTE_ROOT}.incoming" ssh "$SSH_HOST" "mkdir -p '$REMOTE_STAGING'" rsync -az --delete "$DISCOVERY/" "$SSH_HOST:$REMOTE_STAGING/" ssh "$SSH_HOST" "set -e; chmod -R a+rX '$REMOTE_STAGING'; rm -rf '${REMOTE_ROOT}.previous'; if [ -d '$REMOTE_ROOT' ]; then mv '$REMOTE_ROOT' '${REMOTE_ROOT}.previous'; fi; mv '$REMOTE_STAGING' '$REMOTE_ROOT'" echo "skills: deployed to https://crypstie.com/.well-known/agent-skills/index.json" fi