From e8063ac9bbc6a677441368a7468e634e63910758 Mon Sep 17 00:00:00 2001 From: Tibsfox Date: Fri, 3 Apr 2026 22:27:51 -0700 Subject: [PATCH] =?UTF-8?q?fix(plan-phase):=20preserve=20chain=20flag=20ac?= =?UTF-8?q?ross=20discuss=E2=86=92plan=E2=86=92execute=20(#1620)=20(#1633)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The --chain flag was not checked in plan-phase's auto-advance guard, causing the ephemeral _auto_chain_active config to be cleared when discuss-phase chained into plan-phase. This broke the discuss→plan→ execute auto-advance pipeline, requiring manual intervention at each transition. Two fixes applied to plan-phase.md step 15: - Sync-flag guard now checks for both --auto AND --chain before clearing _auto_chain_active (matching discuss-phase's pattern) - Added chain flag persistence (config-set _auto_chain_active true) before auto-advancing, handling direct invocation without prior discuss-phase Co-authored-by: Claude Opus 4.6 (1M context) --- get-shit-done/workflows/plan-phase.md | 15 ++++-- tests/chain-flag-plan-phase.test.cjs | 70 +++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 tests/chain-flag-plan-phase.test.cjs diff --git a/get-shit-done/workflows/plan-phase.md b/get-shit-done/workflows/plan-phase.md index 3fd5d7f88..8078e8090 100644 --- a/get-shit-done/workflows/plan-phase.md +++ b/get-shit-done/workflows/plan-phase.md @@ -855,10 +855,10 @@ Route to `` OR `auto_advance` depending on flags/config. Check for auto-advance trigger: -1. Parse `--auto` flag from $ARGUMENTS -2. **Sync chain flag with intent** — if user invoked manually (no `--auto`), clear the ephemeral chain flag from any previous interrupted `--auto` chain. This does NOT touch `workflow.auto_advance` (the user's persistent settings preference): +1. Parse `--auto` and `--chain` flags from $ARGUMENTS +2. **Sync chain flag with intent** — if user invoked manually (no `--auto` and no `--chain`), clear the ephemeral chain flag from any previous interrupted `--auto` chain. This does NOT touch `workflow.auto_advance` (the user's persistent settings preference): ```bash - if [[ ! "$ARGUMENTS" =~ --auto ]]; then + if [[ ! "$ARGUMENTS" =~ --auto ]] && [[ ! "$ARGUMENTS" =~ --chain ]]; then node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow._auto_chain_active false 2>/dev/null fi ``` @@ -868,7 +868,14 @@ Check for auto-advance trigger: AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false") ``` -**If `--auto` flag present OR `AUTO_CHAIN` is true OR `AUTO_CFG` is true:** +**If `--auto` or `--chain` flag present AND `AUTO_CHAIN` is not true:** Persist chain flag to config (handles direct invocation without prior discuss-phase): +```bash +if ([[ "$ARGUMENTS" =~ --auto ]] || [[ "$ARGUMENTS" =~ --chain ]]) && [[ "$AUTO_CHAIN" != "true" ]]; then + node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow._auto_chain_active true +fi +``` + +**If `--auto` or `--chain` flag present OR `AUTO_CHAIN` is true OR `AUTO_CFG` is true:** Display banner: ``` diff --git a/tests/chain-flag-plan-phase.test.cjs b/tests/chain-flag-plan-phase.test.cjs new file mode 100644 index 000000000..1f1c931e8 --- /dev/null +++ b/tests/chain-flag-plan-phase.test.cjs @@ -0,0 +1,70 @@ +/** + * GSD Tools Tests - chain flag preservation in plan-phase + * + * Validates that plan-phase.md correctly handles the --chain flag + * so that discuss→plan→execute auto-advance works without manual + * intervention. + * + * Closes: #1620 + */ + +const { test, describe } = require('node:test'); +const assert = require('node:assert'); +const fs = require('fs'); +const path = require('path'); + +describe('plan-phase chain flag preservation (#1620)', () => { + const planPath = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'plan-phase.md'); + const discussPath = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'discuss-phase.md'); + + test('plan-phase sync-flag guard checks both --auto AND --chain', () => { + const content = fs.readFileSync(planPath, 'utf8'); + // The guard that clears _auto_chain_active must require BOTH flags to be absent + assert.ok( + content.includes('if [[ ! "$ARGUMENTS" =~ --auto ]] && [[ ! "$ARGUMENTS" =~ --chain ]]; then'), + 'plan-phase should check for both --auto and --chain before clearing chain flag' + ); + }); + + test('plan-phase persists chain flag to config before auto-advancing', () => { + const content = fs.readFileSync(planPath, 'utf8'); + // Plan-phase must persist the chain flag (config-set workflow._auto_chain_active true) + assert.ok( + content.includes('config-set workflow._auto_chain_active true'), + 'plan-phase should persist chain flag via config-set workflow._auto_chain_active true' + ); + }); + + test('plan-phase and discuss-phase use the same guard pattern for clearing _auto_chain_active', () => { + const planContent = fs.readFileSync(planPath, 'utf8'); + const discussContent = fs.readFileSync(discussPath, 'utf8'); + + const guardPattern = 'if [[ ! "$ARGUMENTS" =~ --auto ]] && [[ ! "$ARGUMENTS" =~ --chain ]]; then'; + + assert.ok( + planContent.includes(guardPattern), + 'plan-phase should use the dual-flag guard pattern' + ); + assert.ok( + discussContent.includes(guardPattern), + 'discuss-phase should use the dual-flag guard pattern' + ); + }); + + test('plan-phase auto-advance trigger includes --chain flag', () => { + const content = fs.readFileSync(planPath, 'utf8'); + // The trigger condition should mention --chain alongside --auto + assert.ok( + content.includes('`--auto` or `--chain` flag present OR `AUTO_CHAIN` is true OR `AUTO_CFG` is true'), + 'plan-phase auto-advance trigger should check for --chain flag' + ); + }); + + test('plan-phase parses both --auto and --chain flags', () => { + const content = fs.readFileSync(planPath, 'utf8'); + assert.ok( + content.includes('Parse `--auto` and `--chain` flags from $ARGUMENTS'), + 'plan-phase step 15 should parse both --auto and --chain flags' + ); + }); +});