diff --git a/.changeset/14-progress-auto-flag.md b/.changeset/14-progress-auto-flag.md new file mode 100644 index 000000000..ce0d1c4b4 --- /dev/null +++ b/.changeset/14-progress-auto-flag.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 148 +--- +The `--auto` flag is now wired through the `/gsd:progress` → `/gsd:next` handoff so that chaining these commands works without requiring the flag to be re-supplied manually. diff --git a/commands/gsd/progress.md b/commands/gsd/progress.md index e85cc4517..f351c69ea 100644 --- a/commands/gsd/progress.md +++ b/commands/gsd/progress.md @@ -23,6 +23,7 @@ Three modes: - **--next**: Detect current project state and automatically invoke the next logical GSD workflow step. Scans all prior phases for incomplete work before routing. `--next --force` bypasses safety gates. +- **--next --auto**: Like `--next`, but after the determined step completes, automatically re-invokes `/gsd:progress --next --auto` to continue chaining steps until completion or a blocking decision. Enables hands-free plan→execute→verify→complete progression. - **--do "..."**: Smart dispatcher — match freeform intent to the best GSD command using routing rules, confirm the match, then hand off. - **--forensic**: Run 6-check integrity audit after the standard progress report. - **(no flag)**: Standard progress check + intelligent routing (Routes A through F). @@ -38,7 +39,7 @@ Three modes: Arguments provided: "$ARGUMENTS" Parse the first token from the provided arguments: -- If it is `--next`: strip the flag, execute the next workflow (passing remaining args e.g. --force). +- If it is `--next`: strip the flag, execute the next workflow (passing remaining args e.g. --force, --auto). - If it is `--do`: strip the flag, pass remainder as freeform intent to the do workflow. - Otherwise: execute the progress workflow end-to-end (pass --forensic through if present). diff --git a/get-shit-done/workflows/next.md b/get-shit-done/workflows/next.md index c10e989fd..fba00866f 100644 --- a/get-shit-done/workflows/next.md +++ b/get-shit-done/workflows/next.md @@ -219,6 +219,18 @@ Display the determination: Then immediately invoke the determined command via SlashCommand. Do not ask for confirmation — the whole point of `/gsd:progress --next` is zero-friction advancement. + +**If `--auto` was passed:** after the determined command completes, automatically re-invoke `/gsd:progress --next --auto` to continue chaining to the next step. Repeat until one of: +- A milestone completes (`/gsd:complete-milestone` is reached) +- A blocking decision is required (safety gate triggers, prior-phase completeness prompt, user input needed) +- An error or paused state is detected + +When stopping due to a blocker, display: +``` +⛔ Auto-chain stopped: [reason — e.g. safety gate, blocking decision required] + +Resume with: `/gsd:progress --next --auto` once resolved. +``` diff --git a/scripts/lint-test-file-count.allowlist.json b/scripts/lint-test-file-count.allowlist.json index a35faef7d..3adf4608c 100644 --- a/scripts/lint-test-file-count.allowlist.json +++ b/scripts/lint-test-file-count.allowlist.json @@ -11,7 +11,7 @@ "state": { "current": 10, "issue": "21" }, "config": { "current": 8, "issue": "TBD" }, "graphify": { "current": 7, "issue": "TBD" }, - "progress": { "current": 5, "issue": "TBD" }, + "progress": { "current": 6, "issue": "14" }, "cli": { "current": 5, "issue": "TBD" }, "surface": { "current": 5, "issue": "TBD" }, "commit": { "current": 4, "issue": "TBD" }, diff --git a/tests/bug-14-progress-auto-flag-dropped.test.cjs b/tests/bug-14-progress-auto-flag-dropped.test.cjs new file mode 100644 index 000000000..88767adc5 --- /dev/null +++ b/tests/bug-14-progress-auto-flag-dropped.test.cjs @@ -0,0 +1,73 @@ +// allow-test-rule: source-text-is-the-product +// The command markdown is loaded directly by runtime prompt assembly. +// This test verifies that --auto is documented in progress.md and handled in next.md. + +'use strict'; + +const { test, describe } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const ROOT = path.join(__dirname, '..'); + +describe('#14: /gsd:progress --next --auto flag must be documented and propagated', () => { + test('progress.md section documents --auto flag', () => { + const command = fs.readFileSync( + path.join(ROOT, 'commands', 'gsd', 'progress.md'), + 'utf8' + ); + + assert.ok( + command.includes('--auto'), + 'progress.md must document the --auto flag in the section' + ); + }); + + test('progress.md block explicitly passes --auto through to next workflow', () => { + const command = fs.readFileSync( + path.join(ROOT, 'commands', 'gsd', 'progress.md'), + 'utf8' + ); + + // Extract only the … block so this assertion is + // scoped to the handoff wiring, not just any occurrence in the file. + const processMatch = command.match(/([\s\S]*?)<\/process>/); + assert.ok( + processMatch, + 'progress.md must contain a block' + ); + const processBlock = processMatch[1]; + + assert.ok( + processBlock.includes('--auto'), + 'progress.md block must explicitly mention --auto so it is not silently stripped at the --next handoff' + ); + }); + + test('next.md show_and_execute step handles --auto to chain steps', () => { + const workflow = fs.readFileSync( + path.join(ROOT, 'get-shit-done', 'workflows', 'next.md'), + 'utf8' + ); + + assert.ok( + workflow.includes('--auto'), + 'next.md must handle the --auto flag to chain step invocations automatically' + ); + }); + + test('next.md --auto chaining re-invokes /gsd:progress --next after step completion', () => { + const workflow = fs.readFileSync( + path.join(ROOT, 'get-shit-done', 'workflows', 'next.md'), + 'utf8' + ); + + // The workflow must contain instructions to re-invoke /gsd:progress --next --auto + // after the determined step completes, enabling the chain. + assert.ok( + workflow.includes('--next --auto'), + 'next.md must instruct re-invocation of /gsd:progress --next --auto after step completion to enable chaining' + ); + }); +});