gsd-codex-cli 1.20.2 → 1.20.4

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 (33) hide show
  1. package/.codex/prompts/gsd-add-phase.md +20 -11
  2. package/.codex/prompts/gsd-add-todo.md +20 -10
  3. package/.codex/prompts/gsd-audit-milestone.md +20 -10
  4. package/.codex/prompts/gsd-check-todos.md +20 -10
  5. package/.codex/prompts/gsd-complete-milestone.md +20 -10
  6. package/.codex/prompts/gsd-debug.md +20 -10
  7. package/.codex/prompts/gsd-discuss-phase.md +20 -10
  8. package/.codex/prompts/gsd-doctor.md +51 -0
  9. package/.codex/prompts/gsd-execute-phase.md +20 -10
  10. package/.codex/prompts/gsd-help.md +19 -9
  11. package/.codex/prompts/gsd-insert-phase.md +20 -10
  12. package/.codex/prompts/gsd-list-phase-assumptions.md +20 -10
  13. package/.codex/prompts/gsd-map-codebase.md +20 -10
  14. package/.codex/prompts/gsd-new-milestone.md +20 -10
  15. package/.codex/prompts/gsd-new-project.md +20 -10
  16. package/.codex/prompts/gsd-pause-work.md +20 -10
  17. package/.codex/prompts/gsd-plan-milestone-gaps.md +20 -10
  18. package/.codex/prompts/gsd-plan-phase.md +20 -10
  19. package/.codex/prompts/gsd-progress.md +20 -10
  20. package/.codex/prompts/gsd-quick.md +20 -10
  21. package/.codex/prompts/gsd-remove-phase.md +20 -10
  22. package/.codex/prompts/gsd-research-phase.md +20 -10
  23. package/.codex/prompts/gsd-resume-work.md +20 -10
  24. package/.codex/prompts/gsd-set-profile.md +20 -10
  25. package/.codex/prompts/gsd-settings.md +20 -10
  26. package/.codex/prompts/gsd-update.md +19 -9
  27. package/.codex/prompts/gsd-verify-work.md +20 -10
  28. package/.codex/skills/get-shit-done-codex/SKILL.md +6 -5
  29. package/README.md +88 -88
  30. package/bin/install-codex.js +8 -4
  31. package/get-shit-done/bin/gsd-tools.cjs +87 -33
  32. package/get-shit-done/bin/gsd-tools.js +29 -0
  33. package/package.json +1 -1
@@ -12,8 +12,10 @@ Configure GSD workflow toggles and model profile
12
12
  - Use .codex/skills/get-shit-done-codex semantics.
13
13
  - Treat upstream workflow as the source of truth.
14
14
  - Replace user-specific paths with workspace-relative paths (.claude/..., .planning/...).
15
- - Run engine commands through PowerShell:
16
- node .claude/get-shit-done/bin/gsd-tools.js ...
15
+ - Resolve gsd-tools path (prefer .cjs, fallback to .js):
16
+ $GsdTools = if (Test-Path ".claude/get-shit-done/bin/gsd-tools.cjs") { ".claude/get-shit-done/bin/gsd-tools.cjs" } elseif (Test-Path ".claude/get-shit-done/bin/gsd-tools.js") { ".claude/get-shit-done/bin/gsd-tools.js" } elseif (Test-Path "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs") { "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" } elseif (Test-Path "$HOME/.claude/get-shit-done/bin/gsd-tools.js") { "$HOME/.claude/get-shit-done/bin/gsd-tools.js" } else { throw "Missing gsd-tools in .claude or $HOME/.claude. Reinstall GSD." }
17
+ - Run engine commands through PowerShell:
18
+ node $GsdTools ...
17
19
  - Parse JSON with ConvertFrom-Json; parse key/value output when workflow uses KEY=value raw mode.
18
20
  - No jq / bash-only constructs.
19
21
 
@@ -23,10 +25,18 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
25
  - Spawn only when the upstream workflow defines an agent role.
24
26
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
27
  - Do not advance workflow steps until wait and close complete.
