Files
get-shit-done/tests/explore-command.test.cjs
Tibsfox 790cbbd0d6 feat(commands): add /gsd-explore for Socratic ideation and idea routing (#1813)
* feat(commands): add /gsd-explore for Socratic ideation and idea routing

Open-ended exploration command that guides developers through ideas via
Socratic questioning, optionally spawns research when factual questions
surface, then routes crystallized outputs to appropriate GSD artifacts
(notes, todos, seeds, research questions, requirements, or new phases).

Conversation follows questioning.md principles — one question at a time,
contextual domain probes, natural flow. Outputs require explicit user
selection before writing.

Closes #1729

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

* fix(commands): address review feedback on explore command (#1729)

- Change allowed-tools from Agent to Task to match subagent spawn pattern
- Remove unresolved {resolved_model} placeholder from Task spawn

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 18:33:27 -04:00

73 lines
3.6 KiB
JavaScript

const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('fs');
const path = require('path');
describe('explore command', () => {
test('command file exists', () => {
const p = path.join(__dirname, '..', 'commands', 'gsd', 'explore.md');
assert.ok(fs.existsSync(p), 'commands/gsd/explore.md should exist');
});
test('command file has required frontmatter', () => {
const p = path.join(__dirname, '..', 'commands', 'gsd', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(content.includes('name: gsd:explore'), 'Command must have name frontmatter');
assert.ok(content.includes('description:'), 'Command must have description frontmatter');
assert.ok(content.includes('allowed-tools:'), 'Command must have allowed-tools frontmatter');
});
test('workflow file exists', () => {
const p = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'explore.md');
assert.ok(fs.existsSync(p), 'workflows/explore.md should exist');
});
test('workflow references questioning.md and domain-probes.md', () => {
const p = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(content.includes('questioning.md'), 'Workflow must reference questioning.md');
assert.ok(content.includes('domain-probes.md'), 'Workflow must reference domain-probes.md');
});
test('workflow documents all 6 output types', () => {
const p = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(content.includes('Note'), 'Workflow must document Note output type');
assert.ok(content.includes('Todo'), 'Workflow must document Todo output type');
assert.ok(content.includes('Seed'), 'Workflow must document Seed output type');
assert.ok(content.includes('Research question'), 'Workflow must document Research question output type');
assert.ok(content.includes('Requirement'), 'Workflow must document Requirement output type');
assert.ok(content.includes('New phase') || content.includes('phase'), 'Workflow must document New phase output type');
});
test('workflow enforces one question at a time principle', () => {
const p = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(content.includes('one question at a time'), 'Workflow must mention "one question at a time" principle');
});
test('workflow requires user confirmation before writing artifacts', () => {
const p = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(
content.includes('explicit user selection') || content.includes('Never write artifacts without'),
'Workflow must require user confirmation before writing artifacts'
);
});
test('workflow respects commit_docs config', () => {
const p = path.join(__dirname, '..', 'get-shit-done', 'workflows', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(content.includes('commit_docs'), 'Workflow must respect commit_docs configuration');
});
test('command references the workflow via execution_context', () => {
const p = path.join(__dirname, '..', 'commands', 'gsd', 'explore.md');
const content = fs.readFileSync(p, 'utf-8');
assert.ok(
content.includes('workflows/explore.md'),
'Command must reference workflows/explore.md in execution_context'
);
});
});