@undeemed/get-shit-done-codex 1.6.12 → 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.
Files changed (114) hide show
  1. package/README.md +40 -7
  2. package/agents/gsd-codebase-mapper.md +761 -0
  3. package/agents/gsd-debugger.md +1198 -0
  4. package/agents/gsd-executor.md +419 -0
  5. package/agents/gsd-integration-checker.md +423 -0
  6. package/agents/gsd-phase-researcher.md +469 -0
  7. package/agents/gsd-plan-checker.md +622 -0
  8. package/agents/gsd-planner.md +1159 -0
  9. package/agents/gsd-project-researcher.md +618 -0
  10. package/agents/gsd-research-synthesizer.md +236 -0
  11. package/agents/gsd-roadmapper.md +639 -0
  12. package/agents/gsd-verifier.md +541 -0
  13. package/bin/install.js +108 -102
  14. package/commands/gsd/add-phase.md +17 -185
  15. package/commands/gsd/add-todo.md +23 -163
  16. package/commands/gsd/audit-milestone.md +3 -219
  17. package/commands/gsd/check-todos.md +20 -196
  18. package/commands/gsd/cleanup.md +18 -0
  19. package/commands/gsd/complete-milestone.md +2 -2
  20. package/commands/gsd/debug.md +13 -0
  21. package/commands/gsd/discuss-phase.md +13 -6
  22. package/commands/gsd/execute-phase.md +4 -266
  23. package/commands/gsd/health.md +22 -0
  24. package/commands/gsd/help.md +8 -369
  25. package/commands/gsd/insert-phase.md +9 -203
  26. package/commands/gsd/join-discord.md +18 -0
  27. package/commands/gsd/list-phase-assumptions.md +4 -4
  28. package/commands/gsd/map-codebase.md +1 -1
  29. package/commands/gsd/new-milestone.md +16 -682
  30. package/commands/gsd/new-project.md +12 -866
  31. package/commands/gsd/new-project.md.bak +1041 -0
  32. package/commands/gsd/pause-work.md +17 -105
  33. package/commands/gsd/plan-milestone-gaps.md +3 -247
  34. package/commands/gsd/plan-phase.md +13 -444
  35. package/commands/gsd/progress.md +5 -337
  36. package/commands/gsd/quick.md +40 -0
  37. package/commands/gsd/reapply-patches.md +110 -0
  38. package/commands/gsd/remove-phase.md +9 -315
  39. package/commands/gsd/research-phase.md +27 -20
  40. package/commands/gsd/resume-work.md +2 -2
  41. package/commands/gsd/set-profile.md +34 -0
  42. package/commands/gsd/settings.md +36 -0
  43. package/commands/gsd/update.md +25 -160
  44. package/commands/gsd/verify-work.md +6 -186
  45. package/get-shit-done/bin/gsd-tools.cjs +5243 -0
  46. package/get-shit-done/bin/gsd-tools.test.cjs +2273 -0
  47. package/get-shit-done/references/checkpoints.md +270 -283
  48. package/get-shit-done/references/decimal-phase-calculation.md +65 -0
  49. package/get-shit-done/references/git-integration.md +7 -13
  50. package/get-shit-done/references/git-planning-commit.md +38 -0
  51. package/get-shit-done/references/model-profile-resolution.md +34 -0
  52. package/get-shit-done/references/model-profiles.md +92 -0
  53. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  54. package/get-shit-done/references/planning-config.md +196 -0
  55. package/get-shit-done/references/questioning.md +5 -1
  56. package/get-shit-done/references/verification-patterns.md +17 -0
  57. package/get-shit-done/templates/DEBUG.md +4 -4
  58. package/get-shit-done/templates/UAT.md +1 -1
  59. package/get-shit-done/templates/codebase/architecture.md +1 -1
  60. package/get-shit-done/templates/codebase/concerns.md +1 -1
  61. package/get-shit-done/templates/codebase/conventions.md +1 -1
  62. package/get-shit-done/templates/codebase/structure.md +9 -9
  63. package/get-shit-done/templates/config.json +10 -0
  64. package/get-shit-done/templates/context.md +7 -15
  65. package/get-shit-done/templates/continue-here.md +1 -1
  66. package/get-shit-done/templates/phase-prompt.md +32 -41
  67. package/get-shit-done/templates/planner-subagent-prompt.md +4 -4
  68. package/get-shit-done/templates/project.md +1 -1
  69. package/get-shit-done/templates/research-project/ARCHITECTURE.md +1 -1
  70. package/get-shit-done/templates/research.md +27 -4
  71. package/get-shit-done/templates/state.md +1 -31
  72. package/get-shit-done/templates/summary-complex.md +59 -0
  73. package/get-shit-done/templates/summary-minimal.md +41 -0
  74. package/get-shit-done/templates/summary-standard.md +48 -0
  75. package/get-shit-done/templates/summary.md +5 -28
  76. package/get-shit-done/templates/user-setup.md +8 -20
  77. package/get-shit-done/templates/verification-report.md +3 -3
  78. package/get-shit-done/workflows/add-phase.md +111 -0
  79. package/get-shit-done/workflows/add-todo.md +157 -0
  80. package/get-shit-done/workflows/audit-milestone.md +242 -0
  81. package/get-shit-done/workflows/check-todos.md +176 -0
  82. package/get-shit-done/workflows/cleanup.md +152 -0
  83. package/get-shit-done/workflows/complete-milestone.md +225 -301
  84. package/get-shit-done/workflows/diagnose-issues.md +3 -17
  85. package/get-shit-done/workflows/discovery-phase.md +11 -15
  86. package/get-shit-done/workflows/discuss-phase.md +105 -42
  87. package/get-shit-done/workflows/execute-phase.md +205 -349
  88. package/get-shit-done/workflows/execute-plan.md +179 -1569
  89. package/get-shit-done/workflows/health.md +156 -0
  90. package/get-shit-done/workflows/help.md +486 -0
  91. package/get-shit-done/workflows/insert-phase.md +129 -0
  92. package/get-shit-done/workflows/list-phase-assumptions.md +9 -9
  93. package/get-shit-done/workflows/map-codebase.md +56 -18
  94. package/get-shit-done/workflows/new-milestone.md +373 -0
  95. package/get-shit-done/workflows/new-project.md +1113 -0
  96. package/get-shit-done/workflows/pause-work.md +122 -0
  97. package/get-shit-done/workflows/plan-milestone-gaps.md +256 -0
  98. package/get-shit-done/workflows/plan-phase.md +448 -0
  99. package/get-shit-done/workflows/progress.md +393 -0
  100. package/get-shit-done/workflows/quick.md +444 -0
  101. package/get-shit-done/workflows/remove-phase.md +154 -0
  102. package/get-shit-done/workflows/research-phase.md +74 -0
  103. package/get-shit-done/workflows/resume-project.md +18 -23
  104. package/get-shit-done/workflows/set-profile.md +80 -0
  105. package/get-shit-done/workflows/settings.md +200 -0
  106. package/get-shit-done/workflows/transition.md +78 -103
  107. package/get-shit-done/workflows/update.md +214 -0
  108. package/get-shit-done/workflows/verify-phase.md +109 -496
  109. package/get-shit-done/workflows/verify-work.md +22 -15
  110. package/hooks/dist/gsd-check-update.js +66 -0
  111. package/hooks/dist/gsd-statusline.js +91 -0
  112. package/package.json +19 -3
  113. package/scripts/build-hooks.js +42 -0
  114. package/commands/gsd/whats-new.md +0 -124
