@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.
Files changed (72) hide show
  1. package/.codex/config.toml +1 -1
  2. package/README.md +33 -45
  3. package/agents/gsd-codebase-mapper.md +3 -3
  4. package/agents/gsd-debugger.md +7 -7
  5. package/agents/gsd-executor.md +14 -14
  6. package/agents/gsd-phase-researcher.md +7 -7
  7. package/agents/gsd-plan-checker.md +10 -10
  8. package/agents/gsd-planner.md +20 -20
  9. package/agents/gsd-project-researcher.md +3 -3
  10. package/agents/gsd-research-synthesizer.md +6 -6
  11. package/agents/gsd-roadmapper.md +7 -7
  12. package/agents/gsd-verifier.md +29 -17
  13. package/bin/install.js +54 -198
  14. package/commands/gsd/add-tests.md +5 -4
  15. package/commands/gsd/complete-milestone.md +6 -6
  16. package/commands/gsd/debug.md +1 -1
  17. package/commands/gsd/map-codebase.md +3 -3
  18. package/commands/gsd/new-milestone.md +1 -1
  19. package/commands/gsd/new-project.md +1 -1
  20. package/commands/gsd/plan-milestone-gaps.md +2 -2
  21. package/commands/gsd/reapply-patches.md +2 -2
  22. package/commands/gsd/research-phase.md +3 -3
  23. package/commands/gsd/verify-work.md +1 -1
  24. package/get-shit-done/bin/lib/commands.cjs +1 -1
  25. package/get-shit-done/bin/lib/phase.cjs +2 -2
  26. package/get-shit-done/bin/lib/verify.cjs +8 -8
  27. package/get-shit-done/references/continuation-format.md +33 -27
  28. package/get-shit-done/references/model-profiles.md +1 -1
  29. package/get-shit-done/references/ui-brand.md +3 -3
  30. package/get-shit-done/templates/DEBUG.md +5 -5
  31. package/get-shit-done/templates/UAT.md +4 -4
  32. package/get-shit-done/templates/VALIDATION.md +1 -1
  33. package/get-shit-done/templates/debug-subagent-prompt.md +1 -1
  34. package/get-shit-done/templates/discovery.md +2 -2
  35. package/get-shit-done/templates/phase-prompt.md +1 -1
  36. package/get-shit-done/templates/planner-subagent-prompt.md +3 -3
  37. package/get-shit-done/templates/project.md +1 -1
  38. package/get-shit-done/templates/research.md +1 -1
  39. package/get-shit-done/templates/retrospective.md +13 -7
  40. package/get-shit-done/templates/state.md +2 -2
  41. package/get-shit-done/workflows/add-phase.md +8 -8
  42. package/get-shit-done/workflows/add-tests.md +41 -18
  43. package/get-shit-done/workflows/add-todo.md +2 -2
  44. package/get-shit-done/workflows/audit-milestone.md +8 -8
  45. package/get-shit-done/workflows/check-todos.md +8 -8
  46. package/get-shit-done/workflows/complete-milestone.md +34 -9
  47. package/get-shit-done/workflows/diagnose-issues.md +1 -1
  48. package/get-shit-done/workflows/discovery-phase.md +3 -3
  49. package/get-shit-done/workflows/discuss-phase.md +12 -12
  50. package/get-shit-done/workflows/execute-phase.md +8 -8
  51. package/get-shit-done/workflows/execute-plan.md +4 -4
  52. package/get-shit-done/workflows/health.md +5 -5
  53. package/get-shit-done/workflows/help.md +97 -90
  54. package/get-shit-done/workflows/insert-phase.md +7 -7
  55. package/get-shit-done/workflows/list-phase-assumptions.md +4 -4
  56. package/get-shit-done/workflows/map-codebase.md +3 -3
  57. package/get-shit-done/workflows/new-milestone.md +6 -6
  58. package/get-shit-done/workflows/new-project.md +12 -12
  59. package/get-shit-done/workflows/pause-work.md +1 -1
  60. package/get-shit-done/workflows/plan-milestone-gaps.md +8 -8
  61. package/get-shit-done/workflows/plan-phase.md +13 -13
  62. package/get-shit-done/workflows/progress.md +29 -29
  63. package/get-shit-done/workflows/quick.md +3 -3
  64. package/get-shit-done/workflows/remove-phase.md +6 -6
  65. package/get-shit-done/workflows/research-phase.md +2 -2
  66. package/get-shit-done/workflows/resume-project.md +11 -11
  67. package/get-shit-done/workflows/settings.md +6 -6
  68. package/get-shit-done/workflows/transition.md +13 -13
  69. package/get-shit-done/workflows/update.md +2 -2
  70. package/get-shit-done/workflows/verify-work.md +8 -8
  71. package/package.json +1 -1
  72. 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 CODEX_MODES = new Set(['prompts', 'skills']);
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 into the target directory
119
- - If --codex-mode is omitted in interactive mode, installer prompts to choose
120
- - Non-interactive runs default to skills mode
121
- - If legacy surface files are detected, installer asks before removing them
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
- function convertSkillRefsToPromptRefs(content) {
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, mode) {
178
- if (mode === 'skills') {
179
- let adapted = convertPromptRefsToSkillRefs(content);
180
- adapted = rewriteAgentInvocationLine(adapted, 'Invoke them with `$gsd-command-name`:');
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
- function installPrompts(commandsDir, promptsDir, markdownEntries, pathPrefix) {
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, mode) {
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
- if (mode === 'skills') {
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, mode) {
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
- skillsDir,
367
- promptCountToRemove,
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
- const items = [];
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
- removedPrompts = removePromptAliases(plan.promptsDir);
390
- }
391
- if (plan.skillCountToRemove > 0) {
392
- removedSkills = removeSkillAliases(plan.skillsDir);
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 && skillCount > 0) return 'mixed';
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, expectedMode, strictMode = false) {
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
- if (modeToCheck === 'prompts') {
519
- addCheck(promptFiles.length === expectedCount, 'Prompt aliases complete', `${promptFiles.length}/${expectedCount}`);
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}, check mode: ${cyan}${modeToCheck}${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, checkedMode: modeToCheck };
447
+ return { ok, detectedMode };
550
448
  }
551
449
 
552
- function installCore(isGlobal, mode, migrationPlan, applyMigration, done = () => {}) {
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, mode);
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, mode);
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
- if (installPromptsEnabled) {
592
- const promptsDir = path.join(codexDir, 'prompts');
593
- installPrompts(gsdSrc, promptsDir, markdownEntries, pathPrefix);
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
- ${installPromptsEnabled ? `- Prompt commands: ${cyan}${codexDir}/prompts/${reset}` : ''}
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}${installSkillsEnabled ? '$gsd-help' : '/prompts:gsd-help'}${reset} to list commands
623
- 3. Start with ${cyan}${installSkillsEnabled ? '$gsd-new-project' : '/prompts:gsd-new-project'}${reset}
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}${installSkillsEnabled ? '$gsd-update' : '/prompts:gsd-update'}${reset}
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, mode = codexMode, done = () => {}) {
549
+ function install(isGlobal, done = () => {}) {
663
550
  const { codexDir } = getInstallContext(isGlobal);
664
- const migrationPlan = detectMigrationPlan(codexDir, mode);
551
+ const migrationPlan = detectMigrationPlan(codexDir);
665
552
 
666
553
  if (!migrationPlan.hasChanges) {
667
- installCore(isGlobal, mode, migrationPlan, false, done);
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, mode, migrationPlan, true, done);
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, mode, migrationPlan, false, done);
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, mode, migrationPlan, false, done);
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, mode, migrationPlan, applyMigration, done);
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
- const strictMode = hasCodexModeArg;
777
- let result = verifyInstall(isGlobal, codexMode, strictMode);
638
+ let result = verifyInstall(isGlobal);
778
639
 
