diff --git a/CHANGELOG.md b/CHANGELOG.md index 9783e1d5f..eaf249dab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased](https://github.com/gsd-build/get-shit-done/compare/v1.38.5...HEAD) +### Fixed + +- **`sketch --wrap-up` now dispatches correctly** — `/gsd-sketch --wrap-up` was silently no-oping because the flag dispatch wiring was omitted when the micro-skill entry point was absorbed in #2790. (#2949) + ### Added — 1.40.0-rc.1 - **Six namespace meta-skills with keyword-tag descriptions** — replace the flat 86-skill listing with two-stage hierarchical routing. Model sees 6 namespace routers diff --git a/commands/gsd/sketch.md b/commands/gsd/sketch.md index 8e5521778..c547876f6 100644 --- a/commands/gsd/sketch.md +++ b/commands/gsd/sketch.md @@ -30,6 +30,7 @@ Does not require `/gsd-new-project` — auto-creates `.planning/sketches/` if ne @~/.claude/get-shit-done/workflows/sketch.md +@~/.claude/get-shit-done/workflows/sketch-wrap-up.md @~/.claude/get-shit-done/references/ui-brand.md @~/.claude/get-shit-done/references/sketch-theme-system.md @~/.claude/get-shit-done/references/sketch-interactivity.md @@ -50,6 +51,9 @@ Design idea: $ARGUMENTS -Execute the sketch workflow from @~/.claude/get-shit-done/workflows/sketch.md end-to-end. +Parse the first token of $ARGUMENTS: +- If it is `--wrap-up`: strip the flag, execute the sketch-wrap-up workflow from @~/.claude/get-shit-done/workflows/sketch-wrap-up.md end-to-end. +- Otherwise: execute the sketch workflow from @~/.claude/get-shit-done/workflows/sketch.md end-to-end. + Preserve all workflow gates (intake, decomposition, target stack research, variant evaluation, MANIFEST updates, commit patterns). diff --git a/get-shit-done/workflows/sketch.md b/get-shit-done/workflows/sketch.md index 151b5433e..6ef5a2636 100644 --- a/get-shit-done/workflows/sketch.md +++ b/get-shit-done/workflows/sketch.md @@ -1,7 +1,7 @@ Explore design directions through throwaway HTML mockups before committing to implementation. Each sketch produces 2-3 variants for comparison. Saves artifacts to `.planning/sketches/`. -Companion to `/gsd-sketch-wrap-up`. +Companion to `/gsd-sketch --wrap-up`. Supports two modes: - **Idea mode** (default) — user describes a design idea to sketch @@ -331,7 +331,7 @@ After all sketches complete: **Package findings** — wrap design decisions into a reusable skill -`/gsd-sketch-wrap-up` +`/gsd-sketch --wrap-up` ─────────────────────────────────────────────────────────────── diff --git a/tests/bug-2949-sketch-wrap-up-dispatch.test.cjs b/tests/bug-2949-sketch-wrap-up-dispatch.test.cjs new file mode 100644 index 000000000..2ffe47d5e --- /dev/null +++ b/tests/bug-2949-sketch-wrap-up-dispatch.test.cjs @@ -0,0 +1,61 @@ +/** + * GSD Tests — /gsd-sketch --wrap-up silently no-ops (#2949) + * + * The --wrap-up flag was documented in commands/gsd/sketch.md but never dispatched. + * The sketch-wrap-up.md micro-skill entry point was deleted in #2790 and the dispatch + * wiring was never added to the command or workflow. + */ + +'use strict'; + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('fs'); +const path = require('path'); + +const ROOT = path.resolve(__dirname, '..'); +const SKETCH_COMMAND = path.join(ROOT, 'commands/gsd/sketch.md'); +const SKETCH_WORKFLOW = path.join(ROOT, 'get-shit-done/workflows/sketch.md'); + +describe('bug-2949: sketch --wrap-up dispatch wiring', () => { + test('commands/gsd/sketch.md contains --wrap-up dispatch logic', () => { + const content = fs.readFileSync(SKETCH_COMMAND, 'utf8'); + assert.ok( + content.includes('--wrap-up'), + 'sketch.md should contain --wrap-up dispatch logic' + ); + // The dispatch should route to sketch-wrap-up workflow + assert.ok( + content.includes('sketch-wrap-up'), + 'sketch.md should reference sketch-wrap-up in dispatch logic' + ); + }); + + test('commands/gsd/sketch.md has sketch-wrap-up in execution_context section', () => { + const content = fs.readFileSync(SKETCH_COMMAND, 'utf8'); + // Find execution_context block + const execCtxMatch = content.match(/([\s\S]*?)<\/execution_context>/); + assert.ok(execCtxMatch, 'sketch.md must have an block'); + const execCtx = execCtxMatch[1]; + assert.ok( + execCtx.includes('sketch-wrap-up'), + `execution_context block should include sketch-wrap-up workflow; got: ${execCtx}` + ); + }); + + test('workflows/sketch.md does NOT contain old /gsd-sketch-wrap-up form', () => { + const content = fs.readFileSync(SKETCH_WORKFLOW, 'utf8'); + assert.ok( + !content.includes('/gsd-sketch-wrap-up'), + 'workflows/sketch.md must not reference the old /gsd-sketch-wrap-up command' + ); + }); + + test('workflows/sketch.md DOES contain new /gsd-sketch --wrap-up form', () => { + const content = fs.readFileSync(SKETCH_WORKFLOW, 'utf8'); + assert.ok( + content.includes('/gsd-sketch --wrap-up'), + 'workflows/sketch.md should reference /gsd-sketch --wrap-up (the new form)' + ); + }); +});