* 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
345 lines
10 KiB
Markdown
345 lines
10 KiB
Markdown
<purpose>
|
|
Cross-AI peer review — invoke external AI CLIs to independently review phase plans.
|
|
Each CLI gets the same prompt (PROJECT.md context, phase plans, requirements) and
|
|
produces structured feedback. Results are combined into REVIEWS.md for the planner
|
|
to incorporate via --reviews flag.
|
|
|
|
This implements adversarial review: different AI models catch different blind spots.
|
|
A plan that survives review from 2-3 independent AI systems is more robust.
|
|
</purpose>
|
|
|
|
<process>
|
|
|
|
<step name="detect_clis">
|
|
Check which AI CLIs are available on the system:
|
|
|
|
```bash
|
|
# Check each CLI
|
|
command -v gemini >/dev/null 2>&1 && echo "gemini:available" || echo "gemini:missing"
|
|
command -v claude >/dev/null 2>&1 && echo "claude:available" || echo "claude:missing"
|
|
command -v codex >/dev/null 2>&1 && echo "codex:available" || echo "codex:missing"
|
|
command -v coderabbit >/dev/null 2>&1 && echo "coderabbit:available" || echo "coderabbit:missing"
|
|
command -v opencode >/dev/null 2>&1 && echo "opencode:available" || echo "opencode:missing"
|
|
command -v qwen >/dev/null 2>&1 && echo "qwen:available" || echo "qwen:missing"
|
|
command -v cursor >/dev/null 2>&1 && echo "cursor:available" || echo "cursor:missing"
|
|
```
|
|
|
|
Parse flags from `$ARGUMENTS`:
|
|
- `--gemini` → include Gemini
|
|
- `--claude` → include Claude
|
|
- `--codex` → include Codex
|
|
- `--coderabbit` → include CodeRabbit
|
|
- `--opencode` → include OpenCode
|
|
- `--qwen` → include Qwen Code
|
|
- `--cursor` → include Cursor
|
|
- `--all` → include all available
|
|
- No flags → include all available
|
|
|
|
If no CLIs are available:
|
|
```
|
|
No external AI CLIs found. Install at least one:
|
|
- gemini: https://github.com/google-gemini/gemini-cli
|
|
- codex: https://github.com/openai/codex
|
|
- claude: https://github.com/anthropics/claude-code
|
|
- opencode: https://opencode.ai (leverages GitHub Copilot subscription models)
|
|
- qwen: https://github.com/nicepkg/qwen-code (Alibaba Qwen models)
|
|
- cursor: https://cursor.com (Cursor IDE agent mode)
|
|
|
|
Then run /gsd-review again.
|
|
```
|
|
Exit.
|
|
|
|
Determine which CLI to skip based on the current runtime environment:
|
|
|
|
```bash
|
|
# Environment-based runtime detection (priority order)
|
|
if [ "$ANTIGRAVITY_AGENT" = "1" ]; then
|
|
# Antigravity is a separate client — all CLIs are external, skip none
|
|
SELF_CLI="none"
|
|
elif [ -n "$CURSOR_SESSION_ID" ]; then
|
|
# Running inside Cursor agent — skip cursor for independence
|
|
SELF_CLI="cursor"
|
|
elif [ -n "$CLAUDE_CODE_ENTRYPOINT" ]; then
|
|
# Running inside Claude Code CLI — skip claude for independence
|
|
SELF_CLI="claude"
|
|
else
|
|
# Other environments (Gemini CLI, Codex CLI, etc.)
|
|
# Fall back to AI self-identification to decide which CLI to skip
|
|
SELF_CLI="auto"
|
|
fi
|
|
```
|
|
|
|
Rules:
|
|
- If `SELF_CLI="none"` → invoke ALL available CLIs (no skip)
|
|
- If `SELF_CLI="claude"` → skip claude, use gemini/codex
|
|
- If `SELF_CLI="auto"` → the executing AI identifies itself and skips its own CLI
|
|
- At least one DIFFERENT CLI must be available for the review to proceed.
|
|
</step>
|
|
|
|
<step name="gather_context">
|
|
Collect phase artifacts for the review prompt:
|
|
|
|
```bash
|
|
INIT=$(gsd-sdk query init.phase-op "${PHASE_ARG}")
|
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
```
|
|
|
|
Read from init: `phase_dir`, `phase_number`, `padded_phase`.
|
|
|
|
Then read:
|
|
1. `.planning/PROJECT.md` (first 80 lines — project context)
|
|
2. Phase section from `.planning/ROADMAP.md`
|
|
3. All `*-PLAN.md` files in the phase directory
|
|
4. `*-CONTEXT.md` if present (user decisions)
|
|
5. `*-RESEARCH.md` if present (domain research)
|
|
6. `.planning/REQUIREMENTS.md` (requirements this phase addresses)
|
|
</step>
|
|
|
|
<step name="build_prompt">
|
|
Build a structured review prompt:
|
|
|
|
```markdown
|
|
# Cross-AI Plan Review Request
|
|
|
|
You are reviewing implementation plans for a software project phase.
|
|
Provide structured feedback on plan quality, completeness, and risks.
|
|
|
|
## Project Context
|
|
{first 80 lines of PROJECT.md}
|
|
|
|
## Phase {N}: {phase name}
|
|
### Roadmap Section
|
|
{roadmap phase section}
|
|
|
|
### Requirements Addressed
|
|
{requirements for this phase}
|
|
|
|
### User Decisions (CONTEXT.md)
|
|
{context if present}
|
|
|
|
### Research Findings
|
|
{research if present}
|
|
|
|
### Plans to Review
|
|
{all PLAN.md contents}
|
|
|
|
## Review Instructions
|
|
|
|
Analyze each plan and provide:
|
|
|
|
1. **Summary** — One-paragraph assessment
|
|
2. **Strengths** — What's well-designed (bullet points)
|
|
3. **Concerns** — Potential issues, gaps, risks (bullet points with severity: HIGH/MEDIUM/LOW)
|
|
4. **Suggestions** — Specific improvements (bullet points)
|
|
5. **Risk Assessment** — Overall risk level (LOW/MEDIUM/HIGH) with justification
|
|
|
|
Focus on:
|
|
- Missing edge cases or error handling
|
|
- Dependency ordering issues
|
|
- Scope creep or over-engineering
|
|
- Security considerations
|
|
- Performance implications
|
|
- Whether the plans actually achieve the phase goals
|
|
|
|
Output your review in markdown format.
|
|
```
|
|
|
|
Write to a temp file: `/tmp/gsd-review-prompt-{phase}.md`
|
|
</step>
|
|
|
|
<step name="invoke_reviewers">
|
|
Read model preferences from planning config. Null/missing values fall back to CLI defaults.
|
|
|
|
```bash
|
|
# JSON scalars from gsd-sdk query; use jq -r to strip JSON string quotes (install jq if missing)
|
|
GEMINI_MODEL=$(gsd-sdk query config-get review.models.gemini 2>/dev/null | jq -r '.' 2>/dev/null || true)
|
|
CLAUDE_MODEL=$(gsd-sdk query config-get review.models.claude 2>/dev/null | jq -r '.' 2>/dev/null || true)
|
|
CODEX_MODEL=$(gsd-sdk query config-get review.models.codex 2>/dev/null | jq -r '.' 2>/dev/null || true)
|
|
OPENCODE_MODEL=$(gsd-sdk query config-get review.models.opencode 2>/dev/null | jq -r '.' 2>/dev/null || true)
|
|
```
|
|
|
|
For each selected CLI, invoke in sequence (not parallel — avoid rate limits):
|
|
|
|
**Gemini:**
|
|
```bash
|
|
if [ -n "$GEMINI_MODEL" ] && [ "$GEMINI_MODEL" != "null" ]; then
|
|
cat /tmp/gsd-review-prompt-{phase}.md | gemini -m "$GEMINI_MODEL" -p - 2>/dev/null > /tmp/gsd-review-gemini-{phase}.md
|
|
else
|
|
cat /tmp/gsd-review-prompt-{phase}.md | gemini -p - 2>/dev/null > /tmp/gsd-review-gemini-{phase}.md
|
|
fi
|
|
```
|
|
|
|
**Claude (separate session):**
|
|
```bash
|
|
if [ -n "$CLAUDE_MODEL" ] && [ "$CLAUDE_MODEL" != "null" ]; then
|
|
cat /tmp/gsd-review-prompt-{phase}.md | claude --model "$CLAUDE_MODEL" -p - 2>/dev/null > /tmp/gsd-review-claude-{phase}.md
|
|
else
|
|
cat /tmp/gsd-review-prompt-{phase}.md | claude -p - 2>/dev/null > /tmp/gsd-review-claude-{phase}.md
|
|
fi
|
|
```
|
|
|
|
**Codex:**
|
|
```bash
|
|
if [ -n "$CODEX_MODEL" ] && [ "$CODEX_MODEL" != "null" ]; then
|
|
cat /tmp/gsd-review-prompt-{phase}.md | codex exec --model "$CODEX_MODEL" --skip-git-repo-check - 2>/dev/null > /tmp/gsd-review-codex-{phase}.md
|
|
else
|
|
cat /tmp/gsd-review-prompt-{phase}.md | codex exec --skip-git-repo-check - 2>/dev/null > /tmp/gsd-review-codex-{phase}.md
|
|
fi
|
|
```
|
|
|
|
**CodeRabbit:**
|
|
|
|
Note: CodeRabbit reviews the current git diff/working tree — it does not accept a prompt or model flag. It may take up to 5 minutes. Use `timeout: 360000` on the Bash tool call.
|
|
|
|
```bash
|
|
coderabbit review --prompt-only 2>/dev/null > /tmp/gsd-review-coderabbit-{phase}.md
|
|
```
|
|
|
|
**OpenCode (via GitHub Copilot):**
|
|
```bash
|
|
if [ -n "$OPENCODE_MODEL" ] && [ "$OPENCODE_MODEL" != "null" ]; then
|
|
cat /tmp/gsd-review-prompt-{phase}.md | opencode run --model "$OPENCODE_MODEL" - 2>/dev/null > /tmp/gsd-review-opencode-{phase}.md
|
|
else
|
|
cat /tmp/gsd-review-prompt-{phase}.md | opencode run - 2>/dev/null > /tmp/gsd-review-opencode-{phase}.md
|
|
fi
|
|
if [ ! -s /tmp/gsd-review-opencode-{phase}.md ]; then
|
|
echo "OpenCode review failed or returned empty output." > /tmp/gsd-review-opencode-{phase}.md
|
|
fi
|
|
```
|
|
|
|
**Qwen Code:**
|
|
```bash
|
|
cat /tmp/gsd-review-prompt-{phase}.md | qwen - 2>/dev/null > /tmp/gsd-review-qwen-{phase}.md
|
|
if [ ! -s /tmp/gsd-review-qwen-{phase}.md ]; then
|
|
echo "Qwen review failed or returned empty output." > /tmp/gsd-review-qwen-{phase}.md
|
|
fi
|
|
```
|
|
|
|
**Cursor:**
|
|
```bash
|
|
cat /tmp/gsd-review-prompt-{phase}.md | cursor agent -p --mode ask --trust 2>/dev/null > /tmp/gsd-review-cursor-{phase}.md
|
|
if [ ! -s /tmp/gsd-review-cursor-{phase}.md ]; then
|
|
echo "Cursor review failed or returned empty output." > /tmp/gsd-review-cursor-{phase}.md
|
|
fi
|
|
```
|
|
|
|
If a CLI fails, log the error and continue with remaining CLIs.
|
|
|
|
Display progress:
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► CROSS-AI REVIEW — Phase {N}
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
◆ Reviewing with {CLI}... done ✓
|
|
◆ Reviewing with {CLI}... done ✓
|
|
```
|
|
</step>
|
|
|
|
<step name="write_reviews">
|
|
Combine all review responses into `{phase_dir}/{padded_phase}-REVIEWS.md`:
|
|
|
|
```markdown
|
|
---
|
|
phase: {N}
|
|
reviewers: [gemini, claude, codex, coderabbit, opencode, qwen, cursor]
|
|
reviewed_at: {ISO timestamp}
|
|
plans_reviewed: [{list of PLAN.md files}]
|
|
---
|
|
|
|
# Cross-AI Plan Review — Phase {N}
|
|
|
|
## Gemini Review
|
|
|
|
{gemini review content}
|
|
|
|
---
|
|
|
|
## Claude Review
|
|
|
|
{claude review content}
|
|
|
|
---
|
|
|
|
## Codex Review
|
|
|
|
{codex review content}
|
|
|
|
---
|
|
|
|
## CodeRabbit Review
|
|
|
|
{coderabbit review content}
|
|
|
|
---
|
|
|
|
## OpenCode Review
|
|
|
|
{opencode review content}
|
|
|
|
---
|
|
|
|
## Qwen Review
|
|
|
|
{qwen review content}
|
|
|
|
---
|
|
|
|
## Cursor Review
|
|
|
|
{cursor review content}
|
|
|
|
---
|
|
|
|
## Consensus Summary
|
|
|
|
{synthesize common concerns across all reviewers}
|
|
|
|
### Agreed Strengths
|
|
{strengths mentioned by 2+ reviewers}
|
|
|
|
### Agreed Concerns
|
|
{concerns raised by 2+ reviewers — highest priority}
|
|
|
|
### Divergent Views
|
|
{where reviewers disagreed — worth investigating}
|
|
```
|
|
|
|
Commit:
|
|
```bash
|
|
gsd-sdk query commit "docs: cross-AI review for phase {N}" {phase_dir}/{padded_phase}-REVIEWS.md
|
|
```
|
|
</step>
|
|
|
|
<step name="present_results">
|
|
Display summary:
|
|
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► REVIEW COMPLETE
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
Phase {N} reviewed by {count} AI systems.
|
|
|
|
Consensus concerns:
|
|
{top 3 shared concerns}
|
|
|
|
Full review: {padded_phase}-REVIEWS.md
|
|
|
|
To incorporate feedback into planning:
|
|
/gsd-plan-phase {N} --reviews
|
|
```
|
|
|
|
Clean up temp files.
|
|
</step>
|
|
|
|
</process>
|
|
|
|
<success_criteria>
|
|
- [ ] At least one external CLI invoked successfully
|
|
- [ ] REVIEWS.md written with structured feedback
|
|
- [ ] Consensus summary synthesized from multiple reviewers
|
|
- [ ] Temp files cleaned up
|
|
- [ ] User knows how to use feedback (/gsd-plan-phase --reviews)
|
|
</success_criteria>
|