gsd-codex-cli 1.20.1 → 1.20.3

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.
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse <description> from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [optional description] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[version]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [area filter] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse <version> from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [issue description] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "<phase>" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "<phase-number> [--gaps-only]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse <after> <description> from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[phase]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[optional: specific area to map, for example api or auth]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[milestone name, for example v1.1 Notifications]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[--auto]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[phase] [--research] [--skip-research] [--gaps] [--skip-verify]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse <phase-number> from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[phase]" from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse <profile> from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse [none] from the user input.
28
35
  2. Run init:
@@ -23,6 +23,13 @@ node .claude/get-shit-done/bin/gsd-tools.js ...
23
23
  - Spawn only when the upstream workflow defines an agent role.
24
24
  - Use `.claude/agents/gsd-*.md` as role context for each spawned agent.
25
25
  - Do not advance workflow steps until wait and close complete.
26
+ ## Update check
27
+ - Run:
28
+ $update = node .claude/get-shit-done/bin/gsd-tools.cjs update check --raw | ConvertFrom-Json
29
+ - If $update.update_available is true, surface:
30
+ "Update available: $($update.installed) -> $($update.latest). Run /gsd:update or re-run npx gsd-codex-cli@latest."
31
+
32
+
26
33
  ## Execution
27
34
  1. Parse "[phase number, for example 4]" from the user input.
28
35
  2. Run init:
@@ -65,21 +65,24 @@ function resolveSourceDir(repoRelative, fallbackRelative) {
65
65
  throw new Error(`Missing source directory "${repoRelative}"${fallbackMessage} in repository root ${repoRoot}`);
66
66
  }
67
67
 
68
- function copyCodexToDirectory(baseDir) {
69
- const targetCodex = path.join(baseDir, '.codex');
70
- const targetClaude = path.join(baseDir, '.claude');
71
- const sourceCodex = path.join(repoRoot, '.codex');
72
- const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
73
- const sourceAgents = resolveSourceDir('agents', '.claude/agents');
74
-
75
- ensureDir(baseDir);
76
- ensureDir(targetCodex);
77
- ensureDir(targetClaude);
78
-
79
- copyRecursive(sourceCodex, targetCodex);
80
- copyRecursive(sourceGetShitDone, path.join(targetClaude, 'get-shit-done'));
81
- copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
82
- }
68
+ function copyCodexToDirectory(baseDir) {
69
+ const targetCodex = path.join(baseDir, '.codex');
70
+ const targetClaude = path.join(baseDir, '.claude');
71
+ const sourceCodex = path.join(repoRoot, '.codex');
72
+ const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
73
+ const sourceAgents = resolveSourceDir('agents', '.claude/agents');
74
+ const versionDest = path.join(targetClaude, 'get-shit-done', 'VERSION');
75
+
76
+ ensureDir(baseDir);
77
+ ensureDir(targetCodex);
78
+ ensureDir(targetClaude);
79
+
80
+ copyRecursive(sourceCodex, targetCodex);
81
+ copyRecursive(sourceGetShitDone, path.join(targetClaude, 'get-shit-done'));
82
+ copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
83
+ ensureDir(path.dirname(versionDest));
84
+ fs.writeFileSync(versionDest, `${pkg.version}\n`);
85
+ }
83
86
 
84
87
  copyCodexToDirectory(targetDir);
85
88
 
@@ -53,8 +53,11 @@
53
53
  * Progress:
54
54
  * progress [json|table|bar] Render progress in various formats
55
55
  *
56
- * Todos:
57
- * todo complete <filename> Move todo from pending to completed
56
+ * Todos:
57
+ * todo complete <filename> Move todo from pending to completed
58
+ *
59
+ * Update:
60
+ * update check Check npm for newer GSD version
58
61
  *
59
62
  * Scaffolding:
60
63
  * scaffold context --phase <N> Create CONTEXT.md template
@@ -119,9 +122,10 @@
119
122
  * init progress All context for progress workflow
120
123
  */
121
124
 
122
- const fs = require('fs');
123
- const path = require('path');
124
- const { execSync } = require('child_process');
125
+ const fs = require('fs');
126
+ const path = require('path');
127
+ const os = require('os');
128
+ const { execSync } = require('child_process');
125
129
 
126
130
  // ─── Model Profile Table ─────────────────────────────────────────────────────
127
131
 
@@ -562,10 +566,10 @@ function cmdListTodos(cwd, area, raw) {
562
566
  output(result, raw, count.toString());
563
567
  }
564
568
 
565
- function cmdVerifyPathExists(cwd, targetPath, raw) {
566
- if (!targetPath) {
567
- error('path required for verification');
568
- }
569
+ function cmdVerifyPathExists(cwd, targetPath, raw) {
570
+ if (!targetPath) {
571
+ error('path required for verification');
572
+ }
569
573
 
570
574
  const fullPath = path.isAbsolute(targetPath) ? targetPath : path.join(cwd, targetPath);
571
575
 
@@ -577,8 +581,49 @@ function cmdVerifyPathExists(cwd, targetPath, raw) {
577
581
  } catch {
578
582
  const result = { exists: false, type: null };
579
583
  output(result, raw, 'false');
580
- }
581
- }
584
+ }
585
+ }
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
+ }
582
627
 
583
628
  function cmdConfigEnsureSection(cwd, raw) {
584
629
  const configPath = path.join(cwd, '.planning', 'config.json');
@@ -5058,15 +5103,25 @@ async function main() {
5058
5103
  break;
5059
5104
  }
5060
5105
 
5061
- case 'config-get': {
5062
- cmdConfigGet(cwd, args[1], raw);
5063
- break;
5064
- }
5065
-
5066
- case 'history-digest': {
5067
- cmdHistoryDigest(cwd, raw);
5068
- break;
5069
- }
5106
+ case 'config-get': {
5107
+ cmdConfigGet(cwd, args[1], raw);
5108
+ break;
5109
+ }
5110
+
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
+
5121
+ case 'history-digest': {
5122
+ cmdHistoryDigest(cwd, raw);
5123
+ break;
5124
+ }
5070
5125
 
5071
5126
  case 'phases': {
5072
5127
  const subcommand = args[1];
@@ -40,10 +40,15 @@ const child = spawn(process.execPath, ['-e', `
40
40
  }
41
41
  } catch (e) {}
42
42
 
43
- let latest = null;
44
- try {
45
- latest = execSync('npm view get-shit-done-cc version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
46
- } catch (e) {}
43
+ let latest = null;
44
+ try {
45
+ latest = execSync('npm view gsd-codex-cli version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
46
+ } catch (e) {}
47
+ if (!latest) {
48
+ try {
49
+ latest = execSync('npm view get-shit-done-cc version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
50
+ } catch (e) {}
51
+ }
47
52
 
48
53
  const result = {
49
54
  update_available: latest && installed !== latest,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-codex-cli",
3
- "version": "1.20.1",
3
+ "version": "1.20.3",
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",