* chore(#191): migrate gsd-sdk query call sites to gsd-tools query Retiring the gsd-sdk shim. gsd-tools.cjs already accepts `query` as a meta-prefix (gsd-tools query <command>), so this is a behavior-preserving 1:1 swap across the runtime reference prompts, the graphify hook's commit-detection gate, and two bin/lib comment/message references. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(#191): remove vestigial gsd-sdk shim code from installer + projection The gsd-sdk shim was already not wired up (no gsd-sdk bin in package.json; buildWindowsShimTriple had zero call sites). Remove the dead code: - shell-command-projection.cjs: buildWindowsShimTriple + formatSdkPathDiagnostic (+ their now-unused PACKAGE_NAME import) and exports - install.js: the re-export wrappers + imports, the #3406 stale-standalone-sdk detection (detectStaleStandaloneSdk/formatStaleStandaloneSdkWarning + its global-install call site), and the exports Preserved (retained, not gsd-sdk): buildCodexHookWindowsShimIR (#3426) — only its comments referenced the gsd-sdk pattern; reworded. Also kept the homePathCoveredByRc 'reopen your shell' branch in maybeSuggestPathExport — its logic is bin-dir-agnostic, only the message mentioned gsd-sdk; reworded to use the actual bin dir. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test(#191): update tests for retired gsd-sdk shim - bug-3441/bug-3442: drop the formatSdkPathDiagnostic / buildWindowsShimTriple assertions (functions removed); retained PATH-action + drift-guard tests stay - bug-505: remove the 'still exported' assertions for detectStaleStandaloneSdk / formatStaleStandaloneSdkWarning / the shim contract surface (#505 kept them; #191 removes them) - graphify-auto-update: migrate the hook-dispatch inputs gsd-sdk query commit -> gsd-tools query commit to match the migrated commit hook Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs(#191): point active docs at gsd-tools query (gsd-sdk shim retired) Update the user/agent-facing docs (AGENTS, COMMANDS, CONFIGURATION, USER-GUIDE, ship-pr-body-sections) that presented gsd-sdk query as a current command to gsd-tools query. Historical docs (ADRs, PRDs, release notes) left untouched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs(#191): correct state.load vs state.json description for gsd-tools query Adversarial-review (codex) finding: the migrated USER-GUIDE line claimed both 'gsd-tools query state.json' and 'state.load' resolve to the frontmatter-rebuild handler. Verified they don't — state.load returns the CJS load shape (config + state_raw + flags), state.json returns the frontmatter shape. Both are available via gsd-tools query; corrected the text to say so. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(#191): add changeset for gsd-sdk shim retirement Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
171 lines
5.6 KiB
Markdown
171 lines
5.6 KiB
Markdown
# Custom PR Body Sections
|
|
|
|
`/gsd-ship` creates a pull request body from the planning artifacts for a verified phase. Projects can append extra PRD-style sections to that body with `ship.pr_body_sections` in `.planning/config.json`.
|
|
|
|
Use this when your project needs the PR to carry more release context than the default GSD sections, such as user stories, acceptance criteria, risks, release criteria, or stakeholder approval notes.
|
|
|
|
## What GSD Always Includes
|
|
|
|
Every generated `/gsd-ship` PR body keeps the required core sections:
|
|
|
|
- `Summary`
|
|
- `Changes`
|
|
- `Requirements Addressed`
|
|
- `Verification`
|
|
- `Key Decisions`
|
|
|
|
Custom sections are append-only. They render after `Key Decisions`; they cannot replace, remove, or reorder the core sections.
|
|
|
|
## Configure Sections During Onboarding
|
|
|
|
During `/gsd-new-project`, GSD can seed optional PRD-style sections into `.planning/config.json`.
|
|
|
|
Recommended onboarding choices:
|
|
|
|
- `User Stories & Acceptance Criteria` for user-facing stories and acceptance checks.
|
|
- `Risks & Dependencies` for rollout risks, dependencies, and rollback notes.
|
|
- `Success Metrics & Release Criteria` for Definition of Done, measurable outcomes, and release checks.
|
|
- `Stakeholder Review & Approval` for sign-off traceability.
|
|
|
|
Selected sections are written with `"enabled": true`. Seeded but unselected sections are written with `"enabled": false`, so you can enable them later without editing the shipped `/gsd-ship` workflow.
|
|
|
|
## Configure Sections Manually
|
|
|
|
Set `ship.pr_body_sections` with `gsd-tools query config-set`:
|
|
|
|
```bash
|
|
gsd-tools query config-set ship.pr_body_sections '[{"heading":"Risks & Dependencies","enabled":true,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."}]'
|
|
```
|
|
|
|
You can also edit `.planning/config.json` directly:
|
|
|
|
```json
|
|
{
|
|
"ship": {
|
|
"pr_body_sections": [
|
|
{
|
|
"heading": "User Stories & Acceptance Criteria",
|
|
"enabled": true,
|
|
"source": "REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria",
|
|
"fallback": "- Acceptance criteria are covered by the linked requirements and verification evidence."
|
|
},
|
|
{
|
|
"heading": "Risks & Dependencies",
|
|
"enabled": true,
|
|
"source": "PLAN.md ## Risks || PLAN.md ## Dependencies",
|
|
"fallback": "- No known high-risk rollout dependencies."
|
|
},
|
|
{
|
|
"heading": "Stakeholder Review & Approval",
|
|
"enabled": false,
|
|
"template": "- Product owner approval pending for {phase_name}."
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Section Fields
|
|
|
|
Each section is an object with these fields:
|
|
|
|
| Field | Required | Description |
|
|
|-------|----------|-------------|
|
|
| `heading` | Yes | Markdown heading text rendered as `## {heading}`. Must be one line. |
|
|
| `enabled` | No | Defaults to `true`. Set `false` to keep a section in config without rendering it. |
|
|
| `source` | No | Fallback chain of planning artifact headings to copy into the PR body. |
|
|
| `template` | No | Literal Markdown with a small set of supported tokens. |
|
|
| `fallback` | No | Literal Markdown used when `source` finds no content and no `template` is present. |
|
|
|
|
Each section must include at least one of `source`, `template`, or `fallback`.
|
|
|
|
## Source Selectors
|
|
|
|
`source` points at headings in planning artifacts. Use `||` to provide fallbacks:
|
|
|
|
```text
|
|
REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria
|
|
```
|
|
|
|
Allowed source files:
|
|
|
|
- `ROADMAP.md`
|
|
- `PLAN.md`
|
|
- `SUMMARY.md`
|
|
- `VERIFICATION.md`
|
|
- `STATE.md`
|
|
- `REQUIREMENTS.md`
|
|
- `CONTEXT.md`
|
|
|
|
If the first selector has no content, GSD tries the next selector. If no selector produces content, GSD uses `fallback` when present. Empty final bodies are omitted.
|
|
|
|
## Template Tokens
|
|
|
|
`template` supports only these tokens:
|
|
|
|
- `{phase_number}`
|
|
- `{phase_name}`
|
|
- `{phase_dir}`
|
|
- `{base_branch}`
|
|
- `{padded_phase}`
|
|
|
|
Unknown tokens are rejected by config validation. This keeps PR body generation predictable and avoids accidental prompt or shell expansion.
|
|
|
|
Example:
|
|
|
|
```json
|
|
{
|
|
"heading": "Stakeholder Review & Approval",
|
|
"enabled": true,
|
|
"template": "- Product owner approval pending for {phase_name}."
|
|
}
|
|
```
|
|
|
|
## Agile PRD Examples
|
|
|
|
For a lightweight agile PRD trail, use sections that map to the increment being shipped:
|
|
|
|
```json
|
|
{
|
|
"heading": "User Stories & Acceptance Criteria",
|
|
"enabled": true,
|
|
"source": "REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria",
|
|
"fallback": "- Acceptance criteria are covered by the linked requirements and verification evidence."
|
|
}
|
|
```
|
|
|
|
```json
|
|
{
|
|
"heading": "Success Metrics & Release Criteria",
|
|
"enabled": true,
|
|
"source": "REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria",
|
|
"fallback": "- Release when automated verification and required manual checks pass."
|
|
}
|
|
```
|
|
|
|
These sections make the PR body useful as a release artifact: concise enough for review, but traceable back to requirements and verification.
|
|
|
|
## Troubleshooting
|
|
|
|
### `ship.pr_body_sections` is rejected
|
|
|
|
Check that the value is a JSON array and each entry has:
|
|
|
|
- a one-line `heading`
|
|
- `enabled` as `true` or `false`, not a string
|
|
- at least one of `source`, `template`, or `fallback`
|
|
- only supported fields
|
|
|
|
### A section does not appear in the PR body
|
|
|
|
Check these conditions:
|
|
|
|
- `enabled` is not `false`
|
|
- the selected source heading exists in the allowed artifact
|
|
- `fallback` or `template` is present if source content may be missing
|
|
- the rendered body is not empty after trimming
|
|
|
|
### A template token is rejected
|
|
|
|
Use only the supported token list above. Arbitrary environment variables, shell substitutions, and project-specific tokens are intentionally unsupported.
|