28
+ ## Update check
29
+ - Best-effort only; do not fail if offline.
30
+ - Run:
31
+ $installed = if (Test-Path ".codex/gsd/VERSION") { (Get-Content ".codex/gsd/VERSION" -Raw).Trim() } elseif (Test-Path "$HOME/.codex/gsd/VERSION") { (Get-Content "$HOME/.codex/gsd/VERSION" -Raw).Trim() } else { $null }
32
+ $latest = $null; try { $latest = (npm view gsd-codex-cli version).Trim() } catch {}
33
+ - If $installed and $latest and $installed -ne $latest, surface:
34
+ "Update available: $installed -> $latest. Next: gsd-update (Codex) / /gsd:update (Claude) or re-run npx gsd-codex-cli@latest."
35
+
26
36
  ## Execution
27
37
  1. Parse [none] from the user input.
28
38
  2. Run init:
29
- node .claude/get-shit-done/bin/gsd-tools.js config-ensure-section --raw
39
+ node $GsdTools config-ensure-section --raw
30
40
 
31
41
  3. Load .claude/get-shit-done/workflows/settings.md and execute it step-by-step.
32
42
  4. Translate each Task(...) in workflow into:
@@ -34,10 +44,10 @@ node .claude/get-shit-done/bin/gsd-tools.js config-ensure-section --raw
34
44
  - wait for each spawned agent and apply returned output before moving forward.
35
45
  5. Preserve all gates and routing from upstream workflow.
36
46
  6. Preserve commit behavior using
37
- node .claude/get-shit-done/bin/gsd-tools.js commit "message" --files ....
38
- 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
39
-
40
- ## Completion output
41
- - Summarize key artifacts created/updated and next recommended command.
42
-
43
-
47
+ node $GsdTools commit "message" --files ....
48
+ 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
49
+
50
+ ## Completion output
51
+ - Summarize key artifacts created/updated.
52
+ - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
53
+ - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -12,8 +12,10 @@ Update GSD to latest version with changelog display
12
12
  - Use .codex/skills/get-shit-done-codex semantics.
13
13
  - Treat upstream workflow as the source of truth.
14
14
  - Replace user-specific paths with workspace-relative paths (.claude/..., .planning/...).
15
- - Run engine commands through PowerShell:
16
- node .claude/get-shit-done/bin/gsd-tools.js ...
15
+ - Resolve gsd-tools path (prefer .cjs, fallback to .js):
16
+ $GsdTools = if (Test-Path ".claude/get-shit-done/bin/gsd-tools.cjs") { ".claude/get-shit-done/bin/gsd-tools.cjs" } elseif (Test-Path ".claude/get-shit-done/bin/gsd-tools.js") { ".claude/get-shit-done/bin/gsd-tools.js" } elseif (Test-Path "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs") { "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" } elseif (Test-Path "$HOME/.claude/get-shit-done/bin/gsd-tools.js") { "$HOME/.claude/get-shit-done/bin/gsd-tools.js" } else { throw "Missing gsd-tools in .claude or $HOME/.claude. Reinstall GSD." }
17
+ - Run engine commands through PowerShell:
18
+ node $GsdTools ...
17
19
  - Parse JSON with ConvertFrom-Json; parse key/value output when workflow uses KEY=value raw mode.
18
20
  - No jq / bash-only constructs.
19
21
 
@@ -23,6 +25,14 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
25
  - Spawn only when the upstream workflow defines an agent role.
24
26
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
27
  - Do not advance workflow steps until wait and close complete.
28
+ ## Update check
29
+ - Best-effort only; do not fail if offline.
30
+ - Run:
31
+ $installed = if (Test-Path ".codex/gsd/VERSION") { (Get-Content ".codex/gsd/VERSION" -Raw).Trim() } elseif (Test-Path "$HOME/.codex/gsd/VERSION") { (Get-Content "$HOME/.codex/gsd/VERSION" -Raw).Trim() } else { $null }
32
+ $latest = $null; try { $latest = (npm view gsd-codex-cli version).Trim() } catch {}
33
+ - If $installed and $latest and $installed -ne $latest, surface:
34
+ "Update available: $installed -> $latest. Next: gsd-update (Codex) / /gsd:update (Claude) or re-run npx gsd-codex-cli@latest."
35
+
26
36
  ## Execution
27
37
  1. Parse [none] from the user input.
28
38
  2. Run init:
@@ -34,10 +44,10 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
34
44
  - wait for each spawned agent and apply returned output before moving forward.