@@ -1,13 +1,13 @@
1
1
  <purpose>
2
2
  Validate built features through conversational testing with persistent state. Creates UAT.md that tracks test progress, survives /clear, and feeds gaps into /gsd:plan-phase --gaps.
3
3
 
4
- User tests, Claude records. One test at a time. Plain text responses.
4
+ User tests, Codex records. One test at a time. Plain text responses.
5
5
  </purpose>
6
6
 
7
7
  <philosophy>
8
8
  **Show expected, ask if reality matches.**
9
9
 
10
- Claude presents what SHOULD happen. User confirms or describes what's different.
10
+ Codex presents what SHOULD happen. User confirms or describes what's different.
11
11
  - "yes" / "y" / "next" / empty → pass
12
12
  - Anything else → logged as issue, severity inferred
13
13
 
@@ -15,11 +15,21 @@ No Pass/Fail buttons. No severity questions. Just: "Here's what should happen. D
15
15
  </philosophy>
16
16
 
17
17
  <template>
18
- @~/.claude/get-shit-done/templates/UAT.md
18
+ @~/.codex/get-shit-done/templates/UAT.md
19
19
  </template>
20
20
 
21
21
  <process>
22
22
 
23
+ <step name="initialize" priority="first">
24
+ If $ARGUMENTS contains a phase number, load context:
25
+
26
+ ```bash
27
+ INIT=$(node ~/.codex/get-shit-done/bin/gsd-tools.cjs init verify-work "${PHASE_ARG}")
28
+ ```
29
+
30
+ Parse JSON for: `planner_model`, `checker_model`, `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `has_verification`.
31
+ </step>
32
+
23
33
  <step name="check_active_session">
24
34
  **First: Check for active UAT sessions**
25
35
 
@@ -70,15 +80,10 @@ Continue to `create_uat_file`.
70
80
  <step name="find_summaries">
71
81
  **Find what to test:**
72
82
 
73
- Parse $ARGUMENTS as phase number (e.g., "4") or plan number (e.g., "04-02").
83
+ Use `phase_dir` from init (or run init if not already done).
74
84
 
75
85
  ```bash
