refactor(tests): consolidate Init Command Module — 7 files → 5 (#3756)

* fix(3687): update insert-phase docs and roadmapper to use --insert flag

Updates stale references in insert-phase.md workflow and
gsd-roadmapper.md agent to use the consolidated /gsd:phase --insert
command syntax instead of the retired /gsd-insert-phase and
/gsd:phase insert forms.

Closes #3687

* refactor(tests): consolidate Init Command Module — 7 files → 5

Closes #3755

Merges `tests/init-manager-deps.test.cjs` (#2267 regression) into
`tests/init-manager.test.cjs` (718 LOC), and
`sdk/src/query/init-progress-precedence.test.ts` (#2674 regression)
into `sdk/src/query/init-complex.test.ts` (788 LOC).

The 800 LOC ceiling prevents further consolidation:
- `tests/init.test.cjs` is pre-existing at 1630 LOC
- `sdk/src/query/init.test.ts` is at 791 LOC
- `sdk/src/query/init-workstream-milestone-op.test.ts` is a distinct
  seam testing initMilestoneOp, roadmapAnalyze, and
  resolveQueryRuntimeContext workstream resolution.

Also adds Init Command Module Glossary entry to CONTEXT.md.

Allowlist update deferred to rebase after #3738 merges (allowlist
file does not exist on origin/main).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(init): initExecutePhase preserves same-milestone archived phase dir (#3469)

When `phases clear` archives current-milestone phases into
`.planning/milestones/<version>-phases/` but the workflow is still on
that same milestone, `shouldDropArchivedPhaseMatch` was unconditionally
dropping the archived dir match. This caused `phase_dir: null` when the
phase was still executing in the current milestone.

Fix: detect when `phaseInfo.archived === currentMilestone` (read from
STATE.md) and skip the drop. The #2391 regression guard is safe because
that scenario involves archived.version != current milestone.

Also corrects two tests in `initRemoveWorkspace` to expect thrown
GSDError instead of `{ data: { error } }` — the production code was
intentionally changed to throw for CLI non-zero exit propagation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: arya rizky <aryarizkyardhipratama@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-05-20 20:39:01 -04:00
committed by GitHub
parent 9f57f7488e
commit 3d52f5ee46
12 changed files with 382 additions and 320 deletions

View File

@@ -757,16 +757,15 @@ describe('initListWorkspaces', () => {
});
describe('initRemoveWorkspace', () => {
it('returns error when name arg missing', async () => {
const result = await initRemoveWorkspace([], tmpDir);
const data = result.data as Record<string, unknown>;
expect(data.error).toBeDefined();
// initRemoveWorkspace throws GSDError for validation failures rather than
// returning { data: { error } } — the CLI output path treats error-returns as
// success, so validation must surface as a thrown exception for non-zero exit.
it('throws GSDError when name arg missing', async () => {
await expect(initRemoveWorkspace([], tmpDir)).rejects.toThrow('workspace name required');
});
it('rejects path separator in workspace name (T-14-01)', async () => {
const result = await initRemoveWorkspace(['../../bad'], tmpDir);
const data = result.data as Record<string, unknown>;
expect(data.error).toBeDefined();
it('throws GSDError for path separator in workspace name (T-14-01)', async () => {
await expect(initRemoveWorkspace(['../../bad'], tmpDir)).rejects.toThrow('path separators not allowed');
});
});