Files
msd-core/get-shit-done/workflows/manager.md
Rezolv d3a79917fa feat: Phase 2 caller migration — gsd-sdk query in workflows, agents, commands (#2179)
* feat: Phase 2 caller migration — gsd-sdk query in workflows (#2122)

Cherry-picked orchestration rewrites from feat/sdk-foundation (#2008, 4018fee) onto current main, resolving conflicts to keep upstream worktree guards and post-merge test gate. SDK stub registry omitted (out of Phase 2 scope per #2122).

Refs: #2122 #2008
Made-with: Cursor

* docs: add gsd-sdk query migration blurb

Made-with: Cursor

* docs(workflows): extend Phase 2 gsd-sdk query caller migration

- Swap node gsd-tools.cjs for gsd-sdk query in review, plan-phase, execute-plan,
  ship, extract_learnings, ai-integration-phase, eval-review, next, thread
- Document graphify CJS-only in gsd-planner; dual-path in CLI-TOOLS and ARCHITECTURE
- Update tests: workstreams gsd-sdk path, thread frontmatter.get, workspace init.*,
  CRLF-safe autonomous frontmatter parse
- CHANGELOG: Phase 2 caller migration scope

Made-with: Cursor

* docs(phase2): USER-GUIDE + remaining gsd-sdk query call sites

- USER-GUIDE: dual-path CLI section; state validate/sync use full CJS path
- Commands: debug (config-get+tdd), quick (security note), intel Task prompt
- Agent: gsd-debug-session-manager resolve-model via jq
- Workflows: milestone-summary, forensics, next, complete-milestone/verify-work
  (audit-open CJS notes), discuss-phase, progress, verify-phase, add/insert/remove
  phase, transition, manager, quick workflow; remove-phase commit without --files
- Test: quick-session-management accepts frontmatter.get
- CHANGELOG: Phase 2 follow-up bullet

Made-with: Cursor

* docs(phase2): align gsd-sdk query examples in commands and agents

- init.* query names; frontmatter.get uses positional field name
- state.* handlers use positional args; commit uses positional paths
- CJS-only notes for from-gsd2 and graphify; learnings.query wording
- CHANGELOG: Phase 2 orchestration doc pass

Made-with: Cursor

* docs(phase2): normalize gsd-sdk query commit to positional file paths

- Strip --files from commit examples in workflows, references, commands
- Keep commit-to-subrepo ... --files (separate handler)
- git-planning-commit.md: document positional args
- Tests: new-project commit line, state.record-session, gates CRLF, roadmap.analyze
- CHANGELOG [Unreleased]

Made-with: Cursor

* feat(sdk): gsd-sdk query parity with gsd-tools and PR 2179 registry fixes

- Route query via longest-prefix match and dotted single-token expansion; fall back
  to runGsdToolsQuery (same argv as node gsd-tools.cjs) for full CLI coverage.
- Parse gsd-sdk query permissively so gsd-tools flags (--json, --verify, etc.) are
  not rejected by strict parseArgs.
- resolveGsdToolsPath: honor GSD_TOOLS_PATH; prefer bundled get-shit-done copy
  over project .claude installs; export runGsdToolsQuery from the SDK.
- Fix gsd-tools audit-open (core.output; pass object for --json JSON).
- Register summary-extract as alias of summary.extract; fix audit-fix workflow to
  call audit-uat instead of invalid init.audit-uat (PR review).

Updates QUERY-HANDLERS.md and CHANGELOG [Unreleased].

Made-with: Cursor

* fix(sdk): Phase 2 scope — Trek-e review (#2179, #2122)

- Remove gsd-sdk query passthrough to gsd-tools.cjs; drop GSD_TOOLS_PATH
- Consolidate argv routing in resolveQueryArgv(); update USAGE and QUERY-HANDLERS
- Surface @file: read failures in GSDTools.parseOutput
- execute-plan: defer Task Commit Protocol to gsd-executor
- stale-colon-refs: skip .planning/ and root CLAUDE.md (gitignored overlays)
- CHANGELOG [Unreleased]: maintainer review and routing notes

Made-with: Cursor
2026-04-15 22:46:31 -04:00

16 KiB

Interactive command center for managing a milestone from a single terminal. Shows a dashboard of all phases with visual status, dispatches discuss inline and plan/execute as background agents, and loops back to the dashboard after each action. Enables parallel phase work from one terminal.

<required_reading>

Read all files referenced by the invoking prompt's execution_context before starting.

</required_reading>

1. Initialize

Bootstrap via manager init:

INIT=$(gsd-sdk query init.manager)
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi

Parse JSON for: milestone_version, milestone_name, phase_count, completed_count, in_progress_count, phases, recommended_actions, all_complete, waiting_signal, manager_flags.

manager_flags contains per-step passthrough flags from config:

  • manager_flags.discuss — appended to /gsd-discuss-phase args (e.g. "--auto --analyze")
  • manager_flags.plan — appended to plan agent init command
  • manager_flags.execute — appended to execute agent init command

These are empty strings by default. Set via: gsd-sdk query config-set manager.flags.discuss "--auto --analyze"

If error: Display the error message and exit.

Display startup banner:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 GSD ► MANAGER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 {milestone_version} — {milestone_name}
 {phase_count} phases · {completed_count} complete

 ✓ Discuss → inline    ◆ Plan/Execute → background
 Dashboard auto-refreshes when background work is active.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Proceed to dashboard step.

2. Dashboard (Refresh Point)

Every time this step is reached, re-read state from disk to pick up changes from background agents:

INIT=$(gsd-sdk query init.manager)
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi

Parse the full JSON. Build the dashboard display.

Build dashboard from JSON. Symbols: ✓ done, ◆ active, ○ pending, · queued. Progress bar: 20-char █░.

Status mapping (disk_status → D P E Status):

  • complete → ✓ ✓ ✓ ✓ Complete
  • partial → ✓ ✓ ◆ ◆ Executing...
  • planned → ✓ ✓ ○ ○ Ready to execute
  • discussed → ✓ ○ · ○ Ready to plan
  • researched → ◆ · · ○ Ready to plan
  • empty/no_directory + is_next_to_discuss → ○ · · ○ Ready to discuss
  • empty/no_directory otherwise → · · · · Up next
  • If is_active, replace status icon with ◆ and append (active)

If any is_active phases, show: ◆ Background: {action} Phase {N}, ... above grid.

Use display_name (not name) for the Phase column — it's pre-truncated to 20 chars with … if clipped. Pad all phase names to the same width for alignment.

Use deps_display from init JSON for the Deps column — shows which phases this phase depends on (e.g. 1,3) or — for none.

Example output:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 GSD ► DASHBOARD
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ████████████░░░░░░░░ 60%  (3/5 phases)
 ◆ Background: Planning Phase 4
 | # | Phase                | Deps | D | P | E | Status              |
 |---|----------------------|------|---|---|---|---------------------|
 | 1 | Foundation           | —    | ✓ | ✓ | ✓ | ✓ Complete          |
 | 2 | API Layer            | 1    | ✓ | ✓ | ◆ | ◆ Executing (active)|
 | 3 | Auth System          | 1    | ✓ | ✓ | ○ | ○ Ready to execute  |
 | 4 | Dashboard UI & Set…  | 1,2  | ✓ | ◆ | · | ◆ Planning (active) |
 | 5 | Notifications        | —    | ○ | · | · | ○ Ready to discuss  |
 | 6 | Polish & Final Mail… | 1-5  | · | · | · | · Up next           |

Recommendations section:

If all_complete is true:

╔══════════════════════════════════════════════════════════════╗
║  MILESTONE COMPLETE                                          ║
╚══════════════════════════════════════════════════════════════╝

All {phase_count} phases done. Ready for final steps:
  → /gsd-verify-work — run acceptance testing
  → /gsd-complete-milestone — archive and wrap up

Text mode (workflow.text_mode: true in config or --text flag): Set TEXT_MODE=true if --text is present in $ARGUMENTS OR text_mode from init JSON is true. When TEXT_MODE is active, replace every AskUserQuestion call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where AskUserQuestion is not available. Ask user via AskUserQuestion:

  • question: "All phases complete. What next?"
  • options: "Verify work" / "Complete milestone" / "Exit manager"

Handle responses:

  • "Verify work": Skill(skill="gsd-verify-work") then loop to dashboard.
  • "Complete milestone": Skill(skill="gsd-complete-milestone") then exit.
  • "Exit manager": Go to exit step.

If NOT all_complete, build compound options from recommended_actions:

Compound option logic: Group background actions (plan/execute) together, and pair them with the single inline action (discuss) when one exists. The goal is to present the fewest options possible — one option can dispatch multiple background agents plus one inline action.

Building options:

  1. Collect all background actions (execute and plan recommendations) — there can be multiple of each.

  2. Collect the inline action (discuss recommendation, if any — there will be at most one since discuss is sequential).

  3. Build compound options:

    If there are ANY recommended actions (background, inline, or both): Create ONE primary "Continue" option that dispatches ALL of them together:

    • Label: "Continue" — always this exact word
    • Below the label, list every action that will happen. Enumerate ALL recommended actions — do not cap or truncate:
      Continue:
        → Execute Phase 32 (background)
        → Plan Phase 34 (background)
        → Discuss Phase 35 (inline)
      
    • This dispatches all background agents first, then runs the inline discuss (if any).
    • If there is no inline discuss, the dashboard refreshes after spawning background agents.

    Important: The Continue option must include EVERY action from recommended_actions — not just 2. If there are 3 actions, list 3. If there are 5, list 5.

  4. Always add:

    • "Refresh dashboard"
    • "Exit manager"

Display recommendations compactly:

───────────────────────────────────────────────────────────────
▶ Next Steps
───────────────────────────────────────────────────────────────

Continue:
  → Execute Phase 32 (background)
  → Plan Phase 34 (background)
  → Discuss Phase 35 (inline)

Auto-refresh: If background agents are running (is_active is true for any phase), set a 60-second auto-refresh cycle. After presenting the action menu, if no user input is received within 60 seconds, automatically refresh the dashboard. This interval is configurable via manager_refresh_interval in GSD config (default: 60 seconds, set to 0 to disable).

Present via AskUserQuestion:

  • question: "What would you like to do?"
  • options: (compound options as built above + refresh + exit, AskUserQuestion auto-adds "Other")

On "Other" (free text): Parse intent — if it mentions a phase number and action, dispatch accordingly. If unclear, display available actions and loop to action_menu.

Proceed to handle_action step with the selected action.

4. Handle Action

Refresh Dashboard

Loop back to dashboard step.

Exit Manager

Go to exit step.

Compound Action (background + inline)

When the user selects a compound option:

  1. Spawn all background agents first (plan/execute) — dispatch them in parallel using the Plan Phase N / Execute Phase N handlers below.
  2. Then run the inline discuss:
Skill(skill="gsd-discuss-phase", args="{PHASE_NUM} {manager_flags.discuss}")

After discuss completes, loop back to dashboard step (background agents continue running).

Discuss Phase N

Discussion is interactive — needs user input. Run inline with any configured flags:

Skill(skill="gsd-discuss-phase", args="{PHASE_NUM} {manager_flags.discuss}")

After discuss completes, loop back to dashboard step.

Plan Phase N

Planning runs autonomously. Spawn a background agent that delegates to the Skill pipeline with any configured flags:

Task(
  description="Plan phase {N}: {phase_name}",
  run_in_background=true,
  prompt="You are running the GSD plan-phase workflow for phase {N} of the project.

Working directory: {cwd}
Phase: {N} — {phase_name}
Goal: {goal}
Manager flags: {manager_flags.plan}

Run the plan-phase Skill with any configured manager flags:
Skill(skill=\"gsd-plan-phase\", args=\"{N} --auto {manager_flags.plan}\")

This delegates to the full plan-phase pipeline including local patches, research, plan-checker, and all quality gates.

Important: You are running in the background. Do NOT use AskUserQuestion — make autonomous decisions based on project context. If you hit a blocker, write it to STATE.md as a blocker and stop. Do NOT silently work around permission or file access errors — let them fail so the manager can surface them with resolution hints. Do NOT use --no-verify on git commits."
)

Display:

◆ Spawning planner for Phase {N}: {phase_name}...

Loop back to dashboard step.

Execute Phase N

Execution runs autonomously. Spawn a background agent that delegates to the Skill pipeline with any configured flags:

Task(
  description="Execute phase {N}: {phase_name}",
  run_in_background=true,
  prompt="You are running the GSD execute-phase workflow for phase {N} of the project.

Working directory: {cwd}
Phase: {N} — {phase_name}
Goal: {goal}
Manager flags: {manager_flags.execute}

Run the execute-phase Skill with any configured manager flags:
Skill(skill=\"gsd-execute-phase\", args=\"{N} {manager_flags.execute}\")

This delegates to the full execute-phase pipeline including local patches, branching, wave-based execution, verification, and all quality gates.

Important: You are running in the background. Do NOT use AskUserQuestion — make autonomous decisions. Do NOT use --no-verify on git commits — let pre-commit hooks run normally. If you hit a permission error, file lock, or any access issue, do NOT work around it — let it fail and write the error to STATE.md as a blocker so the manager can surface it with resolution guidance."
)

Display:

◆ Spawning executor for Phase {N}: {phase_name}...

Loop back to dashboard step.

5. Background Agent Completion

When notified that a background agent completed:

  1. Read the result message from the agent.
  2. Display a brief notification:
✓ {description}
  {brief summary from agent result}
  1. Loop back to dashboard step.

If the agent reported an error or blocker:

Classify the error:

Permission / tool access error (e.g. tool not allowed, permission denied, sandbox restriction):

  • Parse the error to identify which tool or command was blocked.
  • Display the error clearly, then offer to fix it:
    • question: "Phase {N} failed — permission denied for {tool_or_command}. Want me to add it to settings.local.json so it's allowed?"
    • options: "Add permission and retry" / "Run this phase inline instead" / "Skip and continue"
    • "Add permission and retry": Use Skill(skill="update-config") to add the permission to settings.local.json, then re-spawn the background agent. Loop to dashboard.
    • "Run this phase inline instead": Dispatch the same action inline via the appropriate Skill — use Skill(skill="gsd-plan-phase", args="{N}") if the failed action was planning, or Skill(skill="gsd-execute-phase", args="{N}") if the failed action was execution. Loop to dashboard after.
    • "Skip and continue": Loop to dashboard (phase stays in current state).

Other errors (git lock, file conflict, logic error, etc.):

  • Display the error, then offer options via AskUserQuestion:
    • question: "Background agent for Phase {N} encountered an issue: {error}. What next?"
    • options: "Retry" / "Run inline instead" / "Skip and continue" / "View details"
    • "Retry": Re-spawn the same background agent. Loop to dashboard.
    • "Run inline instead": Dispatch the action inline via the appropriate Skill — use Skill(skill="gsd-plan-phase", args="{N}") if the failed action was planning, or Skill(skill="gsd-execute-phase", args="{N}") if the failed action was execution. Loop to dashboard after.
    • "Skip and continue": Loop to dashboard (phase stays in current state).
    • "View details": Read STATE.md blockers section, display, then re-present options.

6. Exit

Display final status with progress bar:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 GSD ► SESSION END
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 {milestone_version} — {milestone_name}
 {PROGRESS_BAR} {progress_pct}%  ({completed_count}/{phase_count} phases)

 Resume anytime: /gsd-manager
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Note: Any background agents still running will continue to completion. Their results will be visible on next /gsd-manager or /gsd-progress invocation.

<success_criteria>

  • Dashboard displays all phases with correct status indicators (D/P/E/V columns)
  • Progress bar shows accurate completion percentage
  • Dependency resolution: blocked phases show which deps are missing
  • Recommendations prioritize: execute > plan > discuss
  • Discuss phases run inline via Skill() — interactive questions work
  • Plan phases spawn background Task agents — return to dashboard immediately
  • Execute phases spawn background Task agents — return to dashboard immediately
  • Dashboard refreshes pick up changes from background agents via disk state
  • Background agent completion triggers notification and dashboard refresh
  • Background agent errors present retry/skip options
  • All-complete state offers verify-work and complete-milestone
  • Exit shows final status with resume instructions
  • "Other" free-text input parsed for phase number and action
  • Manager loop continues until user exits or milestone completes </success_criteria>