diff --git a/get-shit-done/bin/lib/workstream.cjs b/get-shit-done/bin/lib/workstream.cjs index 63e209c5b..a7c24a487 100644 --- a/get-shit-done/bin/lib/workstream.cjs +++ b/get-shit-done/bin/lib/workstream.cjs @@ -339,9 +339,13 @@ function cmdWorkstreamComplete(cwd, name, options, raw) { // ─── Active Workstream Commands ────────────────────────────────────────────── function cmdWorkstreamSet(cwd, name, raw) { - if (!name) { + if (!name || name === '--clear') { + if (name !== '--clear') { + error('Workstream name required. Usage: workstream set (or workstream set --clear to unset)'); + } + const previous = getActiveWorkstream(cwd); setActiveWorkstream(cwd, null); - output({ active: null, cleared: true }, raw); + output({ active: null, cleared: true, previous: previous || null }, raw); return; } diff --git a/tests/workstream.test.cjs b/tests/workstream.test.cjs index 33c562514..0f15e1770 100644 --- a/tests/workstream.test.cjs +++ b/tests/workstream.test.cjs @@ -268,6 +268,24 @@ describe('workstream set/get', () => { assert.ok(result.success); assert.strictEqual(result.output, 'ws-a'); }); + + test('errors when set called with no name (#1527)', () => { + const result = runGsdTools(['workstream', 'set', '--raw'], tmpDir); + assert.ok(!result.success, 'should fail when no name provided'); + assert.ok(result.error.includes('name required'), 'error should mention name required'); + }); + + test('--clear explicitly unsets active workstream', () => { + // First set one + runGsdTools(['workstream', 'set', 'ws-b', '--raw'], tmpDir); + // Then clear + const result = runGsdTools(['workstream', 'set', '--clear', '--raw'], tmpDir); + assert.ok(result.success); + const data = JSON.parse(result.output); + assert.strictEqual(data.active, null); + assert.strictEqual(data.cleared, true); + assert.strictEqual(data.previous, 'ws-b'); + }); }); // ─── Collision Detection ────────────────────────────────────────────────────