@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.
- package/README.md +40 -7
- package/agents/gsd-codebase-mapper.md +761 -0
- package/agents/gsd-debugger.md +1198 -0
- package/agents/gsd-executor.md +419 -0
- package/agents/gsd-integration-checker.md +423 -0
- package/agents/gsd-phase-researcher.md +469 -0
- package/agents/gsd-plan-checker.md +622 -0
- package/agents/gsd-planner.md +1159 -0
- package/agents/gsd-project-researcher.md +618 -0
- package/agents/gsd-research-synthesizer.md +236 -0
- package/agents/gsd-roadmapper.md +639 -0
- package/agents/gsd-verifier.md +541 -0
- package/bin/install.js +108 -102
- package/commands/gsd/add-phase.md +17 -185
- package/commands/gsd/add-todo.md +23 -163
- package/commands/gsd/audit-milestone.md +3 -219
- package/commands/gsd/check-todos.md +20 -196
- package/commands/gsd/cleanup.md +18 -0
- package/commands/gsd/complete-milestone.md +2 -2
- package/commands/gsd/debug.md +13 -0
- package/commands/gsd/discuss-phase.md +13 -6
- package/commands/gsd/execute-phase.md +4 -266
- package/commands/gsd/health.md +22 -0
- package/commands/gsd/help.md +8 -369
- package/commands/gsd/insert-phase.md +9 -203
- package/commands/gsd/join-discord.md +18 -0
- package/commands/gsd/list-phase-assumptions.md +4 -4
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/new-milestone.md +16 -682
- package/commands/gsd/new-project.md +12 -866
- package/commands/gsd/new-project.md.bak +1041 -0
- package/commands/gsd/pause-work.md +17 -105
- package/commands/gsd/plan-milestone-gaps.md +3 -247
- package/commands/gsd/plan-phase.md +13 -444
- package/commands/gsd/progress.md +5 -337
- package/commands/gsd/quick.md +40 -0
- package/commands/gsd/reapply-patches.md +110 -0
- package/commands/gsd/remove-phase.md +9 -315
- package/commands/gsd/research-phase.md +27 -20
- package/commands/gsd/resume-work.md +2 -2
- package/commands/gsd/set-profile.md +34 -0
- package/commands/gsd/settings.md +36 -0
- package/commands/gsd/update.md +25 -160
- package/commands/gsd/verify-work.md +6 -186
- package/get-shit-done/bin/gsd-tools.cjs +5243 -0
- package/get-shit-done/bin/gsd-tools.test.cjs +2273 -0
- package/get-shit-done/references/checkpoints.md +270 -283
- package/get-shit-done/references/decimal-phase-calculation.md +65 -0
- package/get-shit-done/references/git-integration.md +7 -13
- package/get-shit-done/references/git-planning-commit.md +38 -0
- package/get-shit-done/references/model-profile-resolution.md +34 -0
- package/get-shit-done/references/model-profiles.md +92 -0
- package/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/get-shit-done/references/planning-config.md +196 -0
- package/get-shit-done/references/questioning.md +5 -1
- package/get-shit-done/references/verification-patterns.md +17 -0
- package/get-shit-done/templates/DEBUG.md +4 -4
- package/get-shit-done/templates/UAT.md +1 -1
- package/get-shit-done/templates/codebase/architecture.md +1 -1
- package/get-shit-done/templates/codebase/concerns.md +1 -1
- package/get-shit-done/templates/codebase/conventions.md +1 -1
- package/get-shit-done/templates/codebase/structure.md +9 -9
- package/get-shit-done/templates/config.json +10 -0
- package/get-shit-done/templates/context.md +7 -15
- package/get-shit-done/templates/continue-here.md +1 -1
- package/get-shit-done/templates/phase-prompt.md +32 -41
- package/get-shit-done/templates/planner-subagent-prompt.md +4 -4
- package/get-shit-done/templates/project.md +1 -1
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +1 -1
- package/get-shit-done/templates/research.md +27 -4
- package/get-shit-done/templates/state.md +1 -31
- package/get-shit-done/templates/summary-complex.md +59 -0
- package/get-shit-done/templates/summary-minimal.md +41 -0
- package/get-shit-done/templates/summary-standard.md +48 -0
- package/get-shit-done/templates/summary.md +5 -28
- package/get-shit-done/templates/user-setup.md +8 -20
- package/get-shit-done/templates/verification-report.md +3 -3
- package/get-shit-done/workflows/add-phase.md +111 -0
- package/get-shit-done/workflows/add-todo.md +157 -0
- package/get-shit-done/workflows/audit-milestone.md +242 -0
- package/get-shit-done/workflows/check-todos.md +176 -0
- package/get-shit-done/workflows/cleanup.md +152 -0
- package/get-shit-done/workflows/complete-milestone.md +225 -301
- package/get-shit-done/workflows/diagnose-issues.md +3 -17
- package/get-shit-done/workflows/discovery-phase.md +11 -15
- package/get-shit-done/workflows/discuss-phase.md +105 -42
- package/get-shit-done/workflows/execute-phase.md +205 -349
- package/get-shit-done/workflows/execute-plan.md +179 -1569
- package/get-shit-done/workflows/health.md +156 -0
- package/get-shit-done/workflows/help.md +486 -0
- package/get-shit-done/workflows/insert-phase.md +129 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +9 -9
- package/get-shit-done/workflows/map-codebase.md +56 -18
- package/get-shit-done/workflows/new-milestone.md +373 -0
- package/get-shit-done/workflows/new-project.md +1113 -0
- package/get-shit-done/workflows/pause-work.md +122 -0
- package/get-shit-done/workflows/plan-milestone-gaps.md +256 -0
- package/get-shit-done/workflows/plan-phase.md +448 -0
- package/get-shit-done/workflows/progress.md +393 -0
- package/get-shit-done/workflows/quick.md +444 -0
- package/get-shit-done/workflows/remove-phase.md +154 -0
- package/get-shit-done/workflows/research-phase.md +74 -0
- package/get-shit-done/workflows/resume-project.md +18 -23
- package/get-shit-done/workflows/set-profile.md +80 -0
- package/get-shit-done/workflows/settings.md +200 -0
- package/get-shit-done/workflows/transition.md +78 -103
- package/get-shit-done/workflows/update.md +214 -0
- package/get-shit-done/workflows/verify-phase.md +109 -496
- package/get-shit-done/workflows/verify-work.md +22 -15
- package/hooks/dist/gsd-check-update.js +66 -0
- package/hooks/dist/gsd-statusline.js +91 -0
- package/package.json +19 -3
- package/scripts/build-hooks.js +42 -0
- 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,
|
|
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
|
-
|
|
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
|
-
@~/.
|
|
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
|
-
|
|
83
|
+
Use `phase_dir` from init (or run init if not already done).
|
|
74
84
|
|
|
75
85
|
```bash
|
|
76
|
-
|
|
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/{
|
|
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
|
-
|
|
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 @~/.
|
|
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}/{
|
|
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.
|
|
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
|
|
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>
|