@undeemed/get-shit-done-codex 1.21.0 → 1.22.1
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/.codex/config.toml +1 -1
- package/README.md +33 -45
- package/agents/gsd-codebase-mapper.md +3 -3
- package/agents/gsd-debugger.md +7 -7
- package/agents/gsd-executor.md +14 -14
- package/agents/gsd-phase-researcher.md +7 -7
- package/agents/gsd-plan-checker.md +10 -10
- package/agents/gsd-planner.md +20 -20
- package/agents/gsd-project-researcher.md +3 -3
- package/agents/gsd-research-synthesizer.md +6 -6
- package/agents/gsd-roadmapper.md +7 -7
- package/agents/gsd-verifier.md +29 -17
- package/bin/install.js +54 -198
- package/commands/gsd/add-tests.md +5 -4
- package/commands/gsd/complete-milestone.md +6 -6
- package/commands/gsd/debug.md +1 -1
- package/commands/gsd/map-codebase.md +3 -3
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/new-project.md +1 -1
- package/commands/gsd/plan-milestone-gaps.md +2 -2
- package/commands/gsd/reapply-patches.md +2 -2
- package/commands/gsd/research-phase.md +3 -3
- package/commands/gsd/verify-work.md +1 -1
- package/get-shit-done/bin/lib/commands.cjs +1 -1
- package/get-shit-done/bin/lib/phase.cjs +2 -2
- package/get-shit-done/bin/lib/verify.cjs +8 -8
- package/get-shit-done/references/continuation-format.md +33 -27
- package/get-shit-done/references/model-profiles.md +1 -1
- package/get-shit-done/references/ui-brand.md +3 -3
- package/get-shit-done/templates/DEBUG.md +5 -5
- package/get-shit-done/templates/UAT.md +4 -4
- package/get-shit-done/templates/VALIDATION.md +1 -1
- package/get-shit-done/templates/debug-subagent-prompt.md +1 -1
- package/get-shit-done/templates/discovery.md +2 -2
- package/get-shit-done/templates/phase-prompt.md +1 -1
- package/get-shit-done/templates/planner-subagent-prompt.md +3 -3
- package/get-shit-done/templates/project.md +1 -1
- package/get-shit-done/templates/research.md +1 -1
- package/get-shit-done/templates/retrospective.md +13 -7
- package/get-shit-done/templates/state.md +2 -2
- package/get-shit-done/workflows/add-phase.md +8 -8
- package/get-shit-done/workflows/add-tests.md +41 -18
- package/get-shit-done/workflows/add-todo.md +2 -2
- package/get-shit-done/workflows/audit-milestone.md +8 -8
- package/get-shit-done/workflows/check-todos.md +8 -8
- package/get-shit-done/workflows/complete-milestone.md +34 -9
- package/get-shit-done/workflows/diagnose-issues.md +1 -1
- package/get-shit-done/workflows/discovery-phase.md +3 -3
- package/get-shit-done/workflows/discuss-phase.md +12 -12
- package/get-shit-done/workflows/execute-phase.md +8 -8
- package/get-shit-done/workflows/execute-plan.md +4 -4
- package/get-shit-done/workflows/health.md +5 -5
- package/get-shit-done/workflows/help.md +97 -90
- package/get-shit-done/workflows/insert-phase.md +7 -7
- package/get-shit-done/workflows/list-phase-assumptions.md +4 -4
- package/get-shit-done/workflows/map-codebase.md +3 -3
- package/get-shit-done/workflows/new-milestone.md +6 -6
- package/get-shit-done/workflows/new-project.md +12 -12
- package/get-shit-done/workflows/pause-work.md +1 -1
- package/get-shit-done/workflows/plan-milestone-gaps.md +8 -8
- package/get-shit-done/workflows/plan-phase.md +13 -13
- package/get-shit-done/workflows/progress.md +29 -29
- package/get-shit-done/workflows/quick.md +3 -3
- package/get-shit-done/workflows/remove-phase.md +6 -6
- package/get-shit-done/workflows/research-phase.md +2 -2
- package/get-shit-done/workflows/resume-project.md +11 -11
- package/get-shit-done/workflows/settings.md +6 -6
- package/get-shit-done/workflows/transition.md +13 -13
- package/get-shit-done/workflows/update.md +2 -2
- package/get-shit-done/workflows/verify-work.md +8 -8
- package/package.json +1 -1
- package/commands/gsd/new-project.md.bak +0 -1041
package/bin/install.js
CHANGED
|
@@ -42,39 +42,7 @@ const hasNoVersionCheck = args.includes('--no-version-check') || process.env.GSD
|
|
|
42
42
|
const hasMigrate = args.includes('--migrate');
|
|
43
43
|
const hasSkipMigrate = args.includes('--skip-migrate') || args.includes('--no-migrate');
|
|
44
44
|
const isInteractiveTerminal = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
45
|
-
const
|
|
46
|
-
const hasCodexModeArg = args.some((arg) =>
|
|
47
|
-
arg.startsWith('--codex-mode=') || arg === '--codex-mode' || arg === '-m'
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
function parseCodexModeArg(argv) {
|
|
51
|
-
const explicit = argv.find((arg) => arg.startsWith('--codex-mode='));
|
|
52
|
-
const flagIndex = argv.findIndex((arg) => arg === '--codex-mode' || arg === '-m');
|
|
53
|
-
let mode = 'skills';
|
|
54
|
-
|
|
55
|
-
if (explicit) {
|
|
56
|
-
mode = explicit.split('=')[1] || '';
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (flagIndex !== -1) {
|
|
60
|
-
const next = argv[flagIndex + 1];
|
|
61
|
-
if (!next || next.startsWith('-')) {
|
|
62
|
-
console.error(` ${yellow}--codex-mode requires one of: prompts, skills${reset}`);
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
mode = next;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
mode = String(mode).toLowerCase().trim();
|
|
69
|
-
if (!CODEX_MODES.has(mode)) {
|
|
70
|
-
console.error(` ${yellow}Invalid --codex-mode '${mode}'. Expected prompts or skills.${reset}`);
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return mode;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const codexMode = hasHelp ? 'skills' : parseCodexModeArg(args);
|
|
45
|
+
const codexMode = 'skills';
|
|
78
46
|
|
|
79
47
|
console.log(banner);
|
|
80
48
|
|
|
@@ -84,7 +52,6 @@ if (hasHelp) {
|
|
|
84
52
|
${yellow}Options:${reset}
|
|
85
53
|
${cyan}-g, --global${reset} Install globally (to ~/.codex/)
|
|
86
54
|
${cyan}-l, --local${reset} Install locally (to current directory)
|
|
87
|
-
${cyan}-m, --codex-mode <mode>${reset} Command mode: skills or prompts
|
|
88
55
|
${cyan}--migrate${reset} Apply detected legacy surface cleanup without prompting
|
|
89
56
|
${cyan}--skip-migrate${reset} Keep legacy surface files when migration is detected
|
|
90
57
|
${cyan}--verify${reset} Verify current install integrity
|
|
@@ -99,12 +66,6 @@ if (hasHelp) {
|
|
|
99
66
|
${dim}# Install to current project only${reset}
|
|
100
67
|
npx ${NPM_PACKAGE} --local
|
|
101
68
|
|
|
102
|
-
${dim}# Install native Codex skills only${reset}
|
|
103
|
-
npx ${NPM_PACKAGE} --global --codex-mode skills
|
|
104
|
-
|
|
105
|
-
${dim}# Install prompt aliases only${reset}
|
|
106
|
-
npx ${NPM_PACKAGE} --global --codex-mode prompts
|
|
107
|
-
|
|
108
69
|
${dim}# Verify global installation${reset}
|
|
109
70
|
npx ${NPM_PACKAGE} --verify --global
|
|
110
71
|
|
|
@@ -115,10 +76,10 @@ if (hasHelp) {
|
|
|
115
76
|
npx ${NPM_PACKAGE} --global --migrate
|
|
116
77
|
|
|
117
78
|
${yellow}Notes:${reset}
|
|
118
|
-
- Installs AGENTS.md
|
|
119
|
-
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
79
|
+
- Installs AGENTS.md, skills/gsd-*/SKILL.md, agents/gsd-*.md, .codex/config.toml
|
|
80
|
+
- All commands use $gsd-* skill notation
|
|
81
|
+
- Legacy prompts/ installs are detected and cleaned up via --migrate
|
|
82
|
+
- --verify + --repair will reinstall missing artifacts
|
|
122
83
|
- Installs get-shit-done/ workflow files
|
|
123
84
|
`);
|
|
124
85
|
process.exit(0);
|
|
@@ -159,9 +120,7 @@ function convertPromptRefsToSkillRefs(content) {
|
|
|
159
120
|
return converted;
|
|
160
121
|
}
|
|
161
122
|
|
|
162
|
-
|
|
163
|
-
return content.replace(/\$gsd-([a-z0-9-]+)/gi, (_, commandName) => `/prompts:gsd-${String(commandName).toLowerCase()}`);
|
|
164
|
-
}
|
|
123
|
+
|
|
165
124
|
|
|
166
125
|
function convertCommandRefsToSkillMentions(content) {
|
|
167
126
|
return convertPromptRefsToSkillRefs(content).replace(/\$ARGUMENTS\b/g, '{{GSD_ARGS}}');
|
|
@@ -174,20 +133,10 @@ function rewriteAgentInvocationLine(content, replacement) {
|
|
|
174
133
|
.replace('Invoke them with `$gsd-command-name`:', replacement);
|
|
175
134
|
}
|
|
176
135
|
|
|
177
|
-
function adaptAgentsForCodexMode(content
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return adapted;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (mode === 'prompts') {
|
|
185
|
-
let adapted = convertSkillRefsToPromptRefs(content);
|
|
186
|
-
adapted = rewriteAgentInvocationLine(adapted, 'Invoke them with `/prompts:gsd-command-name`:');
|
|
187
|
-
return adapted;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return content;
|
|
136
|
+
function adaptAgentsForCodexMode(content) {
|
|
137
|
+
let adapted = convertPromptRefsToSkillRefs(content);
|
|
138
|
+
adapted = rewriteAgentInvocationLine(adapted, 'Invoke them with `$gsd-command-name`:');
|
|
139
|
+
return adapted;
|
|
191
140
|
}
|
|
192
141
|
|
|
193
142
|
function extractFrontmatterAndBody(content) {
|
|
@@ -244,15 +193,7 @@ ${getCodexSkillAdapterHeader(skillName)}
|
|
|
244
193
|
${body.trimStart()}`;
|
|
245
194
|
}
|
|
246
195
|
|
|
247
|
-
|
|
248
|
-
fs.mkdirSync(promptsDir, { recursive: true });
|
|
249
|
-
for (const entry of markdownEntries) {
|
|
250
|
-
const srcPath = path.join(commandsDir, entry);
|
|
251
|
-
const destPath = path.join(promptsDir, `gsd-${entry}`);
|
|
252
|
-
const content = applyReplacements(fs.readFileSync(srcPath, 'utf8'), pathPrefix);
|
|
253
|
-
fs.writeFileSync(destPath, content, 'utf8');
|
|
254
|
-
}
|
|
255
|
-
}
|
|
196
|
+
|
|
256
197
|
|
|
257
198
|
function installCodexSkills(commandsDir, skillsDir, markdownEntries, pathPrefix) {
|
|
258
199
|
fs.mkdirSync(skillsDir, { recursive: true });
|
|
@@ -320,7 +261,7 @@ function installConfig(src, codexDir, pathPrefix) {
|
|
|
320
261
|
return true;
|
|
321
262
|
}
|
|
322
263
|
|
|
323
|
-
function installAgentDefs(src, codexDir, pathPrefix
|
|
264
|
+
function installAgentDefs(src, codexDir, pathPrefix) {
|
|
324
265
|
const agentsSrc = path.join(src, 'agents');
|
|
325
266
|
if (!fs.existsSync(agentsSrc)) return 0;
|
|
326
267
|
const agentsDest = path.join(codexDir, 'agents');
|
|
@@ -329,11 +270,7 @@ function installAgentDefs(src, codexDir, pathPrefix, mode) {
|
|
|
329
270
|
for (const entry of entries) {
|
|
330
271
|
let content = fs.readFileSync(path.join(agentsSrc, entry), 'utf8');
|
|
331
272
|
content = applyReplacements(content, pathPrefix);
|
|
332
|
-
|
|
333
|
-
content = convertPromptRefsToSkillRefs(content);
|
|
334
|
-
} else if (mode === 'prompts') {
|
|
335
|
-
content = convertSkillRefsToPromptRefs(content);
|
|
336
|
-
}
|
|
273
|
+
content = convertPromptRefsToSkillRefs(content);
|
|
337
274
|
fs.writeFileSync(path.join(agentsDest, entry), content, 'utf8');
|
|
338
275
|
}
|
|
339
276
|
return entries.length;
|
|
@@ -351,52 +288,27 @@ function countInstalledAgentDefs(codexDir) {
|
|
|
351
288
|
return fs.readdirSync(agentsDest).filter((e) => /^gsd-.*\.md$/i.test(e)).length;
|
|
352
289
|
}
|
|
353
290
|
|
|
354
|
-
function detectMigrationPlan(codexDir
|
|
291
|
+
function detectMigrationPlan(codexDir) {
|
|
355
292
|
const promptsDir = path.join(codexDir, 'prompts');
|
|
356
|
-
const skillsDir = path.join(codexDir, 'skills');
|
|
357
293
|
const promptFiles = listPromptCommandFiles(promptsDir);
|
|
358
|
-
const skillNames = listSkillNames(skillsDir);
|
|
359
|
-
|
|
360
|
-
const promptCountToRemove = mode === 'skills' ? promptFiles.length : 0;
|
|
361
|
-
const skillCountToRemove = mode === 'prompts' ? skillNames.length : 0;
|
|
362
294
|
|
|
363
295
|
return {
|
|
364
|
-
mode,
|
|
365
296
|
promptsDir,
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
skillCountToRemove,
|
|
369
|
-
hasChanges: promptCountToRemove > 0 || skillCountToRemove > 0,
|
|
297
|
+
promptCountToRemove: promptFiles.length,
|
|
298
|
+
hasChanges: promptFiles.length > 0,
|
|
370
299
|
};
|
|
371
300
|
}
|
|
372
301
|
|
|
373
302
|
function describeMigrationPlan(plan) {
|
|
374
|
-
|
|
375
|
-
if (plan.promptCountToRemove > 0) {
|
|
376
|
-
items.push(`${plan.promptCountToRemove} legacy prompt alias file(s) in prompts/`);
|
|
377
|
-
}
|
|
378
|
-
if (plan.skillCountToRemove > 0) {
|
|
379
|
-
items.push(`${plan.skillCountToRemove} legacy skill director${plan.skillCountToRemove === 1 ? 'y' : 'ies'} in skills/`);
|
|
380
|
-
}
|
|
381
|
-
return items.join(' and ');
|
|
303
|
+
return `${plan.promptCountToRemove} legacy prompt alias file(s) in prompts/`;
|
|
382
304
|
}
|
|
383
305
|
|
|
384
306
|
function applyMigrationPlan(plan) {
|
|
385
|
-
let removedPrompts = 0;
|
|
386
|
-
let removedSkills = 0;
|
|
387
|
-
|
|
388
307
|
if (plan.promptCountToRemove > 0) {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
if (removedPrompts > 0 || removedSkills > 0) {
|
|
396
|
-
const changes = [];
|
|
397
|
-
if (removedPrompts > 0) changes.push(`${removedPrompts} prompt alias file(s)`);
|
|
398
|
-
if (removedSkills > 0) changes.push(`${removedSkills} skill director${removedSkills === 1 ? 'y' : 'ies'}`);
|
|
399
|
-
console.log(` ${green}✓${reset} Migration applied: removed ${changes.join(', ')}`);
|
|
308
|
+
const removed = removePromptAliases(plan.promptsDir);
|
|
309
|
+
if (removed > 0) {
|
|
310
|
+
console.log(` ${green}✓${reset} Migration applied: removed ${removed} legacy prompt alias file(s)`);
|
|
311
|
+
}
|
|
400
312
|
}
|
|
401
313
|
}
|
|
402
314
|
|
|
@@ -471,13 +383,12 @@ function listSkillNames(skillsDir) {
|
|
|
471
383
|
}
|
|
472
384
|
|
|
473
385
|
function detectInstalledMode(promptCount, skillCount) {
|
|
474
|
-
if (promptCount > 0
|
|
475
|
-
if (promptCount > 0) return 'prompts';
|
|
386
|
+
if (promptCount > 0) return 'legacy-prompts';
|
|
476
387
|
if (skillCount > 0) return 'skills';
|
|
477
388
|
return 'none';
|
|
478
389
|
}
|
|
479
390
|
|
|
480
|
-
function verifyInstall(isGlobal
|
|
391
|
+
function verifyInstall(isGlobal) {
|
|
481
392
|
const src = path.join(__dirname, '..');
|
|
482
393
|
const { codexDir, locationLabel } = getInstallContext(isGlobal);
|
|
483
394
|
const promptsDir = path.join(codexDir, 'prompts');
|
|
@@ -491,7 +402,6 @@ function verifyInstall(isGlobal, expectedMode, strictMode = false) {
|
|
|
491
402
|
const promptFiles = listPromptCommandFiles(promptsDir);
|
|
492
403
|
const skillNames = listSkillNames(skillsDir);
|
|
493
404
|
const detectedMode = detectInstalledMode(promptFiles.length, skillNames.length);
|
|
494
|
-
const modeToCheck = strictMode ? expectedMode : (detectedMode === 'none' ? expectedMode : detectedMode);
|
|
495
405
|
|
|
496
406
|
const checks = [];
|
|
497
407
|
const addCheck = (ok, label, detail) => checks.push({ ok, label, detail });
|
|
@@ -515,24 +425,12 @@ function verifyInstall(isGlobal, expectedMode, strictMode = false) {
|
|
|
515
425
|
addCheck(version === pkg.version, 'VERSION matches installer package', `${version || '(empty)'} vs ${pkg.version}`);
|
|
516
426
|
}
|
|
517
427
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if (modeToCheck === 'skills') {
|
|
522
|
-
addCheck(skillNames.length === expectedCount, 'Native skills complete', `${skillNames.length}/${expectedCount}`);
|
|
523
|
-
}
|
|
524
|
-
if (modeToCheck === 'mixed') {
|
|
525
|
-
addCheck(
|
|
526
|
-
false,
|
|
527
|
-
'Single command surface required',
|
|
528
|
-
'Both skills and prompt aliases found. Choose one mode and run install with --migrate.'
|
|
529
|
-
);
|
|
530
|
-
}
|
|
531
|
-
if (modeToCheck === 'none') {
|
|
532
|
-
addCheck(false, 'At least one command surface installed', 'No skills/ or prompts/ entries found');
|
|
428
|
+
addCheck(skillNames.length === expectedCount, 'Native skills complete', `${skillNames.length}/${expectedCount}`);
|
|
429
|
+
if (promptFiles.length > 0) {
|
|
430
|
+
addCheck(false, 'Legacy prompts/ detected', 'Run with --migrate to clean up');
|
|
533
431
|
}
|
|
534
432
|
|
|
535
|
-
console.log(` Verifying ${cyan}${locationLabel}${reset} (detected mode: ${cyan}${detectedMode}${reset}
|
|
433
|
+
console.log(` Verifying ${cyan}${locationLabel}${reset} (detected mode: ${cyan}${detectedMode}${reset})`);
|
|
536
434
|
for (const check of checks) {
|
|
537
435
|
const icon = check.ok ? `${green}✓${reset}` : `${yellow}✗${reset}`;
|
|
538
436
|
const detail = check.detail ? ` ${dim}(${check.detail})${reset}` : '';
|
|
@@ -546,14 +444,12 @@ function verifyInstall(isGlobal, expectedMode, strictMode = false) {
|
|
|
546
444
|
console.log(`\n ${yellow}Integrity check failed.${reset}`);
|
|
547
445
|
}
|
|
548
446
|
|
|
549
|
-
return { ok, detectedMode
|
|
447
|
+
return { ok, detectedMode };
|
|
550
448
|
}
|
|
551
449
|
|
|
552
|
-
function installCore(isGlobal,
|
|
450
|
+
function installCore(isGlobal, migrationPlan, applyMigration, done = () => {}) {
|
|
553
451
|
const src = path.join(__dirname, '..');
|
|
554
452
|
const { codexDir, locationLabel, pathPrefix } = getInstallContext(isGlobal);
|
|
555
|
-
const installPromptsEnabled = mode === 'prompts';
|
|
556
|
-
const installSkillsEnabled = mode === 'skills';
|
|
557
453
|
|
|
558
454
|
console.log(` Installing to ${cyan}${locationLabel}${reset}\n`);
|
|
559
455
|
fs.mkdirSync(codexDir, { recursive: true });
|
|
@@ -567,7 +463,7 @@ function installCore(isGlobal, mode, migrationPlan, applyMigration, done = () =>
|
|
|
567
463
|
|
|
568
464
|
const writeAgents = () => {
|
|
569
465
|
let agentsContent = applyReplacements(fs.readFileSync(agentsSrc, 'utf8'), pathPrefix);
|
|
570
|
-
agentsContent = adaptAgentsForCodexMode(agentsContent
|
|
466
|
+
agentsContent = adaptAgentsForCodexMode(agentsContent);
|
|
571
467
|
fs.writeFileSync(agentsDest, agentsContent, 'utf8');
|
|
572
468
|
};
|
|
573
469
|
|
|
@@ -579,7 +475,7 @@ function installCore(isGlobal, mode, migrationPlan, applyMigration, done = () =>
|
|
|
579
475
|
console.log(` ${dim}-${reset} Skipped .codex/config.toml (already exists or source missing)`);
|
|
580
476
|
}
|
|
581
477
|
|
|
582
|
-
const agentCount = installAgentDefs(src, codexDir, pathPrefix
|
|
478
|
+
const agentCount = installAgentDefs(src, codexDir, pathPrefix);
|
|
583
479
|
if (agentCount > 0) {
|
|
584
480
|
console.log(` ${green}✓${reset} Installed agents/gsd-*.md (${agentCount} agent definitions)`);
|
|
585
481
|
}
|
|
@@ -588,17 +484,9 @@ function installCore(isGlobal, mode, migrationPlan, applyMigration, done = () =>
|
|
|
588
484
|
const entries = fs.readdirSync(gsdSrc);
|
|
589
485
|
const markdownEntries = entries.filter((entry) => entry.endsWith('.md'));
|
|
590
486
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
console.log(` ${green}✓${reset} Installed prompts/gsd-*.md (${markdownEntries.length} commands)`);
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
if (installSkillsEnabled) {
|
|
598
|
-
const skillsDir = path.join(codexDir, 'skills');
|
|
599
|
-
installCodexSkills(gsdSrc, skillsDir, markdownEntries, pathPrefix);
|
|
600
|
-
console.log(` ${green}✓${reset} Installed skills/gsd-*/SKILL.md (${markdownEntries.length} skills)`);
|
|
601
|
-
}
|
|
487
|
+
const skillsDir = path.join(codexDir, 'skills');
|
|
488
|
+
installCodexSkills(gsdSrc, skillsDir, markdownEntries, pathPrefix);
|
|
489
|
+
console.log(` ${green}✓${reset} Installed skills/gsd-*/SKILL.md (${markdownEntries.length} skills)`);
|
|
602
490
|
|
|
603
491
|
const skillSrc = path.join(src, 'get-shit-done');
|
|
604
492
|
const skillDest = path.join(codexDir, 'get-shit-done');
|
|
@@ -612,18 +500,17 @@ function installCore(isGlobal, mode, migrationPlan, applyMigration, done = () =>
|
|
|
612
500
|
|
|
613
501
|
${yellow}For Codex (CLI + Desktop):${reset}
|
|
614
502
|
- AGENTS.md: ${cyan}${codexDir}/AGENTS.md${reset}
|
|
615
|
-
|
|
616
|
-
${installSkillsEnabled ? `- Native skills: ${cyan}${codexDir}/skills/gsd-*/SKILL.md${reset}` : ''}
|
|
503
|
+
- Native skills: ${cyan}${codexDir}/skills/gsd-*/SKILL.md${reset}
|
|
617
504
|
- Config: ${cyan}${codexDir}/.codex/config.toml${reset}
|
|
618
505
|
- Agent defs: ${cyan}${codexDir}/agents/gsd-*.md${reset}
|
|
619
506
|
|
|
620
507
|
${yellow}Getting Started:${reset}
|
|
621
508
|
1. Run ${cyan}codex${reset} (CLI) or ${cyan}codex app${reset} (Desktop)
|
|
622
|
-
2. Use ${cyan}$
|
|
623
|
-
3. Start with ${cyan}$
|
|
509
|
+
2. Use ${cyan}$gsd-help${reset} to list commands
|
|
510
|
+
3. Start with ${cyan}$gsd-new-project${reset}
|
|
624
511
|
|
|
625
512
|
${yellow}Staying Updated:${reset}
|
|
626
|
-
- In Codex: ${cyan}$
|
|
513
|
+
- In Codex: ${cyan}$gsd-update${reset}
|
|
627
514
|
- In terminal: ${cyan}npx ${NPM_PACKAGE_LATEST}${reset}
|
|
628
515
|
|
|
629
516
|
${dim}Note: Codex will prompt you to trust this project on first run
|
|
@@ -659,12 +546,12 @@ function installCore(isGlobal, mode, migrationPlan, applyMigration, done = () =>
|
|
|
659
546
|
}
|
|
660
547
|
}
|
|
661
548
|
|
|
662
|
-
function install(isGlobal,
|
|
549
|
+
function install(isGlobal, done = () => {}) {
|
|
663
550
|
const { codexDir } = getInstallContext(isGlobal);
|
|
664
|
-
const migrationPlan = detectMigrationPlan(codexDir
|
|
551
|
+
const migrationPlan = detectMigrationPlan(codexDir);
|
|
665
552
|
|
|
666
553
|
if (!migrationPlan.hasChanges) {
|
|
667
|
-
installCore(isGlobal,
|
|
554
|
+
installCore(isGlobal, migrationPlan, false, done);
|
|
668
555
|
return;
|
|
669
556
|
}
|
|
670
557
|
|
|
@@ -673,20 +560,20 @@ function install(isGlobal, mode = codexMode, done = () => {}) {
|
|
|
673
560
|
|
|
674
561
|
if (hasMigrate) {
|
|
675
562
|
console.log(` ${green}✓${reset} Migration approved by --migrate`);
|
|
676
|
-
installCore(isGlobal,
|
|
563
|
+
installCore(isGlobal, migrationPlan, true, done);
|
|
677
564
|
return;
|
|
678
565
|
}
|
|
679
566
|
|
|
680
567
|
if (hasSkipMigrate) {
|
|
681
568
|
console.log(` ${yellow}Skipping migration due to --skip-migrate.${reset}`);
|
|
682
|
-
installCore(isGlobal,
|
|
569
|
+
installCore(isGlobal, migrationPlan, false, done);
|
|
683
570
|
return;
|
|
684
571
|
}
|
|
685
572
|
|
|
686
573
|
if (!isInteractiveTerminal) {
|
|
687
574
|
console.log(` ${yellow}Skipping migration in non-interactive mode.${reset}`);
|
|
688
575
|
console.log(` ${dim}Re-run with --migrate to apply cleanup or --skip-migrate to keep legacy files explicitly.${reset}`);
|
|
689
|
-
installCore(isGlobal,
|
|
576
|
+
installCore(isGlobal, migrationPlan, false, done);
|
|
690
577
|
return;
|
|
691
578
|
}
|
|
692
579
|
|
|
@@ -702,36 +589,11 @@ function install(isGlobal, mode = codexMode, done = () => {}) {
|
|
|
702
589
|
if (!applyMigration) {
|
|
703
590
|
console.log(` ${yellow}Keeping legacy files.${reset}`);
|
|
704
591
|
}
|
|
705
|
-
installCore(isGlobal,
|
|
592
|
+
installCore(isGlobal, migrationPlan, applyMigration, done);
|
|
706
593
|
});
|
|
707
594
|
}
|
|
708
595
|
|
|
709
|
-
function promptCodexMode(done) {
|
|
710
|
-
if (hasCodexModeArg || !isInteractiveTerminal) {
|
|
711
|
-
done(codexMode);
|
|
712
|
-
return;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
const rl = readline.createInterface({
|
|
716
|
-
input: process.stdin,
|
|
717
|
-
output: process.stdout
|
|
718
|
-
});
|
|
719
|
-
|
|
720
|
-
console.log(` ${yellow}Which command surface do you want?${reset}
|
|
721
596
|
|
|
722
|
-
${cyan}1${reset}) Skills ${dim}($gsd-*, recommended)${reset}
|
|
723
|
-
${cyan}2${reset}) Prompts ${dim}(/prompts:gsd-*)${reset}
|
|
724
|
-
`);
|
|
725
|
-
|
|
726
|
-
rl.question(` Choice ${dim}[1]${reset}: `, (answer) => {
|
|
727
|
-
rl.close();
|
|
728
|
-
const normalized = answer.trim().toLowerCase();
|
|
729
|
-
const mode = normalized === '2' || normalized === 'prompt' || normalized === 'prompts'
|
|
730
|
-
? 'prompts'
|
|
731
|
-
: 'skills';
|
|
732
|
-
done(mode);
|
|
733
|
-
});
|
|
734
|
-
}
|
|
735
597
|
|
|
736
598
|
function promptLocation(done) {
|
|
737
599
|
const rl = readline.createInterface({
|
|
@@ -773,32 +635,26 @@ if (!hasNoVersionCheck && !hasVerify) {
|
|
|
773
635
|
|
|
774
636
|
if (hasVerify) {
|
|
775
637
|
const isGlobal = hasLocal ? false : true;
|
|
776
|
-
|
|
777
|
-
let result = verifyInstall(isGlobal, codexMode, strictMode);
|
|
638
|
+
let result = verifyInstall(isGlobal);
|
|
778
639
|
|
|
779
640
|
if (!result.ok && hasRepair) {
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
install(isGlobal, repairMode, () => {
|
|
641
|
+
console.log(`\n ${yellow}Repairing install...${reset}\n`);
|
|
642
|
+
install(isGlobal, () => {
|
|
783
643
|
console.log('');
|
|
784
|
-
const repaired = verifyInstall(isGlobal
|
|
644
|
+
const repaired = verifyInstall(isGlobal);
|
|
785
645
|
process.exit(repaired.ok ? 0 : 1);
|
|
786
646
|
});
|
|
787
647
|
} else {
|
|
788
648
|
process.exit(result.ok ? 0 : 1);
|
|
789
649
|
}
|
|
790
650
|
} else {
|
|
791
|
-
const installWithSelectedMode = (isGlobal) => {
|
|
792
|
-
promptCodexMode((selectedMode) => {
|
|
793
|
-
install(isGlobal, selectedMode);
|
|
794
|
-
});
|
|
795
|
-
};
|
|
796
|
-
|
|
797
651
|
if (hasGlobal) {
|
|
798
|
-
|
|
652
|
+
install(true);
|
|
799
653
|
} else if (hasLocal) {
|
|
800
|
-
|
|
654
|
+
install(false);
|
|
801
655
|
} else {
|
|
802
|
-
promptLocation(
|
|
656
|
+
promptLocation((isGlobal) => {
|
|
657
|
+
install(isGlobal);
|
|
658
|
+
});
|
|
803
659
|
}
|
|
804
660
|
}
|
|
@@ -13,9 +13,10 @@ allowed-tools:
|
|
|
13
13
|
- AskUserQuestion
|
|
14
14
|
argument-instructions: |
|
|
15
15
|
Parse the argument as a phase number (integer, decimal, or letter-suffix), plus optional free-text instructions.
|
|
16
|
-
Example:
|
|
17
|
-
Example:
|
|
16
|
+
Example: $gsd-add-tests 12
|
|
17
|
+
Example: $gsd-add-tests 12 focus on edge cases in the pricing module
|
|
18
18
|
---
|
|
19
|
+
|
|
19
20
|
<objective>
|
|
20
21
|
Generate unit and E2E tests for a completed phase, using its SUMMARY.md, CONTEXT.md, and VERIFICATION.md as specifications.
|
|
21
22
|
|
|
@@ -25,7 +26,7 @@ Output: Test files committed with message `test(phase-{N}): add unit and E2E tes
|
|
|
25
26
|
</objective>
|
|
26
27
|
|
|
27
28
|
<execution_context>
|
|
28
|
-
@~/.
|
|
29
|
+
@~/.codex/get-shit-done/workflows/add-tests.md
|
|
29
30
|
</execution_context>
|
|
30
31
|
|
|
31
32
|
<context>
|
|
@@ -36,6 +37,6 @@ Phase: $ARGUMENTS
|
|
|
36
37
|
</context>
|
|
37
38
|
|
|
38
39
|
<process>
|
|
39
|
-
Execute the add-tests workflow from @~/.
|
|
40
|
+
Execute the add-tests workflow from @~/.codex/get-shit-done/workflows/add-tests.md end-to-end.
|
|
40
41
|
Preserve all workflow gates (classification approval, test plan approval, RED-GREEN verification, gap reporting).
|
|
41
42
|
</process>
|
|
@@ -42,19 +42,19 @@ Output: Milestone archived (roadmap + requirements), PROJECT.md evolved, git tag
|
|
|
42
42
|
0. **Check for audit:**
|
|
43
43
|
|
|
44
44
|
- Look for `.planning/v{{version}}-MILESTONE-AUDIT.md`
|
|
45
|
-
- If missing or stale: recommend
|
|
46
|
-
- If audit status is `gaps_found`: recommend
|
|
45
|
+
- If missing or stale: recommend `$gsd-audit-milestone` first
|
|
46
|
+
- If audit status is `gaps_found`: recommend `$gsd-plan-milestone-gaps` first
|
|
47
47
|
- If audit status is `passed`: proceed to step 1
|
|
48
48
|
|
|
49
49
|
```markdown
|
|
50
50
|
## Pre-flight Check
|
|
51
51
|
|
|
52
52
|
{If no v{{version}}-MILESTONE-AUDIT.md:}
|
|
53
|
-
⚠ No milestone audit found. Run
|
|
53
|
+
⚠ No milestone audit found. Run `$gsd-audit-milestone` first to verify
|
|
54
54
|
requirements coverage, cross-phase integration, and E2E flows.
|
|
55
55
|
|
|
56
56
|
{If audit has gaps:}
|
|
57
|
-
⚠ Milestone audit found gaps. Run
|
|
57
|
+
⚠ Milestone audit found gaps. Run `$gsd-plan-milestone-gaps` to create
|
|
58
58
|
phases that close the gaps, or proceed anyway to accept as tech debt.
|
|
59
59
|
|
|
60
60
|
{If audit passed:}
|
|
@@ -108,7 +108,7 @@ Output: Milestone archived (roadmap + requirements), PROJECT.md evolved, git tag
|
|
|
108
108
|
- Ask about pushing tag
|
|
109
109
|
|
|
110
110
|
8. **Offer next steps:**
|
|
111
|
-
-
|
|
111
|
+
- `$gsd-new-milestone` — start next milestone (questioning → research → requirements → roadmap)
|
|
112
112
|
|
|
113
113
|
</process>
|
|
114
114
|
|
|
@@ -132,5 +132,5 @@ Output: Milestone archived (roadmap + requirements), PROJECT.md evolved, git tag
|
|
|
132
132
|
- **Archive before deleting:** Always create archive files before updating/deleting originals
|
|
133
133
|
- **One-line summary:** Collapsed milestone in ROADMAP.md should be single line with link
|
|
134
134
|
- **Context efficiency:** Archive keeps ROADMAP.md and REQUIREMENTS.md constant size per milestone
|
|
135
|
-
- **Fresh requirements:** Next milestone starts with
|
|
135
|
+
- **Fresh requirements:** Next milestone starts with `$gsd-new-milestone` which includes requirements definition
|
|
136
136
|
</critical_rules>
|
package/commands/gsd/debug.md
CHANGED
|
@@ -104,7 +104,7 @@ Task(
|
|
|
104
104
|
- Display root cause and evidence summary
|
|
105
105
|
- Offer options:
|
|
106
106
|
- "Fix now" - spawn fix subagent
|
|
107
|
-
- "Plan fix" - suggest
|
|
107
|
+
- "Plan fix" - suggest $gsd-plan-phase --gaps
|
|
108
108
|
- "Manual fix" - done
|
|
109
109
|
|
|
110
110
|
**If `## CHECKPOINT REACHED`:**
|
|
@@ -30,8 +30,8 @@ Focus area: $ARGUMENTS (optional - if provided, tells agents to focus on specifi
|
|
|
30
30
|
Check for .planning/STATE.md - loads context if project already initialized
|
|
31
31
|
|
|
32
32
|
**This command can run:**
|
|
33
|
-
- Before
|
|
34
|
-
- After
|
|
33
|
+
- Before $gsd-new-project (brownfield codebases) - creates codebase map first
|
|
34
|
+
- After $gsd-new-project (greenfield codebases) - updates codebase map as code evolves
|
|
35
35
|
- Anytime to refresh codebase understanding
|
|
36
36
|
</context>
|
|
37
37
|
|
|
@@ -59,7 +59,7 @@ Check for .planning/STATE.md - loads context if project already initialized
|
|
|
59
59
|
4. Wait for agents to complete, collect confirmations (NOT document contents)
|
|
60
60
|
5. Verify all 7 documents exist with line counts
|
|
61
61
|
6. Commit codebase map
|
|
62
|
-
7. Offer next steps (typically:
|
|
62
|
+
7. Offer next steps (typically: $gsd-new-project or $gsd-plan-phase)
|
|
63
63
|
</process>
|
|
64
64
|
|
|
65
65
|
<success_criteria>
|
|
@@ -21,7 +21,7 @@ Brownfield equivalent of new-project. Project exists, PROJECT.md has history. Ga
|
|
|
21
21
|
- `.planning/ROADMAP.md` — phase structure (continues numbering)
|
|
22
22
|
- `.planning/STATE.md` — reset for new milestone
|
|
23
23
|
|
|
24
|
-
**After:**
|
|
24
|
+
**After:** `$gsd-plan-phase [N]` to start execution.
|
|
25
25
|
</objective>
|
|
26
26
|
|
|
27
27
|
<execution_context>
|
|
@@ -25,7 +25,7 @@ Initialize a new project through unified flow: questioning → research (optiona
|
|
|
25
25
|
- `.planning/ROADMAP.md` — phase structure
|
|
26
26
|
- `.planning/STATE.md` — project memory
|
|
27
27
|
|
|
28
|
-
**After this command:** Run
|
|
28
|
+
**After this command:** Run `$gsd-plan-phase 1` to start execution.
|
|
29
29
|
</objective>
|
|
30
30
|
|
|
31
31
|
<execution_context>
|
|
@@ -10,11 +10,11 @@ allowed-tools:
|
|
|
10
10
|
- AskUserQuestion
|
|
11
11
|
---
|
|
12
12
|
<objective>
|
|
13
|
-
Create all phases necessary to close gaps identified by
|
|
13
|
+
Create all phases necessary to close gaps identified by `$gsd-audit-milestone`.
|
|
14
14
|
|
|
15
15
|
Reads MILESTONE-AUDIT.md, groups gaps into logical phases, creates phase entries in ROADMAP.md, and offers to plan each phase.
|
|
16
16
|
|
|
17
|
-
One command creates all fix phases — no manual
|
|
17
|
+
One command creates all fix phases — no manual `$gsd-add-phase` per gap.
|
|
18
18
|
</objective>
|
|
19
19
|
|
|
20
20
|
<execution_context>
|
|
@@ -28,7 +28,7 @@ Read `backup-meta.json` from the patches directory.
|
|
|
28
28
|
```
|
|
29
29
|
No local patches found. Nothing to reapply.
|
|
30
30
|
|
|
31
|
-
Local patches are automatically saved when you run
|
|
31
|
+
Local patches are automatically saved when you run $gsd-update
|
|
32
32
|
after modifying any GSD workflow, command, or agent files.
|
|
33
33
|
```
|
|
34
34
|
Exit.
|
|
@@ -76,7 +76,7 @@ For each file in `backup-meta.json`:
|
|
|
76
76
|
After reapplying, regenerate the file manifest so future updates correctly detect these as user modifications:
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
# The manifest will be regenerated on next
|
|
79
|
+
# The manifest will be regenerated on next $gsd-update
|
|
80
80
|
# For now, just note which files were modified
|
|
81
81
|
```
|
|
82
82
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd:research-phase
|
|
3
|
-
description: Research how to implement a phase (standalone - usually use
|
|
3
|
+
description: Research how to implement a phase (standalone - usually use $gsd-plan-phase instead)
|
|
4
4
|
argument-hint: "[phase]"
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Read
|
|
@@ -11,7 +11,7 @@ allowed-tools:
|
|
|
11
11
|
<objective>
|
|
12
12
|
Research how to implement a phase. Spawns gsd-phase-researcher agent with phase context.
|
|
13
13
|
|
|
14
|
-
**Note:** This is a standalone research command. For most workflows, use
|
|
14
|
+
**Note:** This is a standalone research command. For most workflows, use `$gsd-plan-phase` which integrates research automatically.
|
|
15
15
|
|
|
16
16
|
**Use this command when:**
|
|
17
17
|
- You want to research without planning yet
|
|
@@ -109,7 +109,7 @@ Mode: ecosystem
|
|
|
109
109
|
</additional_context>
|
|
110
110
|
|
|
111
111
|
<downstream_consumer>
|
|
112
|
-
Your RESEARCH.md will be loaded by
|
|
112
|
+
Your RESEARCH.md will be loaded by `$gsd-plan-phase` which uses specific sections:
|
|
113
113
|
- `## Standard Stack` → Plans use these libraries
|
|
114
114
|
- `## Architecture Patterns` → Task structure follows these
|
|
115
115
|
- `## Don't Hand-Roll` → Tasks NEVER build custom solutions for listed problems
|
|
@@ -16,7 +16,7 @@ Validate built features through conversational testing with persistent state.
|
|
|
16
16
|
|
|
17
17
|
Purpose: Confirm what Codex built actually works from user's perspective. One test at a time, plain text responses, no interrogation. When issues are found, automatically diagnose, plan fixes, and prepare for execution.
|
|
18
18
|
|
|
19
|
-
Output: {phase_num}-UAT.md tracking all test results. If issues found: diagnosed gaps, verified fix plans ready for
|
|
19
|
+
Output: {phase_num}-UAT.md tracking all test results. If issues found: diagnosed gaps, verified fix plans ready for $gsd-execute-phase
|
|
20
20
|
</objective>
|
|
21
21
|
|
|
22
22
|
<execution_context>
|
|
@@ -497,7 +497,7 @@ function cmdScaffold(cwd, type, options, raw) {
|
|
|
497
497
|
switch (type) {
|
|
498
498
|
case 'context': {
|
|
499
499
|
filePath = path.join(phaseDir, `${padded}-CONTEXT.md`);
|
|
500
|
-
content = `---\nphase: "${padded}"\nname: "${name || phaseInfo?.phase_name || 'Unnamed'}"\ncreated: ${today}\n---\n\n# Phase ${phase}: ${name || phaseInfo?.phase_name || 'Unnamed'} — Context\n\n## Decisions\n\n_Decisions will be captured during
|
|
500
|
+
content = `---\nphase: "${padded}"\nname: "${name || phaseInfo?.phase_name || 'Unnamed'}"\ncreated: ${today}\n---\n\n# Phase ${phase}: ${name || phaseInfo?.phase_name || 'Unnamed'} — Context\n\n## Decisions\n\n_Decisions will be captured during $gsd-discuss-phase ${phase}_\n\n## Discretion Areas\n\n_Areas where the executor can use judgment_\n\n## Deferred Ideas\n\n_Ideas to consider later_\n`;
|
|
501
501
|
break;
|
|
502
502
|
}
|
|
503
503
|
case 'uat': {
|