779
640
  if (!result.ok && hasRepair) {
780
- const repairMode = codexMode;
781
- console.log(`\n ${yellow}Repairing install using mode '${repairMode}'...${reset}\n`);
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, repairMode, true);
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
- installWithSelectedMode(true);
652
+ install(true);
799
653
  } else if (hasLocal) {
800
- installWithSelectedMode(false);
654
+ install(false);
801
655
  } else {
802
- promptLocation(installWithSelectedMode);
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: /gsd:add-tests 12
17
- Example: /gsd:add-tests 12 focus on edge cases in the pricing module
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
- @~/.claude/get-shit-done/workflows/add-tests.md
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 @~/.claude/get-shit-done/workflows/add-tests.md end-to-end.
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 `/gsd:audit-milestone` first
46
- - If audit status is `gaps_found`: recommend `/gsd:plan-milestone-gaps` first
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 `/gsd:audit-milestone` first to verify
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 `/gsd:plan-milestone-gaps` to create
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
- - `/gsd:new-milestone` — start next milestone (questioning → research → requirements → roadmap)
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 `/gsd:new-milestone` which includes requirements definition
135
+ - **Fresh requirements:** Next milestone starts with `$gsd-new-milestone` which includes requirements definition
136
136
  </critical_rules>
@@ -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 /gsd:plan-phase --gaps
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 /gsd:new-project (brownfield codebases) - creates codebase map first
34
- - After /gsd:new-project (greenfield codebases) - updates codebase map as code evolves
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: /gsd:new-project or /gsd:plan-phase)
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:** `/gsd:plan-phase [N]` to start execution.
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 `/gsd:plan-phase 1` to start execution.
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 `/gsd:audit-milestone`.
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 `/gsd:add-phase` per gap.
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 /gsd:update
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 /gsd:update
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 /gsd:plan-phase instead)
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 `/gsd:plan-phase` which integrates research automatically.
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 `/gsd:plan-phase` which uses specific sections:
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 /gsd:execute-phase
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 /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`;
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': {