pi-superpowers-skills/scripts/sync-upstream.sh

83 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Sync selected skills from upstream (github.com/obra/superpowers)
# Usage: ./scripts/sync-upstream.sh [--dry-run]
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"
DRY_RUN=${DRY_RUN:-false}
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=true
fi
SKILLS=(
systematic-debugging
test-driven-development
verification-before-completion
writing-plans
requesting-code-review
receiving-code-review
finishing-a-development-branch
)
echo "Fetching upstream..."
git fetch upstream --depth=1
UPSTREAM_REF="upstream/main"
CURRENT_REF="HEAD"
CHANGED=false
for skill in "${SKILLS[@]}"; do
echo ""
echo "=== Checking skills/$skill ==="
# Get list of files that differ
diff_files=$(git diff --name-only "$CURRENT_REF" "$UPSTREAM_REF" -- "skills/$skill" 2>/dev/null || true)
if [[ -z "$diff_files" ]]; then
echo " Up to date"
continue
fi
echo " Changes detected:"
echo "$diff_files" | sed 's/^/ /'
if [[ "$DRY_RUN" == true ]]; then
echo " (dry-run, skipping copy)"
CHANGED=true
continue
fi
# Checkout the entire skill directory from upstream
git checkout "$UPSTREAM_REF" -- "skills/$skill"
echo " Merged from upstream"
CHANGED=true
done
if [[ "$CHANGED" == false ]]; then
echo ""
echo "All skills up to date. Nothing to do."
exit 0
fi
if [[ "$DRY_RUN" == true ]]; then
echo ""
echo "Dry run complete. Run without --dry-run to apply changes."
exit 0
fi
# Stage everything in skills/
git add -A skills/
if git diff --cached --quiet; then
echo ""
echo "No changes to commit after merge."
exit 0
fi
echo ""
echo "Changes staged. Commit with:"
echo " git commit -m 'Sync skills from obra/superpowers upstream (v$(git describe --tags "$UPSTREAM_REF" 2>/dev/null || echo "$(git rev-parse --short "$UPSTREAM_REF")"))'"