mirror of
https://github.com/obra/superpowers.git
synced 2026-08-23 15:09:05 +00:00
0be49879b1
Codex marketplace users hit 'Permission denied' running SDD helpers:
some extractors (Python zipfile) discard Unix mode attributes when
unpacking the package, so task-brief's and review-package's direct exec
of their sibling sdd-workspace fails. Our packaging preserves 0755
(git archive | tar -xpf, asserted by the existing packaging test) — the
bits are lost on the consumer side, which no packaging change can reach.
Invoking the sibling via "${BASH:-bash}" makes the exec bit irrelevant.
TDD: new regression case copies the helpers, chmod -x, runs task-brief
via bash — RED with the reported rc=126 Permission denied, GREEN after.
Reported in #2040 (michaelholcomb-creator). Fixes #2040.
44 lines
1.3 KiB
Bash
Executable File
44 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Extract one task's full text from an implementation plan into a file the
|
|
# implementer reads in one call, so the task text never has to be pasted
|
|
# through the controller's context.
|
|
#
|
|
# Usage: task-brief PLAN_FILE TASK_NUMBER [OUTFILE]
|
|
# Default OUTFILE: <repo-root>/.superpowers/sdd/<plan-basename>/task-<N>-brief.md
|
|
# (per plan and per worktree; concurrent runs of the SAME plan in the same
|
|
# working tree share it).
|
|
set -euo pipefail
|
|
|
|
if [ $# -lt 2 ] || [ $# -gt 3 ]; then
|
|
echo "usage: task-brief PLAN_FILE TASK_NUMBER [OUTFILE]" >&2
|
|
exit 2
|
|
fi
|
|
|
|
plan=$1
|
|
n=$2
|
|
[ -f "$plan" ] || { echo "no such plan file: $plan" >&2; exit 2; }
|
|
|
|
if [ $# -eq 3 ]; then
|
|
out=$3
|
|
else
|
|
# Invoke via bash rather than direct exec: some extractors (Python zipfile)
|
|
# strip Unix exec bits when unpacking marketplace packages (#2040).
|
|
dir=$("${BASH:-bash}" "$(cd "$(dirname "$0")" && pwd)/sdd-workspace" "$plan")
|
|
out="$dir/task-${n}-brief.md"
|
|
fi
|
|
|
|
awk -v n="$n" '
|
|
/^```/ { infence = !infence }
|
|
!infence && /^#+[ \t]+Task[ \t]+[0-9]+/ {
|
|
intask = ($0 ~ ("^#+[ \t]+Task[ \t]+" n "([^0-9]|$)"))
|
|
}
|
|
intask { print }
|
|
' "$plan" > "$out"
|
|
|
|
if [ ! -s "$out" ]; then
|
|
echo "task ${n} not found in ${plan} (no heading matching 'Task ${n}')" >&2
|
|
exit 3
|
|
fi
|
|
|
|
echo "wrote ${out}: $(wc -l < "$out" | tr -d ' ') lines"
|