fix(#2950): update stale deleted-command references in workflow files (#2952)

* fix(#2950): update stale deleted-command references in workflow files

Eight workflow files (help.md, do.md, settings.md, discuss-phase.md,
new-project.md, plan-phase.md, spike.md, sketch.md) referenced command
names removed in #2790. Updated all occurrences to canonical new forms:
  /gsd-phase (--insert / --remove), /gsd-capture, /gsd-config (--profile
  / --integrations / --advanced), /gsd-spike --wrap-up,
  /gsd-sketch --wrap-up, /gsd-code-review --fix.
Adds regression test (124 assertions) in tests/bug-2950-stale-command-refs.test.cjs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(#2950): update pre-existing assertions to accept new consolidated command forms

gsd-settings-advanced.test.cjs and settings-integrations.test.cjs were checking
settings.md for the old micro-skill names (/gsd-settings-advanced,
/gsd-settings-integrations). Now that #2950 updates settings.md to use the
consolidated equivalents, broaden the assertions to accept both old and new forms.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(#2950): require canonical command forms and forbid legacy variants

The broadened OR assertions added to unblock CI were too permissive — they
could pass with legacy names still present. Now assert the canonical form is
present (gsd-config --advanced / gsd-config --integrations) AND the legacy
forms are absent (gsd-settings-advanced, gsd:settings-advanced,
/gsd-settings-integrations).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-05-01 11:25:10 -04:00
committed by GitHub
parent 4d628b306a
commit 3ba17e872e
11 changed files with 193 additions and 41 deletions

View File

@@ -42,6 +42,10 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
now auto-closes PRs opened without a closing keyword that links a tracking issue,
posting a comment that points to the contribution guide. (#2872)
### Fixed
- **Stale deleted command references updated across workflow files** — `help.md`, `do.md`, `settings.md`, `discuss-phase.md`, `new-project.md`, `plan-phase.md`, `spike.md`, and `sketch.md` referenced command names removed in #2790; updated to new consolidated equivalents. (#2950)
### Fixed — 1.40.0-rc.1
- **`config-get context_window` returns `200000` when key absent** — querying an unset `context_window` previously exited 1 with "Key not found", surfacing a confusing error in planning logs even though the workflow fallback worked correctly. `cmdConfigGet` now consults a `SCHEMA_DEFAULTS` map and returns the documented default (`200000`, exit 0) for absent schema-defaulted keys; unknown absent keys still error as before. (#2943)
- **`gap-analysis` now parses non-`REQ-` requirement IDs and ignores traceability table headers** — `parseRequirements()` no longer hard-codes the `REQ-` prefix and now accepts uppercase prefixed IDs such as `TST-01`, `BACK-07`, and `INSP-04`; markdown table header rows (for example `| REQ-ID | ... |`) are excluded so header tokens are not reported as phantom uncovered requirements. Added regression coverage for mixed-prefix REQUIREMENTS files with traceability tables. (#2897)

View File

@@ -252,7 +252,7 @@ RAW_SKETCHES=$(ls .planning/sketches/MANIFEST.md 2>/dev/null)
If findings skills exist, read SKILL.md and reference files; extract validated patterns, landmines, constraints, design decisions. Add them to `<prior_decisions>`.
If raw spikes/sketches exist but no findings skill, note: `⚠ Unpackaged spikes/sketches detected — run /gsd-spike-wrap-up or /gsd-sketch-wrap-up to make findings available.`
If raw spikes/sketches exist but no findings skill, note: `⚠ Unpackaged spikes/sketches detected — run /gsd-spike --wrap-up or /gsd-sketch --wrap-up to make findings available.`
Build internal `<prior_decisions>` with sections for Project-Level (from PROJECT.md / REQUIREMENTS.md), From Prior Phases (per-phase decisions), and From Spike/Sketch Findings (validated patterns, landmines, design decisions).

View File

@@ -44,18 +44,18 @@ Evaluate `$ARGUMENTS` against these routing rules. Apply the **first matching**
| A bug, error, crash, failure, or something broken | `/gsd-debug` | Needs systematic investigation |
| Spiking, "test if", "will this work", "experiment", "prove this out", validate feasibility | `/gsd-spike` | Throwaway experiment to validate feasibility |
| Sketching, "mockup", "what would this look like", "prototype the UI", "design this", explore visual direction | `/gsd-sketch` | Throwaway HTML mockups to explore design |
| Wrapping up spikes, "package the spikes", "consolidate spike findings" | `/gsd-spike-wrap-up` | Package spike findings into reusable skill |
| Wrapping up sketches, "package the designs", "consolidate sketch findings" | `/gsd-sketch-wrap-up` | Package sketch findings into reusable skill |
| Wrapping up spikes, "package the spikes", "consolidate spike findings" | `/gsd-spike --wrap-up` | Package spike findings into reusable skill |
| Wrapping up sketches, "package the designs", "consolidate sketch findings" | `/gsd-sketch --wrap-up` | Package sketch findings into reusable skill |
| Exploring, researching, comparing, or "how does X work" | `/gsd-research-phase` | Domain research before planning |
| Discussing vision, "how should X look", brainstorming | `/gsd-discuss-phase` | Needs context gathering |
| A complex task: refactoring, migration, multi-file architecture, system redesign | `/gsd-add-phase` | Needs a full phase with plan/build cycle |
| A complex task: refactoring, migration, multi-file architecture, system redesign | `/gsd-phase` | Needs a full phase with plan/build cycle |
| Planning a specific phase or "plan phase N" | `/gsd-plan-phase` | Direct planning request |
| Executing a phase or "build phase N", "run phase N" | `/gsd-execute-phase` | Direct execution request |
| Running all remaining phases automatically | `/gsd-autonomous` | Full autonomous execution |
| A review or quality concern about existing work | `/gsd-verify-work` | Needs verification |
| Checking progress, status, "where am I" | `/gsd-progress` | Status check |
| Resuming work, "pick up where I left off" | `/gsd-resume-work` | Session restoration |
| A note, idea, or "remember to..." | `/gsd-add-todo` | Capture for later |
| A note, idea, or "remember to..." | `/gsd-capture` | Capture for later |
| Adding tests, "write tests", "test coverage" | `/gsd-add-tests` | Test generation |
| Completing a milestone, shipping, releasing | `/gsd-complete-milestone` | Milestone lifecycle |
| A specific, actionable, small task (add feature, fix typo, update config) | `/gsd-quick` | Self-contained, single executor |
@@ -66,7 +66,7 @@ Evaluate `$ARGUMENTS` against these routing rules. Apply the **first matching**
```
"Refactor the authentication system" could be:
1. /gsd-add-phase — Full planning cycle (recommended for multi-file refactors)
1. /gsd-phase — Full planning cycle (recommended for multi-file refactors)
2. /gsd-quick — Quick execution (if scope is small and clear)
Which approach fits better?

View File

@@ -172,26 +172,26 @@ Usage: `/gsd-fast "add .env to gitignore"`
### Roadmap Management
**`/gsd-add-phase <description>`**
**`/gsd-phase <description>`**
Add new phase to end of current milestone.
- Appends to ROADMAP.md
- Uses next sequential number
- Updates phase directory structure
Usage: `/gsd-add-phase "Add admin dashboard"`
Usage: `/gsd-phase "Add admin dashboard"`
**`/gsd-insert-phase <after> <description>`**
**`/gsd-phase --insert <after> <description>`**
Insert urgent work as decimal phase between existing phases.
- Creates intermediate phase (e.g., 7.1 between 7 and 8)
- Useful for discovered work that must happen mid-milestone
- Maintains phase ordering
Usage: `/gsd-insert-phase 7 "Fix critical auth bug"`
Usage: `/gsd-phase --insert 7 "Fix critical auth bug"`
Result: Creates Phase 7.1
**`/gsd-remove-phase <number>`**
**`/gsd-phase --remove <number>`**
Remove a future phase and renumber subsequent phases.
- Deletes phase directory and all references
@@ -199,7 +199,7 @@ Remove a future phase and renumber subsequent phases.
- Only works on future (unstarted) phases
- Git commit preserves historical record
Usage: `/gsd-remove-phase 17`
Usage: `/gsd-phase --remove 17`
Result: Phase 17 deleted, phases 18-20 become 17-19
### Milestone Management
@@ -305,7 +305,7 @@ Rapidly sketch UI/design ideas using throwaway HTML mockups with multi-variant e
Usage: `/gsd-sketch "dashboard layout for the admin panel"`
Usage: `/gsd-sketch --quick "form card grouping"`
**`/gsd-spike-wrap-up`**
**`/gsd-spike --wrap-up`**
Package spike findings into a persistent project skill.
- Curates each spike one-at-a-time (include/exclude/partial/UAT)
@@ -314,9 +314,9 @@ Package spike findings into a persistent project skill.
- Writes summary to `.planning/spikes/WRAP-UP-SUMMARY.md`
- Adds auto-load routing line to project CLAUDE.md
Usage: `/gsd-spike-wrap-up`
Usage: `/gsd-spike --wrap-up`
**`/gsd-sketch-wrap-up`**
**`/gsd-sketch --wrap-up`**
Package sketch design findings into a persistent project skill.
- Curates each sketch one-at-a-time (include/exclude/partial/revisit)
@@ -325,7 +325,7 @@ Package sketch design findings into a persistent project skill.
- Writes summary to `.planning/sketches/WRAP-UP-SUMMARY.md`
- Adds auto-load routing line to project CLAUDE.md
Usage: `/gsd-sketch-wrap-up`
Usage: `/gsd-sketch --wrap-up`
### Quick Notes
@@ -344,7 +344,7 @@ Usage: `/gsd-note --global cross-project idea`
### Todo Management
**`/gsd-add-todo [description]`**
**`/gsd-capture [description]`**
Capture idea or task as todo from current conversation.
- Extracts context from conversation (or uses provided description)
@@ -353,8 +353,8 @@ Capture idea or task as todo from current conversation.
- Checks for duplicates before creating
- Updates STATE.md todo count
Usage: `/gsd-add-todo` (infers from conversation)
Usage: `/gsd-add-todo Add auth token refresh`
Usage: `/gsd-capture` (infers from conversation)
Usage: `/gsd-capture Add auth token refresh`
**`/gsd-check-todos [area]`**
List pending todos and select one to work on.
@@ -473,7 +473,7 @@ Configure workflow toggles and model profile interactively.
Usage: `/gsd-settings`
**`/gsd-set-profile <profile>`**
**`/gsd-config --profile <profile>`**
Quick switch model profile for GSD agents.
- `quality` — Opus everywhere except verification
@@ -481,7 +481,7 @@ Quick switch model profile for GSD agents.
- `budget` — Sonnet for writing, Haiku for research/verification
- `inherit` — Use current session model for all agents (OpenCode `/model`)
Usage: `/gsd-set-profile budget`
Usage: `/gsd-config --profile budget`
### Utility Commands
@@ -627,7 +627,7 @@ Example config:
**Adding urgent mid-milestone work:**
```
/gsd-insert-phase 5 "Critical security fix"
/gsd-phase --insert 5 "Critical security fix"
/gsd-plan-phase 5.1
/gsd-execute-phase 5.1
```
@@ -643,8 +643,8 @@ Example config:
**Capturing ideas during work:**
```
/gsd-add-todo # Capture from conversation context
/gsd-add-todo Fix modal z-index # Capture with explicit description
/gsd-capture # Capture from conversation context
/gsd-capture Fix modal z-index # Capture with explicit description
/gsd-check-todos # Review and work on todos
/gsd-check-todos api # Filter by area
```

View File

@@ -269,8 +269,8 @@ If any of these exist, surface them before questioning:
⚡ Prior exploration detected:
{if SPIKE_SKILL} ✓ Spike findings skill: {path} — validated patterns from experiments
{if SKETCH_SKILL} ✓ Sketch findings skill: {path} — validated design decisions
{if HAS_SPIKES && !SPIKE_SKILL} ◆ Raw spikes in .planning/spikes/ — consider `/gsd-spike-wrap-up` to package findings
{if HAS_SKETCHES && !SKETCH_SKILL} ◆ Raw sketches in .planning/sketches/ — consider `/gsd-sketch-wrap-up` to package findings
{if HAS_SPIKES && !SPIKE_SKILL} ◆ Raw spikes in .planning/spikes/ — consider `/gsd-spike --wrap-up` to package findings
{if HAS_SKETCHES && !SKETCH_SKILL} ◆ Raw sketches in .planning/sketches/ — consider `/gsd-sketch --wrap-up` to package findings
These findings will be incorporated into project context and available to planning agents.
```

View File

@@ -996,7 +996,7 @@ rest become a follow-up phase
Use AskUserQuestion with these 3 options.
**If "Split":** Use `/gsd-insert-phase` to create the sub-phases, then replan each.
**If "Split":** Use `/gsd-phase --insert` to create the sub-phases, then replan each.
**If "Proceed":** Return to planner with instruction to attempt all items at full fidelity, accepting more plans/tasks.
**If "Prioritize":** Use AskUserQuestion (multiSelect) to let user pick which items are "now" vs "later". Create CONTEXT.md for each sub-phase with the selected items.
@@ -1025,7 +1025,7 @@ Options:
Use AskUserQuestion for each gap (or batch if multiple gaps).
**If "Add plan":** Return to planner (step 8) with instruction to add plans covering the missing items, preserving existing plans.
**If "Split":** Use `/gsd-insert-phase` for overflow items, then replan.
**If "Split":** Use `/gsd-phase --insert` for overflow items, then replan.
**If "Defer":** Record in CONTEXT.md `## Deferred Ideas` with developer's confirmation. Proceed to step 10.
## 10. Spawn gsd-plan-checker Agent

View File

@@ -45,7 +45,7 @@ Parse current values (default to `true` if not present):
- `workflow.ui_safety_gate` — prompt to run /gsd-ui-phase before planning frontend phases (default: true if absent)
- `workflow.ai_integration_phase` — framework selection + eval strategy for AI phases (default: true if absent)
- `workflow.tdd_mode` — enforce RED/GREEN/REFACTOR gate sequence during execute-phase (default: false if absent)
- `workflow.code_review` — enable /gsd-code-review and /gsd-code-review-fix commands (default: true if absent)
- `workflow.code_review` — enable /gsd-code-review and /gsd-code-review --fix commands (default: true if absent)
- `workflow.code_review_depth` — default depth for /gsd-code-review: `quick`, `standard`, or `deep` (default: `"standard"` if absent; only relevant when `code_review` is on)
- `workflow.ui_review` — run visual quality audit (/gsd-ui-review) in autonomous mode (default: true if absent)
- `commit_docs` — whether `.planning/` files are committed to git (default: true if absent)
@@ -150,7 +150,7 @@ AskUserQuestion([
]
},
{
question: "Enable Code Review? (/gsd-code-review and /gsd-code-review-fix commands)",
question: "Enable Code Review? (/gsd-code-review and /gsd-code-review --fix commands)",
header: "Code Review",
multiSelect: false,
options: [
@@ -457,12 +457,12 @@ Display:
These settings apply to future /gsd-plan-phase and /gsd-execute-phase runs.
Quick commands:
- /gsd-settings-integrations — configure API keys (Brave/Firecrawl/Exa), review.models CLI routing, and agent_skills injection
- /gsd-set-profile <profile> — switch model profile
- /gsd-config --integrations — configure API keys (Brave/Firecrawl/Exa), review.models CLI routing, and agent_skills injection
- /gsd-config --profile <profile> — switch model profile
- /gsd-plan-phase --research — force research
- /gsd-plan-phase --skip-research — skip research
- /gsd-plan-phase --skip-verify — skip plan check
- /gsd-settings-advanced — power-user tuning (plan bounce, timeouts, branch templates, cross-AI, context window)
- /gsd-config --advanced — power-user tuning (plan bounce, timeouts, branch templates, cross-AI, context window)
```
</step>

View File

@@ -1,7 +1,7 @@
<purpose>
Spike an idea through experiential exploration — build focused experiments to feel the pieces
of a future app, validate feasibility, and produce verified knowledge for the real build.
Saves artifacts to `.planning/spikes/`. Companion to `/gsd-spike-wrap-up`.
Saves artifacts to `.planning/spikes/`. Companion to `/gsd-spike --wrap-up`.
Supports two modes:
- **Idea mode** (default) — user describes an idea to spike
@@ -421,7 +421,7 @@ gsd-sdk query commit "docs(spikes): update conventions" --files .planning/spikes
**Package findings** — wrap spike knowledge into an implementation blueprint
`/gsd-spike-wrap-up`
`/gsd-spike --wrap-up`
───────────────────────────────────────────────────────────────

View File

@@ -0,0 +1,140 @@
/**
* Bug #2950: Stale deleted command references in workflow files
*
* Multiple workflow files referenced command names removed in #2790
* (gsd-add-phase, gsd-insert-phase, gsd-remove-phase, gsd-add-todo,
* gsd-set-profile, gsd-settings-integrations, gsd-settings-advanced,
* gsd-spike-wrap-up, gsd-sketch-wrap-up, gsd-code-review-fix).
*
* Fix: Update every occurrence to the new consolidated forms:
* /gsd-phase (no flag | --insert | --remove)
* /gsd-capture
* /gsd-config (--profile | --integrations | --advanced)
* /gsd-spike --wrap-up
* /gsd-sketch --wrap-up
* /gsd-code-review --fix
*/
'use strict';
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const WORKFLOWS_DIR = path.join(__dirname, '..', 'get-shit-done', 'workflows');
function read(filename) {
return fs.readFileSync(path.join(WORKFLOWS_DIR, filename), 'utf-8');
}
// Deleted command names that must not appear anywhere in the fixed files.
const DELETED_COMMANDS = [
'/gsd-add-phase',
'/gsd-insert-phase',
'/gsd-remove-phase',
'/gsd-add-todo',
'/gsd-set-profile',
'/gsd-settings-integrations',
'/gsd-settings-advanced',
'/gsd-spike-wrap-up',
'/gsd-sketch-wrap-up',
'/gsd-code-review-fix',
];
// Per-file assertions: [file, deletedCmd, newForm]
const FILE_ASSERTIONS = [
// help.md
['help.md', '/gsd-add-phase', '/gsd-phase "Add admin dashboard"'],
['help.md', '/gsd-insert-phase', '/gsd-phase --insert 7 "Fix critical auth bug"'],
['help.md', '/gsd-remove-phase', '/gsd-phase --remove 17'],
['help.md', '/gsd-spike-wrap-up', '/gsd-spike --wrap-up'],
['help.md', '/gsd-sketch-wrap-up', '/gsd-sketch --wrap-up'],
['help.md', '/gsd-add-todo', '/gsd-capture'],
['help.md', '/gsd-set-profile', '/gsd-config --profile budget'],
// do.md
['do.md', '/gsd-spike-wrap-up', '/gsd-spike --wrap-up'],
['do.md', '/gsd-sketch-wrap-up', '/gsd-sketch --wrap-up'],
['do.md', '/gsd-add-phase', '/gsd-phase'],
['do.md', '/gsd-add-todo', '/gsd-capture'],
// settings.md
['settings.md', '/gsd-code-review-fix', '/gsd-code-review --fix'],
['settings.md', '/gsd-settings-integrations', '/gsd-config --integrations'],
['settings.md', '/gsd-set-profile', '/gsd-config --profile'],
['settings.md', '/gsd-settings-advanced', '/gsd-config --advanced'],
// discuss-phase.md
['discuss-phase.md', '/gsd-spike-wrap-up', '/gsd-spike --wrap-up'],
['discuss-phase.md', '/gsd-sketch-wrap-up', '/gsd-sketch --wrap-up'],
// new-project.md
['new-project.md', '/gsd-spike-wrap-up', '/gsd-spike --wrap-up'],
['new-project.md', '/gsd-sketch-wrap-up', '/gsd-sketch --wrap-up'],
// plan-phase.md
['plan-phase.md', '/gsd-insert-phase', '/gsd-phase --insert'],
// spike.md
['spike.md', '/gsd-spike-wrap-up', '/gsd-spike --wrap-up'],
// sketch.md
['sketch.md', '/gsd-sketch-wrap-up', '/gsd-sketch --wrap-up'],
];
describe('bug #2950: stale deleted-command references removed from workflow files', () => {
// Build a map of file → content to avoid re-reading
const files = [...new Set(FILE_ASSERTIONS.map(([f]) => f))];
const contentMap = {};
for (const f of files) {
contentMap[f] = read(f);
}
// For each (file, deletedCmd) pair, assert the old name is absent
for (const [file, deletedCmd] of FILE_ASSERTIONS) {
test(`${file}: does not contain deleted command "${deletedCmd}"`, () => {
const content = contentMap[file];
assert.ok(
!content.includes(deletedCmd),
`${file} still contains deleted command "${deletedCmd}" — update to new form`
);
});
}
// For each (file, deletedCmd, newForm) triple, assert the new form is present
for (const [file, , newForm] of FILE_ASSERTIONS) {
test(`${file}: contains new form "${newForm}"`, () => {
const content = contentMap[file];
assert.ok(
content.includes(newForm),
`${file} is missing expected new form "${newForm}"`
);
});
}
// Blanket check: no affected workflow file contains any of the deleted command names
// (catches any we might have missed in per-file assertions above)
const affectedFiles = [
'help.md',
'do.md',
'settings.md',
'discuss-phase.md',
'new-project.md',
'plan-phase.md',
'spike.md',
'sketch.md',
];
for (const file of affectedFiles) {
const content = read(file);
for (const deleted of DELETED_COMMANDS) {
test(`${file}: blanket check — "${deleted}" not present`, () => {
assert.ok(
!content.includes(deleted),
`${file} contains deleted command "${deleted}"`
);
});
}
}
});

View File

@@ -201,11 +201,15 @@ describe('gsd-settings-advanced — VALID_CONFIG_KEYS coverage', () => {
// ─── /gsd-settings mentions /gsd-settings-advanced ────────────────────────────
describe('/gsd-settings advertises /gsd-settings-advanced', () => {
test('settings workflow confirmation mentions gsd-settings-advanced', () => {
test('settings workflow mentions canonical /gsd-config --advanced', () => {
const text = fs.readFileSync(SETTINGS_WORKFLOW_PATH, 'utf-8');
assert.ok(
text.includes('gsd-settings-advanced') || text.includes('gsd:settings-advanced'),
'get-shit-done/workflows/settings.md must mention /gsd-settings-advanced or /gsd:settings-advanced'
text.includes('gsd-config --advanced'),
'get-shit-done/workflows/settings.md must mention /gsd-config --advanced'
);
assert.ok(
!text.includes('gsd-settings-advanced') && !text.includes('gsd:settings-advanced'),
'get-shit-done/workflows/settings.md must not mention legacy /gsd-settings-advanced variants'
);
});
});

View File

@@ -265,11 +265,15 @@ describe('#2529 config merge safety', () => {
// ─── /gsd-settings mentions /gsd-settings-integrations ──────────────────────
describe('#2529 /gsd-settings mentions new command', () => {
test('settings workflow mentions /gsd-settings-integrations in its confirmation output', () => {
test('settings workflow mentions canonical /gsd-config --integrations', () => {
const src = fs.readFileSync(SETTINGS_WORKFLOW_PATH, 'utf-8');
assert.ok(
src.includes('/gsd-settings-integrations'),
'settings.md must mention /gsd-settings-integrations as a follow-up'
src.includes('gsd-config --integrations'),
'settings.md must mention /gsd-config --integrations'
);
assert.ok(
!src.includes('/gsd-settings-integrations'),
'settings.md must not mention the legacy /gsd-settings-integrations variant'
);
});
});