35
45
  5. Preserve all gates and routing from upstream workflow.
36
46
  6. Preserve commit behavior using
37
- node .claude/get-shit-done/bin/gsd-tools.js commit "message" --files ....
38
- 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
39
-
40
- ## Completion output
41
- - Summarize key artifacts created/updated and next recommended command.
42
-
43
-
47
+ node $GsdTools commit "message" --files ....
48
+ 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
49
+
50
+ ## Completion output
51
+ - Summarize key artifacts created/updated.
52
+ - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
53
+ - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -12,8 +12,10 @@ Validate built features through conversational UAT
12
12
  - Use .codex/skills/get-shit-done-codex semantics.
13
13
  - Treat upstream workflow as the source of truth.
14
14
  - Replace user-specific paths with workspace-relative paths (.claude/..., .planning/...).
15
- - Run engine commands through PowerShell:
16
- node .claude/get-shit-done/bin/gsd-tools.js ...
15
+ - Resolve gsd-tools path (prefer .cjs, fallback to .js):
16
+ $GsdTools = if (Test-Path ".claude/get-shit-done/bin/gsd-tools.cjs") { ".claude/get-shit-done/bin/gsd-tools.cjs" } elseif (Test-Path ".claude/get-shit-done/bin/gsd-tools.js") { ".claude/get-shit-done/bin/gsd-tools.js" } elseif (Test-Path "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs") { "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" } elseif (Test-Path "$HOME/.claude/get-shit-done/bin/gsd-tools.js") { "$HOME/.claude/get-shit-done/bin/gsd-tools.js" } else { throw "Missing gsd-tools in .claude or $HOME/.claude. Reinstall GSD." }
17
+ - Run engine commands through PowerShell:
18
+ node $GsdTools ...
17
19
  - Parse JSON with ConvertFrom-Json; parse key/value output when workflow uses KEY=value raw mode.
18
20
  - No jq / bash-only constructs.
19
21
 
@@ -23,10 +25,18 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
25
  - Spawn only when the upstream workflow defines an agent role.
24
26
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
27
  - Do not advance workflow steps until wait and close complete.
28
+ ## Update check
29
+ - Best-effort only; do not fail if offline.
30
+ - Run:
31
+ $installed = if (Test-Path ".codex/gsd/VERSION") { (Get-Content ".codex/gsd/VERSION" -Raw).Trim() } elseif (Test-Path "$HOME/.codex/gsd/VERSION") { (Get-Content "$HOME/.codex/gsd/VERSION" -Raw).Trim() } else { $null }
32
+ $latest = $null; try { $latest = (npm view gsd-codex-cli version).Trim() } catch {}
33
+ - If $installed and $latest and $installed -ne $latest, surface:
34
+ "Update available: $installed -> $latest. Next: gsd-update (Codex) / /gsd:update (Claude) or re-run npx gsd-codex-cli@latest."
35
+
26
36
  ## Execution
27
37
  1. Parse "[phase number, for example 4]" from the user input.
28
38
  2. Run init:
29
- node .claude/get-shit-done/bin/gsd-tools.js init verify-work $PHASE --raw
39
+ node $GsdTools init verify-work $PHASE --raw
30
40
 
31
41
  3. Load .claude/get-shit-done/workflows/verify-work.md and execute it step-by-step.
32
42
  4. Translate each Task(...) in workflow into:
@@ -34,10 +44,10 @@ node .claude/get-shit-done/bin/gsd-tools.js init verify-work $PHASE --raw
34
44
  - wait for each spawned agent and apply returned output before moving forward.
35
45
  5. Preserve all gates and routing from upstream workflow.
36
46
  6. Preserve commit behavior using
37
- node .claude/get-shit-done/bin/gsd-tools.js commit "message" --files ....
38
- 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
39
-
40
- ## Completion output
41
- - Summarize key artifacts created/updated and next recommended command.
42
-
43
-
47
+ node $GsdTools commit "message" --files ....
48
+ 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
49
+
50
+ ## Completion output
51
+ - Summarize key artifacts created/updated.
52
+ - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
53
+ - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -14,11 +14,12 @@ Use this skill to run `gsd-*` prompts under `Codex` while preserving upstream GS
14
14
  - Keep `.claude/agents/gsd-*.md` as role contracts for subagents.
