@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.
@@ -16,21 +16,21 @@ function toPosixPath(p) {
16
16
  // ─── Model Profile Table ─────────────────────────────────────────────────────
17
17
 
18
18
  const MODEL_PROFILES = {
19
- // quality balanced budget
20
- 'gsd-planner': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'high' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
21
- 'gsd-roadmapper': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
22
- 'gsd-executor': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
23
- 'gsd-phase-researcher': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'low' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
24
- 'gsd-project-researcher': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'low' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
25
- 'gsd-research-synthesizer': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'low' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
26
- 'gsd-debugger': { quality: { m: 'gpt-5.3-codex', t: 'high' }, balanced: { m: 'gpt-5.3-codex', t: 'high' }, budget: { m: 'gpt-5.3-codex', t: 'medium' } },
27
- 'gsd-codebase-mapper': { quality: { m: 'gpt-5.3-codex', t: 'low' }, balanced: { m: 'gpt-5.3-codex', t: 'low' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
28
- 'gsd-verifier': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'medium' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
29
- 'gsd-plan-checker': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'low' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
30
- 'gsd-integration-checker': { quality: { m: 'gpt-5.3-codex', t: 'medium' }, balanced: { m: 'gpt-5.3-codex', t: 'low' }, budget: { m: 'gpt-5.3-codex', t: 'low' } },
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: 'medium' };
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 : 'medium' };
369
+ return { model: 'inherit', thinking: override === 'xhigh' || override === 'high' || override === 'medium' || override === 'low' ? override : 'high' };
370
370
  }
371
- return { model: 'inherit', thinking: override.t || 'medium' };
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: 'medium' };
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": "high" }
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 | 🟢 high | 🟢 high | 🟡 medium |
10
- | gsd-roadmapper | 🟢 high | 🟡 medium | 🔵 low |
11
- | gsd-executor | 🟢 high | 🟡 medium | 🔵 low |
12
- | gsd-phase-researcher | 🟡 medium | 🔵 low | 🔵 low |
13
- | gsd-project-researcher | 🟡 medium | 🔵 low | 🔵 low |
14
- | gsd-research-synthesizer | 🟡 medium | 🔵 low | 🔵 low |
15
- | gsd-debugger | 🟢 high | 🟢 high | 🟡 medium |
16
- | gsd-codebase-mapper | 🔵 low | 🔵 low | 🔵 low |
17
- | gsd-verifier | 🟡 medium | 🟡 medium | 🔵 low |
18
- | gsd-plan-checker | 🟡 medium | 🔵 low | 🔵 low |
19
- | gsd-integration-checker | 🟡 medium | 🔵 low | 🔵 low |
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
- - 🟢 **high** for decision-makers: planner, roadmapper, executor, debugger
28
- - 🟡 **medium** for analysis: researchers, verifiers, checkers
29
- - 🔵 **low** for read-only mapping
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
- - 🟢 **high** only for planner and debugger (highest-impact decisions)
35
- - 🟡 **medium** for executor and verifier (needs reasoning but follows plans)
36
- - 🔵 **low** for everything else (structured output, scanning)
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
- - 🟡 **medium** for planner and debugger (always need some reasoning)
42
- - 🔵 **low** for everything else
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 high thinking for gsd-planner?**
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 high thinking for gsd-debugger even in balanced?**
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 low thinking for gsd-codebase-mapper?**
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 medium thinking for gsd-verifier in balanced?**
57
- Verification requires goal-backward reasoning — checking if code _delivers_ what the phase promised. Low thinking may miss subtle gaps.
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 low thinking for researchers in balanced?**
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": "high",
84
- "gsd-codebase-mapper": "medium"
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` — high thinking for decision-makers, medium for analysis agents
313
- - `balanced` — high thinking for planner/debugger, medium/low for others (default)
314
- - `budget` — minimal thinking — medium for planner/debugger, low everywhere else
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 — smart thinking allocation per role" },
168
- { label: "Quality", description: "gpt-5.3-codex — high thinking for all decision-makers" },
169
- { label: "Budget", description: "gpt-5.3-codex — minimal thinking, fastest/cheapest" }
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 — smart thinking allocation per role" },
463
- { label: "Quality", description: "gpt-5.3-codex — high thinking for all decision-makers" },
464
- { label: "Budget", description: "gpt-5.3-codex — minimal thinking, fastest/cheapest" }
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 | high |
62
- | gsd-executor | gpt-5.3-codex | medium |
63
- | gsd-verifier | gpt-5.3-codex | medium |
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 high thinking for decision-makers, medium for analysis" },
47
- { label: "Balanced (Recommended)", description: "gpt-5.3-codex with high thinking for planner/debugger, lower for others" },
48
- { label: "Budget", description: "gpt-5.3-codex with minimal thinking fastest, lowest cost" }
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.1",
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 --test tests/*.test.cjs"
70
+ "test": "node scripts/run-tests.cjs",
71
+ "test:coverage": "node scripts/run-tests.cjs --coverage"
71
72
  }
72
73
  }
@@ -1,29 +1,43 @@
1
1
  #!/usr/bin/env node
2
- // Cross-platform test runner — resolves test file globs via Node
3
- // instead of relying on shell expansion (which fails on Windows PowerShell/cmd).
4
- // Propagates NODE_V8_COVERAGE so c8 collects coverage from the child process.
5
- 'use strict';
6
-
7
- const { readdirSync } = require('fs');
8
- const { join } = require('path');
9
- const { execFileSync } = require('child_process');
10
-
11
- const testDir = join(__dirname, '..', 'tests');
12
- const files = readdirSync(testDir)
13
- .filter(f => f.endsWith('.test.cjs'))
14
- .sort()
15
- .map(f => join('tests', f));
16
-
17
- if (files.length === 0) {
18
- console.error('No test files found in tests/');
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
- try {
23
- execFileSync(process.execPath, ['--test', ...files], {
24
- stdio: 'inherit',
25
- env: { ...process.env },
26
- });
27
- } catch (err) {
28
- process.exit(err.status || 1);
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);