@undeemed/get-shit-done-codex 1.24.1 → 1.24.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 +72 -12
- package/get-shit-done/AGENTS.md +59 -23
- package/get-shit-done/bin/gsd-tools.cjs +293 -124
- package/get-shit-done/bin/lib/core.cjs +16 -16
- package/get-shit-done/references/model-profile-resolution.md +2 -2
- package/get-shit-done/references/model-profiles.md +29 -29
- package/get-shit-done/workflows/help.md +3 -3
- package/get-shit-done/workflows/new-project.md +6 -6
- package/get-shit-done/workflows/set-profile.md +3 -3
- package/get-shit-done/workflows/settings.md +3 -3
- package/package.json +3 -2
- package/scripts/run-tests.cjs +38 -24
|
@@ -16,21 +16,21 @@ function toPosixPath(p) {
|
|
|
16
16
|
// ─── Model Profile Table ─────────────────────────────────────────────────────
|
|
17
17
|
|
|
18
18
|
const MODEL_PROFILES = {
|
|
19
|
-
// quality
|
|
20
|
-
'gsd-planner': { quality: { m: 'gpt-5.3-codex', t: '
|
|
21
|
-
'gsd-roadmapper': { quality: { m: 'gpt-5.3-codex', t: '
|
|
22
|
-
'gsd-executor': { quality: { m: 'gpt-5.3-codex', t: '
|
|
23
|
-
'gsd-phase-researcher': { quality: { m: 'gpt-5.3-codex', t: '
|
|
24
|
-
'gsd-project-researcher': { quality: { m: 'gpt-5.3-codex', t: '
|
|
25
|
-
'gsd-research-synthesizer': { quality: { m: 'gpt-5.3-codex', t: '
|
|
26
|
-
'gsd-debugger': { quality: { m: 'gpt-5.3-codex', t: '
|
|
27
|
-
'gsd-codebase-mapper': { quality: { m: 'gpt-5.3-codex', t: '
|
|
28
|
-
'gsd-verifier': { quality: { m: 'gpt-5.3-codex', t: '
|
|
29
|
-
'gsd-plan-checker': { quality: { m: 'gpt-5.3-codex', t: '
|
|
30
|
-
'gsd-integration-checker': { quality: { m: 'gpt-5.3-codex', t: '
|
|
19
|
+
// quality balanced budget
|
|
20
|
+
'gsd-planner': { quality: { m: 'gpt-5.3-codex', t: 'xhigh' }, balanced: { m: 'gpt-5.3-codex', t: 'xhigh' }, budget: { m: 'gpt-5.3-codex', t: 'high' } },
|
|
21
|
+
'gsd-roadmapper': { quality: { m: 'gpt-5.3-codex', t: 'xhigh' }, balanced: { m: 'gpt-5.3-codex', t: 'high' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
22
|
+
'gsd-executor': { quality: { m: 'gpt-5.3-codex', t: 'xhigh' }, balanced: { m: 'gpt-5.3-codex', t: 'high' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
23
|
+
'gsd-phase-researcher': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
24
|
+
'gsd-project-researcher': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
25
|
+
'gsd-research-synthesizer': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
26
|
+
'gsd-debugger': { quality: { m: 'gpt-5.3-codex', t: 'xhigh' }, balanced: { m: 'gpt-5.3-codex', t: 'xhigh' }, budget: { m: 'gpt-5.3-codex', t: 'high' } },
|
|
27
|
+
'gsd-codebase-mapper': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
28
|
+
'gsd-verifier': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'high' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
29
|
+
'gsd-plan-checker': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
30
|
+
'gsd-integration-checker': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
const DEFAULT_ENTRY = { m: 'gpt-5.3-codex', t: '
|
|
33
|
+
const DEFAULT_ENTRY = { m: 'gpt-5.3-codex', t: 'high' };
|
|
34
34
|
|
|
35
35
|
// ─── Output helpers ───────────────────────────────────────────────────────────
|
|
36
36
|
|
|
@@ -366,15 +366,15 @@ function resolveModelInternal(cwd, agentType) {
|
|
|
366
366
|
if (override) {
|
|
367
367
|
// Override can be a string (thinking level) or { m, t } object
|
|
368
368
|
if (typeof override === 'string') {
|
|
369
|
-
return { model: 'inherit', thinking: override === 'high' || override === 'medium' || override === 'low' ? override : '
|
|
369
|
+
return { model: 'inherit', thinking: override === 'xhigh' || override === 'high' || override === 'medium' || override === 'low' ? override : 'high' };
|
|
370
370
|
}
|
|
371
|
-
return { model: 'inherit', thinking: override.t || '
|
|
371
|
+
return { model: 'inherit', thinking: override.t || 'high' };
|
|
372
372
|
}
|
|
373
373
|
|
|
374
374
|
// Fall back to profile lookup
|
|
375
375
|
const profile = config.model_profile || 'balanced';
|
|
376
376
|
const agentModels = MODEL_PROFILES[agentType];
|
|
377
|
-
if (!agentModels) return { model: 'inherit', thinking: '
|
|
377
|
+
if (!agentModels) return { model: 'inherit', thinking: 'high' };
|
|
378
378
|
const entry = agentModels[profile] || agentModels['balanced'] || DEFAULT_ENTRY;
|
|
379
379
|
return { model: 'inherit', thinking: entry.t };
|
|
380
380
|
}
|
|
@@ -17,7 +17,7 @@ Default: `balanced` if not set or config missing.
|
|
|
17
17
|
Look up the agent in the table for the resolved profile. Each entry returns:
|
|
18
18
|
|
|
19
19
|
```json
|
|
20
|
-
{ "model": "inherit", "thinking": "
|
|
20
|
+
{ "model": "inherit", "thinking": "xhigh" }
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
All agents use `gpt-5.3-codex` (via `"inherit"`). The `thinking` field controls reasoning effort.
|
|
@@ -29,7 +29,7 @@ Task(
|
|
|
29
29
|
prompt="...",
|
|
30
30
|
subagent_type="gsd-planner",
|
|
31
31
|
model="inherit",
|
|
32
|
-
thinking="{resolved_thinking}" # "high", "medium", or "low"
|
|
32
|
+
thinking="{resolved_thinking}" # "xhigh", "high", "medium", or "low"
|
|
33
33
|
)
|
|
34
34
|
```
|
|
35
35
|
|
|
@@ -6,17 +6,17 @@ Model profiles control the reasoning effort level for each GSD agent. All agents
|
|
|
6
6
|
|
|
7
7
|
| Agent | `quality` | `balanced` | `budget` |
|
|
8
8
|
| ------------------------ | --------- | ---------- | --------- |
|
|
9
|
-
| gsd-planner |
|
|
10
|
-
| gsd-roadmapper | 🟢 high
|
|
11
|
-
| gsd-executor | 🟢 high
|
|
12
|
-
| gsd-phase-researcher | 🟡 medium
|
|
13
|
-
| gsd-project-researcher | 🟡 medium
|
|
14
|
-
| gsd-research-synthesizer | 🟡 medium
|
|
15
|
-
| gsd-debugger |
|
|
16
|
-
| gsd-codebase-mapper |
|
|
17
|
-
| gsd-verifier |
|
|
18
|
-
| gsd-plan-checker | 🟡 medium
|
|
19
|
-
| gsd-integration-checker | 🟡 medium
|
|
9
|
+
| gsd-planner | 🔴 xhigh | 🔴 xhigh | 🟢 high |
|
|
10
|
+
| gsd-roadmapper | 🔴 xhigh | 🟢 high | 🟡 medium |
|
|
11
|
+
| gsd-executor | 🔴 xhigh | 🟢 high | 🟡 medium |
|
|
12
|
+
| gsd-phase-researcher | 🟢 high | 🟡 medium | 🟡 medium |
|
|
13
|
+
| gsd-project-researcher | 🟢 high | 🟡 medium | 🟡 medium |
|
|
14
|
+
| gsd-research-synthesizer | 🟢 high | 🟡 medium | 🟡 medium |
|
|
15
|
+
| gsd-debugger | 🔴 xhigh | 🔴 xhigh | 🟢 high |
|
|
16
|
+
| gsd-codebase-mapper | 🟡 medium | 🟡 medium | 🟡 medium |
|
|
17
|
+
| gsd-verifier | 🟢 high | 🟢 high | 🟡 medium |
|
|
18
|
+
| gsd-plan-checker | 🟢 high | 🟡 medium | 🟡 medium |
|
|
19
|
+
| gsd-integration-checker | 🟢 high | 🟡 medium | 🟡 medium |
|
|
20
20
|
|
|
21
21
|
All entries resolve to `model: "inherit"` (uses the session's gpt-5.3-codex). The `thinking` field controls reasoning effort.
|
|
22
22
|
|
|
@@ -24,39 +24,39 @@ All entries resolve to `model: "inherit"` (uses the session's gpt-5.3-codex). Th
|
|
|
24
24
|
|
|
25
25
|
**quality** - Maximum reasoning for every role
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
27
|
+
- 🔴 **xhigh** for decision-makers: planner, roadmapper, executor, debugger
|
|
28
|
+
- 🟢 **high** for analysis: researchers, verifiers, checkers
|
|
29
|
+
- 🟡 **medium** for read-only mapping
|
|
30
30
|
- Use when: critical architecture work, complex debugging
|
|
31
31
|
|
|
32
32
|
**balanced** (default) - Smart thinking allocation
|
|
33
33
|
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
34
|
+
- 🔴 **xhigh** only for planner and debugger (highest-impact decisions)
|
|
35
|
+
- 🟢 **high** for executor and verifier (needs reasoning but follows plans)
|
|
36
|
+
- 🟡 **medium** for everything else (structured output, scanning)
|
|
37
37
|
- Use when: normal development
|
|
38
38
|
|
|
39
39
|
**budget** - Minimal reasoning budget
|
|
40
40
|
|
|
41
|
-
-
|
|
42
|
-
-
|
|
41
|
+
- 🟢 **high** for planner and debugger (always need some reasoning)
|
|
42
|
+
- 🟡 **medium** for everything else
|
|
43
43
|
- Use when: high-volume work, less critical phases
|
|
44
44
|
|
|
45
45
|
## Role-Based Thinking Rationale
|
|
46
46
|
|
|
47
|
-
**Why
|
|
47
|
+
**Why xhigh thinking for gsd-planner?**
|
|
48
48
|
Planning involves architecture decisions, goal decomposition, and task design. These decisions cascade through the entire phase — worth the extra reasoning budget.
|
|
49
49
|
|
|
50
|
-
**Why
|
|
50
|
+
**Why xhigh thinking for gsd-debugger even in balanced?**
|
|
51
51
|
Root cause analysis requires deep reasoning. A debugger that misdiagnoses wastes more tokens in re-runs than the reasoning cost.
|
|
52
52
|
|
|
53
|
-
**Why
|
|
53
|
+
**Why medium thinking for gsd-codebase-mapper?**
|
|
54
54
|
Read-only file scanning and pattern extraction. No decisions to make — just structured output from file contents.
|
|
55
55
|
|
|
56
|
-
**Why
|
|
57
|
-
Verification requires goal-backward reasoning — checking if code _delivers_ what the phase promised.
|
|
56
|
+
**Why high thinking for gsd-verifier in balanced?**
|
|
57
|
+
Verification requires goal-backward reasoning — checking if code _delivers_ what the phase promised. Medium thinking may miss subtle gaps.
|
|
58
58
|
|
|
59
|
-
**Why
|
|
59
|
+
**Why medium thinking for researchers in balanced?**
|
|
60
60
|
Research agents scan and collect information. The synthesis happens elsewhere. They don't need deep reasoning for reading files.
|
|
61
61
|
|
|
62
62
|
## Resolution Logic
|
|
@@ -70,7 +70,7 @@ Orchestrators resolve model and thinking before spawning:
|
|
|
70
70
|
4. Pass model + thinking to Task call
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
Returns: `{ model: "inherit", thinking: "high"|"medium"|"low" }`
|
|
73
|
+
Returns: `{ model: "inherit", thinking: "xhigh"|"high"|"medium"|"low" }`
|
|
74
74
|
|
|
75
75
|
## Per-Agent Overrides
|
|
76
76
|
|
|
@@ -80,13 +80,13 @@ Override thinking level for specific agents:
|
|
|
80
80
|
{
|
|
81
81
|
"model_profile": "balanced",
|
|
82
82
|
"model_overrides": {
|
|
83
|
-
"gsd-executor": "
|
|
84
|
-
"gsd-codebase-mapper": "
|
|
83
|
+
"gsd-executor": "xhigh",
|
|
84
|
+
"gsd-codebase-mapper": "high"
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
Valid override values: `"high"`, `"medium"`, `"low"`.
|
|
89
|
+
Valid override values: `"xhigh"`, `"high"`, `"medium"`, `"low"`.
|
|
90
90
|
|
|
91
91
|
## Switching Profiles
|
|
92
92
|
|
|
@@ -309,9 +309,9 @@ Usage: `$gsd-settings`
|
|
|
309
309
|
**`$gsd-set-profile <profile>`**
|
|
310
310
|
Quick switch model profile for GSD agents.
|
|
311
311
|
|
|
312
|
-
- `quality` —
|
|
313
|
-
- `balanced` —
|
|
314
|
-
- `budget` — minimal thinking —
|
|
312
|
+
- `quality` — xhigh thinking for decision-makers, high for analysis agents
|
|
313
|
+
- `balanced` — xhigh thinking for planner/debugger, high/medium for others (default)
|
|
314
|
+
- `budget` — minimal thinking — high for planner/debugger, medium everywhere else
|
|
315
315
|
|
|
316
316
|
Usage: `$gsd-set-profile budget`
|
|
317
317
|
|
|
@@ -164,9 +164,9 @@ AskUserQuestion([
|
|
|
164
164
|
question: "Which AI models for planning agents?",
|
|
165
165
|
multiSelect: false,
|
|
166
166
|
options: [
|
|
167
|
-
{ label: "Balanced (Recommended)", description: "gpt-5.3-codex —
|
|
168
|
-
{ label: "Quality", description: "gpt-5.3-codex —
|
|
169
|
-
{ label: "Budget", description: "gpt-5.3-codex —
|
|
167
|
+
{ label: "Balanced (Recommended)", description: "gpt-5.3-codex — xhigh/high/medium thinking allocation per role" },
|
|
168
|
+
{ label: "Quality", description: "gpt-5.3-codex — xhigh thinking for all decision-makers" },
|
|
169
|
+
{ label: "Budget", description: "gpt-5.3-codex — high/medium thinking, fastest/cheapest" }
|
|
170
170
|
]
|
|
171
171
|
}
|
|
172
172
|
])
|
|
@@ -459,9 +459,9 @@ questions: [
|
|
|
459
459
|
question: "Which AI models for planning agents?",
|
|
460
460
|
multiSelect: false,
|
|
461
461
|
options: [
|
|
462
|
-
{ label: "Balanced (Recommended)", description: "gpt-5.3-codex —
|
|
463
|
-
{ label: "Quality", description: "gpt-5.3-codex —
|
|
464
|
-
{ label: "Budget", description: "gpt-5.3-codex —
|
|
462
|
+
{ label: "Balanced (Recommended)", description: "gpt-5.3-codex — xhigh/high/medium thinking allocation per role" },
|
|
463
|
+
{ label: "Quality", description: "gpt-5.3-codex — xhigh thinking for all decision-makers" },
|
|
464
|
+
{ label: "Budget", description: "gpt-5.3-codex — high/medium thinking, fastest/cheapest" }
|
|
465
465
|
]
|
|
466
466
|
}
|
|
467
467
|
]
|
|
@@ -58,9 +58,9 @@ Agents will now use:
|
|
|
58
58
|
Example:
|
|
59
59
|
| Agent | Model | Thinking |
|
|
60
60
|
|-------|-------|----------|
|
|
61
|
-
| gsd-planner | gpt-5.3-codex |
|
|
62
|
-
| gsd-executor | gpt-5.3-codex |
|
|
63
|
-
| gsd-verifier | gpt-5.3-codex |
|
|
61
|
+
| gsd-planner | gpt-5.3-codex | xhigh |
|
|
62
|
+
| gsd-executor | gpt-5.3-codex | high |
|
|
63
|
+
| gsd-verifier | gpt-5.3-codex | high |
|
|
64
64
|
| ... | ... | ... |
|
|
65
65
|
|
|
66
66
|
Next spawned agents will use the new profile.
|
|
@@ -43,9 +43,9 @@ AskUserQuestion([
|
|
|
43
43
|
header: "Model",
|
|
44
44
|
multiSelect: false,
|
|
45
45
|
options: [
|
|
46
|
-
{ label: "Quality", description: "gpt-5.3-codex with
|
|
47
|
-
{ label: "Balanced (Recommended)", description: "gpt-5.3-codex with
|
|
48
|
-
{ label: "Budget", description: "gpt-5.3-codex with
|
|
46
|
+
{ label: "Quality", description: "gpt-5.3-codex with xhigh thinking for decision-makers, high for analysis" },
|
|
47
|
+
{ label: "Balanced (Recommended)", description: "gpt-5.3-codex with xhigh thinking for planner/debugger, high/medium for others" },
|
|
48
|
+
{ label: "Budget", description: "gpt-5.3-codex with high thinking for planner/debugger, medium everywhere else" }
|
|
49
49
|
]
|
|
50
50
|
},
|
|
51
51
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@undeemed/get-shit-done-codex",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.3",
|
|
4
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.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"get-shit-done-codex": "bin/install.js"
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
"scripts": {
|
|
68
68
|
"build:hooks": "node scripts/build-hooks.js",
|
|
69
69
|
"prepublishOnly": "npm run build:hooks",
|
|
70
|
-
"test": "node
|
|
70
|
+
"test": "node scripts/run-tests.cjs",
|
|
71
|
+
"test:coverage": "node scripts/run-tests.cjs --coverage"
|
|
71
72
|
}
|
|
72
73
|
}
|
package/scripts/run-tests.cjs
CHANGED
|
@@ -1,29 +1,43 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
|
|
3
|
+
const fs = require("node:fs");
|
|
4
|
+
const path = require("node:path");
|
|
5
|
+
const { spawnSync } = require("node:child_process");
|
|
6
|
+
|
|
7
|
+
function collectTests(dir) {
|
|
8
|
+
if (!fs.existsSync(dir)) return [];
|
|
9
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
10
|
+
const files = [];
|
|
11
|
+
|
|
12
|
+
for (const entry of entries) {
|
|
13
|
+
const fullPath = path.join(dir, entry.name);
|
|
14
|
+
if (entry.isDirectory()) {
|
|
15
|
+
files.push(...collectTests(fullPath));
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (entry.isFile() && entry.name.endsWith(".test.cjs")) {
|
|
19
|
+
files.push(fullPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return files;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const withCoverage = process.argv.includes("--coverage");
|
|
27
|
+
const testFiles = collectTests(path.resolve(__dirname, "..", "tests")).sort();
|
|
28
|
+
|
|
29
|
+
if (testFiles.length === 0) {
|
|
30
|
+
console.error("No test files found in ./tests");
|
|
19
31
|
process.exit(1);
|
|
20
32
|
}
|
|
21
33
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
const args = [];
|
|
35
|
+
if (withCoverage) args.push("--experimental-test-coverage");
|
|
36
|
+
args.push("--test", ...testFiles);
|
|
37
|
+
|
|
38
|
+
const result = spawnSync(process.execPath, args, { stdio: "inherit" });
|
|
39
|
+
if (result.error) {
|
|
40
|
+
console.error(result.error.message);
|
|
41
|
+
process.exit(1);
|
|
29
42
|
}
|
|
43
|
+
process.exit(result.status ?? 1);
|