Files
get-shit-done/tests/verify-work-auto-transition.test.cjs
Tom Boucher 73c1af5168 fix(#2543): replace legacy /gsd-<cmd> syntax with /gsd:<cmd> across all source files (#2595)
Commands are now installed as commands/gsd/<name>.md and invoked as
/gsd:<name> in Claude Code. The old hyphen form /gsd-<name> was still
hardcoded in hundreds of places across workflows, references, templates,
lib modules, and command files — causing "Unknown command" errors
whenever GSD suggested a command to the user.

Replace all /gsd-<cmd> occurrences where <cmd> is a known command name
(derived at runtime from commands/gsd/*.md) using a targeted Node.js
script. Agent names, tool names (gsd-sdk, gsd-tools), directory names,
and path fragments are not touched.

Adds regression test tests/bug-2543-gsd-slash-namespace.test.cjs that
enforces zero legacy occurrences going forward. Removes inverted
tests/stale-colon-refs.test.cjs (bug #1748) which enforced the now-obsolete
hyphen form; the new bug-2543 test supersedes it. Updates 5 assertion
tests that hardcoded the old hyphen form to accept the new colon form.

Closes #2543

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 12:04:25 -04:00

84 lines
3.1 KiB
JavaScript

'use strict';
/**
* verify-work auto-transition tests (#2018)
*
* Validates that verify-work.md calls the transition workflow to mark the
* phase complete in ROADMAP.md and STATE.md when UAT passes with 0 issues.
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('fs');
const path = require('path');
const VERIFY_WORK = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'verify-work.md');
describe('verify-work.md — auto-transition after UAT passes with 0 issues', () => {
test('workflow reads transition.md when issues == 0 and security gate cleared', () => {
const content = fs.readFileSync(VERIFY_WORK, 'utf-8');
assert.ok(
content.includes('transition.md'),
'verify-work.md must reference transition.md for phase completion when issues == 0'
);
});
test('transition call appears after complete_session section', () => {
const content = fs.readFileSync(VERIFY_WORK, 'utf-8');
const completeSessionIdx = content.indexOf('complete_session');
const transitionIdx = content.indexOf('transition.md');
assert.ok(
completeSessionIdx !== -1,
'verify-work.md must contain a complete_session section'
);
assert.ok(
transitionIdx !== -1,
'verify-work.md must reference transition.md'
);
assert.ok(
transitionIdx > completeSessionIdx,
'transition.md reference must appear after the complete_session section'
);
});
test('security gate check gates the transition (no auto-transition when security pending)', () => {
const content = fs.readFileSync(VERIFY_WORK, 'utf-8');
// The security check must appear before the transition reference
const securityCfgIdx = content.indexOf('SECURITY_CFG');
const transitionIdx = content.indexOf('transition.md');
assert.ok(
securityCfgIdx !== -1,
'verify-work.md must check SECURITY_CFG before transitioning'
);
assert.ok(
securityCfgIdx < transitionIdx,
'SECURITY_CFG check must appear before transition.md reference'
);
});
test('transition is only invoked when security gate is cleared or disabled', () => {
const content = fs.readFileSync(VERIFY_WORK, 'utf-8');
// Transition must be guarded by security check:
// Either SECURITY_CFG is false, or security file exists with 0 open threats
const hasGuardedTransition =
content.includes('transition.md') &&
(
content.includes("SECURITY_CFG") &&
(content.includes('threats_open') || content.includes('SECURITY_FILE'))
);
assert.ok(
hasGuardedTransition,
'transition.md invocation must be guarded by security gate checks'
);
});
test('transition is NOT suggested when security enforcement is enabled and no SECURITY.md exists', () => {
const content = fs.readFileSync(VERIFY_WORK, 'utf-8');
// The workflow should suggest /gsd-secure-phase when security is enabled but no file exists
assert.ok(
content.includes('gsd-secure-phase') || content.includes('gsd:secure-phase'),
'verify-work.md must suggest /gsd:secure-phase when security gate blocks transition'
);
});
});