gsd-codex-cli 1.20.11 → 1.20.13

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 (45) hide show
  1. package/.codex/agents/gsd-codebase-mapper.toml +2 -0
  2. package/.codex/agents/gsd-debugger.toml +2 -0
  3. package/.codex/agents/gsd-executor.toml +2 -0
  4. package/.codex/agents/gsd-integration-checker.toml +2 -0
  5. package/.codex/agents/gsd-phase-researcher.toml +2 -0
  6. package/.codex/agents/gsd-plan-checker.toml +2 -0
  7. package/.codex/agents/gsd-planner.toml +2 -0
  8. package/.codex/agents/gsd-project-researcher.toml +2 -0
  9. package/.codex/agents/gsd-research-synthesizer.toml +2 -0
  10. package/.codex/agents/gsd-roadmapper.toml +2 -0
  11. package/.codex/agents/gsd-verifier.toml +2 -0
  12. package/.codex/prompts/gsd-add-phase.md +1 -0
  13. package/.codex/prompts/gsd-add-todo.md +1 -0
  14. package/.codex/prompts/gsd-audit-milestone.md +1 -0
  15. package/.codex/prompts/gsd-check-todos.md +1 -0
  16. package/.codex/prompts/gsd-complete-milestone.md +1 -0
  17. package/.codex/prompts/gsd-debug.md +1 -0
  18. package/.codex/prompts/gsd-discuss-phase.md +1 -0
  19. package/.codex/prompts/gsd-doctor.md +14 -6
  20. package/.codex/prompts/gsd-execute-phase.md +1 -0
  21. package/.codex/prompts/gsd-help.md +1 -0
  22. package/.codex/prompts/gsd-insert-phase.md +1 -0
  23. package/.codex/prompts/gsd-list-phase-assumptions.md +1 -0
  24. package/.codex/prompts/gsd-map-codebase.md +1 -0
  25. package/.codex/prompts/gsd-new-milestone.md +1 -0
  26. package/.codex/prompts/gsd-new-project.md +1 -0
  27. package/.codex/prompts/gsd-pause-work.md +1 -0
  28. package/.codex/prompts/gsd-plan-milestone-gaps.md +1 -0
  29. package/.codex/prompts/gsd-plan-phase.md +1 -0
  30. package/.codex/prompts/gsd-progress.md +1 -0
  31. package/.codex/prompts/gsd-quick.md +1 -0
  32. package/.codex/prompts/gsd-remove-phase.md +1 -0
  33. package/.codex/prompts/gsd-research-phase.md +1 -0
  34. package/.codex/prompts/gsd-resume-work.md +1 -0
  35. package/.codex/prompts/gsd-set-profile.md +1 -0
  36. package/.codex/prompts/gsd-settings.md +1 -0
  37. package/.codex/prompts/gsd-update.md +1 -0
  38. package/.codex/prompts/gsd-verify-work.md +1 -0
  39. package/.codex/skills/get-shit-done-codex/SKILL.md +18 -13
  40. package/.codex/skills/get-shit-done-codex/references/compat.md +7 -1
  41. package/README.md +32 -21
  42. package/bin/install-codex.js +115 -57
  43. package/get-shit-done/bin/gsd-tools.cjs +109 -56
  44. package/get-shit-done/references/model-profile-resolution.md +13 -2
  45. package/package.json +16 -15
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.1-codex-mini"
2
+ model_reasoning_effort = "high"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-codex"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -0,0 +1,2 @@
1
+ model = "gpt-5.3-spark"
2
+ model_reasoning_effort = "xhigh"
@@ -38,6 +38,7 @@ node <gsd-tools-path> init phase-op "0" --raw
38
38
  3. Load .claude/get-shit-done/workflows/add-phase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init todos [argument] --raw
38
38
  3. Load .claude/get-shit-done/workflows/add-todo.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init milestone-op --raw
38
38
  3. Load .claude/get-shit-done/workflows/audit-milestone.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init todos [argument] --raw
38
38
  3. Load .claude/get-shit-done/workflows/check-todos.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init execute-phase "1" --raw
38
38
  3. Load .claude/get-shit-done/workflows/complete-milestone.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> state load --raw
38
38
  3. Execute the debug flow defined in this command (no separate workflow file exists in the gsd commands set).
39
39
  4. Translate each Task(...) in the debug flow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init phase-op [argument] --raw