15
15
  - Keep `.codex/prompts/gsd-*.md` as Codex-native orchestrators.
16
16
 
17
- ## Core rules
18
- 1. Do not change command semantics.
19
- 2. Do not change source workflow logic unless necessary for Codex command compatibility.
20
- 3. Use workspace-relative paths.
21
- 4. Preserve step ordering and gate behavior from workflow files.
17
+ ## Core rules
18
+ 1. Do not change command semantics.
19
+ 2. Do not change source workflow logic unless necessary for Codex command compatibility.
20
+ 3. Use workspace-relative paths.
21
+ 4. Preserve step ordering and gate behavior from workflow files.
22
+ 5. User-facing guidance should recommend `gsd-*` prompts (Codex) and `/gsd:*` commands (Claude), not internal `node ... gsd-tools ...` plumbing.
22
23
 
23
24
  ## Mandatory codex translations
24
25
  - Replace each `Task(...)` with: `spawn_agent` + `wait`.
package/README.md CHANGED
@@ -1,89 +1,89 @@
1
- # Get Shit Done - Codex Fork
2
-
3
- This repository packages the get-shit-done (GSD) workflow for Codex. It installs Codex prompts plus the supporting GSD reference files used by the workflows and agents.
4
-
5
- Use this fork if you want the GSD workflow inside Codex with a simple installer that works for a single project or your home directory.
6
-
7
- ## Quick Install
8
-
9
- ```bash
10
- npx gsd-codex-cli@latest --path .
11
- ```
12
-
13
- Install globally (prompts available from any project):
14
-
15
- ```bash
16
- npx gsd-codex-cli@latest --global
17
- ```
18
-
19
- You can combine both:
20
-
21
- ```bash
22
- npx gsd-codex-cli@latest --path . --global
23
- ```
24
-
25
- ## What Gets Installed
26
-
27
- The installer copies these directories into the target location:
28
-
29
- - `.codex/prompts` and `.codex/skills` for Codex commands
30
- - `.claude/get-shit-done` for workflow references
31
- - `.claude/agents` for agent definitions
32
-
33
- This fork is Codex-first, but the Claude assets are kept alongside for compatibility with the upstream workflow files.
34
-
35
- ## Using the Prompts
36
-
37
- Open your project in Codex and run these prompts from the prompt list:
38
-
39
- - `gsd-new-project`
40
- - `gsd-plan-phase`
41
- - `gsd-execute-phase`
42
-
43
- All Codex prompts live in `.codex/prompts`.
44
-
45
- ## Update
46
-
47
- Re-run the installer to update your local or global install. It overwrites the existing files with the latest version.
48
-
49
- ```bash
50
- npx gsd-codex-cli@latest --path . --global
51
- ```
52
-
53
- ## CLI Options
54
-
55
- ```
56
- --path <dir> Install into a specific directory (defaults to current directory)
57
- --global Also install to your home directory (~/.codex and ~/.claude)
58
- --help Show help
59
- ```
60
-
61
- ## Development
62
-
63
- ```bash
64
- git clone https://github.com/redstar1337/get-shit-done-codex.git
65
- cd get-shit-done-codex
66
- node bin/install-codex.js --path .
67
- ```
68
-
69
- Run tests and build hooks:
70
-
71
- ```bash
72
- npm test
73
- npm run build:hooks
74
- ```
75
-
76
- ## Notes
77
-
78
- - This package is published as `gsd-codex-cli`. Use `npx gsd-codex-cli@latest` for installs.
79
- - The npm binary names `get-shit-done-codex` and `get-shit-done-cc` are still provided for compatibility after install.
80
-
81
- ## Upstream
82
-
83
- GSD originated in the upstream repository by TACHES. This fork keeps the core workflow and adds Codex-native prompts and packaging.
84
-
85
- Upstream: https://github.com/glittercowboy/get-shit-done
86
-
87
- ## License
88
-
1
+ # Get Shit Done - Codex Fork
2
+
3
+ This repository packages the get-shit-done (GSD) workflow for Codex. It installs Codex prompts plus the supporting GSD reference files used by the workflows and agents.
4
+
5
+ Use this fork if you want the GSD workflow inside Codex with a simple installer that works for a single project or your home directory.
6
+
7
+ ## Quick Install
8
+
9
+ ```bash
10
+ npx gsd-codex-cli@latest --path .
11
+ ```
12
+
13
+ Install globally (prompts available from any project):
14
+
15
+ ```bash
16
+ npx gsd-codex-cli@latest --global
17
+ ```
18
+
19
+ You can combine both:
20
+
21
+ ```bash
22
+ npx gsd-codex-cli@latest --path . --global
23
+ ```
24
+
25
+ ## What Gets Installed
26
+
27
+ The installer copies these directories into the target location:
28
+
29
+ - `.codex/prompts` and `.codex/skills` for Codex commands
30
+ - `.claude/get-shit-done` for workflow references
31
+ - `.claude/agents` for agent definitions
32
+
33
+ This fork is Codex-first, but the Claude assets are kept alongside for compatibility with the upstream workflow files.
34
+
35
+ ## Using the Prompts
36
+
37
+ Open your project in Codex and run these prompts from the prompt list:
38
+
39
+ - `gsd-new-project`
40
+ - `gsd-plan-phase`
41
+ - `gsd-execute-phase`
42
+
43
+ All Codex prompts live in `.codex/prompts`.
44
+
45
+ ## Update
46
+
47
+ Re-run the installer to update your local or global install. It overwrites the existing files with the latest version.
48
+
49
+ ```bash
50
+ npx gsd-codex-cli@latest --path . --global
51
+ ```
52
+
53
+ ## CLI Options
54
+
55
+ ```
56
+ --path <dir> Install into a specific directory (defaults to current directory)
57
+ --global Also install to your home directory (~/.codex and ~/.claude)
58
+ --help Show help
59
+ ```
60
+
61
+ ## Development
62
+
63
+ ```bash
64
+ git clone https://github.com/redstar1337/get-shit-done-codex.git
65
+ cd get-shit-done-codex
66
+ node bin/install-codex.js --path .
67
+ ```
68
+
69
+ Run tests and build hooks:
70
+
71
+ ```bash
72
+ npm test
73
+ npm run build:hooks
74
+ ```
75
+
76
+ ## Notes
77
+
78
+ - This package is published as `gsd-codex-cli`. Use `npx gsd-codex-cli@latest` for installs.
79
+ - The npm binary names `get-shit-done-codex` and `get-shit-done-cc` are still provided for compatibility after install.
80
+
81
+ ## Upstream
82
+
83
+ GSD originated in the upstream repository by TACHES. This fork keeps the core workflow and adds Codex-native prompts and packaging.
84
+
85
+ Upstream: https://github.com/glittercowboy/get-shit-done
86
+
87
+ ## License
88
+
89
89
  MIT. See `LICENSE`.