76
- # Find phase directory (match both zero-padded and unpadded)
77
- PADDED_PHASE=$(printf "%02d" ${PHASE_ARG} 2>/dev/null || echo "${PHASE_ARG}")
78
- PHASE_DIR=$(ls -d .planning/phases/${PADDED_PHASE}-* .planning/phases/${PHASE_ARG}-* 2>/dev/null | head -1)
79
-
80
- # Find SUMMARY files
81
- ls "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null
86
+ ls "$phase_dir"/*-SUMMARY.md 2>/dev/null
82
87
  ```
83
88
 
84
89
  Read each SUMMARY.md to extract testable deliverables.
@@ -159,7 +164,7 @@ skipped: 0
159
164
  [none yet]
160
165
  ```
161
166
 
162
- Write to `.planning/phases/XX-name/{phase}-UAT.md`
167
+ Write to `.planning/phases/XX-name/{phase_num}-UAT.md`
163
168
 
164
169
  Proceed to `present_test`.
165
170
  </step>
@@ -287,8 +292,7 @@ Clear Current Test section:
287
292
 
288
293
  Commit the UAT file:
289
294
  ```bash
290
- git add ".planning/phases/XX-name/{phase}-UAT.md"
291
- git commit -m "test({phase}): complete UAT - {passed} passed, {issues} issues"
295
+ node ~/.codex/get-shit-done/bin/gsd-tools.cjs commit "test({phase_num}): complete UAT - {passed} passed, {issues} issues" --files ".planning/phases/XX-name/{phase_num}-UAT.md"
292
296
  ```
293
297
 
294
298
  Present summary:
@@ -330,7 +334,7 @@ Spawning parallel debug agents to investigate each issue.
330
334
  ```
331
335
 
332
336
  - Load diagnose-issues workflow
333
- - Follow @~/.claude/get-shit-done/workflows/diagnose-issues.md
337
+ - Follow @~/.codex/get-shit-done/workflows/diagnose-issues.md
334
338
  - Spawn parallel debug agents for each issue
335
339
  - Collect root causes
336
340
  - Update UAT.md with root causes
@@ -362,7 +366,7 @@ Task(
362
366
  **Mode:** gap_closure
363
367
 
364
368
  **UAT with diagnoses:**
365
- @.planning/phases/{phase_dir}/{phase}-UAT.md
369
+ @.planning/phases/{phase_dir}/{phase_num}-UAT.md
366
370
 
367
371
  **Project State:**
368
372
  @.planning/STATE.md
@@ -378,6 +382,7 @@ Plans must be executable prompts.
378
382
  </downstream_consumer>
379
383
  """,
380
384
  subagent_type="gsd-planner",
385
+ model="{planner_model}",
381
386
  description="Plan gap fixes for Phase {phase}"
382
387
  )
383
388
  ```
@@ -423,6 +428,7 @@ Return one of:
423
428
  </expected_output>
424
429
  """,
425
430
  subagent_type="gsd-plan-checker",
431
+ model="{checker_model}",
426
432
  description="Verify Phase {phase} fix plans"
427
433
  )
428
434
  ```
@@ -463,6 +469,7 @@ Do NOT replan from scratch unless issues are fundamental.
463
469
  </instructions>
464
470
  """,
465
471
  subagent_type="gsd-planner",
472
+ model="{planner_model}",
466
473
  description="Revise Phase {phase} plans"
467
474
  )
468
475
  ```
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ // Check for GSD updates in background, write result to cache
3
+ // Called by SessionStart hook - runs once per session
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+ const { spawn } = require('child_process');
9
+
10
+ const homeDir = os.homedir();
11
+ const cwd = process.cwd();
12
+ const cacheDir = path.join(homeDir, '.codex', 'cache');
13
+ const cacheFile = path.join(cacheDir, 'gsd-update-check.json');
14
+
15
+ // VERSION file locations (check project first, then global)
16
+ const projectVersionFile = path.join(cwd, 'get-shit-done', 'VERSION');
17
+ const globalVersionFile = path.join(homeDir, '.codex', 'get-shit-done', 'VERSION');
18
+
19
+ // Ensure cache directory exists
20
+ if (!fs.existsSync(cacheDir)) {
21
+ fs.mkdirSync(cacheDir, { recursive: true });
22
+ }
23
+
24
+ // Run check in background (spawn background process, windowsHide prevents console flash)
25
+ const child = spawn(process.execPath, ['-e', `
26
+ const fs = require('fs');
27
+ const { execSync } = require('child_process');
28
+
29
+ const cacheFile = ${JSON.stringify(cacheFile)};
30
+ const projectVersionFile = ${JSON.stringify(projectVersionFile)};
31
+ const globalVersionFile = ${JSON.stringify(globalVersionFile)};
32
+
33
+ // Check project directory first (local install), then global
34
+ let installed = '0.0.0';
35
+ const readInstalledVersion = (versionFilePath) => {
36
+ const raw = fs.readFileSync(versionFilePath, 'utf8');
37
+ return (raw.split(/\\r?\\n/)[0] || '').trim() || '0.0.0';
38
+ };
39
+ try {
40
+ if (fs.existsSync(projectVersionFile)) {
41
+ installed = readInstalledVersion(projectVersionFile);
42
+ } else if (fs.existsSync(globalVersionFile)) {
43
+ installed = readInstalledVersion(globalVersionFile);
44
+ }
45
+ } catch (e) {}
46
+
47
+ let latest = null;
48
+ try {
49
+ latest = execSync('npm view @undeemed/get-shit-done-codex version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
50
+ } catch (e) {}
51
+
52
+ const result = {
53
+ update_available: latest && installed !== latest,
54
+ installed,
55
+ latest: latest || 'unknown',
56
+ checked: Math.floor(Date.now() / 1000)
57
+ };
58
+
59
+ fs.writeFileSync(cacheFile, JSON.stringify(result));
60
+ `], {
61
+ stdio: 'ignore',
62
+ windowsHide: true,
63
+ detached: true // Required on Windows for proper process detachment
64
+ });
65
+
66
+ child.unref();
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ // Codex Statusline - GSD Edition
3
+ // Shows: model | current task | directory | context usage
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+
9
+ // Read JSON from stdin
10
+ let input = '';
11
+ process.stdin.setEncoding('utf8');
12
+ process.stdin.on('data', chunk => input += chunk);
13
+ process.stdin.on('end', () => {
14
+ try {
15
+ const data = JSON.parse(input);
16
+ const model = data.model?.display_name || 'Codex';
17
+ const dir = data.workspace?.current_dir || process.cwd();
18
+ const session = data.session_id || '';
19
+ const remaining = data.context_window?.remaining_percentage;
20
+
21
+ // Context window display (shows USED percentage scaled to 80% limit)
22
+ // Scale context to show 100% at the effective limit.
23
+ let ctx = '';
24
+ if (remaining != null) {
25
+ const rem = Math.round(remaining);
26
+ const rawUsed = Math.max(0, Math.min(100, 100 - rem));
27
+ // Scale: 80% real usage = 100% displayed
28
+ const used = Math.min(100, Math.round((rawUsed / 80) * 100));
29
+
30
+ // Build progress bar (10 segments)
31
+ const filled = Math.floor(used / 10);
32
+ const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
33
+
34
+ // Color based on scaled usage (thresholds adjusted for new scale)
35
+ if (used < 63) { // ~50% real
36
+ ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
37
+ } else if (used < 81) { // ~65% real
38
+ ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
39
+ } else if (used < 95) { // ~76% real
40
+ ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
41
+ } else {
42
+ ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
43
+ }
44
+ }
45
+
46
+ // Current task from todos
47
+ let task = '';
48
+ const homeDir = os.homedir();
49
+ const todosDir = path.join(homeDir, '.codex', 'todos');
50
+ if (session && fs.existsSync(todosDir)) {
51
+ try {
52
+ const files = fs.readdirSync(todosDir)
53
+ .filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
54
+ .map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
55
+ .sort((a, b) => b.mtime - a.mtime);
56
+
57
+ if (files.length > 0) {
58
+ try {
59
+ const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
60
+ const inProgress = todos.find(t => t.status === 'in_progress');
61
+ if (inProgress) task = inProgress.activeForm || '';
62
+ } catch (e) {}
63
+ }
64
+ } catch (e) {
65
+ // Silently fail on file system errors - don't break statusline
66
+ }
67
+ }
68
+
69
+ // GSD update available?
70
+ let gsdUpdate = '';
71
+ const cacheFile = path.join(homeDir, '.codex', 'cache', 'gsd-update-check.json');
72
+ if (fs.existsSync(cacheFile)) {
73
+ try {
74
+ const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
75
+ if (cache.update_available) {
76
+ gsdUpdate = '\x1b[33m⬆ /prompts:gsd-update\x1b[0m │ ';
77
+ }
78
+ } catch (e) {}
79
+ }
80
+
81
+ // Output
82
+ const dirname = path.basename(dir);
83
+ if (task) {
84
+ process.stdout.write(`${gsdUpdate}\x1b[2m${model}\x1b[0m │ \x1b[1m${task}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
85
+ } else {
86
+ process.stdout.write(`${gsdUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
87
+ }
88
+ } catch (e) {
89
+ // Silent fail - don't break statusline on parse errors
90
+ }
91
+ });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@undeemed/get-shit-done-codex",
3
- "version": "1.6.12",
4
- "description": "A meta-prompting, context engineering and spec-driven development system for OpenAI Codex CLI. Fork of get-shit-done by TÂCHES, adapted for Codex CLI by undeemed.",
3
+ "version": "1.20.3",
4
+ "description": "A meta-prompting, context engineering and spec-driven development system for OpenAI Codex (CLI and Desktop). Fork of get-shit-done by TÂCHES, adapted for Codex by undeemed.",
5
5
  "bin": {
6
6
  "get-shit-done-codex": "bin/install.js"
7
7
  },
@@ -12,6 +12,9 @@
12
12
  "bin",
13
13
  "commands",
14
14
  "get-shit-done",
15
+ "agents",
16
+ "hooks/dist",
17
+ "scripts",
15
18
  "AGENTS.md"
16
19
  ],
17
20
  "keywords": [
@@ -33,7 +36,20 @@
33
36
  "type": "git",
34
37
  "url": "git+https://github.com/undeemed/get-shit-done-codex.git"
35
38
  },
39
+ "homepage": "https://github.com/undeemed/get-shit-done-codex",
40
+ "bugs": {
41
+ "url": "https://github.com/undeemed/get-shit-done-codex/issues"
42
+ },
36
43
  "engines": {
37
44
  "node": ">=16.7.0"
45
+ },
46
+ "dependencies": {},
47
+ "devDependencies": {
48
+ "esbuild": "^0.24.0"
49
+ },
50
+ "scripts": {
51
+ "build:hooks": "node scripts/build-hooks.js",
52
+ "prepublishOnly": "npm run build:hooks",
53
+ "test": "node --test get-shit-done/bin/gsd-tools.test.cjs"
38
54
  }
39
- }
55
+ }
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copy GSD hooks to dist for installation.
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ const HOOKS_DIR = path.join(__dirname, '..', 'hooks');
10
+ const DIST_DIR = path.join(HOOKS_DIR, 'dist');
11
+
12
+ // Hooks to copy (pure Node.js, no bundling needed)
13
+ const HOOKS_TO_COPY = [
14
+ 'gsd-check-update.js',
15
+ 'gsd-statusline.js'
16
+ ];
17
+
18
+ function build() {
19
+ // Ensure dist directory exists
20
+ if (!fs.existsSync(DIST_DIR)) {
21
+ fs.mkdirSync(DIST_DIR, { recursive: true });
22
+ }
23
+
24
+ // Copy hooks to dist
25
+ for (const hook of HOOKS_TO_COPY) {
26
+ const src = path.join(HOOKS_DIR, hook);
27
+ const dest = path.join(DIST_DIR, hook);
28
+
29
+ if (!fs.existsSync(src)) {
30
+ console.warn(`Warning: ${hook} not found, skipping`);
31
+ continue;
32
+ }
33
+
34
+ console.log(`Copying ${hook}...`);
35
+ fs.copyFileSync(src, dest);
36
+ console.log(` → ${dest}`);
37
+ }
38
+
39
+ console.log('\nBuild complete.');
40
+ }
41
+
42
+ build();
@@ -1,124 +0,0 @@
1
- ---
2
- name: gsd:whats-new
3
- description: See what's new in GSD since your installed version
4
- ---
5
-
6
- <objective>
7
- Display changes between installed version and latest available version.
8
-
9
- Shows version comparison, changelog entries for missed versions, and update instructions.
10
- </objective>
11
-
12
- <process>
13
-
14
- <step name="get_installed_version">
15
- Read installed version from VERSION file:
16
-
17
- ```bash
18
- cat ~/.claude/get-shit-done/VERSION 2>/dev/null
19
- ```
20
-
21
- **If VERSION file missing:**
22
- ```
23
- ## GSD What's New
24
-
25
- **Installed version:** Unknown
26
-
27
- Your installation doesn't include version tracking.
28
-
29
- **To fix:** `npx get-shit-done-cc --global`
30
-
31
- This will reinstall with version tracking enabled.
32
- ```
33
-
34
- STOP here if no VERSION file.
35
- </step>
36
-
37
- <step name="fetch_remote_changelog">
38
- Fetch latest CHANGELOG.md from GitHub:
39
-
40
- Use WebFetch tool with:
41
- - URL: `https://raw.githubusercontent.com/glittercowboy/get-shit-done/main/CHANGELOG.md`
42
- - Prompt: "Extract all version entries with their dates and changes. Return in Keep-a-Changelog format."
43
-
44
- **If fetch fails:**
45
- Fall back to local changelog:
46
- ```bash
47
- cat ~/.claude/get-shit-done/CHANGELOG.md 2>/dev/null
48
- ```
49
-
50
- Note to user: "Couldn't check for updates (offline or GitHub unavailable). Showing local changelog."
51
- </step>
52
-
53
- <step name="parse_versions">
54
- From the remote (or local) changelog:
55
-
56
- 1. **Extract latest version** - First `## [X.Y.Z]` line after `## [Unreleased]`
57
- 2. **Compare with installed** - From VERSION file
58
- 3. **Extract entries between** - All version sections from latest down to (but not including) installed
59
-
60
- **Version comparison:**
61
- - If installed == latest: "You're on the latest version"
62
- - If installed < latest: Show changes since installed version
63
- - If installed > latest: "You're ahead of latest release (development version?)"
64
- </step>
65
-
66
- <step name="display_output">
67
- Format output clearly:
68
-
69
- **If up to date:**
70
- ```
71
- ## GSD What's New
72
-
73
- **Installed:** 1.4.26
74
- **Latest:** 1.4.26
75
-
76
- You're on the latest version.
77
-
78
- [View full changelog](https://github.com/glittercowboy/get-shit-done/blob/main/CHANGELOG.md)
79
- ```
80
-
81
- **If updates available:**
82
- ```
83
- ## GSD What's New
84
-
85
- **Installed:** 1.4.23
86
- **Latest:** 1.4.26
87
-
88
- ---
89
-
90
- ### Changes since your version:
91
-
92
- ## [1.4.26] - 2026-01-20
93
-
94
- ### Added
95
- - Feature X
96
- - Feature Y
97
-
98
- ### Changed
99
- - **BREAKING:** Changed Z behavior
100
-
101
- ## [1.4.25] - 2026-01-18
102
-
103
- ### Fixed
104
- - Bug in feature A
105
-
106
- ---
107
-
108
- [View full changelog](https://github.com/glittercowboy/get-shit-done/blob/main/CHANGELOG.md)
109
-
110
- **To update:** `npx get-shit-done-cc --global`
111
- ```
112
-
113
- **Breaking changes:** Surface prominently with **BREAKING:** prefix in the output.
114
- </step>
115
-
116
- </process>
117
-
118
- <success_criteria>
119
- - [ ] Installed version read from VERSION file
120
- - [ ] Remote changelog fetched (or graceful fallback to local)
121
- - [ ] Version comparison displayed clearly
122
- - [ ] Changes since installed version shown (if any)
123
- - [ ] Update instructions provided when behind
124
- </success_criteria>