38
38
  3. Load .claude/get-shit-done/workflows/discuss-phase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -24,12 +24,20 @@ Run these checks and then present a compact table: `check | status | details | f
24
24
  - `.claude/get-shit-done/VERSION`
25
25
  - `~/.claude/get-shit-done/VERSION`
26
26
 
27
- ### Engine presence (required for Codex prompts)
28
- - `.claude/get-shit-done/bin/gsd-tools.cjs` OR `.claude/get-shit-done/bin/gsd-tools.js`
29
- - If only `gsd-tools.test.js` exists, treat engine as missing/incomplete.
30
-
31
- ### Project state
32
- - `.planning/` exists (if missing, user hasn’t initialized a project).
27
+ ### Engine presence (required for Codex prompts)
28
+ - `.claude/get-shit-done/bin/gsd-tools.cjs` OR `.claude/get-shit-done/bin/gsd-tools.js`
29
+ - If only `gsd-tools.test.js` exists, treat engine as missing/incomplete.
30
+
31
+ ### Codex agent roles (recommended for model routing)
32
+ - Role registrations exist (first match wins):
33
+ - `.codex/config.toml` contains `[agents.gsd-planner]`
34
+ - `~/.codex/config.toml` contains `[agents.gsd-planner]`
35
+ - Role config layers exist (first match wins):
36
+ - `.codex/agents/gsd-planner.toml`
37
+ - `~/.codex/agents/gsd-planner.toml`
38
+
39
+ ### Project state
40
+ - `.planning/` exists (if missing, user hasn’t initialized a project).
33
41
 
34
42
  ## Update check
35
43
  - Best-effort only; do not fail if offline.
@@ -51,6 +51,7 @@ node <gsd-tools-path> init execute-phase <phase> --raw
51
51
  6. Load .claude/get-shit-done/workflows/execute-phase.md and execute it step-by-step.
52
52
  7. Translate each Task(...) in workflow into:
53
53
  - spawn_agent with the matching role file context from .claude/agents/.
54
+ - Set `agent_type` to the matching GSD role (gsd-*).
54
55
  - wait for each spawned agent and apply returned output before moving forward.
55
56
  8. Preserve all gates and routing from upstream workflow.
56
57
  9. Preserve commit behavior using
@@ -38,6 +38,7 @@ Show available GSD commands and usage guide
38
38
  3. Load .claude/get-shit-done/workflows/help.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init phase-op [after-phase] --raw
38
38
  3. Load .claude/get-shit-done/workflows/insert-phase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init phase-op [argument] --raw
38
38
  3. Load .claude/get-shit-done/workflows/list-phase-assumptions.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init map-codebase --raw
38
38
  3. Load .claude/get-shit-done/workflows/map-codebase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -46,6 +46,7 @@ node <gsd-tools-path> init new-milestone --raw
46
46
  Then summarize the chosen direction and ask for confirmation.
47
47
  5. Translate each Task(...) in workflow into:
48
48
  - spawn_agent with the matching role file context from .claude/agents/.
49
+ - Set `agent_type` to the matching GSD role (gsd-*).
49
50
  - wait for each spawned agent and apply returned output before moving forward.
50
51
  6. Preserve all gates and routing from upstream workflow.
51
52
  7. Before reporting success, verify `.planning/ROADMAP.md` exists. If missing, treat as blocked and continue workflow remediation.
@@ -38,6 +38,7 @@ node <gsd-tools-path> init new-project --raw
38
38
  3. Load .claude/get-shit-done/workflows/new-project.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> state load --raw
38
38
  3. Load .claude/get-shit-done/workflows/pause-work.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init milestone-op --raw
38
38
  3. Load .claude/get-shit-done/workflows/plan-milestone-gaps.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init plan-phase [phase] --include state,roadmap,requiremen
38
38
  3. Load .claude/get-shit-done/workflows/plan-phase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init progress --include state,roadmap,project,config --raw
38
38
  3. Load .claude/get-shit-done/workflows/progress.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init quick "[argument]" --raw
38
38
  3. Load .claude/get-shit-done/workflows/quick.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init phase-op [argument] --raw
38
38
  3. Load .claude/get-shit-done/workflows/remove-phase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init phase-op [argument] --raw
38
38
  3. Load .claude/get-shit-done/workflows/research-phase.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init resume --raw
38
38
  3. Load .claude/get-shit-done/workflows/resume-project.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> state load --raw
38
38
  3. Load .claude/get-shit-done/workflows/set-profile.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> config-ensure-section --raw
38
38
  3. Load .claude/get-shit-done/workflows/settings.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -44,6 +44,7 @@ Update GSD to latest version with changelog display
44
44
  3. Load .claude/get-shit-done/workflows/update.md and execute it step-by-step.
45
45
  4. Translate each Task(...) in workflow into:
46
46
  - spawn_agent with the matching role file context from .claude/agents/.
47
+ - Set `agent_type` to the matching GSD role (gsd-*).
47
48
  - wait for each spawned agent and apply returned output before moving forward.
48
49
  5. Preserve all gates and routing from upstream workflow.
49
50
  6. Preserve commit behavior using
@@ -38,6 +38,7 @@ node <gsd-tools-path> init verify-work [phase] --raw
38
38
  3. Load .claude/get-shit-done/workflows/verify-work.md and execute it step-by-step.
39
39
  4. Translate each Task(...) in workflow into:
40
40
  - spawn_agent with the matching role file context from .claude/agents/.
41
+ - Set `agent_type` to the matching GSD role (gsd-*).
41
42
  - wait for each spawned agent and apply returned output before moving forward.
42
43
  5. Preserve all gates and routing from upstream workflow.
43
44
  6. Preserve commit behavior using
@@ -21,20 +21,25 @@ Use this skill to run `gsd-*` prompts under `Codex` while preserving upstream GS
21
21
  4. Preserve step ordering and gate behavior from workflow files.
22
22
  5. User-facing guidance should recommend `/prompts:gsd-*` prompts (Codex) and `/gsd:*` commands (Claude), not internal `node ... gsd-tools ...` plumbing.
23
23
 
24
- ## Mandatory codex translations
25
- - Replace each `Task(...)` with: `spawn_agent` + `wait`.
26
- - Replace Bash/JQ patterns with PowerShell and `ConvertFrom-Json`.
27
- - Replace AskUserQuestion interactions with direct user prompts in chat.
24
+ ## Mandatory codex translations
25
+ - Replace each `Task(...)` with: `spawn_agent` + `wait`.
26
+ - Replace Bash/JQ patterns with PowerShell and `ConvertFrom-Json`.
27
+ - Replace AskUserQuestion interactions with direct user prompts in chat.
28
+ - GSD Codex agent roles route models per role via `.codex/agents/gsd-*.toml`:
29
+ - Opus-tier work uses `gpt-5.3-codex` (`xhigh` reasoning effort)
30
+ - Sonnet-tier work uses `gpt-5.3-spark` (`xhigh` reasoning effort)
31
+ - Haiku-tier work uses `gpt-5.1-codex-mini` (`high` reasoning effort)
28
32
 
29
- ## Subagent lifecycle (required)
30
- - Spawn only when the upstream workflow explicitly defines a `Task(...)` role.
31
- - For each spawned subagent:
32
- - Start with `spawn_agent` and provide the role source from `.claude/agents/gsd-*.md`.
33
- - Do not set `agent_type` to a GSD role. Codex only accepts `default`, `explorer`, or `worker` (or omit `agent_type`).
34
- - Wait for completion before proceeding: `wait`.
35
- - Explicitly close the agent after it finishes (`close_agent`) to release resources.
36
- - Keep prompt-level sequencing intact; do not continue to subsequent steps until waiting + closure are complete.
37
- - If an agent fails or exceeds retry policy, stop that phase of workflow and surface a clear remediation step.
33
+ ## Subagent lifecycle (required)
34
+ - Spawn only when the upstream workflow explicitly defines a `Task(...)` role.
35
+ - For each spawned subagent:
36
+ - Start with `spawn_agent` and provide the role source from `.claude/agents/gsd-*.md`.
37
+ - Set `agent_type` to the matching GSD role name (for example: `gsd-planner`, `gsd-executor`).
38
+ - These roles are registered under `[agents.*]` in `.codex/config.toml` and map to per-role Codex model settings via `.codex/agents/*.toml`.
39
+ - Wait for completion before proceeding: `wait`.
40
+ - Explicitly close the agent after it finishes (`close_agent`) to release resources.
41
+ - Keep prompt-level sequencing intact; do not continue to subsequent steps until waiting + closure are complete.
42
+ - If an agent fails or exceeds retry policy, stop that phase of workflow and surface a clear remediation step.
38
43
 
39
44
  ## Required GSD roles (must map by name)
40
45
  - `gsd-project-researcher`
@@ -19,7 +19,13 @@
19
19
  ## Subagent mapping
20
20
  - `subagent_type=gsd-*` maps to equivalent role contract in `.claude/agents/gsd-*.md`.
21
21
  - Unspecified `subagent_type` values default to command-context Codex agent behavior.
22
- - Do not pass `agent_type=gsd-*` to `spawn_agent`. Codex only accepts `default`, `explorer`, or `worker` (or omit `agent_type`).
22
+ - Pass `agent_type=gsd-*` to `spawn_agent` so Codex can apply the matching role config.
23
+ - GSD Codex roles are declared under `[agents.gsd-*]` in `.codex/config.toml`.
24
+ - Each role points to a role config layer in `.codex/agents/gsd-*.toml` (used to route models and other Codex settings per role).
25
+ - GSD model alias mapping (implemented by the default role config layers):
26
+ - `inherit` (opus tier) -> `gpt-5.3-codex` with `xhigh` reasoning effort
27
+ - `sonnet` -> `gpt-5.3-spark` with `xhigh` reasoning effort
28
+ - `haiku` -> `gpt-5.1-codex-mini` with `high` reasoning effort
23
29
 
24
30
  ## Required GSD subagents
25
31
  - `gsd-project-researcher`
package/README.md CHANGED
@@ -4,11 +4,11 @@ This repository packages the get-shit-done (GSD) workflow for Codex. It installs
4
4
 
5
5
  Use this fork if you want the GSD workflow inside Codex with a simple installer that works for a single project or your home directory.
6
6
 
7
- ## Quick Install
8
-
9
- ```bash
10
- npx gsd-codex-cli@latest --path .
11
- ```
7
+ ## Quick Install
8
+
9
+ ```bash
10
+ npx gsd-codex-cli@latest --path .
11
+ ```
12
12
 
13
13
  Install globally (prompts available from any project):
14
14
 
@@ -22,15 +22,18 @@ You can combine both:
22
22
  npx gsd-codex-cli@latest --path . --global
23
23
  ```
24
24
 
25
- ## What Gets Installed
26
-
27
- The installer copies these directories into the target location:
28
-
29
- - `.codex/prompts` and `.codex/skills` for Codex commands
30
- - `.claude/get-shit-done` for workflow references
31
- - `.claude/agents` for agent definitions
32
-
33
- This fork is Codex-first, but the Claude assets are kept alongside for compatibility with the upstream workflow files.
25
+ ## What Gets Installed
26
+
27
+ The installer copies these directories into the target location:
28
+
29
+ - `.codex/prompts` and `.codex/skills` for Codex commands
30
+ - `.codex/agents` for Codex agent roles (model routing)
31
+ - `.claude/get-shit-done` for workflow references
32
+ - `.claude/agents` for agent definitions
33
+
34
+ This fork is Codex-first, but the Claude assets are kept alongside for compatibility with the upstream workflow files.
35
+
36
+ The installer also registers GSD agent roles under `[agents.gsd-*]` in your Codex config (`.codex/config.toml` for local installs and `~/.codex/config.toml` for global installs). It only appends missing sections.
34
37
 
35
38
  ## Using the Prompts
36
39
 
@@ -50,13 +53,21 @@ Re-run the installer to update your local or global install. It overwrites the e
50
53
  npx gsd-codex-cli@latest --path . --global
51
54
  ```
52
55
 
53
- ## CLI Options
54
-
55
- ```
56
- --path <dir> Install into a specific directory (defaults to current directory)
57
- --global Also install to your home directory (~/.codex and ~/.claude)
58
- --help Show help
59
- ```
56
+ ## CLI Options
57
+
58
+ ```
59
+ --path <target-dir> Install into this directory (defaults to current directory)
60
+ --global Also install to your home directory
61
+ --help Show help
62
+ ```
63
+
64
+ ## Examples
65
+
66
+ ```bash
67
+ npx gsd-codex-cli@latest --path .
68
+ npx gsd-codex-cli@latest --global
69
+ npx gsd-codex-cli@latest --path . --global
70
+ ```
60
71
 
61
72
  ## Development
62
73
 
@@ -1,23 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const fs = require('fs');
4
- const path = require('path');
5
- const os = require('os');
6
-
7
- const args = process.argv.slice(2);
8
- const pkg = require('../package.json');
9
- const repoRoot = path.resolve(__dirname, '..');
10
-
11
- const helpText = `
12
- ${pkg.name} v${pkg.version}
13
-
14
- Usage:
15
- ${pkg.name} [--path <target-dir>] [--help]
16
-
17
- Options:
18
- --path <target-dir> Install into this directory (defaults to current directory)
19
- --global Also install .claude to your home directory (for manual sharing)
20
- --help, -h Show this help message
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+
7
+ const args = process.argv.slice(2);
8
+ const pkg = require('../package.json');
9
+ const repoRoot = path.resolve(__dirname, '..');
10
+
11
+ const GSD_AGENT_ROLES = [
12
+ { name: 'gsd-project-researcher', description: 'GSD role: project researcher.' },
13
+ { name: 'gsd-research-synthesizer', description: 'GSD role: research synthesizer.' },
14
+ { name: 'gsd-roadmapper', description: 'GSD role: roadmap planning.' },
15
+ { name: 'gsd-phase-researcher', description: 'GSD role: phase research.' },
16
+ { name: 'gsd-planner', description: 'GSD role: phase planning.' },
17
+ { name: 'gsd-plan-checker', description: 'GSD role: plan verification.' },
18
+ { name: 'gsd-executor', description: 'GSD role: plan execution.' },
19
+ { name: 'gsd-verifier', description: 'GSD role: execution verification.' },
20
+ { name: 'gsd-debugger', description: 'GSD role: debugging.' },
21
+ { name: 'gsd-integration-checker', description: 'GSD role: integration verification.' },
22
+ { name: 'gsd-codebase-mapper', description: 'GSD role: codebase mapping.' },
23
+ ];
24
+
25
+ const helpText = `
26
+ ${pkg.name} v${pkg.version}
27
+
28
+ Usage:
29
+ ${pkg.name} [--path <target-dir>] [--global] [--help]
30
+
31
+ Options:
32
+ --path <target-dir> Install into this directory (defaults to current directory)
33
+ --global Also install .claude to your home directory (for manual sharing)
34
+ --help, -h Show this help message
21
35
 
22
36
  Examples:
23
37
  npx gsd-codex-cli@latest --path .
@@ -43,21 +57,57 @@ if (pathArgIndex !== -1) {
43
57
  targetDir = path.resolve(process.cwd(), userPath);
44
58
  }
45
59
 
46
- const installGlobal = args.includes('--global');
60
+ const installGlobal = args.includes('--global');
47
61
 
48
62
  function copyRecursive(source, destination) {
49
63
  if (!fs.existsSync(source)) return;
50
64
  fs.cpSync(source, destination, { recursive: true, force: true });
51
65
  }
52
66
 
53
- function ensureDir(dirPath) {
54
- fs.mkdirSync(dirPath, { recursive: true });
55
- }
56
-
57
- function resolveSourceDir(repoRelative, fallbackRelative) {
58
- const primary = path.join(repoRoot, repoRelative);
59
- const fallback = fallbackRelative ? path.join(repoRoot, fallbackRelative) : null;
60
-
67
+ function ensureDir(dirPath) {
68
+ fs.mkdirSync(dirPath, { recursive: true });
69
+ }
70
+
71
+ function escapeRegExp(value) {
72
+ // Escape special regex characters.
73
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
74
+ }
75
+
76
+ function ensureCodexConfigHasGsdAgentRoles(codexDir) {
77
+ const configPath = path.join(codexDir, 'config.toml');
78
+ const existing = fs.existsSync(configPath) ? fs.readFileSync(configPath, 'utf8') : '';
79
+ const eol = existing.includes('\r\n') ? '\r\n' : '\n';
80
+
81
+ const blocks = [];
82
+ for (const role of GSD_AGENT_ROLES) {
83
+ const header = `[agents.${role.name}]`;
84
+ const headerRegex = new RegExp(`^\\s*\\[agents\\.${escapeRegExp(role.name)}\\]\\s*$`, 'm');
85
+ if (headerRegex.test(existing)) continue;
86
+
87
+ blocks.push([
88
+ header,
89
+ `description = "${role.description}"`,
90
+ `config_file = "./agents/${role.name}.toml"`,
91
+ ].join(eol));
92
+ }
93
+
94
+ if (blocks.length === 0) {
95
+ return { changed: false, added_roles: [] };
96
+ }
97
+
98
+ let next = existing;
99
+ if (next.length > 0 && !next.endsWith(eol)) next += eol;
100
+ if (next.length > 0 && !next.endsWith(eol + eol)) next += eol;
101
+ next += blocks.join(eol + eol) + eol;
102
+
103
+ fs.writeFileSync(configPath, next, 'utf8');
104
+ return { changed: true, added_roles: blocks.map(b => b.split(eol, 1)[0]) };
105
+ }
106
+
107
+ function resolveSourceDir(repoRelative, fallbackRelative) {
108
+ const primary = path.join(repoRoot, repoRelative);
109
+ const fallback = fallbackRelative ? path.join(repoRoot, fallbackRelative) : null;
110
+
61
111
  if (fs.existsSync(primary)) return primary;
62
112
  if (fallback && fs.existsSync(fallback)) return fallback;
63
113
 
@@ -65,10 +115,10 @@ function resolveSourceDir(repoRelative, fallbackRelative) {
65
115
  throw new Error(`Missing source directory "${repoRelative}"${fallbackMessage} in repository root ${repoRoot}`);
66
116
  }
67
117
 
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');
118
+ function copyCodexToDirectory(baseDir) {
119
+ const targetCodex = path.join(baseDir, '.codex');
120
+ const targetClaude = path.join(baseDir, '.claude');
121
+ const sourceCodex = path.join(repoRoot, '.codex');
72
122
  const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
73
123
  const sourceAgents = resolveSourceDir('agents', '.claude/agents');
74
124
  const versionDest = path.join(targetClaude, 'get-shit-done', 'VERSION');
@@ -77,31 +127,39 @@ function copyCodexToDirectory(baseDir) {
77
127
  ensureDir(baseDir);
78
128
  ensureDir(targetCodex);
79
129
  ensureDir(targetClaude);
80
-
81
- copyRecursive(sourceCodex, targetCodex);
82
- copyRecursive(sourceGetShitDone, path.join(targetClaude, 'get-shit-done'));
83
- copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
84
- ensureDir(path.dirname(versionDest));
85
- fs.writeFileSync(versionDest, `${pkg.version}\n`);
86
- ensureDir(path.dirname(codexVersionDest));
87
- fs.writeFileSync(codexVersionDest, `${pkg.version}\n`);
88
- }
89
-
90
- copyCodexToDirectory(targetDir);
91
-
92
- if (installGlobal) {
93
- // Global installs should place prompts at ~/.codex/prompts (not ~/.codex/.codex/prompts).
94
- const globalBase = os.homedir();
95
- copyCodexToDirectory(globalBase);
130
+
131
+ copyRecursive(sourceCodex, targetCodex);
132
+ copyRecursive(sourceGetShitDone, path.join(targetClaude, 'get-shit-done'));
133
+ copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
134
+ ensureCodexConfigHasGsdAgentRoles(targetCodex);
135
+ ensureDir(path.dirname(versionDest));
136
+ fs.writeFileSync(versionDest, `${pkg.version}\n`);
137
+ ensureDir(path.dirname(codexVersionDest));
138
+ fs.writeFileSync(codexVersionDest, `${pkg.version}\n`);
96
139
  }
97
140
 
98
- console.log(`\n${pkg.name}@${pkg.version} installed to:`);
99
- console.log(` local: ${targetDir}`);
100
- if (installGlobal) {
101
- console.log(' global: ~/.codex');
102
- }
103
- console.log('\nNext steps:');
104
- console.log(' 1) Open your project in Codex');
105
- console.log(' 2) Run /prompts:gsd-new-project, then /prompts:gsd-discuss-phase, /prompts:gsd-plan-phase, /prompts:gsd-execute-phase');
106
- console.log(' 3) If something looks off, run /prompts:gsd-doctor');
107
- console.log(' 4) Use .codex/prompts/* for all GSD commands in this fork');
141
+ async function main() {
142
+ copyCodexToDirectory(targetDir);
143
+
144
+ if (installGlobal) {
145
+ // Global installs should place prompts at ~/.codex/prompts (not ~/.codex/.codex/prompts).
146
+ const globalBase = os.homedir();
147
+ copyCodexToDirectory(globalBase);
148
+ }
149
+
150
+ console.log(`\n${pkg.name}@${pkg.version} installed to:`);
151
+ console.log(` local: ${targetDir}`);
152
+ if (installGlobal) {
153
+ console.log(' global: ~/.codex');
154
+ }
155
+ console.log('\nNext steps:');
156
+ console.log(' 1) Open your project in Codex');
157
+ console.log(' 2) Run /prompts:gsd-new-project, then /prompts:gsd-discuss-phase, /prompts:gsd-plan-phase, /prompts:gsd-execute-phase');
158
+ console.log(' 3) If something looks off, run /prompts:gsd-doctor');
159
+ console.log(' 4) Use .codex/prompts/* for all GSD commands in this fork');
160
+ }
161
+
162
+ main().catch((error) => {
163
+ console.error(error instanceof Error ? error.message : error);
164
+ process.exit(1);
165
+ });
@@ -129,29 +129,55 @@ const { execSync } = require('child_process');
129
129
 
130
130
  // ─── Model Profile Table ─────────────────────────────────────────────────────
131
131
 
132
- const MODEL_PROFILES = {
133
- 'gsd-planner': { quality: 'opus', balanced: 'opus', budget: 'sonnet' },
134
- 'gsd-roadmapper': { quality: 'opus', balanced: 'sonnet', budget: 'sonnet' },
135
- 'gsd-executor': { quality: 'opus', balanced: 'sonnet', budget: 'sonnet' },
132
+ const MODEL_PROFILES = {
133
+ 'gsd-planner': { quality: 'opus', balanced: 'opus', budget: 'sonnet' },
134
+ 'gsd-roadmapper': { quality: 'opus', balanced: 'sonnet', budget: 'sonnet' },
135
+ 'gsd-executor': { quality: 'opus', balanced: 'sonnet', budget: 'sonnet' },
136
136
  'gsd-phase-researcher': { quality: 'opus', balanced: 'sonnet', budget: 'haiku' },
137
137
  'gsd-project-researcher': { quality: 'opus', balanced: 'sonnet', budget: 'haiku' },
138
138
  'gsd-research-synthesizer': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku' },
139
139
  'gsd-debugger': { quality: 'opus', balanced: 'sonnet', budget: 'sonnet' },
140
140
  'gsd-codebase-mapper': { quality: 'sonnet', balanced: 'haiku', budget: 'haiku' },
141
141
  'gsd-verifier': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku' },
142
- 'gsd-plan-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku' },
143
- 'gsd-integration-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku' },
144
- };
142
+ 'gsd-plan-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku' },
143
+ 'gsd-integration-checker': { quality: 'sonnet', balanced: 'sonnet', budget: 'haiku' },
144
+ };
145
+
146
+ const CODEX_MODEL_MAP = {
147
+ // Opus-tier aliases resolve to `inherit` in GSD, then map to Codex 5.3 at xhigh effort.
148
+ inherit: { model: 'gpt-5.3-codex', reasoning_effort: 'xhigh' },
149
+ // Sonnet-tier aliases map to Spark 5.3 at xhigh effort.
150
+ sonnet: { model: 'gpt-5.3-spark', reasoning_effort: 'xhigh' },
151
+ // Haiku-tier aliases map to codex-mini at high effort.
152
+ haiku: { model: 'gpt-5.1-codex-mini', reasoning_effort: 'high' },
153
+ };
145
154
 
146
155
  // ─── Helpers ──────────────────────────────────────────────────────────────────
147
156
 
148
- function parseIncludeFlag(args) {
157
+ function parseIncludeFlag(args) {
149
158
  const includeIndex = args.indexOf('--include');
150
159
  if (includeIndex === -1) return new Set();
151
160
  const includeValue = args[includeIndex + 1];
152
161
  if (!includeValue) return new Set();
153
162
  return new Set(includeValue.split(',').map(s => s.trim()));
154
- }
163
+ }
164
+
165
+ function codexModelSpecFromAlias(alias) {
166
+ if (!alias) return null;
167
+ const normalized = String(alias).toLowerCase() === 'opus' ? 'inherit' : String(alias).toLowerCase();
168
+ return CODEX_MODEL_MAP[normalized] || null;
169
+ }
170
+
171
+ function withCodexModelHints(result) {
172
+ for (const [key, value] of Object.entries(result)) {
173
+ if (!key.endsWith('_model') || typeof value !== 'string') continue;
174
+ const spec = codexModelSpecFromAlias(value);
175
+ if (!spec) continue;
176
+ result[`${key}_codex`] = spec.model;
177
+ result[`${key}_reasoning_effort`] = spec.reasoning_effort;
178
+ }
179
+ return result;
180
+ }
155
181
 
156
182
  function safeReadFile(filePath) {
157
183
  try {
@@ -1472,7 +1498,7 @@ function cmdStateRecordSession(cwd, options, raw) {
1472
1498
  }
1473
1499
  }
1474
1500
 
1475
- function cmdResolveModel(cwd, agentType, raw) {
1501
+ function cmdResolveModel(cwd, agentType, raw) {
1476
1502
  if (!agentType) {
1477
1503
  error('agent-type required');
1478
1504
  }
@@ -1480,18 +1506,31 @@ function cmdResolveModel(cwd, agentType, raw) {
1480
1506
  const config = loadConfig(cwd);
1481
1507
  const profile = config.model_profile || 'balanced';
1482
1508
 
1483
- const agentModels = MODEL_PROFILES[agentType];
1484
- if (!agentModels) {
1485
- const result = { model: 'sonnet', profile, unknown_agent: true };
1486
- output(result, raw, 'sonnet');
1487
- return;
1488
- }
1489
-
1490
- const resolved = agentModels[profile] || agentModels['balanced'] || 'sonnet';
1491
- const model = resolved === 'opus' ? 'inherit' : resolved;
1492
- const result = { model, profile };
1493
- output(result, raw, model);
1494
- }
1509
+ const agentModels = MODEL_PROFILES[agentType];
1510
+ if (!agentModels) {
1511
+ const codexSpec = codexModelSpecFromAlias('sonnet');
1512
+ const result = {
1513
+ model: 'sonnet',
1514
+ profile,
1515
+ unknown_agent: true,
1516
+ codex_model: codexSpec?.model || null,
1517
+ codex_reasoning_effort: codexSpec?.reasoning_effort || null,
1518
+ };
1519
+ output(result, raw, 'sonnet');
1520
+ return;
1521
+ }
1522
+
1523
+ const resolved = agentModels[profile] || agentModels['balanced'] || 'sonnet';
1524
+ const model = resolved === 'opus' ? 'inherit' : resolved;
1525
+ const codexSpec = codexModelSpecFromAlias(model);
1526
+ const result = {
1527
+ model,
1528
+ profile,
1529
+ codex_model: codexSpec?.model || null,
1530
+ codex_reasoning_effort: codexSpec?.reasoning_effort || null,
1531
+ };
1532
+ output(result, raw, model);
1533
+ }
1495
1534
 
1496
1535
  function cmdFindPhase(cwd, phase, raw) {
1497
1536
  if (!phase) {
@@ -1998,8 +2037,9 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
1998
2037
  has_checkpoints: hasCheckpoints,
1999
2038
  };
2000
2039
 
2001
- output(result, raw);
2002
- }
2040
+ withCodexModelHints(result);
2041
+ output(result, raw);
2042
+ }
2003
2043
 
2004
2044
  function cmdStateSnapshot(cwd, raw) {
2005
2045
  const statePath = path.join(cwd, '.planning', 'STATE.md');
@@ -2099,8 +2139,9 @@ function cmdStateSnapshot(cwd, raw) {
2099
2139
  session,
2100
2140
  };
2101
2141
 
2102
- output(result, raw);
2103
- }
2142
+ withCodexModelHints(result);
2143
+ output(result, raw);
2144
+ }
2104
2145
 
2105
2146
  function cmdSummaryExtract(cwd, summaryPath, fields, raw) {
2106
2147
  if (!summaryPath) {
@@ -2703,8 +2744,9 @@ function cmdRoadmapAnalyze(cwd, raw) {
2703
2744
  missing_phase_details: missingDetails.length > 0 ? missingDetails : null,
2704
2745
  };
2705
2746
 
2706
- output(result, raw);
2707
- }
2747
+ withCodexModelHints(result);
2748
+ output(result, raw);
2749
+ }
2708
2750
 
2709
2751
  // ─── Phase Add ────────────────────────────────────────────────────────────────
2710
2752
 
@@ -3118,8 +3160,9 @@ function cmdPhaseRemove(cwd, targetPhase, options, raw) {
3118
3160
  state_updated: fs.existsSync(statePath),
3119
3161
  };
3120
3162
 
3121
- output(result, raw);
3122
- }
3163
+ withCodexModelHints(result);
3164
+ output(result, raw);
3165
+ }
3123
3166
 
3124
3167
  // ─── Roadmap Update Plan Progress ────────────────────────────────────────────
3125
3168
 
@@ -3365,8 +3408,9 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
3365
3408
  state_updated: fs.existsSync(statePath),
3366
3409
  };
3367
3410
 
3368
- output(result, raw);
3369
- }
3411
+ withCodexModelHints(result);
3412
+ output(result, raw);
3413
+ }
3370
3414
 
3371
3415
  // ─── Milestone Complete ───────────────────────────────────────────────────────
3372
3416
 
@@ -3502,8 +3546,9 @@ function cmdMilestoneComplete(cwd, version, options, raw) {
3502
3546
  state_updated: fs.existsSync(statePath),
3503
3547
  };
3504
3548
 
3505
- output(result, raw);
3506
- }
3549
+ withCodexModelHints(result);
3550
+ output(result, raw);
3551
+ }
3507
3552
 
3508
3553
  // ─── Validate Consistency ─────────────────────────────────────────────────────
3509
3554
 
@@ -4299,8 +4344,9 @@ function cmdInitExecutePhase(cwd, phase, includes, raw) {
4299
4344
  result.roadmap_content = safeReadFile(path.join(cwd, '.planning', 'ROADMAP.md'));
4300
4345
  }
4301
4346
 
4302
- output(result, raw);
4303
- }
4347
+ withCodexModelHints(result);
4348
+ output(result, raw);
4349
+ }
4304
4350
 
4305
4351
  function cmdInitPlanPhase(cwd, phase, includes, raw) {
4306
4352
  if (!phase) {
@@ -4395,10 +4441,11 @@ function cmdInitPlanPhase(cwd, phase, includes, raw) {
4395
4441
  } catch {}
4396
4442
  }
4397
4443
 
4398
- output(result, raw);
4399
- }
4444
+ withCodexModelHints(result);
4445
+ output(result, raw);
4446
+ }
4400
4447
 
4401
- function cmdInitNewProject(cwd, raw) {
4448
+ function cmdInitNewProject(cwd, raw) {
4402
4449
  const config = loadConfig(cwd);
4403
4450
 
4404
4451
  // Detect Brave Search API key availability
@@ -4451,10 +4498,11 @@ function cmdInitNewProject(cwd, raw) {
4451
4498
  brave_search_available: hasBraveSearch,
4452
4499
  };
4453
4500
 
4454
- output(result, raw);
4455
- }
4501
+ withCodexModelHints(result);
4502
+ output(result, raw);
4503
+ }
4456
4504
 
4457
- function cmdInitNewMilestone(cwd, raw) {
4505
+ function cmdInitNewMilestone(cwd, raw) {
4458
4506
  const config = loadConfig(cwd);
4459
4507
  const milestone = getMilestoneInfo(cwd);
4460
4508
 
@@ -4478,10 +4526,11 @@ function cmdInitNewMilestone(cwd, raw) {
4478
4526
  state_exists: pathExistsInternal(cwd, '.planning/STATE.md'),
4479
4527
  };
4480
4528
 
4481
- output(result, raw);
4482
- }
4529
+ withCodexModelHints(result);
4530
+ output(result, raw);
4531
+ }
4483
4532
 
4484
- function cmdInitQuick(cwd, description, raw) {
4533
+ function cmdInitQuick(cwd, description, raw) {
4485
4534
  const config = loadConfig(cwd);
4486
4535
  const now = new Date();
4487
4536
  const slug = description ? generateSlugInternal(description)?.substring(0, 40) : null;
@@ -4527,8 +4576,9 @@ function cmdInitQuick(cwd, description, raw) {
4527
4576
  planning_exists: pathExistsInternal(cwd, '.planning'),
4528
4577
  };
4529
4578
 
4530
- output(result, raw);
4531
- }
4579
+ withCodexModelHints(result);
4580
+ output(result, raw);
4581
+ }
4532
4582
 
4533
4583
  function cmdInitResume(cwd, raw) {
4534
4584
  const config = loadConfig(cwd);
@@ -4557,7 +4607,7 @@ function cmdInitResume(cwd, raw) {
4557
4607
  output(result, raw);
4558
4608
  }
4559
4609
 
4560
- function cmdInitVerifyWork(cwd, phase, raw) {
4610
+ function cmdInitVerifyWork(cwd, phase, raw) {
4561
4611
  if (!phase) {
4562
4612
  error('phase required for init verify-work');
4563
4613
  }
@@ -4583,8 +4633,9 @@ function cmdInitVerifyWork(cwd, phase, raw) {
4583
4633
  has_verification: phaseInfo?.has_verification || false,
4584
4634
  };
4585
4635
 
4586
- output(result, raw);
4587
- }
4636
+ withCodexModelHints(result);
4637
+ output(result, raw);
4638
+ }
4588
4639
 
4589
4640
  function cmdInitPhaseOp(cwd, phase, raw) {
4590
4641
  const config = loadConfig(cwd);
@@ -4759,7 +4810,7 @@ function cmdInitMilestoneOp(cwd, raw) {
4759
4810
  output(result, raw);
4760
4811
  }
4761
4812
 
4762
- function cmdInitMapCodebase(cwd, raw) {
4813
+ function cmdInitMapCodebase(cwd, raw) {
4763
4814
  const config = loadConfig(cwd);
4764
4815
 
4765
4816
  // Check for existing codebase maps
@@ -4790,10 +4841,11 @@ function cmdInitMapCodebase(cwd, raw) {
4790
4841
  codebase_dir_exists: pathExistsInternal(cwd, '.planning/codebase'),
4791
4842
  };
4792
4843
 
4793
- output(result, raw);
4794
- }
4844
+ withCodexModelHints(result);
4845
+ output(result, raw);
4846
+ }
4795
4847
 
4796
- function cmdInitProgress(cwd, includes, raw) {
4848
+ function cmdInitProgress(cwd, includes, raw) {
4797
4849
  const config = loadConfig(cwd);
4798
4850
  const milestone = getMilestoneInfo(cwd);
4799
4851
 
@@ -4897,8 +4949,9 @@ function cmdInitProgress(cwd, includes, raw) {
4897
4949
  result.config_content = safeReadFile(path.join(cwd, '.planning', 'config.json'));
4898
4950
  }
4899
4951
 
4900
- output(result, raw);
4901
- }
4952
+ withCodexModelHints(result);
4953
+ output(result, raw);
4954
+ }
4902
4955
 
4903
4956
  // ─── CLI Router ───────────────────────────────────────────────────────────────
4904
4957
 
@@ -24,11 +24,22 @@ Task(
24
24
  )
25
25
  ```
26
26
 
27
- **Note:** Opus-tier agents resolve to `"inherit"` (not `"opus"`). This causes the agent to use the parent session's model, avoiding conflicts with organization policies that may block specific opus versions.
27
+ **Note:** Opus-tier agents resolve to `"inherit"` (not `"opus"`). This causes the agent to use the parent session's model, avoiding conflicts with organization policies that may block specific opus versions.
28
+
29
+ ## Codex alias mapping
30
+
31
+ When running under Codex, map the resolved aliases to concrete Codex models:
32
+
33
+ | Alias | Codex model | Reasoning effort |
34
+ |-------|-------------|------------------|
35
+ | `inherit` (`opus` tier) | `gpt-5.3-codex` | `xhigh` |
36
+ | `sonnet` | `gpt-5.3-spark` | `xhigh` |
37
+ | `haiku` | `gpt-5.1-codex-mini` | `high` |
28
38
 
29
39
  ## Usage
30
40
 
31
41
  1. Resolve once at orchestration start
32
42
  2. Store the profile value
33
43
  3. Look up each agent's model from the table when spawning
34
- 4. Pass model parameter to each Task call (values: `"inherit"`, `"sonnet"`, `"haiku"`)
44
+ 4. Pass model parameter to each Task call (values: `"inherit"`, `"sonnet"`, `"haiku"`)
45
+ 5. In Codex mode, translate those aliases with the table above before spawning subagents
package/package.json CHANGED
@@ -1,25 +1,26 @@
1
1
  {
2
- "name": "gsd-codex-cli",
3
- "version": "1.20.11",
2
+ "name": "gsd-codex-cli",
3
+ "version": "1.20.13",
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",
7
7
  "get-shit-done-codex": "bin/install-codex.js",
8
8
  "get-shit-done-cc": "bin/install.js"
9
9
  },
10
- "files": [
11
- "bin",
12
- ".codex",
13
- "commands",
14
- "get-shit-done",
15
- "agents",
16
- "hooks/dist",
17
- "scripts",
18
- "README.md",
19
- "LICENSE",
20
- "CHANGELOG.md",
21
- "!**/*.bak"
22
- ],
10
+ "files": [
11
+ "bin",
12
+ ".codex",
13
+ "commands",
14
+ "get-shit-done",
15
+ "agents",
16
+ "hooks/dist",
17
+ "scripts",
18
+ "README.md",
19
+ "LICENSE",
20
+ "CHANGELOG.md",
21
+ "!**/*.bak",
22
+ "!.codex/gsd/**"
23
+ ],
23
24
  "keywords": [
24
25
  "codex",
25
26
  "claude",