@@ -72,6 +72,7 @@ function copyCodexToDirectory(baseDir) {
72
72
  const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
73
73
  const sourceAgents = resolveSourceDir('agents', '.claude/agents');
74
74
  const versionDest = path.join(targetClaude, 'get-shit-done', 'VERSION');
75
+ const codexVersionDest = path.join(targetCodex, 'gsd', 'VERSION');
75
76
 
76
77
  ensureDir(baseDir);
77
78
  ensureDir(targetCodex);
@@ -82,6 +83,8 @@ function copyCodexToDirectory(baseDir) {
82
83
  copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
83
84
  ensureDir(path.dirname(versionDest));
84
85
  fs.writeFileSync(versionDest, `${pkg.version}\n`);
86
+ ensureDir(path.dirname(codexVersionDest));
87
+ fs.writeFileSync(codexVersionDest, `${pkg.version}\n`);
85
88
  }
86
89
 
87
90
  copyCodexToDirectory(targetDir);
@@ -97,7 +100,8 @@ console.log(` local: ${targetDir}`);
97
100
  if (installGlobal) {
98
101
  console.log(' global: ~/.codex');
99
102
  }
100
- console.log('\nNext steps:');
101
- console.log(' 1) Open your project in Codex');
102
- console.log(' 2) Run prompt gsd-new-project, then gsd-plan-phase, gsd-execute-phase');
103
- console.log(' 3) Use .codex/prompts/* for all GSD commands in this fork');
103
+ console.log('\nNext steps:');
104
+ console.log(' 1) Open your project in Codex');
105
+ console.log(' 2) Run prompt gsd-new-project, then gsd-discuss-phase, gsd-plan-phase, gsd-execute-phase');
106
+ console.log(' 3) If something looks off, run prompt gsd-doctor');
107
+ console.log(' 4) Use .codex/prompts/* for all GSD commands in this fork');
@@ -56,6 +56,9 @@
56
56
  * Todos:
57
57
  * todo complete <filename> Move todo from pending to completed
58
58
  *
59
+ * Update:
60
+ * update check Check npm for newer GSD version
61
+ *
59
62
  * Scaffolding:
60
63
  * scaffold context --phase <N> Create CONTEXT.md template
61
64
  * scaffold uat --phase <N> Create UAT.md template
@@ -121,6 +124,7 @@
121
124
 
122
125
  const fs = require('fs');
123
126
  const path = require('path');
127
+ const os = require('os');
124
128
  const { execSync } = require('child_process');
125
129
 
126
130
  // ─── Model Profile Table ─────────────────────────────────────────────────────
@@ -580,6 +584,47 @@ function cmdVerifyPathExists(cwd, targetPath, raw) {
580
584
  }
581
585
  }
