#!/usr/bin/env bash # Resolve and ensure the working-tree directory SDD uses for one plan's # short-lived artifacts: task briefs, implementer reports, review packages, # and the progress ledger. Print the plan directory's absolute path. # # One directory per plan (.superpowers/sdd//) so a follow-up # plan in the same working tree can never read or overwrite another plan's # artifacts. A stale ledger misread as current progress makes controllers # skip whole task sequences — plan-scoping removes that failure structurally. # # The workspace lives in the working tree (not under .git/) because Claude Code # treats .git/ as a protected path and denies agent writes there — which blocks # an implementer subagent from writing its report file. A self-ignoring # .gitignore at .superpowers/sdd/ keeps every plan's workspace out of # `git status` and out of accidental commits without modifying any tracked file. # # Single source of truth for the workspace location, so task-brief and # review-package cannot drift to different directories. # # Usage: sdd-workspace PLAN_FILE set -euo pipefail if [ $# -ne 1 ]; then echo "usage: sdd-workspace PLAN_FILE" >&2 exit 2 fi plan=$1 [ -f "$plan" ] || { echo "no such plan file: $plan" >&2; exit 2; } slug=$(basename "$plan" .md) [ -n "$slug" ] && [ "$slug" != "." ] && [ "$slug" != ".." ] \ || { echo "cannot derive a workspace name from: $plan" >&2; exit 2; } root=$(git rev-parse --show-toplevel) base="$root/.superpowers/sdd" dir="$base/$slug" mkdir -p "$dir" printf '*\n' > "$base/.gitignore" cd "$dir" && pwd