Files
msd-core/get-shit-done/references/phase-argument-parsing.md
Lex Christopherson 4010e3ff0e fix: replace echo with printf in shell snippets to prevent jq parse errors
zsh's built-in echo interprets \n escape sequences in JSON strings,
converting properly-escaped \\n back into literal newlines. This breaks
jq parsing with "control characters U+0000 through U+001F must be escaped".
printf '%s\n' preserves the JSON verbatim.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 12:07:45 -06:00

1.6 KiB

Phase Argument Parsing

Parse and normalize phase arguments for commands that operate on phases.

Extraction

From $ARGUMENTS:

  • Extract phase number (first numeric argument)
  • Extract flags (prefixed with --)
  • Remaining text is description (for insert/add commands)

Using gsd-tools

The find-phase command handles normalization and validation in one step:

PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PHASE}")

Returns JSON with:

  • found: true/false
  • directory: Full path to phase directory
  • phase_number: Normalized number (e.g., "06", "06.1")
  • phase_name: Name portion (e.g., "foundation")
  • plans: Array of PLAN.md files
  • summaries: Array of SUMMARY.md files

Manual Normalization (Legacy)

Zero-pad integer phases to 2 digits. Preserve decimal suffixes.

# Normalize phase number
if [[ "$PHASE" =~ ^[0-9]+$ ]]; then
  # Integer: 8 → 08
  PHASE=$(printf "%02d" "$PHASE")
elif [[ "$PHASE" =~ ^([0-9]+)\.([0-9]+)$ ]]; then
  # Decimal: 2.1 → 02.1
  PHASE=$(printf "%02d.%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}")
fi

Validation

Use roadmap get-phase to validate phase exists:

PHASE_CHECK=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${PHASE}")
if [ "$(printf '%s\n' "$PHASE_CHECK" | jq -r '.found')" = "false" ]; then
  echo "ERROR: Phase ${PHASE} not found in roadmap"
  exit 1
fi

Directory Lookup

Use find-phase for directory lookup:

PHASE_DIR=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PHASE}" --raw)