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) <noreply@anthropic.com>
This commit is contained in:
@@ -855,10 +855,10 @@ Route to `<offer_next>` 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:
|
||||
```
|
||||
|
||||
70
tests/chain-flag-plan-phase.test.cjs
Normal file
70
tests/chain-flag-plan-phase.test.cjs
Normal file
@@ -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'
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user