From 73c97f3729b621c142e2707822a6d64cc23b1be0 Mon Sep 17 00:00:00 2001 From: csh Date: Thu, 22 Jan 2026 15:32:02 +0800 Subject: [PATCH] :wrench: chore(ci): centralize superpowers sync --- .gitea/ci/sync_superpowers.sh | 128 ++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 .gitea/ci/sync_superpowers.sh diff --git a/.gitea/ci/sync_superpowers.sh b/.gitea/ci/sync_superpowers.sh new file mode 100644 index 0000000..93aa0fb --- /dev/null +++ b/.gitea/ci/sync_superpowers.sh @@ -0,0 +1,128 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_DIR="${REPO_DIR:-$(pwd)}" +SUPERPOWERS_BRANCH="${SUPERPOWERS_BRANCH:-thirdparty/skill}" +SUPERPOWERS_DIR="${SUPERPOWERS_DIR:-superpowers}" +SUPERPOWERS_LIST="${SUPERPOWERS_LIST:-codex/skills/.sources/superpowers.list}" +TARGET_BRANCH="${TARGET_BRANCH:-main}" +COMMIT_AUTHOR_NAME="${COMMIT_AUTHOR_NAME:-playbook-bot}" +COMMIT_AUTHOR_EMAIL="${COMMIT_AUTHOR_EMAIL:-playbook-bot@local}" + +cd "$REPO_DIR" + +git config user.name "$COMMIT_AUTHOR_NAME" +git config user.email "$COMMIT_AUTHOR_EMAIL" + +git fetch origin "$SUPERPOWERS_BRANCH" +git fetch origin "$TARGET_BRANCH" + +tmp_dir="$(mktemp -d)" +cleanup() { + rm -rf "$tmp_dir" +} +trap cleanup EXIT + +git archive --format=tar "origin/${SUPERPOWERS_BRANCH}" "${SUPERPOWERS_DIR}/skills" | tar -xf - -C "$tmp_dir" + +tmp_skills_dir="$tmp_dir/${SUPERPOWERS_DIR}/skills" +if [ ! -d "$tmp_skills_dir" ]; then + echo "ERROR: ${SUPERPOWERS_DIR}/skills not found in ${SUPERPOWERS_BRANCH}" >&2 + exit 1 +fi + +git checkout -f "$TARGET_BRANCH" + +mkdir -p "$(dirname "$SUPERPOWERS_LIST")" + +old_list="$SUPERPOWERS_LIST" +if [ -f "$old_list" ]; then + while IFS= read -r name; do + [ -n "$name" ] || continue + rm -rf "codex/skills/$name" + done < "$old_list" +fi + +names=() +for dir in "$tmp_skills_dir"/*; do + [ -d "$dir" ] || continue + name="$(basename "$dir")" + + if [ -d "codex/skills/$name" ] && ! grep -qx "$name" "$old_list" 2>/dev/null; then + echo "ERROR: skill name conflict: $name" >&2 + exit 1 + fi + + rm -rf "codex/skills/$name" + cp -R "$dir" "codex/skills/$name" + names+=("$name") +done + +printf "%s\n" "${names[@]}" | sort > "$SUPERPOWERS_LIST" + +update_block() { + local file="$1" + local start="" + local end="" + local tmp + + tmp="$(mktemp)" + { + echo "### Third-party Skills (superpowers)" + echo "" + echo "$start" + while IFS= read -r name; do + [ -n "$name" ] || continue + echo "- $name" + done < "$SUPERPOWERS_LIST" + echo "$end" + } > "$tmp" + + if grep -q "$start" "$file"; then + awk -v start="$start" -v end="$end" -v block="$tmp" ' + BEGIN { + while ((getline line < block) > 0) { buf[++n] = line } + close(block) + inblock=0 + replaced=0 + } + { + if (!replaced && $0 == start) { + for (i=1; i<=n; i++) print buf[i] + inblock=1 + replaced=1 + next + } + if (inblock) { + if ($0 == end) { inblock=0 } + next + } + print + } + ' "$file" > "${file}.tmp" + mv "${file}.tmp" "$file" + else + echo "" >> "$file" + cat "$tmp" >> "$file" + fi + + rm -f "$tmp" +} + +update_block "SKILLS.md" + +git add codex/skills SKILLS.md "$SUPERPOWERS_LIST" + +if git diff --cached --quiet; then + echo "No changes to sync." + exit 0 +fi + +git commit -m ":package: deps(skills): sync superpowers" + +TOKEN="${WORKFLOW:-}" +if [ -n "$TOKEN" ] && [ -n "${GITHUB_SERVER_URL:-}" ] && [ -n "${GITHUB_REPOSITORY:-}" ]; then + git remote set-url origin "https://oauth2:${TOKEN}@${GITHUB_SERVER_URL#https://}/${GITHUB_REPOSITORY}.git" +fi + +git push origin "$TARGET_BRANCH"