* fix: replace /gsd: command format with /gsd- skill format in all suggestions All next-step suggestions shown to users were still using the old colon format (/gsd:xxx) which cannot be copy-pasted as skills. Migrated all occurrences across agents/, commands/, get-shit-done/, docs/, README files, bin/install.js (hardcoded defaults for claude runtime), and get-shit-done/bin/lib/*.cjs (generate-claude-md templates and error messages). Updated tests to assert new hyphen format instead of old colon format. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: migrate remaining /gsd: format to /gsd- in hooks, workflows, and sdk Addresses remaining user-facing occurrences missed in the initial migration: - hooks/: fix 4 user-facing messages (pause-work, update, fast, quick) and 2 comments in gsd-workflow-guard.js - get-shit-done/workflows/: fix 21 Skill() literal calls that Claude executes directly (installer does not transform workflow content) - sdk/prompt-sanitizer.ts: update regex to strip /gsd- format in addition to legacy /gsd: format; update JSDoc comment - tests/: update autonomous-ui-steps, prompt-sanitizer to assert new format Note: commands/gsd/*.md frontmatter (name: gsd:xxx) intentionally unchanged — installer derives skillName from directory path, not the name field. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(plan-phase): preserve --chain flag in auto-advance sync and handle ui-phase gate in chain mode Bug 1: step 15 sync-flag check only guarded against --auto, causing _auto_chain_active to be cleared when plan-phase is invoked without --auto in ARGUMENTS even though a --chain pipeline was active. Added --chain to the guard condition, matching discuss-phase behaviour. Bug 2: UI Design Contract gate (step 5.6) always exited the workflow when UI-SPEC was missing, breaking the discuss --chain pipeline silently. When _auto_chain_active is true, the gate now auto-invokes gsd-ui-phase --auto via Skill() and continues to step 6 without prompting. Manual invocations retain the existing AskUserQuestion flow. * fix: remove <sub>/clear</sub> pattern and duplicate old-format command in discuss-phase.md --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
238 lines
6.3 KiB
Markdown
238 lines
6.3 KiB
Markdown
<purpose>
|
|
Create a pull request from completed phase/milestone work, generate a rich PR body from planning artifacts, optionally run code review, and prepare for merge. Closes the plan → execute → verify → ship loop.
|
|
</purpose>
|
|
|
|
<required_reading>
|
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
</required_reading>
|
|
|
|
<process>
|
|
|
|
<step name="initialize">
|
|
Parse arguments and load project state:
|
|
|
|
```bash
|
|
INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}")
|
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
```
|
|
|
|
Parse from init JSON: `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `padded_phase`, `commit_docs`.
|
|
|
|
Also load config for branching strategy:
|
|
```bash
|
|
CONFIG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
|
|
```
|
|
|
|
Extract: `branching_strategy`, `branch_name`.
|
|
|
|
Detect base branch for PRs and merges:
|
|
```bash
|
|
BASE_BRANCH=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get git.base_branch 2>/dev/null || echo "")
|
|
if [ -z "$BASE_BRANCH" ] || [ "$BASE_BRANCH" = "null" ]; then
|
|
BASE_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|^refs/remotes/origin/||')
|
|
BASE_BRANCH="${BASE_BRANCH:-main}"
|
|
fi
|
|
```
|
|
</step>
|
|
|
|
<step name="preflight_checks">
|
|
Verify the work is ready to ship:
|
|
|
|
1. **Verification passed?**
|
|
```bash
|
|
VERIFICATION=$(cat ${PHASE_DIR}/*-VERIFICATION.md 2>/dev/null)
|
|
```
|
|
Check for `status: passed` or `status: human_needed` (with human approval).
|
|
If no VERIFICATION.md or status is `gaps_found`: warn and ask user to confirm.
|
|
|
|
2. **Clean working tree?**
|
|
```bash
|
|
git status --short
|
|
```
|
|
If uncommitted changes exist: ask user to commit or stash first.
|
|
|
|
3. **On correct branch?**
|
|
```bash
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
```
|
|
If on `${BASE_BRANCH}`: warn — should be on a feature branch.
|
|
If branching_strategy is `none`: offer to create a branch now.
|
|
|
|
4. **Remote configured?**
|
|
```bash
|
|
git remote -v | head -2
|
|
```
|
|
Detect `origin` remote. If no remote: error — can't create PR.
|
|
|
|
5. **`gh` CLI available?**
|
|
```bash
|
|
which gh && gh auth status 2>&1
|
|
```
|
|
If `gh` not found or not authenticated: provide setup instructions and exit.
|
|
</step>
|
|
|
|
<step name="push_branch">
|
|
Push the current branch to remote:
|
|
|
|
```bash
|
|
git push origin ${CURRENT_BRANCH} 2>&1
|
|
```
|
|
|
|
If push fails (e.g., no upstream): set upstream:
|
|
```bash
|
|
git push --set-upstream origin ${CURRENT_BRANCH} 2>&1
|
|
```
|
|
|
|
Report: "Pushed `{branch}` to origin ({commit_count} commits ahead of ${BASE_BRANCH})"
|
|
</step>
|
|
|
|
<step name="generate_pr_body">
|
|
Auto-generate a rich PR body from planning artifacts:
|
|
|
|
**1. Title:**
|
|
```
|
|
Phase {phase_number}: {phase_name}
|
|
```
|
|
Or for milestone: `Milestone {version}: {name}`
|
|
|
|
**2. Summary section:**
|
|
Read ROADMAP.md for phase goal. Read VERIFICATION.md for verification status.
|
|
|
|
```markdown
|
|
## Summary
|
|
|
|
**Phase {N}: {Name}**
|
|
**Goal:** {goal from ROADMAP.md}
|
|
**Status:** Verified ✓
|
|
|
|
{One paragraph synthesized from SUMMARY.md files — what was built}
|
|
```
|
|
|
|
**3. Changes section:**
|
|
For each SUMMARY.md in the phase directory:
|
|
```markdown
|
|
## Changes
|
|
|
|
### Plan {plan_id}: {plan_name}
|
|
{one_liner from SUMMARY.md frontmatter}
|
|
|
|
**Key files:**
|
|
{key-files.created and key-files.modified from SUMMARY.md frontmatter}
|
|
```
|
|
|
|
**4. Requirements section:**
|
|
```markdown
|
|
## Requirements Addressed
|
|
|
|
{REQ-IDs from plan frontmatter, linked to REQUIREMENTS.md descriptions}
|
|
```
|
|
|
|
**5. Testing section:**
|
|
```markdown
|
|
## Verification
|
|
|
|
- [x] Automated verification: {pass/fail from VERIFICATION.md}
|
|
- {human verification items from VERIFICATION.md, if any}
|
|
```
|
|
|
|
**6. Decisions section:**
|
|
```markdown
|
|
## Key Decisions
|
|
|
|
{Decisions from STATE.md accumulated context relevant to this phase}
|
|
```
|
|
</step>
|
|
|
|
<step name="create_pr">
|
|
Create the PR using the generated body:
|
|
|
|
```bash
|
|
gh pr create \
|
|
--title "Phase ${PHASE_NUMBER}: ${PHASE_NAME}" \
|
|
--body "${PR_BODY}" \
|
|
--base ${BASE_BRANCH}
|
|
```
|
|
|
|
If `--draft` flag was passed: add `--draft`.
|
|
|
|
Report: "PR #{number} created: {url}"
|
|
</step>
|
|
|
|
<step name="optional_review">
|
|
Ask if user wants to trigger a code review:
|
|
|
|
```
|
|
AskUserQuestion:
|
|
question: "PR created. Run a code review before merge?"
|
|
options:
|
|
- label: "Skip review"
|
|
description: "PR is ready — merge when CI passes"
|
|
- label: "Self-review"
|
|
description: "I'll review the diff in the PR myself"
|
|
- label: "Request review"
|
|
description: "Request review from a teammate"
|
|
```
|
|
|
|
**If "Request review":**
|
|
```bash
|
|
gh pr edit ${PR_NUMBER} --add-reviewer "${REVIEWER}"
|
|
```
|
|
|
|
**If "Self-review":**
|
|
Report the PR URL and suggest: "Review the diff at {url}/files"
|
|
</step>
|
|
|
|
<step name="track_shipping">
|
|
Update STATE.md to reflect the shipping action:
|
|
|
|
```bash
|
|
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state update "Last Activity" "$(date +%Y-%m-%d)"
|
|
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state update "Status" "Phase ${PHASE_NUMBER} shipped — PR #${PR_NUMBER}"
|
|
```
|
|
|
|
If `commit_docs` is true:
|
|
```bash
|
|
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(${padded_phase}): ship phase ${PHASE_NUMBER} — PR #${PR_NUMBER}" --files .planning/STATE.md
|
|
```
|
|
</step>
|
|
|
|
<step name="report">
|
|
```
|
|
───────────────────────────────────────────────────────────────
|
|
|
|
## ✓ Phase {X}: {Name} — Shipped
|
|
|
|
PR: #{number} ({url})
|
|
Branch: {branch} → ${BASE_BRANCH}
|
|
Commits: {count}
|
|
Verification: ✓ Passed
|
|
Requirements: {N} REQ-IDs addressed
|
|
|
|
Next steps:
|
|
- Review/approve PR
|
|
- Merge when CI passes
|
|
- /gsd-complete-milestone (if last phase in milestone)
|
|
- /gsd-progress (to see what's next)
|
|
|
|
───────────────────────────────────────────────────────────────
|
|
```
|
|
</step>
|
|
|
|
</process>
|
|
|
|
<offer_next>
|
|
After shipping:
|
|
|
|
- /gsd-complete-milestone — if all phases in milestone are done
|
|
- /gsd-progress — see overall project state
|
|
- /gsd-execute-phase {next} — continue to next phase
|
|
</offer_next>
|
|
|
|
<success_criteria>
|
|
- [ ] Preflight checks passed (verification, clean tree, branch, remote, gh)
|
|
- [ ] Branch pushed to remote
|
|
- [ ] PR created with rich auto-generated body
|
|
- [ ] STATE.md updated with shipping status
|
|
- [ ] User knows PR number and next steps
|
|
</success_criteria>
|