#!/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: /.superpowers/sdd//task--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; } script_dir=$(cd "$(dirname "$0")" && pwd) if [ $# -eq 3 ]; then out=$3 else dir=$("$script_dir/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" # Platform dispatch hints ride this output because the controller reads it # immediately before spawning; the lines themselves are owned by the platform # reference layer (using-superpowers/references/*-dispatch.hints), not this # script. Claude Code's dispatch templates carry model selection already, so # the relay is suppressed there and on any harness without a hints file. hints_file="$script_dir/../../using-superpowers/references/codex-dispatch.hints" if [ -z "${CLAUDECODE:-}" ] && [ -f "$hints_file" ]; then hint_line=$(grep "^implementer:" "$hints_file" | head -1 | cut -d: -f2- | sed 's/^ *//') || true if [ -n "$hint_line" ]; then echo "$hint_line" fi fi