gsd-remix 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -81
- package/README.zh-CN.md +13 -57
- package/agents/gsd-debugger.md +0 -3
- package/agents/gsd-executor.md +5 -11
- package/agents/gsd-phase-researcher.md +3 -107
- package/agents/gsd-plan-checker.md +0 -61
- package/agents/gsd-planner.md +4 -63
- package/agents/gsd-roadmapper.md +0 -29
- package/agents/gsd-security-auditor.md +62 -114
- package/agents/gsd-verifier.md +0 -3
- package/bin/install.js +20 -118
- package/commands/gsd/complete-milestone.md +0 -22
- package/commands/gsd/plan-phase.md +1 -2
- package/get-shit-done/bin/gsd-tools.cjs +5 -224
- package/get-shit-done/bin/lib/claude-md.cjs +427 -0
- package/get-shit-done/bin/lib/config-schema.cjs +2 -12
- package/get-shit-done/bin/lib/config.cjs +3 -12
- package/get-shit-done/bin/lib/core.cjs +4 -5
- package/get-shit-done/bin/lib/init.cjs +0 -163
- package/get-shit-done/bin/lib/model-profiles.cjs +12 -18
- package/get-shit-done/bin/lib/verify.cjs +0 -66
- package/get-shit-done/references/agent-contracts.md +0 -6
- package/get-shit-done/references/artifact-types.md +0 -30
- package/get-shit-done/references/continuation-format.md +0 -1
- package/get-shit-done/references/model-profiles.md +39 -37
- package/get-shit-done/references/planning-config.md +7 -12
- package/get-shit-done/references/verification-overrides.md +1 -1
- package/get-shit-done/templates/README.md +2 -9
- package/get-shit-done/templates/claude-md.md +0 -14
- package/get-shit-done/templates/config.json +5 -19
- package/get-shit-done/workflows/autonomous.md +9 -141
- package/get-shit-done/workflows/complete-milestone.md +3 -4
- package/get-shit-done/workflows/discuss-phase-assumptions.md +1 -18
- package/get-shit-done/workflows/discuss-phase.md +10 -104
- package/get-shit-done/workflows/do.md +1 -5
- package/get-shit-done/workflows/execute-phase.md +53 -103
- package/get-shit-done/workflows/execute-plan.md +4 -4
- package/get-shit-done/workflows/health.md +2 -5
- package/get-shit-done/workflows/help.md +0 -165
- package/get-shit-done/workflows/new-milestone.md +0 -51
- package/get-shit-done/workflows/new-project.md +2 -63
- package/get-shit-done/workflows/next.md +0 -23
- package/get-shit-done/workflows/pause-work.md +7 -15
- package/get-shit-done/workflows/plan-phase.md +20 -304
- package/get-shit-done/workflows/pr-branch.md +0 -1
- package/get-shit-done/workflows/progress.md +1 -68
- package/get-shit-done/workflows/quick.md +0 -3
- package/get-shit-done/workflows/research-phase.md +0 -1
- package/get-shit-done/workflows/settings.md +1 -57
- package/get-shit-done/workflows/transition.md +3 -86
- package/get-shit-done/workflows/verify-work.md +0 -64
- package/package.json +1 -1
- package/scripts/build-hooks.js +0 -2
- package/sdk/prompts/agents/gsd-executor.md +2 -0
- package/sdk/prompts/agents/gsd-plan-checker.md +0 -3
- package/sdk/prompts/agents/gsd-roadmapper.md +0 -29
- package/sdk/src/config.ts +4 -5
- package/sdk/src/golden/golden-integration-covered.ts +0 -2
- package/sdk/src/golden/golden-policy.ts +1 -1
- package/sdk/src/golden/golden.integration.test.ts +0 -27
- package/sdk/src/golden/read-only-golden-rows.ts +0 -15
- package/sdk/src/query/QUERY-HANDLERS.md +3 -34
- package/sdk/src/query/claude-md.ts +421 -0
- package/sdk/src/query/commit.test.ts +155 -1
- package/sdk/src/query/commit.ts +71 -17
- package/sdk/src/query/config-gates.test.ts +1 -2
- package/sdk/src/query/config-gates.ts +1 -5
- package/sdk/src/query/config-mutation.test.ts +0 -1
- package/sdk/src/query/config-mutation.ts +5 -6
- package/sdk/src/query/config-query.test.ts +2 -2
- package/sdk/src/query/config-query.ts +12 -18
- package/sdk/src/query/decomposed-handlers.test.ts +0 -64
- package/sdk/src/query/index.ts +4 -68
- package/sdk/src/query/init.test.ts +0 -64
- package/sdk/src/query/init.ts +0 -189
- package/sdk/src/query/normalize-query-command.ts +0 -2
- package/sdk/src/query/profile.test.ts +0 -43
- package/sdk/src/query/profile.ts +1 -141
- package/sdk/src/query/state-mutation.ts +18 -0
- package/sdk/src/runtime-health.ts +3 -3
- package/agents/gsd-ai-researcher.md +0 -133
- package/agents/gsd-doc-classifier.md +0 -168
- package/agents/gsd-doc-synthesizer.md +0 -204
- package/agents/gsd-doc-verifier.md +0 -217
- package/agents/gsd-doc-writer.md +0 -615
- package/agents/gsd-domain-researcher.md +0 -153
- package/agents/gsd-eval-auditor.md +0 -191
- package/agents/gsd-eval-planner.md +0 -154
- package/agents/gsd-framework-selector.md +0 -160
- package/agents/gsd-intel-updater.md +0 -334
- package/agents/gsd-nyquist-auditor.md +0 -203
- package/agents/gsd-ui-auditor.md +0 -495
- package/agents/gsd-ui-checker.md +0 -309
- package/agents/gsd-ui-researcher.md +0 -380
- package/agents/gsd-user-profiler.md +0 -171
- package/commands/gsd/ai-integration-phase.md +0 -36
- package/commands/gsd/analyze-dependencies.md +0 -34
- package/commands/gsd/audit-fix.md +0 -33
- package/commands/gsd/audit-milestone.md +0 -36
- package/commands/gsd/audit-uat.md +0 -24
- package/commands/gsd/docs-update.md +0 -48
- package/commands/gsd/eval-review.md +0 -32
- package/commands/gsd/explore.md +0 -27
- package/commands/gsd/extract_learnings.md +0 -22
- package/commands/gsd/forensics.md +0 -56
- package/commands/gsd/from-gsd2.md +0 -47
- package/commands/gsd/graphify.md +0 -201
- package/commands/gsd/import.md +0 -37
- package/commands/gsd/inbox.md +0 -38
- package/commands/gsd/ingest-docs.md +0 -42
- package/commands/gsd/intel.md +0 -179
- package/commands/gsd/join-discord.md +0 -19
- package/commands/gsd/list-phase-assumptions.md +0 -46
- package/commands/gsd/list-workspaces.md +0 -19
- package/commands/gsd/manager.md +0 -40
- package/commands/gsd/milestone-summary.md +0 -51
- package/commands/gsd/new-workspace.md +0 -44
- package/commands/gsd/plan-milestone-gaps.md +0 -34
- package/commands/gsd/plan-review-convergence.md +0 -52
- package/commands/gsd/plant-seed.md +0 -28
- package/commands/gsd/profile-user.md +0 -46
- package/commands/gsd/reapply-patches.md +0 -331
- package/commands/gsd/remove-workspace.md +0 -26
- package/commands/gsd/review.md +0 -40
- package/commands/gsd/scan.md +0 -26
- package/commands/gsd/secure-phase.md +0 -35
- package/commands/gsd/session-report.md +0 -19
- package/commands/gsd/set-profile.md +0 -12
- package/commands/gsd/ship.md +0 -23
- package/commands/gsd/sketch-wrap-up.md +0 -31
- package/commands/gsd/sketch.md +0 -49
- package/commands/gsd/spec-phase.md +0 -62
- package/commands/gsd/spike-wrap-up.md +0 -31
- package/commands/gsd/spike.md +0 -46
- package/commands/gsd/stats.md +0 -18
- package/commands/gsd/sync-skills.md +0 -19
- package/commands/gsd/thread.md +0 -227
- package/commands/gsd/ui-phase.md +0 -34
- package/commands/gsd/ui-review.md +0 -32
- package/commands/gsd/ultraplan-phase.md +0 -33
- package/commands/gsd/update.md +0 -37
- package/commands/gsd/validate-phase.md +0 -35
- package/commands/gsd/workstreams.md +0 -69
- package/get-shit-done/bin/lib/docs.cjs +0 -267
- package/get-shit-done/bin/lib/graphify.cjs +0 -494
- package/get-shit-done/bin/lib/gsd2-import.cjs +0 -511
- package/get-shit-done/bin/lib/intel.cjs +0 -639
- package/get-shit-done/bin/lib/profile-output.cjs +0 -1080
- package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
- package/get-shit-done/bin/lib/workstream.cjs +0 -495
- package/get-shit-done/references/ai-evals.md +0 -156
- package/get-shit-done/references/ai-frameworks.md +0 -186
- package/get-shit-done/references/doc-conflict-engine.md +0 -91
- package/get-shit-done/references/model-profile-resolution.md +0 -38
- package/get-shit-done/references/planner-reviews.md +0 -39
- package/get-shit-done/references/sketch-interactivity.md +0 -41
- package/get-shit-done/references/sketch-theme-system.md +0 -94
- package/get-shit-done/references/sketch-tooling.md +0 -45
- package/get-shit-done/references/sketch-variant-patterns.md +0 -81
- package/get-shit-done/references/thinking-models-debug.md +0 -44
- package/get-shit-done/references/thinking-models-execution.md +0 -50
- package/get-shit-done/references/thinking-models-planning.md +0 -62
- package/get-shit-done/references/thinking-models-research.md +0 -50
- package/get-shit-done/references/thinking-models-verification.md +0 -55
- package/get-shit-done/references/thinking-partner.md +0 -96
- package/get-shit-done/references/user-profiling.md +0 -681
- package/get-shit-done/references/workstream-flag.md +0 -111
- package/get-shit-done/templates/AI-SPEC.md +0 -246
- package/get-shit-done/templates/SECURITY.md +0 -61
- package/get-shit-done/templates/UI-SPEC.md +0 -100
- package/get-shit-done/templates/VALIDATION.md +0 -76
- package/get-shit-done/templates/dev-preferences.md +0 -21
- package/get-shit-done/templates/user-profile.md +0 -146
- package/get-shit-done/workflows/ai-integration-phase.md +0 -284
- package/get-shit-done/workflows/analyze-dependencies.md +0 -96
- package/get-shit-done/workflows/audit-fix.md +0 -175
- package/get-shit-done/workflows/audit-milestone.md +0 -340
- package/get-shit-done/workflows/audit-uat.md +0 -109
- package/get-shit-done/workflows/docs-update.md +0 -1155
- package/get-shit-done/workflows/eval-review.md +0 -155
- package/get-shit-done/workflows/explore.md +0 -141
- package/get-shit-done/workflows/extract_learnings.md +0 -242
- package/get-shit-done/workflows/forensics.md +0 -265
- package/get-shit-done/workflows/import.md +0 -246
- package/get-shit-done/workflows/inbox.md +0 -387
- package/get-shit-done/workflows/ingest-docs.md +0 -328
- package/get-shit-done/workflows/list-phase-assumptions.md +0 -178
- package/get-shit-done/workflows/list-workspaces.md +0 -56
- package/get-shit-done/workflows/manager.md +0 -365
- package/get-shit-done/workflows/milestone-summary.md +0 -223
- package/get-shit-done/workflows/new-workspace.md +0 -239
- package/get-shit-done/workflows/plan-milestone-gaps.md +0 -273
- package/get-shit-done/workflows/plan-review-convergence.md +0 -254
- package/get-shit-done/workflows/plant-seed.md +0 -172
- package/get-shit-done/workflows/profile-user.md +0 -452
- package/get-shit-done/workflows/remove-workspace.md +0 -92
- package/get-shit-done/workflows/review.md +0 -344
- package/get-shit-done/workflows/scan.md +0 -102
- package/get-shit-done/workflows/secure-phase.md +0 -166
- package/get-shit-done/workflows/session-report.md +0 -146
- package/get-shit-done/workflows/ship.md +0 -302
- package/get-shit-done/workflows/sketch-wrap-up.md +0 -283
- package/get-shit-done/workflows/sketch.md +0 -286
- package/get-shit-done/workflows/spec-phase.md +0 -262
- package/get-shit-done/workflows/spike-wrap-up.md +0 -281
- package/get-shit-done/workflows/spike.md +0 -362
- package/get-shit-done/workflows/stats.md +0 -60
- package/get-shit-done/workflows/sync-skills.md +0 -182
- package/get-shit-done/workflows/ui-phase.md +0 -323
- package/get-shit-done/workflows/ui-review.md +0 -190
- package/get-shit-done/workflows/ultraplan-phase.md +0 -189
- package/get-shit-done/workflows/update.md +0 -587
- package/get-shit-done/workflows/validate-phase.md +0 -176
- package/hooks/dist/gsd-check-update-worker.js +0 -108
- package/hooks/dist/gsd-check-update.js +0 -63
- package/hooks/gsd-check-update-worker.js +0 -108
- package/hooks/gsd-check-update.js +0 -63
- package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +0 -3
- package/sdk/src/query/docs-init.ts +0 -257
- package/sdk/src/query/intel.test.ts +0 -90
- package/sdk/src/query/intel.ts +0 -404
- package/sdk/src/query/profile-extract-messages.ts +0 -247
- package/sdk/src/query/profile-output.ts +0 -908
- package/sdk/src/query/profile-questionnaire-data.ts +0 -181
- package/sdk/src/query/profile-sample.ts +0 -184
- package/sdk/src/query/profile-scan-sessions.ts +0 -174
- package/sdk/src/query/workspace.test.ts +0 -119
- package/sdk/src/query/workspace.ts +0 -131
- package/sdk/src/query/workstream.test.ts +0 -51
- package/sdk/src/query/workstream.ts +0 -434
|
@@ -1364,165 +1364,6 @@ function cmdInitProgress(cwd, raw) {
|
|
|
1364
1364
|
output(withProjectRoot(cwd, result), raw);
|
|
1365
1365
|
}
|
|
1366
1366
|
|
|
1367
|
-
/**
|
|
1368
|
-
* Detect child git repos in a directory (one level deep).
|
|
1369
|
-
* Returns array of { name, path, has_uncommitted } objects.
|
|
1370
|
-
*/
|
|
1371
|
-
function detectChildRepos(dir) {
|
|
1372
|
-
const repos = [];
|
|
1373
|
-
let entries;
|
|
1374
|
-
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return repos; }
|
|
1375
|
-
for (const entry of entries) {
|
|
1376
|
-
if (!entry.isDirectory()) continue;
|
|
1377
|
-
if (entry.name.startsWith('.')) continue;
|
|
1378
|
-
const fullPath = path.join(dir, entry.name);
|
|
1379
|
-
const gitDir = path.join(fullPath, '.git');
|
|
1380
|
-
if (fs.existsSync(gitDir)) {
|
|
1381
|
-
let hasUncommitted = false;
|
|
1382
|
-
try {
|
|
1383
|
-
const status = execSync('git status --porcelain', { cwd: fullPath, encoding: 'utf8', timeout: 5000 });
|
|
1384
|
-
hasUncommitted = status.trim().length > 0;
|
|
1385
|
-
} catch { /* best-effort */ }
|
|
1386
|
-
repos.push({ name: entry.name, path: fullPath, has_uncommitted: hasUncommitted });
|
|
1387
|
-
}
|
|
1388
|
-
}
|
|
1389
|
-
return repos;
|
|
1390
|
-
}
|
|
1391
|
-
|
|
1392
|
-
function cmdInitNewWorkspace(cwd, raw) {
|
|
1393
|
-
const homedir = process.env.HOME || require('os').homedir();
|
|
1394
|
-
const defaultBase = path.join(homedir, 'gsd-workspaces');
|
|
1395
|
-
|
|
1396
|
-
// Detect child git repos for interactive selection
|
|
1397
|
-
const childRepos = detectChildRepos(cwd);
|
|
1398
|
-
|
|
1399
|
-
// Check if git worktree is available
|
|
1400
|
-
let worktreeAvailable = false;
|
|
1401
|
-
try {
|
|
1402
|
-
execSync('git --version', { encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
|
|
1403
|
-
worktreeAvailable = true;
|
|
1404
|
-
} catch { /* no git at all */ }
|
|
1405
|
-
|
|
1406
|
-
const result = {
|
|
1407
|
-
default_workspace_base: defaultBase,
|
|
1408
|
-
child_repos: childRepos,
|
|
1409
|
-
child_repo_count: childRepos.length,
|
|
1410
|
-
worktree_available: worktreeAvailable,
|
|
1411
|
-
is_git_repo: pathExistsInternal(cwd, '.git'),
|
|
1412
|
-
cwd_repo_name: path.basename(cwd),
|
|
1413
|
-
};
|
|
1414
|
-
|
|
1415
|
-
output(withProjectRoot(cwd, result), raw);
|
|
1416
|
-
}
|
|
1417
|
-
|
|
1418
|
-
function cmdInitListWorkspaces(cwd, raw) {
|
|
1419
|
-
const homedir = process.env.HOME || require('os').homedir();
|
|
1420
|
-
const defaultBase = path.join(homedir, 'gsd-workspaces');
|
|
1421
|
-
|
|
1422
|
-
const workspaces = [];
|
|
1423
|
-
if (fs.existsSync(defaultBase)) {
|
|
1424
|
-
let entries;
|
|
1425
|
-
try { entries = fs.readdirSync(defaultBase, { withFileTypes: true }); } catch { entries = []; }
|
|
1426
|
-
for (const entry of entries) {
|
|
1427
|
-
if (!entry.isDirectory()) continue;
|
|
1428
|
-
const wsPath = path.join(defaultBase, entry.name);
|
|
1429
|
-
const manifestPath = path.join(wsPath, 'WORKSPACE.md');
|
|
1430
|
-
if (!fs.existsSync(manifestPath)) continue;
|
|
1431
|
-
|
|
1432
|
-
let repoCount = 0;
|
|
1433
|
-
let hasProject = false;
|
|
1434
|
-
let strategy = 'unknown';
|
|
1435
|
-
try {
|
|
1436
|
-
const manifest = fs.readFileSync(manifestPath, 'utf8');
|
|
1437
|
-
const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
|
|
1438
|
-
if (strategyMatch) strategy = strategyMatch[1].trim();
|
|
1439
|
-
// Count table rows (lines starting with |, excluding header and separator)
|
|
1440
|
-
const tableRows = manifest.split('\n').filter(l => l.match(/^\|\s*\w/) && !l.includes('Repo') && !l.includes('---'));
|
|
1441
|
-
repoCount = tableRows.length;
|
|
1442
|
-
} catch { /* best-effort */ }
|
|
1443
|
-
hasProject = fs.existsSync(path.join(wsPath, '.planning', 'PROJECT.md'));
|
|
1444
|
-
|
|
1445
|
-
workspaces.push({
|
|
1446
|
-
name: entry.name,
|
|
1447
|
-
path: wsPath,
|
|
1448
|
-
repo_count: repoCount,
|
|
1449
|
-
strategy,
|
|
1450
|
-
has_project: hasProject,
|
|
1451
|
-
});
|
|
1452
|
-
}
|
|
1453
|
-
}
|
|
1454
|
-
|
|
1455
|
-
const result = {
|
|
1456
|
-
workspace_base: defaultBase,
|
|
1457
|
-
workspaces,
|
|
1458
|
-
workspace_count: workspaces.length,
|
|
1459
|
-
};
|
|
1460
|
-
|
|
1461
|
-
output(result, raw);
|
|
1462
|
-
}
|
|
1463
|
-
|
|
1464
|
-
function cmdInitRemoveWorkspace(cwd, name, raw) {
|
|
1465
|
-
const homedir = process.env.HOME || require('os').homedir();
|
|
1466
|
-
const defaultBase = path.join(homedir, 'gsd-workspaces');
|
|
1467
|
-
|
|
1468
|
-
if (!name) {
|
|
1469
|
-
error('workspace name required for init remove-workspace');
|
|
1470
|
-
}
|
|
1471
|
-
|
|
1472
|
-
const wsPath = path.join(defaultBase, name);
|
|
1473
|
-
const manifestPath = path.join(wsPath, 'WORKSPACE.md');
|
|
1474
|
-
|
|
1475
|
-
if (!fs.existsSync(wsPath)) {
|
|
1476
|
-
error(`Workspace not found: ${wsPath}`);
|
|
1477
|
-
}
|
|
1478
|
-
|
|
1479
|
-
// Parse manifest for repo info
|
|
1480
|
-
const repos = [];
|
|
1481
|
-
let strategy = 'unknown';
|
|
1482
|
-
if (fs.existsSync(manifestPath)) {
|
|
1483
|
-
try {
|
|
1484
|
-
const manifest = fs.readFileSync(manifestPath, 'utf8');
|
|
1485
|
-
const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
|
|
1486
|
-
if (strategyMatch) strategy = strategyMatch[1].trim();
|
|
1487
|
-
|
|
1488
|
-
// Parse table rows for repo names and source paths
|
|
1489
|
-
const lines = manifest.split('\n');
|
|
1490
|
-
for (const line of lines) {
|
|
1491
|
-
const match = line.match(/^\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|$/);
|
|
1492
|
-
if (match && match[1] !== 'Repo' && !match[1].includes('---')) {
|
|
1493
|
-
repos.push({ name: match[1], source: match[2], branch: match[3], strategy: match[4] });
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
} catch { /* best-effort */ }
|
|
1497
|
-
}
|
|
1498
|
-
|
|
1499
|
-
// Check for uncommitted changes in workspace repos
|
|
1500
|
-
const dirtyRepos = [];
|
|
1501
|
-
for (const repo of repos) {
|
|
1502
|
-
const repoPath = path.join(wsPath, repo.name);
|
|
1503
|
-
if (!fs.existsSync(repoPath)) continue;
|
|
1504
|
-
try {
|
|
1505
|
-
const status = execSync('git status --porcelain', { cwd: repoPath, encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
|
|
1506
|
-
if (status.trim().length > 0) {
|
|
1507
|
-
dirtyRepos.push(repo.name);
|
|
1508
|
-
}
|
|
1509
|
-
} catch { /* best-effort */ }
|
|
1510
|
-
}
|
|
1511
|
-
|
|
1512
|
-
const result = {
|
|
1513
|
-
workspace_name: name,
|
|
1514
|
-
workspace_path: wsPath,
|
|
1515
|
-
has_manifest: fs.existsSync(manifestPath),
|
|
1516
|
-
strategy,
|
|
1517
|
-
repos,
|
|
1518
|
-
repo_count: repos.length,
|
|
1519
|
-
dirty_repos: dirtyRepos,
|
|
1520
|
-
has_dirty_repos: dirtyRepos.length > 0,
|
|
1521
|
-
};
|
|
1522
|
-
|
|
1523
|
-
output(result, raw);
|
|
1524
|
-
}
|
|
1525
|
-
|
|
1526
1367
|
/**
|
|
1527
1368
|
* Build a formatted agent skills block for injection into Task() prompts.
|
|
1528
1369
|
*
|
|
@@ -1867,10 +1708,6 @@ module.exports = {
|
|
|
1867
1708
|
cmdInitMapCodebase,
|
|
1868
1709
|
cmdInitProgress,
|
|
1869
1710
|
cmdInitManager,
|
|
1870
|
-
cmdInitNewWorkspace,
|
|
1871
|
-
cmdInitListWorkspaces,
|
|
1872
|
-
cmdInitRemoveWorkspace,
|
|
1873
|
-
detectChildRepos,
|
|
1874
1711
|
buildAgentSkillsBlock,
|
|
1875
1712
|
cmdAgentSkills,
|
|
1876
1713
|
buildSkillManifest,
|
|
@@ -7,24 +7,18 @@
|
|
|
7
7
|
* would be faster, use fewer tokens, and be less error-prone).
|
|
8
8
|
*/
|
|
9
9
|
const MODEL_PROFILES = {
|
|
10
|
-
'gsd-planner': { quality: 'opus', balanced: 'opus', budget: '
|
|
11
|
-
'gsd-roadmapper': { quality: 'opus', balanced: '
|
|
12
|
-
'gsd-executor': { quality: '
|
|
13
|
-
'gsd-phase-researcher': { quality: 'opus', balanced: '
|
|
14
|
-
'gsd-project-researcher': { quality: 'opus', balanced: '
|
|
15
|
-
'gsd-research-synthesizer': { quality: 'sonnet', balanced: 'sonnet', budget: '
|
|
16
|
-
'gsd-debugger': { quality: 'opus', balanced: '
|
|
17
|
-
'gsd-codebase-mapper': { quality: 'sonnet', balanced: '
|
|
18
|
-
'gsd-verifier': { quality: 'sonnet', balanced: 'sonnet', budget: '
|
|
19
|
-
'gsd-plan-checker': { quality: 'sonnet', balanced: 'sonnet', budget: '
|
|
20
|
-
'gsd-integration-checker': { quality: 'sonnet', balanced: 'sonnet', budget: '
|
|
21
|
-
'gsd-
|
|
22
|
-
'gsd-pattern-mapper': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku', adaptive: 'haiku' },
|
|
23
|
-
'gsd-ui-researcher': { quality: 'opus', balanced: 'sonnet', budget: 'haiku', adaptive: 'sonnet' },
|
|
24
|
-
'gsd-ui-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku', adaptive: 'haiku' },
|
|
25
|
-
'gsd-ui-auditor': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku', adaptive: 'haiku' },
|
|
26
|
-
'gsd-doc-writer': { quality: 'opus', balanced: 'sonnet', budget: 'haiku', adaptive: 'sonnet' },
|
|
27
|
-
'gsd-doc-verifier': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku', adaptive: 'haiku' },
|
|
10
|
+
'gsd-planner': { quality: 'opus', balanced: 'opus', budget: 'opus', adaptive: 'opus' },
|
|
11
|
+
'gsd-roadmapper': { quality: 'opus', balanced: 'opus', budget: 'opus', adaptive: 'opus' },
|
|
12
|
+
'gsd-executor': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
13
|
+
'gsd-phase-researcher': { quality: 'opus', balanced: 'opus', budget: 'opus', adaptive: 'opus' },
|
|
14
|
+
'gsd-project-researcher': { quality: 'opus', balanced: 'opus', budget: 'opus', adaptive: 'opus' },
|
|
15
|
+
'gsd-research-synthesizer': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
16
|
+
'gsd-debugger': { quality: 'opus', balanced: 'opus', budget: 'opus', adaptive: 'opus' },
|
|
17
|
+
'gsd-codebase-mapper': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
18
|
+
'gsd-verifier': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
19
|
+
'gsd-plan-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
20
|
+
'gsd-integration-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
21
|
+
'gsd-pattern-mapper': { quality: 'sonnet', balanced: 'sonnet', budget: 'sonnet', adaptive: 'sonnet' },
|
|
28
22
|
};
|
|
29
23
|
const VALID_PROFILES = Object.keys(MODEL_PROFILES['gsd-planner']);
|
|
30
24
|
|
|
@@ -639,22 +639,6 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
639
639
|
}
|
|
640
640
|
}
|
|
641
641
|
|
|
642
|
-
// ─── Check 5b: Nyquist validation key presence ──────────────────────────
|
|
643
|
-
if (fs.existsSync(configPath)) {
|
|
644
|
-
try {
|
|
645
|
-
const configRaw = fs.readFileSync(configPath, 'utf-8');
|
|
646
|
-
const configParsed = JSON.parse(configRaw);
|
|
647
|
-
if (configParsed.workflow && configParsed.workflow.nyquist_validation === undefined) {
|
|
648
|
-
addIssue('warning', 'W008', 'config.json: workflow.nyquist_validation absent (defaults to enabled but agents may skip)', 'Run /gsd-health --repair to add key', true);
|
|
649
|
-
if (!repairs.includes('addNyquistKey')) repairs.push('addNyquistKey');
|
|
650
|
-
}
|
|
651
|
-
if (configParsed.workflow && configParsed.workflow.ai_integration_phase === undefined) {
|
|
652
|
-
addIssue('warning', 'W016', 'config.json: workflow.ai_integration_phase absent (defaults to enabled — run /gsd-ai-integration-phase before planning AI system phases)', 'Run /gsd-health --repair to add key', true);
|
|
653
|
-
if (!repairs.includes('addAiIntegrationPhaseKey')) repairs.push('addAiIntegrationPhaseKey');
|
|
654
|
-
}
|
|
655
|
-
} catch { /* intentionally empty */ }
|
|
656
|
-
}
|
|
657
|
-
|
|
658
642
|
// ─── Read phase directories once for checks 6, 7, 7b, and 8 (#1973) ──────
|
|
659
643
|
let phaseDirEntries = [];
|
|
660
644
|
const phaseDirFiles = new Map(); // phase dir name → file list
|
|
@@ -689,22 +673,6 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
689
673
|
}
|
|
690
674
|
}
|
|
691
675
|
|
|
692
|
-
// ─── Check 7b: Nyquist VALIDATION.md consistency ────────────────────────
|
|
693
|
-
for (const e of phaseDirEntries) {
|
|
694
|
-
const phaseFiles = phaseDirFiles.get(e.name) || [];
|
|
695
|
-
const hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md'));
|
|
696
|
-
const hasValidation = phaseFiles.some(f => f.endsWith('-VALIDATION.md'));
|
|
697
|
-
if (hasResearch && !hasValidation) {
|
|
698
|
-
const researchFile = phaseFiles.find(f => f.endsWith('-RESEARCH.md'));
|
|
699
|
-
try {
|
|
700
|
-
const researchContent = fs.readFileSync(path.join(phasesDir, e.name, researchFile), 'utf-8');
|
|
701
|
-
if (researchContent.includes('## Validation Architecture')) {
|
|
702
|
-
addIssue('warning', 'W009', `Phase ${e.name}: has Validation Architecture in RESEARCH.md but no VALIDATION.md`, 'Re-run /gsd-plan-phase with --research to regenerate');
|
|
703
|
-
}
|
|
704
|
-
} catch { /* intentionally empty */ }
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
|
|
708
676
|
// ─── Check 7c: Agent installation (#1371) ──────────────────────────────────
|
|
709
677
|
// Verify GSD agents are installed. Missing agents cause Task(subagent_type=...)
|
|
710
678
|
// to silently fall back to general-purpose, losing specialized instructions.
|
|
@@ -974,40 +942,6 @@ function cmdValidateHealth(cwd, options, raw) {
|
|
|
974
942
|
repairActions.push({ action: repair, success: true, path: 'STATE.md' });
|
|
975
943
|
break;
|
|
976
944
|
}
|
|
977
|
-
case 'addNyquistKey': {
|
|
978
|
-
if (fs.existsSync(configPath)) {
|
|
979
|
-
try {
|
|
980
|
-
const configRaw = fs.readFileSync(configPath, 'utf-8');
|
|
981
|
-
const configParsed = JSON.parse(configRaw);
|
|
982
|
-
if (!configParsed.workflow) configParsed.workflow = {};
|
|
983
|
-
if (configParsed.workflow.nyquist_validation === undefined) {
|
|
984
|
-
configParsed.workflow.nyquist_validation = true;
|
|
985
|
-
fs.writeFileSync(configPath, JSON.stringify(configParsed, null, 2), 'utf-8');
|
|
986
|
-
}
|
|
987
|
-
repairActions.push({ action: repair, success: true, path: 'config.json' });
|
|
988
|
-
} catch (err) {
|
|
989
|
-
repairActions.push({ action: repair, success: false, error: err.message });
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
break;
|
|
993
|
-
}
|
|
994
|
-
case 'addAiIntegrationPhaseKey': {
|
|
995
|
-
if (fs.existsSync(configPath)) {
|
|
996
|
-
try {
|
|
997
|
-
const configRaw = fs.readFileSync(configPath, 'utf-8');
|
|
998
|
-
const configParsed = JSON.parse(configRaw);
|
|
999
|
-
if (!configParsed.workflow) configParsed.workflow = {};
|
|
1000
|
-
if (configParsed.workflow.ai_integration_phase === undefined) {
|
|
1001
|
-
configParsed.workflow.ai_integration_phase = true;
|
|
1002
|
-
fs.writeFileSync(configPath, JSON.stringify(configParsed, null, 2), 'utf-8');
|
|
1003
|
-
}
|
|
1004
|
-
repairActions.push({ action: repair, success: true, path: 'config.json' });
|
|
1005
|
-
} catch (err) {
|
|
1006
|
-
repairActions.push({ action: repair, success: false, error: err.message });
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
break;
|
|
1010
|
-
}
|
|
1011
945
|
case 'backfillMilestones': {
|
|
1012
946
|
if (!options.backfill && !options.repair) break;
|
|
1013
947
|
const today = new Date().toISOString().split('T')[0];
|
|
@@ -18,20 +18,14 @@ This doc describes what IS, not what should be. Casing inconsistencies are docum
|
|
|
18
18
|
| gsd-research-synthesizer | Multi-research synthesis | `## SYNTHESIS COMPLETE`, `## SYNTHESIS BLOCKED` |
|
|
19
19
|
| gsd-debugger | Debug investigation | `## DEBUG COMPLETE`, `## ROOT CAUSE FOUND`, `## CHECKPOINT REACHED` |
|
|
20
20
|
| gsd-roadmapper | Roadmap creation/revision | `## ROADMAP CREATED`, `## ROADMAP REVISED`, `## ROADMAP BLOCKED` |
|
|
21
|
-
| gsd-ui-auditor | UI review | `## UI REVIEW COMPLETE` |
|
|
22
|
-
| gsd-ui-checker | UI validation | `## ISSUES FOUND` |
|
|
23
|
-
| gsd-ui-researcher | UI spec creation | `## UI-SPEC COMPLETE`, `## UI-SPEC BLOCKED` |
|
|
24
21
|
| gsd-verifier | Post-execution verification | `## Verification Complete` (title case) |
|
|
25
22
|
| gsd-integration-checker | Cross-phase integration check | `## Integration Check Complete` (title case) |
|
|
26
|
-
| gsd-nyquist-auditor | Sampling audit | `## PARTIAL`, `## ESCALATE` (non-standard) |
|
|
27
23
|
| gsd-security-auditor | Security audit | `## OPEN_THREATS`, `## ESCALATE` (non-standard) |
|
|
28
24
|
| gsd-codebase-mapper | Codebase analysis | No marker (writes docs directly) |
|
|
29
25
|
| gsd-assumptions-analyzer | Assumption extraction | No marker (returns `## Assumptions` sections) |
|
|
30
26
|
| gsd-doc-verifier | Doc validation | No marker (writes JSON to `.planning/tmp/`) |
|
|
31
27
|
| gsd-doc-writer | Doc generation | No marker (writes docs directly) |
|
|
32
28
|
| gsd-advisor-researcher | Advisory research | No marker (utility agent) |
|
|
33
|
-
| gsd-user-profiler | User profiling | No marker (returns JSON in analysis tags) |
|
|
34
|
-
| gsd-intel-updater | Codebase intelligence analysis | `## INTEL UPDATE COMPLETE`, `## INTEL UPDATE FAILED` |
|
|
35
29
|
|
|
36
30
|
## Marker Rules
|
|
37
31
|
|
|
@@ -60,36 +60,6 @@ reads is inert — the consumption mechanism is what gives an artifact meaning.
|
|
|
60
60
|
- **Location**: `.planning/phases/XX-name/XX-DISCUSSION-LOG.md`
|
|
61
61
|
- **Consumed by**: Human review; not read by automated workflows
|
|
62
62
|
|
|
63
|
-
### USER-PROFILE.md
|
|
64
|
-
- **Shape**: Calibration tier and preferences profile
|
|
65
|
-
- **Lifecycle**: Created by `profile-user` → Updated as preferences are observed
|
|
66
|
-
- **Location**: `~/.claude/get-shit-done/USER-PROFILE.md`
|
|
67
|
-
- **Consumed by**: `discuss-phase-assumptions` (calibration tier), `plan-phase`
|
|
68
|
-
|
|
69
|
-
### SPIKE.md / DESIGN.md (per-spike)
|
|
70
|
-
- **Shape**: Research question + methodology + findings + recommendation
|
|
71
|
-
- **Lifecycle**: Created → Investigated → Decided → Archived
|
|
72
|
-
- **Location**: `.planning/spikes/SPIKE-NNN/`
|
|
73
|
-
- **Consumed by**: Planner when spike is referenced; `pause-work` for spike context handoff
|
|
74
|
-
|
|
75
|
-
### Spike README.md / MANIFEST.md (per-spike, via /gsd-spike)
|
|
76
|
-
- **Shape**: YAML frontmatter (spike, name, validates, verdict, related, tags) + run instructions + results
|
|
77
|
-
- **Lifecycle**: Created by `/gsd-spike` → Verified → Wrapped up by `/gsd-spike-wrap-up`
|
|
78
|
-
- **Location**: `.planning/spikes/NNN-name/README.md`, `.planning/spikes/MANIFEST.md`
|
|
79
|
-
- **Consumed by**: `/gsd-spike-wrap-up` for curation; `pause-work` for spike context handoff
|
|
80
|
-
|
|
81
|
-
### Sketch README.md / MANIFEST.md / index.html (per-sketch)
|
|
82
|
-
- **Shape**: YAML frontmatter (sketch, name, question, winner, tags) + variants as tabbed HTML
|
|
83
|
-
- **Lifecycle**: Created by `/gsd-sketch` → Evaluated → Wrapped up by `/gsd-sketch-wrap-up`
|
|
84
|
-
- **Location**: `.planning/sketches/NNN-name/README.md`, `.planning/sketches/NNN-name/index.html`, `.planning/sketches/MANIFEST.md`
|
|
85
|
-
- **Consumed by**: `/gsd-sketch-wrap-up` for curation; `pause-work` for sketch context handoff
|
|
86
|
-
|
|
87
|
-
### WRAP-UP-SUMMARY.md (per wrap-up session)
|
|
88
|
-
- **Shape**: Curation results, included/excluded items, feature/design area groupings
|
|
89
|
-
- **Lifecycle**: Created by `/gsd-spike-wrap-up` or `/gsd-sketch-wrap-up`
|
|
90
|
-
- **Location**: `.planning/spikes/WRAP-UP-SUMMARY.md` or `.planning/sketches/WRAP-UP-SUMMARY.md`
|
|
91
|
-
- **Consumed by**: Project history; not read by automated workflows
|
|
92
|
-
|
|
93
63
|
---
|
|
94
64
|
|
|
95
65
|
## Standing Reference Artifacts
|
|
@@ -4,44 +4,46 @@ Model profiles control which Claude model each GSD agent uses. This allows balan
|
|
|
4
4
|
|
|
5
5
|
## Profile Definitions
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
|
10
|
-
|
|
11
|
-
| gsd-
|
|
12
|
-
| gsd-
|
|
13
|
-
| gsd-
|
|
14
|
-
| gsd-
|
|
15
|
-
| gsd-debugger | opus |
|
|
16
|
-
| gsd-
|
|
17
|
-
| gsd-
|
|
18
|
-
| gsd-
|
|
19
|
-
| gsd-
|
|
20
|
-
| gsd-
|
|
7
|
+
All named profiles (`quality` / `balanced` / `budget` / `adaptive`) resolve to the same unified allocation — the profile keys are kept for config compatibility, not differentiation. `inherit` resolves every agent to the current session model.
|
|
8
|
+
|
|
9
|
+
| Agent | All profiles | `inherit` |
|
|
10
|
+
|-------|--------------|-----------|
|
|
11
|
+
| gsd-planner | opus | inherit |
|
|
12
|
+
| gsd-roadmapper | opus | inherit |
|
|
13
|
+
| gsd-phase-researcher | opus | inherit |
|
|
14
|
+
| gsd-project-researcher | opus | inherit |
|
|
15
|
+
| gsd-debugger | opus | inherit |
|
|
16
|
+
| gsd-executor | sonnet | inherit |
|
|
17
|
+
| gsd-research-synthesizer | sonnet | inherit |
|
|
18
|
+
| gsd-codebase-mapper | sonnet | inherit |
|
|
19
|
+
| gsd-verifier | sonnet | inherit |
|
|
20
|
+
| gsd-plan-checker | sonnet | inherit |
|
|
21
|
+
| gsd-integration-checker | sonnet | inherit |
|
|
22
|
+
| gsd-pattern-mapper | sonnet | inherit |
|
|
23
|
+
|
|
24
|
+
Agents not in the table (e.g. gsd-advisor-researcher) resolve to `sonnet` via the default fallback.
|
|
25
|
+
|
|
26
|
+
**Security reviewer special tier:** the execute-phase `security_review_gate` overrides the model per trigger — **Opus** when the review fires via a hard rule (`.env*`/Dockerfile/CI diff) or `workflow.security_review: "always"`, **Sonnet** when it fires via `auto` semantic judgment. Low-frequency, high-value path; the override is passed at spawn time and does not live in the profile table.
|
|
21
27
|
|
|
22
28
|
## Profile Philosophy
|
|
23
29
|
|
|
24
|
-
**
|
|
25
|
-
- Opus for
|
|
26
|
-
- Sonnet for
|
|
27
|
-
-
|
|
30
|
+
**Unified allocation** (all named profiles)
|
|
31
|
+
- Opus for planning, roadmapping, research, and debugging — where reasoning quality has the highest downstream impact and the call frequency is low (once per phase)
|
|
32
|
+
- Sonnet for execution, verification, checking, and mapping — these follow explicit instructions produced by the Opus tier
|
|
33
|
+
- Research quality directly determines plan quality, so both researchers ride the Opus tier
|
|
28
34
|
|
|
29
|
-
**
|
|
30
|
-
|
|
31
|
-
- Sonnet for execution and research (follows explicit instructions)
|
|
32
|
-
- Sonnet for verification (needs reasoning, not just pattern matching)
|
|
33
|
-
- Use when: normal development, good balance of quality and cost
|
|
35
|
+
**Executor escape hatch**
|
|
36
|
+
The executor stays on Sonnet by default (plans carry the reasoning; execution is implementation). If a phase's implementation itself demands top-tier reasoning, override just the executor without touching the profile:
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"model_overrides": {
|
|
41
|
+
"gsd-executor": "opus"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
39
45
|
|
|
40
|
-
|
|
41
|
-
- Opus for planning and debugging (where reasoning quality has highest impact)
|
|
42
|
-
- Sonnet for execution, research, and verification (follows explicit instructions)
|
|
43
|
-
- Haiku for mapping, checking, and auditing (high volume, structured output)
|
|
44
|
-
- Use when: optimizing cost without sacrificing plan quality, solo development on paid API tiers
|
|
46
|
+
`model_overrides` takes precedence over the profile table (resolution order: override > profile > default). This turns the "small tasks run inline on Opus, big tasks spawn on Sonnet" inversion into a conscious, per-project choice.
|
|
45
47
|
|
|
46
48
|
**inherit** - Follow the current session model
|
|
47
49
|
- All agents resolve to `inherit`
|
|
@@ -115,7 +117,7 @@ Overrides take precedence over the profile. Valid values: `opus`, `sonnet`, `hai
|
|
|
115
117
|
|
|
116
118
|
## Switching Profiles
|
|
117
119
|
|
|
118
|
-
Runtime: `/gsd-
|
|
120
|
+
Runtime: `/gsd-settings` (model profile section)
|
|
119
121
|
|
|
120
122
|
Per-project default: Set in `.planning/config.json`:
|
|
121
123
|
```json
|
|
@@ -132,11 +134,11 @@ Planning involves architecture decisions, goal decomposition, and task design. T
|
|
|
132
134
|
**Why Sonnet for gsd-executor?**
|
|
133
135
|
Executors follow explicit PLAN.md instructions. The plan already contains the reasoning; execution is implementation.
|
|
134
136
|
|
|
135
|
-
**Why
|
|
136
|
-
|
|
137
|
+
**Why Opus for the researchers?**
|
|
138
|
+
Research quality directly determines plan quality, and each researcher runs at most once per phase — a low-frequency, high-leverage path.
|
|
137
139
|
|
|
138
|
-
**Why Haiku for
|
|
139
|
-
|
|
140
|
+
**Why Sonnet (not Haiku) for verifiers?**
|
|
141
|
+
Verification requires goal-backward reasoning - checking if code *delivers* what the phase promised, not just pattern matching. Sonnet handles this well; Haiku may miss subtle gaps.
|
|
140
142
|
|
|
141
143
|
**Why `inherit` instead of passing `opus` directly?**
|
|
142
144
|
Claude Code's `"opus"` alias maps to a specific model version. Organizations may block older opus versions while allowing newer ones. GSD returns `"inherit"` for opus-tier agents, causing them to use whatever opus version the user has configured in their session. This avoids version conflicts and silent fallbacks to Sonnet.
|
|
@@ -236,7 +236,6 @@ Generated from `CONFIG_DEFAULTS` (core.cjs) and `VALID_CONFIG_KEYS` (config.cjs)
|
|
|
236
236
|
| `context_window` | number | `200000` | `200000`, `1000000` | Context window size; set `1000000` for 1M-context models |
|
|
237
237
|
| `resolve_model_ids` | boolean\|string | `false` | `false`, `true`, `"omit"` | Map model aliases to full Claude IDs; `"omit"` returns empty string |
|
|
238
238
|
| `context` | string\|null | `null` | `"dev"`, `"research"`, `"review"` | Execution context profile that adjusts agent behavior: `"dev"` for development tasks, `"research"` for investigation/exploration, `"review"` for code review workflows |
|
|
239
|
-
| `review.models.<cli>` | string\|null | `null` | Any model ID string | Per-CLI model override for /gsd-review (e.g., `review.models.gemini`). Falls back to CLI default when null. |
|
|
240
239
|
|
|
241
240
|
### Workflow Fields
|
|
242
241
|
|
|
@@ -247,14 +246,12 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
|
|
|
247
246
|
| `workflow.research` | boolean | `true` | `true`, `false` | Run research agent before planning |
|
|
248
247
|
| `workflow.plan_check` | boolean | `true` | `true`, `false` | Run plan-checker agent to validate plans. _Alias:_ `plan_checker` is the flat-key form used in `CONFIG_DEFAULTS`; `workflow.plan_check` is the canonical namespaced form. |
|
|
249
248
|
| `workflow.verifier` | boolean | `true` | `true`, `false` | Run verifier agent after execution |
|
|
250
|
-
| `workflow.nyquist_validation` | boolean | `
|
|
249
|
+
| `workflow.nyquist_validation` | boolean | `false` | `true`, `false` | Legacy validation-gate switch. Feature removed; keep the key explicitly `false` — absent is treated as enabled by some readers |
|
|
251
250
|
| `workflow.auto_prune_state` | boolean | `false` | `true`, `false` | Automatically prune old STATE.md entries on phase completion (keeps 3 most recent phases) |
|
|
252
251
|
| `workflow.auto_advance` | boolean | `false` | `true`, `false` | Auto-advance to next phase after completion |
|
|
253
252
|
| `workflow.node_repair` | boolean | `true` | `true`, `false` | Attempt automatic repair of failed plan nodes |
|
|
254
253
|
| `workflow.node_repair_budget` | number | `2` | Any positive integer | Max repair retries per failed node |
|
|
255
|
-
| `workflow.ai_integration_phase` | boolean | `
|
|
256
|
-
| `workflow.ui_phase` | boolean | `true` | `true`, `false` | Generate UI-SPEC.md for frontend phases |
|
|
257
|
-
| `workflow.ui_safety_gate` | boolean | `true` | `true`, `false` | Require safety gate approval for UI changes |
|
|
254
|
+
| `workflow.ai_integration_phase` | boolean | `false` | `true`, `false` | Legacy AI-phase switch. Feature removed; key kept for config compatibility |
|
|
258
255
|
| `workflow.text_mode` | boolean | `false` | `true`, `false` | Use plain-text numbered lists instead of AskUserQuestion menus |
|
|
259
256
|
| `workflow.research_before_questions` | boolean | `false` | `true`, `false` | Run research before interactive questions in discuss phase |
|
|
260
257
|
| `workflow.discuss_mode` | string | `"discuss"` | `"discuss"`, `"assumptions"` | Default mode for discuss-phase: `"discuss"` runs interactive questioning; `"assumptions"` analyzes codebase and surfaces assumptions instead |
|
|
@@ -265,9 +262,8 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
|
|
|
265
262
|
| `workflow.code_review` | boolean | `true` | `true`, `false` | Enable built-in code review step in the ship workflow |
|
|
266
263
|
| `workflow.code_review_depth` | string | `"standard"` | `"light"`, `"standard"`, `"deep"` | Depth level for code review analysis in the ship workflow |
|
|
267
264
|
| `workflow._auto_chain_active` | boolean | `false` | `true`, `false` | Internal: tracks whether autonomous chaining is active |
|
|
268
|
-
| `workflow.security_enforcement` | boolean | `
|
|
269
|
-
| `workflow.
|
|
270
|
-
| `workflow.security_block_on` | string | `"high"` | `"high"`, `"medium"`, `"low"` | Minimum severity that blocks phase advancement |
|
|
265
|
+
| `workflow.security_enforcement` | boolean | `false` | `true`, `false` | Legacy threat-model-anchored security verification. Keep the key explicit — absent is treated as enabled by some readers |
|
|
266
|
+
| `workflow.security_review` | string | `"auto"` | `"auto"`, `"always"`, `"off"` | Diff-scoped security review trigger: `auto` reviews when the diff touches security-relevant surface, `always` reviews every phase, `off` disables |
|
|
271
267
|
|
|
272
268
|
### Git Fields
|
|
273
269
|
|
|
@@ -293,11 +289,10 @@ These toggle external search integrations. Auto-detected at project creation whe
|
|
|
293
289
|
|
|
294
290
|
### Features Fields
|
|
295
291
|
|
|
296
|
-
Set via `features.*` namespace (e.g., `"features": { "
|
|
292
|
+
Set via `features.*` namespace (e.g., `"features": { "global_learnings": true }`).
|
|
297
293
|
|
|
298
294
|
| Key | Type | Default | Allowed Values | Description |
|
|
299
295
|
|-----|------|---------|----------------|-------------|
|
|
300
|
-
| `features.thinking_partner` | boolean | `false` | `true`, `false` | Enable conditional extended thinking at workflow decision points (used by discuss-phase and plan-phase for architectural tradeoff analysis) |
|
|
301
296
|
| `features.global_learnings` | boolean | `false` | `true`, `false` | Enable injection of global learnings from `~/.gsd/learnings/` into agent prompts |
|
|
302
297
|
|
|
303
298
|
### Hook Fields
|
|
@@ -409,7 +404,7 @@ Several config fields affect each other or trigger special behavior:
|
|
|
409
404
|
"research": true,
|
|
410
405
|
"plan_check": true,
|
|
411
406
|
"verifier": true,
|
|
412
|
-
"nyquist_validation":
|
|
407
|
+
"nyquist_validation": false,
|
|
413
408
|
"use_worktrees": true,
|
|
414
409
|
"discuss_mode": "discuss"
|
|
415
410
|
},
|
|
@@ -441,7 +436,7 @@ Several config fields affect each other or trigger special behavior:
|
|
|
441
436
|
"research": true,
|
|
442
437
|
"plan_check": true,
|
|
443
438
|
"verifier": true,
|
|
444
|
-
"nyquist_validation":
|
|
439
|
+
"nyquist_validation": false,
|
|
445
440
|
"subagent_timeout": 600000,
|
|
446
441
|
"use_worktrees": true,
|
|
447
442
|
"node_repair": true,
|
|
@@ -183,7 +183,7 @@ When a phase is re-verified (e.g., after gap closure):
|
|
|
183
183
|
|
|
184
184
|
### At Milestone Completion
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
When closing a milestone, surface accumulated overrides for review:
|
|
187
187
|
|
|
188
188
|
```
|
|
189
189
|
### Verification Overrides ({count} across {phase_count} phases)
|
|
@@ -18,16 +18,14 @@ These files live directly at `.planning/` — not inside phase subdirectories.
|
|
|
18
18
|
| `REQUIREMENTS.md` | `requirements.md` | `/gsd-new-milestone` | Functional requirements with traceability |
|
|
19
19
|
| `MILESTONES.md` | `milestone.md` | `/gsd-complete-milestone` | Log of completed milestones with accomplishments |
|
|
20
20
|
| `BACKLOG.md` | *(inline)* | `/gsd-add-backlog` | Pending ideas and deferred work |
|
|
21
|
-
| `LEARNINGS.md` | *(inline)* | `/gsd-
|
|
22
|
-
| `THREADS.md` | *(inline)* | `/gsd-thread` | Persistent discussion threads |
|
|
21
|
+
| `LEARNINGS.md` | *(inline)* | `/gsd-execute-phase` | Phase retrospective learnings for future plans |
|
|
23
22
|
| `config.json` | `config.json` | `/gsd-new-project`, `/gsd-health --repair` | Project-specific GSD configuration |
|
|
24
|
-
| `CLAUDE.md` | `claude-md.md` | `/gsd-
|
|
23
|
+
| `CLAUDE.md` | `claude-md.md` | `/gsd-new-project` (generate-claude-md) | Auto-assembled Claude Code context file |
|
|
25
24
|
|
|
26
25
|
### Version-stamped artifacts (pattern: `vX.Y-*.md`)
|
|
27
26
|
|
|
28
27
|
| Pattern | Produced by | Purpose |
|
|
29
28
|
|---------|-------------|---------|
|
|
30
|
-
| `vX.Y-MILESTONE-AUDIT.md` | `/gsd-audit-milestone` | Milestone audit report before archiving |
|
|
31
29
|
|
|
32
30
|
These files are archived to `.planning/milestones/` by `/gsd-complete-milestone`. Finding them at the `.planning/` root after completion indicates the archive step was skipped.
|
|
33
31
|
|
|
@@ -43,14 +41,9 @@ These files live inside a phase directory. They are NOT checked by W019 (which o
|
|
|
43
41
|
| `NN-MM-SUMMARY.md` | `summary.md` | `/gsd-execute-phase` | Post-execution summary with learnings |
|
|
44
42
|
| `NN-CONTEXT.md` | `context.md` | `/gsd-discuss-phase` | Scoped discussion decisions for the phase |
|
|
45
43
|
| `NN-RESEARCH.md` | `research.md` | `/gsd-research-phase`, `/gsd-plan-phase` | Technical research for the phase |
|
|
46
|
-
| `NN-VALIDATION.md` | `VALIDATION.md` | `/gsd-research-phase` (Nyquist) | Validation architecture (Nyquist method) |
|
|
47
44
|
| `NN-UAT.md` | `UAT.md` | `/gsd-validate-phase` | User acceptance test results |
|
|
48
45
|
| `NN-PATTERNS.md` | *(inline)* | `/gsd-plan-phase` (pattern mapper) | Analog file mapping for the phase |
|
|
49
|
-
| `NN-UI-SPEC.md` | `UI-SPEC.md` | `/gsd-ui-phase` | UI design contract |
|
|
50
|
-
| `NN-SECURITY.md` | `SECURITY.md` | `/gsd-secure-phase` | Security threat model |
|
|
51
|
-
| `NN-AI-SPEC.md` | `AI-SPEC.md` | `/gsd-ai-integration-phase` | AI integration spec with eval strategy |
|
|
52
46
|
| `NN-DEBUG.md` | `DEBUG.md` | `/gsd-debug` | Debug session log |
|
|
53
|
-
| `NN-REVIEWS.md` | *(inline)* | `/gsd-review` | Cross-AI review feedback |
|
|
54
47
|
|
|
55
48
|
---
|
|
56
49
|
|
|
@@ -4,7 +4,6 @@ Template for project-root `CLAUDE.md` — auto-generated by `gsd-tools generate-
|
|
|
4
4
|
|
|
5
5
|
Contains 7 marker-bounded sections. Each section is independently updatable.
|
|
6
6
|
The `generate-claude-md` subcommand manages 6 sections (project, stack, conventions, architecture, skills, workflow enforcement).
|
|
7
|
-
The profile section is managed exclusively by `generate-claude-profile`.
|
|
8
7
|
|
|
9
8
|
---
|
|
10
9
|
|
|
@@ -104,19 +103,6 @@ Do not make direct repo edits outside a GSD workflow unless the user explicitly
|
|
|
104
103
|
<!-- GSD:workflow-end -->
|
|
105
104
|
```
|
|
106
105
|
|
|
107
|
-
### Profile Section (Placeholder Only)
|
|
108
|
-
```
|
|
109
|
-
<!-- GSD:profile-start -->
|
|
110
|
-
## Developer Profile
|
|
111
|
-
|
|
112
|
-
> Profile not yet configured. Run `/gsd-profile-user` to generate your developer profile.
|
|
113
|
-
> This section is managed by `generate-claude-profile` — do not edit manually.
|
|
114
|
-
<!-- GSD:profile-end -->
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
**Note:** This section is NOT managed by `generate-claude-md`. It is managed exclusively
|
|
118
|
-
by `generate-claude-profile`. The placeholder above is only used when creating a new
|
|
119
|
-
CLAUDE.md file and no profile section exists yet.
|
|
120
106
|
|
|
121
107
|
---
|
|
122
108
|
|