From ea0da051e3b3841e76629635f790c5143f8734ad Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Wed, 17 Jun 2026 13:22:32 -0700 Subject: [PATCH] fix(sdd): write artifacts to working-tree .superpowers/sdd, not .git/ (#1780) --- skills/subagent-driven-development/SKILL.md | 2 +- .../scripts/review-package | 9 ++--- .../scripts/task-brief | 8 ++--- tests/claude-code/test-sdd-workspace.sh | 36 +++++++++++++++++++ 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/skills/subagent-driven-development/SKILL.md b/skills/subagent-driven-development/SKILL.md index 26760430..b3dfb6f9 100644 --- a/skills/subagent-driven-development/SKILL.md +++ b/skills/subagent-driven-development/SKILL.md @@ -251,7 +251,7 @@ sequences — the single most expensive failure observed. Track progress in a ledger file, not only in todos. - At skill start, check for a ledger: - `cat "$(git rev-parse --git-path sdd)/progress.md"`. Tasks listed there + `cat "$(git rev-parse --show-toplevel)/.superpowers/sdd/progress.md"`. Tasks listed there as complete are DONE — do not re-dispatch them; resume at the first task not marked complete. - When a task's review comes back clean, append one line to the ledger in diff --git a/skills/subagent-driven-development/scripts/review-package b/skills/subagent-driven-development/scripts/review-package index 88a00224..33bb20f7 100755 --- a/skills/subagent-driven-development/scripts/review-package +++ b/skills/subagent-driven-development/scripts/review-package @@ -5,9 +5,8 @@ # tasks intact. # # Usage: review-package BASE HEAD [OUTFILE] -# Default OUTFILE: /sdd/review-...diff — unique per -# repo instance and per range, so concurrent sessions cannot collide and a -# re-review after fixes always gets a distinctly named fresh file. +# Default OUTFILE: /.superpowers/sdd/review-...diff +# (named per range, so a re-review after fixes gets a distinct fresh file). set -euo pipefail if [ $# -lt 2 ] || [ $# -gt 3 ]; then @@ -24,9 +23,7 @@ git rev-parse --verify --quiet "$head" >/dev/null || { echo "bad HEAD: $head" >& if [ $# -eq 3 ]; then out=$3 else - dir=$(git rev-parse --git-path sdd) - mkdir -p "$dir" - dir=$(cd "$dir" && pwd) + dir=$("$(cd "$(dirname "$0")" && pwd)/sdd-workspace") out="$dir/review-$(git rev-parse --short "$base")..$(git rev-parse --short "$head").diff" fi diff --git a/skills/subagent-driven-development/scripts/task-brief b/skills/subagent-driven-development/scripts/task-brief index b046a2bb..247a7670 100755 --- a/skills/subagent-driven-development/scripts/task-brief +++ b/skills/subagent-driven-development/scripts/task-brief @@ -4,8 +4,8 @@ # through the controller's context. # # Usage: task-brief PLAN_FILE TASK_NUMBER [OUTFILE] -# Default OUTFILE: /sdd/task--brief.md — unique per repo -# instance, so concurrent sessions cannot collide. +# Default OUTFILE: /.superpowers/sdd/task--brief.md +# (per worktree; concurrent runs in the same working tree share it). set -euo pipefail if [ $# -lt 2 ] || [ $# -gt 3 ]; then @@ -20,9 +20,7 @@ n=$2 if [ $# -eq 3 ]; then out=$3 else - dir=$(git rev-parse --git-path sdd) - mkdir -p "$dir" - dir=$(cd "$dir" && pwd) + dir=$("$(cd "$(dirname "$0")" && pwd)/sdd-workspace") out="$dir/task-${n}-brief.md" fi diff --git a/tests/claude-code/test-sdd-workspace.sh b/tests/claude-code/test-sdd-workspace.sh index 06ce2fff..d367f14a 100755 --- a/tests/claude-code/test-sdd-workspace.sh +++ b/tests/claude-code/test-sdd-workspace.sh @@ -71,6 +71,42 @@ main() { echo " staged: $staged" fi + cat > "$repo/plan.md" <<'PLAN' +# Plan + +## Task 1: First thing + +Do the first thing. +PLAN + + local brief_out brief_path + brief_out="$(cd "$repo" && "$SDD_SCRIPTS/task-brief" plan.md 1)" + brief_path="$(printf '%s\n' "$brief_out" | sed -n 's/^wrote \(.*\): [0-9][0-9]* lines$/\1/p')" + case "$brief_path" in + "$repo/.superpowers/sdd/"*) pass "task-brief writes its brief under the workspace" ;; + *) + fail "task-brief writes its brief under the workspace" + echo " got: $brief_path" + ;; + esac + + local git_id=(-c user.email=t@example.com -c user.name=t -c commit.gpgsign=false) + ( cd "$repo" \ + && git add plan.md \ + && git "${git_id[@]}" commit -qm c1 \ + && printf 'y\n' > f && git add f \ + && git "${git_id[@]}" commit -qm c2 ) + local rp_out rp_path + rp_out="$(cd "$repo" && "$SDD_SCRIPTS/review-package" HEAD~1 HEAD)" + rp_path="$(printf '%s\n' "$rp_out" | sed -n 's/^wrote \(.*\): [0-9].*$/\1/p')" + case "$rp_path" in + "$repo/.superpowers/sdd/"*) pass "review-package writes its diff under the workspace" ;; + *) + fail "review-package writes its diff under the workspace" + echo " got: $rp_path" + ;; + esac + echo "" if [[ "$FAILURES" -ne 0 ]]; then echo "FAILED: $FAILURES assertion(s)."