Skill Tracer
Skills › Superpowers › subagent-driven-development › review-package

review-package

53 lines · skills/subagent-driven-development/scripts/review-package at 2ce8aa1

1#!/usr/bin/env bash
2# Generate a review package: commit list, stat summary, and the net
3# diff with extended context, written to a file the reviewer reads in one
4# call. Using the recorded per-task BASE (not HEAD~1) keeps multi-commit
5# tasks intact.
6#
7# Usage: review-package PLAN_FILE BASE HEAD [OUTFILE]
8# Default OUTFILE: <repo-root>/.superpowers/sdd/<plan-basename>/review-<base7>..<head7>.diff
9# (named per range, so a re-review after fixes gets a distinct fresh file).
10set -euo pipefail
12if [ $# -lt 3 ] || [ $# -gt 4 ]; then
13 echo "usage: review-package PLAN_FILE BASE HEAD [OUTFILE]" >&2
14 exit 2
15fi
17plan=$1
18base=$2
19head=$3
20[ -f "$plan" ] || { echo "no such plan file: $plan" >&2; exit 2; }
22git rev-parse --verify --quiet "$base" >/dev/null || { echo "bad BASE: $base" >&2; exit 2; }
23git rev-parse --verify --quiet "$head" >/dev/null || { echo "bad HEAD: $head" >&2; exit 2; }
25# Range guards (exit 3): a wrong-branch HEAD yields a range that is empty or
26# not rooted at BASE; either would silently produce a bogus review package.
27git merge-base --is-ancestor "$base" "$head" || { echo "HEAD is not a descendant of BASE: ${base}..${head}" >&2; exit 3; }
28[ "$(git rev-list --count "${base}..${head}")" -gt 0 ] || { echo "empty commit range: ${base}..${head}" >&2; exit 3; }
30if [ $# -eq 4 ]; then
31 out=$4
32else
33 # Invoke via bash rather than direct exec: some extractors (Python zipfile)
34 # strip Unix exec bits when unpacking marketplace packages (#2040).
35 dir=$("${BASH:-bash}" "$(cd "$(dirname "$0")" && pwd)/sdd-workspace" "$plan")
36 out="$dir/review-$(git rev-parse --short "$base")..$(git rev-parse --short "$head").diff"
37fi
40 echo "# Review package: ${base}..${head}"
41 echo
42 echo "## Commits"
43 git log --oneline "${base}..${head}"
44 echo
45 echo "## Files changed"
46 git diff --stat "${base}..${head}"
47 echo
48 echo "## Diff"
49 git diff -U10 "${base}..${head}"
50} > "$out"
52commits=$(git rev-list --count "${base}..${head}")
53echo "wrote ${out}: ${commits} commit(s), $(wc -c < "$out" | tr -d ' ') bytes"