582
586
 
587
+ function cmdUpdateCheck(cwd, raw) {
588
+ const homeDir = os.homedir();
589
+ const cacheDir = path.join(homeDir, '.claude', 'cache');
590
+ const cacheFile = path.join(cacheDir, 'gsd-update-check.json');
591
+ const projectVersionFile = path.join(cwd, '.claude', 'get-shit-done', 'VERSION');
592
+ const globalVersionFile = path.join(homeDir, '.claude', 'get-shit-done', 'VERSION');
593
+
594
+ let installed = '0.0.0';
595
+ try {
596
+ if (fs.existsSync(projectVersionFile)) {
597
+ installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
598
+ } else if (fs.existsSync(globalVersionFile)) {
599
+ installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
600
+ }
601
+ } catch {}
602
+
603
+ let latest = null;
604
+ try {
605
+ latest = execSync('npm view gsd-codex-cli version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
606
+ } catch {}
607
+ if (!latest) {
608
+ try {
609
+ latest = execSync('npm view get-shit-done-cc version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
610
+ } catch {}
611
+ }
612
+
613
+ const result = {
614
+ update_available: !!(latest && installed && latest !== installed),
615
+ installed,
616
+ latest: latest || 'unknown',
617
+ checked: Math.floor(Date.now() / 1000),
618
+ };
619
+
620
+ try {
621
+ fs.mkdirSync(cacheDir, { recursive: true });
622
+ fs.writeFileSync(cacheFile, JSON.stringify(result));
623
+ } catch {}
624
+
625
+ output(result, raw);
626
+ }
627
+
583
628
  function cmdConfigEnsureSection(cwd, raw) {
584
629
  const configPath = path.join(cwd, '.planning', 'config.json');
585
630
  const planningDir = path.join(cwd, '.planning');
@@ -2697,35 +2742,35 @@ function cmdPhaseAdd(cwd, description, raw) {
2697
2742
  // Build phase entry
2698
2743
  const phaseEntry = `\n### Phase ${newPhaseNum}: ${description}\n\n**Goal:** [To be planned]\n**Depends on:** Phase ${maxPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /gsd:plan-phase ${newPhaseNum} to break down)\n`;
2699
2744
 
2700
- // Find insertion point: inside last milestone block (if grouped), otherwise before Progress or end
2701
- const progressMatch = content.match(/^##\s+Progress\b/m);
2702
- const progressIdx = progressMatch ? progressMatch.index : -1;
2703
- const searchEnd = progressIdx >= 0 ? progressIdx : content.length;
2704
- const beforeProgress = content.slice(0, searchEnd);
2705
-
2706
- const milestonePattern = /^###\s+.*v\d+\.\d+.*$/gmi;
2707
- const milestoneHeaders = [];
2708
- let mm;
2709
- while ((mm = milestonePattern.exec(beforeProgress)) !== null) {
2710
- milestoneHeaders.push({ index: mm.index });
2711
- }
2712
-
2713
- let insertIdx = content.length;
2714
- if (milestoneHeaders.length > 0) {
2715
- const target = milestoneHeaders[milestoneHeaders.length - 1];
2716
- let nextHeaderIdx = searchEnd;
2717
- for (const header of milestoneHeaders) {
2718
- if (header.index > target.index) {
2719
- nextHeaderIdx = header.index;
2720
- break;
2721
- }
2722
- }
2723
- insertIdx = nextHeaderIdx;
2724
- } else if (progressIdx >= 0) {
2725
- insertIdx = progressIdx;
2726
- }
2727
-
2728
- const updatedContent = content.slice(0, insertIdx) + phaseEntry + content.slice(insertIdx);
2745
+ // Find insertion point: inside last milestone block (if grouped), otherwise before Progress or end
2746
+ const progressMatch = content.match(/^##\s+Progress\b/m);
2747
+ const progressIdx = progressMatch ? progressMatch.index : -1;
2748
+ const searchEnd = progressIdx >= 0 ? progressIdx : content.length;
2749
+ const beforeProgress = content.slice(0, searchEnd);
2750
+
2751
+ const milestonePattern = /^###\s+.*v\d+\.\d+.*$/gmi;
2752
+ const milestoneHeaders = [];
2753
+ let mm;
2754
+ while ((mm = milestonePattern.exec(beforeProgress)) !== null) {
2755
+ milestoneHeaders.push({ index: mm.index });
2756
+ }
2757
+
2758
+ let insertIdx = content.length;
2759
+ if (milestoneHeaders.length > 0) {
2760
+ const target = milestoneHeaders[milestoneHeaders.length - 1];
2761
+ let nextHeaderIdx = searchEnd;
2762
+ for (const header of milestoneHeaders) {
2763
+ if (header.index > target.index) {
2764
+ nextHeaderIdx = header.index;
2765
+ break;
2766
+ }
2767
+ }
2768
+ insertIdx = nextHeaderIdx;
2769
+ } else if (progressIdx >= 0) {
2770
+ insertIdx = progressIdx;
2771
+ }
2772
+
2773
+ const updatedContent = content.slice(0, insertIdx) + phaseEntry + content.slice(insertIdx);
2729
2774
 
2730
2775
  fs.writeFileSync(roadmapPath, updatedContent, 'utf-8');
2731
2776
 
@@ -5063,10 +5108,19 @@ async function main() {
5063
5108
  break;
5064
5109
  }
5065
5110
 
5066
- case 'history-digest': {
5067
- cmdHistoryDigest(cwd, raw);
5068
- break;
5069
- }
5111
+ case 'update': {
5112
+ const subcommand = args[1];
5113
+ if (subcommand === 'check') {
5114
+ cmdUpdateCheck(cwd, raw);
5115
+ } else {
5116
+ error('Unknown update subcommand. Available: check');
5117
+ }
5118
+ break;
5119
+ }
5120
+ case 'history-digest': {
5121
+ cmdHistoryDigest(cwd, raw);
5122
+ break;
5123
+ }
5070
5124
 
5071
5125
  case 'phases': {
5072
5126
  const subcommand = args[1];
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Backward-compatible wrapper: some workflows/prompts reference gsd-tools.js.
4
+ // Canonical implementation lives in gsd-tools.cjs (CommonJS) to avoid ESM issues.
5
+
6
+ const path = require('path');
7
+ const { spawnSync } = require('child_process');
8
+
9
+ const cjsPath = path.join(__dirname, 'gsd-tools.cjs');
10
+ const args = process.argv.slice(2);
11
+
12
+ const result = spawnSync(process.execPath, [cjsPath, ...args], { stdio: 'inherit' });
13
+
14
+ if (result.error) {
15
+ console.error(result.error.message || String(result.error));
16
+ process.exit(1);
17
+ }
18
+
19
+ if (result.signal) {
20
+ // Mirror the child termination signal if possible.
21
+ try {
22
+ process.kill(process.pid, result.signal);
23
+ } catch {
24
+ process.exit(1);
25
+ }
26
+ }
27
+
28
+ process.exit(typeof result.status === 'number' ? result.status : 0);
29
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-codex-cli",
3
- "version": "1.20.2",
3
+ "version": "1.20.4",
4
4
  "description": "Codex-native package for the get-shit-done workflow with native subagent orchestration.",
5
5
  "bin": {
6
6
  "gsd-codex-cli": "bin/install-codex.js",