gsd-codex-cli 1.20.10 → 1.20.12

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 (36) hide show
  1. package/.codex/prompts/gsd-add-phase.md +1 -1
  2. package/.codex/prompts/gsd-add-todo.md +1 -1
  3. package/.codex/prompts/gsd-audit-milestone.md +1 -1
  4. package/.codex/prompts/gsd-check-todos.md +1 -1
  5. package/.codex/prompts/gsd-complete-milestone.md +1 -1
  6. package/.codex/prompts/gsd-debug.md +1 -1
  7. package/.codex/prompts/gsd-discuss-phase.md +1 -1
  8. package/.codex/prompts/gsd-doctor.md +20 -20
  9. package/.codex/prompts/gsd-execute-phase.md +1 -1
  10. package/.codex/prompts/gsd-help.md +1 -1
  11. package/.codex/prompts/gsd-insert-phase.md +1 -1
  12. package/.codex/prompts/gsd-list-phase-assumptions.md +1 -1
  13. package/.codex/prompts/gsd-map-codebase.md +1 -1
  14. package/.codex/prompts/gsd-new-milestone.md +16 -7
  15. package/.codex/prompts/gsd-new-project.md +1 -1
  16. package/.codex/prompts/gsd-pause-work.md +1 -1
  17. package/.codex/prompts/gsd-plan-milestone-gaps.md +1 -1
  18. package/.codex/prompts/gsd-plan-phase.md +1 -1
  19. package/.codex/prompts/gsd-progress.md +1 -1
  20. package/.codex/prompts/gsd-quick.md +1 -1
  21. package/.codex/prompts/gsd-remove-phase.md +1 -1
  22. package/.codex/prompts/gsd-research-phase.md +1 -1
  23. package/.codex/prompts/gsd-resume-work.md +1 -1
  24. package/.codex/prompts/gsd-set-profile.md +1 -1
  25. package/.codex/prompts/gsd-settings.md +1 -1
  26. package/.codex/prompts/gsd-update.md +2 -2
  27. package/.codex/prompts/gsd-verify-work.md +1 -1
  28. package/.codex/skills/get-shit-done-codex/SKILL.md +23 -19
  29. package/.codex/skills/get-shit-done-codex/references/compat.md +4 -0
  30. package/README.md +24 -16
  31. package/bin/install-codex.js +61 -54
  32. package/commands/gsd/new-milestone.md +4 -1
  33. package/get-shit-done/bin/gsd-tools.cjs +109 -56
  34. package/get-shit-done/references/model-profile-resolution.md +13 -2
  35. package/get-shit-done/workflows/new-milestone.md +13 -3
  36. package/package.json +1 -1
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -49,5 +49,5 @@ node <gsd-tools-path> commit "message" --files ....
49
49
 
50
50
  ## Completion output
51
51
  - Summarize key artifacts created/updated.
52
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
52
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
53
53
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: `gsd-plan-phase [phase]` (Codex) / `/gsd:plan-phase [phase]` (Claude)
49
+ - Next recommended command: `/prompts:gsd-plan-phase [phase]` (Codex) / `/gsd:plan-phase [phase]` (Claude)
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -1,12 +1,12 @@
1
- ---
2
- description: Diagnose Codex+Claude GSD installation (engine, prompts, versions)
3
- argument-hint: [none]
4
- ---
5
-
6
- $ARGUMENTS
7
-
8
- ## Objective
9
- Diagnose whether this project is set up to run GSD prompts in Codex while remaining compatible with Claude workflows on the same `.planning/` milestone/phases.
1
+ ---
2
+ description: Diagnose Codex+Claude GSD installation (engine, prompts, versions)
3
+ argument-hint: [none]
4
+ ---
5
+
6
+ $ARGUMENTS
7
+
8
+ ## Objective
9
+ Diagnose whether this project is set up to run GSD prompts in Codex while remaining compatible with Claude workflows on the same `.planning/` milestone/phases.
10
10
 
11
11
  ## Compatibility
12
12
  - Use .codex/skills/get-shit-done-codex semantics.
@@ -28,22 +28,22 @@ Run these checks and then present a compact table: `check | status | details | f
28
28
  - `.claude/get-shit-done/bin/gsd-tools.cjs` OR `.claude/get-shit-done/bin/gsd-tools.js`
29
29
  - If only `gsd-tools.test.js` exists, treat engine as missing/incomplete.
30
30
 
31
- ### Project state
32
- - `.planning/` exists (if missing, user hasn’t initialized a project).
33
-
34
- ## Update check
35
- - Best-effort only; do not fail if offline.
36
- ### Update availability (best-effort)
37
- - Latest Codex fork version (do not fail if offline):
38
- - `npm view gsd-codex-cli version`
39
- - If installed Codex fork version is known and differs from latest, surface:
31
+ ### Project state
32
+ - `.planning/` exists (if missing, user hasn’t initialized a project).
33
+
34
+ ## Update check
35
+ - Best-effort only; do not fail if offline.
36
+ ### Update availability (best-effort)
37
+ - Latest Codex fork version (do not fail if offline):
38
+ - `npm view gsd-codex-cli version`
39
+ - If installed Codex fork version is known and differs from latest, surface:
40
40
  - `Update available: {installed} -> {latest}`
41
- - Next: `gsd-update` (Codex) / `/gsd:update` (Claude) or re-run `npx gsd-codex-cli@latest`.
41
+ - Next: `/prompts:gsd-update` (Codex) / `/gsd:update` (Claude) or re-run `npx gsd-codex-cli@latest`.
42
42
 
43
43
  ## Recommended fixes (use the minimum)
44
44
  - If engine missing: `npx gsd-codex-cli@latest --path .` (or `--global`)
45
45
  - If only Claude engine exists and Codex prompts are desired in-project: `npx gsd-codex-cli@latest --path .`
46
- - If `.planning/` missing: run `gsd-new-project` (Codex) / `/gsd:new-project` (Claude)
46
+ - If `.planning/` missing: run `/prompts:gsd-new-project` (Codex) / `/gsd:new-project` (Claude)
47
47
 
48
48
  ## Completion output
49
49
  - Print the table and a single “Next recommended command”:
@@ -59,5 +59,5 @@ node <gsd-tools-path> commit "message" --files ....
59
59
 
60
60
  ## Completion output
61
61
  - Summarize key artifacts created/updated.
62
- - Next recommended command: `gsd-verify-work <phase>` (Codex) / `/gsd:verify-work <phase>` (Claude)
62
+ - Next recommended command: `/prompts:gsd-verify-work <phase>` (Codex) / `/gsd:verify-work <phase>` (Claude)
63
63
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Start a new milestone cycle update PROJECT.md and route to requirements
2
+ description: Start a new milestone cycle end-to-end (questioning -> requirements -> roadmap)
3
3
  argument-hint: "[milestone name, for example v1.1 Notifications]"
4
4
  ---
5
5
 
6
6
  $ARGUMENTS
7
7
 
8
8
  ## Objective
9
- Start a new milestone cycle update PROJECT.md and route to requirements
9
+ Start a new milestone cycle end-to-end (questioning -> requirements -> roadmap)
10
10
 
11
11
  ## Compatibility
12
12
  - Use .codex/skills/get-shit-done-codex semantics.
@@ -22,6 +22,8 @@ Start a new milestone cycle — update PROJECT.md and route to requirements
22
22
  - No jq / bash-only constructs.
23
23
  - Accept natural-language command input; do not require an exact literal argument template.
24
24
  - If a required argument is still missing after extraction, ask one concise clarification question.
25
+ - If `.planning/MILESTONE-CONTEXT.md` is missing, ask options before drafting goals; do not assume milestone scope.
26
+ - Do not complete successfully unless `.planning/ROADMAP.md` exists (or explicit `ROADMAP BLOCKED` is surfaced).
25
27
 
26
28
  ## Subagent lifecycle (required)
27
29
 
@@ -36,15 +38,22 @@ Start a new milestone cycle — update PROJECT.md and route to requirements
36
38
  node <gsd-tools-path> init new-milestone --raw
37
39
 
38
40
  3. Load .claude/get-shit-done/workflows/new-milestone.md and execute it step-by-step.
39
- 4. Translate each Task(...) in workflow into:
41
+ 4. If `.planning/MILESTONE-CONTEXT.md` is absent, run an explicit options question before requirements:
42
+ - "Ship features (Recommended)"
43
+ - "Stabilize quality"
44
+ - "Platform + ops"
45
+ - "Custom scope"
46
+ Then summarize the chosen direction and ask for confirmation.
47
+ 5. Translate each Task(...) in workflow into:
40
48
  - spawn_agent with the matching role file context from .claude/agents/.
41
49
  - wait for each spawned agent and apply returned output before moving forward.
42
- 5. Preserve all gates and routing from upstream workflow.
43
- 6. Preserve commit behavior using
50
+ 6. Preserve all gates and routing from upstream workflow.
51
+ 7. Before reporting success, verify `.planning/ROADMAP.md` exists. If missing, treat as blocked and continue workflow remediation.
52
+ 8. Preserve commit behavior using
44
53
  node <gsd-tools-path> commit "message" --files ....
45
- 7. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
54
+ 9. If commit preflight fails (no git / no commit flag), proceed in read-only mode and report clearly.
46
55
 
47
56
  ## Completion output
48
57
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
58
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
59
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: `gsd-discuss-phase 1` (Codex) / `/gsd:discuss-phase 1` (Claude)
49
+ - Next recommended command: `/prompts:gsd-discuss-phase 1` (Codex) / `/gsd:discuss-phase 1` (Claude)
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: `gsd-execute-phase [phase]` (Codex) / `/gsd:execute-phase [phase]` (Claude)
49
+ - Next recommended command: `/prompts:gsd-execute-phase [phase]` (Codex) / `/gsd:execute-phase [phase]` (Claude)
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -34,7 +34,7 @@ Update GSD to latest version with changelog display
34
34
  - Best-effort only; do not fail if offline.
35
35
  - Check installed Codex fork version from `.codex/gsd/VERSION` (or `~/.codex/gsd/VERSION`).
36
36
  - Check latest published version with `npm view gsd-codex-cli version`.
37
- - If versions differ, surface: "Update available: <installed> -> <latest>. Next: gsd-update (Codex) / /gsd:update (Claude) or re-run npx gsd-codex-cli@latest."
37
+ - If versions differ, surface: "Update available: <installed> -> <latest>. Next: /prompts:gsd-update (Codex) / /gsd:update (Claude) or re-run npx gsd-codex-cli@latest."
38
38
 
39
39
  ## Execution
40
40
  1. No positional argument is required. Read flags from command text if present.
@@ -52,5 +52,5 @@ node <gsd-tools-path> commit "message" --files ....
52
52
 
53
53
  ## Completion output
54
54
  - Summarize key artifacts created/updated.
55
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
55
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
56
56
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -46,5 +46,5 @@ node <gsd-tools-path> commit "message" --files ....
46
46
 
47
47
  ## Completion output
48
48
  - Summarize key artifacts created/updated.
49
- - Next recommended command: use the next user-facing GSD command (Codex prompt name + Claude slash command).
49
+ - Next recommended command: use the next user-facing GSD command (`/prompts:gsd-...` for Codex + `/gsd:...` for Claude).
50
50
  - Never recommend internal `node ... gsd-tools ...` commands to the user.
@@ -14,27 +14,31 @@ Use this skill to run `gsd-*` prompts under `Codex` while preserving upstream GS
14
14
  - Keep `.claude/agents/gsd-*.md` as role contracts for subagents.
15
15
  - Keep `.codex/prompts/gsd-*.md` as Codex-native orchestrators.
16
16
 
17
- ## Core rules
18
- 1. Do not change command semantics.
19
- 2. Do not change source workflow logic unless necessary for Codex command compatibility.
20
- 3. Use workspace-relative paths.
21
- 4. Preserve step ordering and gate behavior from workflow files.
22
- 5. User-facing guidance should recommend `gsd-*` prompts (Codex) and `/gsd:*` commands (Claude), not internal `node ... gsd-tools ...` plumbing.
17
+ ## Core rules
18
+ 1. Do not change command semantics.
19
+ 2. Do not change source workflow logic unless necessary for Codex command compatibility.
20
+ 3. Use workspace-relative paths.
21
+ 4. Preserve step ordering and gate behavior from workflow files.
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
+ - Translate resolved model aliases before Codex subagent spawn:
29
+ - `inherit` (opus tier) -> `gpt-5.3-codex` (`xhigh`)
30
+ - `sonnet` -> `gpt-5.3-spark` (`xhigh`)
31
+ - `haiku` -> `gpt-5.1-codex-mini` (`high`)
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
+ - Do not set `agent_type` to a GSD role. Codex only accepts `default`, `explorer`, or `worker` (or omit `agent_type`).
38
+ - Wait for completion before proceeding: `wait`.
39
+ - Explicitly close the agent after it finishes (`close_agent`) to release resources.
40
+ - Keep prompt-level sequencing intact; do not continue to subsequent steps until waiting + closure are complete.
41
+ - If an agent fails or exceeds retry policy, stop that phase of workflow and surface a clear remediation step.
38
42
 
39
43
  ## Required GSD roles (must map by name)
40
44
  - `gsd-project-researcher`
@@ -20,6 +20,10 @@
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
22
  - Do not pass `agent_type=gsd-*` to `spawn_agent`. Codex only accepts `default`, `explorer`, or `worker` (or omit `agent_type`).
23
+ - Translate GSD model aliases to Codex models when spawning:
24
+ - `inherit` (opus tier) -> `gpt-5.3-codex` with `xhigh` reasoning effort
25
+ - `sonnet` -> `gpt-5.3-spark` with `xhigh` reasoning effort
26
+ - `haiku` -> `gpt-5.1-codex-mini` with `high` reasoning effort
23
27
 
24
28
  ## Required GSD subagents
25
29
  - `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
 
@@ -34,11 +34,11 @@ This fork is Codex-first, but the Claude assets are kept alongside for compatibi
34
34
 
35
35
  ## Using the Prompts
36
36
 
37
- Open your project in Codex and run these prompts from the prompt list:
37
+ Open your project in Codex and run these prompt commands:
38
38
 
39
- - `gsd-new-project`
40
- - `gsd-plan-phase`
41
- - `gsd-execute-phase`
39
+ - `/prompts:gsd-new-project`
40
+ - `/prompts:gsd-plan-phase`
41
+ - `/prompts:gsd-execute-phase`
42
42
 
43
43
  All Codex prompts live in `.codex/prompts`.
44
44
 
@@ -50,13 +50,21 @@ Re-run the installer to update your local or global install. It overwrites the e
50
50
  npx gsd-codex-cli@latest --path . --global
51
51
  ```
52
52
 
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
- ```
53
+ ## CLI Options
54
+
55
+ ```
56
+ --path <target-dir> Install into this directory (defaults to current directory)
57
+ --global Also install to your home directory
58
+ --help Show help
59
+ ```
60
+
61
+ ## Examples
62
+
63
+ ```bash
64
+ npx gsd-codex-cli@latest --path .
65
+ npx gsd-codex-cli@latest --global
66
+ npx gsd-codex-cli@latest --path . --global
67
+ ```
60
68
 
61
69
  ## Development
62
70
 
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const fs = require('fs');
4
- const path = require('path');
5
- const os = require('os');
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
6
 
7
7
  const args = process.argv.slice(2);
8
8
  const pkg = require('../package.json');
@@ -12,17 +12,17 @@ const helpText = `
12
12
  ${pkg.name} v${pkg.version}
13
13
 
14
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
15
+ ${pkg.name} [--path <target-dir>] [--global] [--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
21
21
 
22
- Examples:
23
- npx gsd-codex-cli@latest --path .
24
- npx gsd-codex-cli@latest --path ./my-project
25
- `;
22
+ Examples:
23
+ npx gsd-codex-cli@latest --path .
24
+ npx gsd-codex-cli@latest --path ./my-project
25
+ `;
26
26
 
27
27
  if (args.includes('--help') || args.includes('-h')) {
28
28
  console.log(helpText);
@@ -43,16 +43,16 @@ if (pathArgIndex !== -1) {
43
43
  targetDir = path.resolve(process.cwd(), userPath);
44
44
  }
45
45
 
46
- const installGlobal = args.includes('--global');
46
+ const installGlobal = args.includes('--global');
47
47
 
48
48
  function copyRecursive(source, destination) {
49
49
  if (!fs.existsSync(source)) return;
50
50
  fs.cpSync(source, destination, { recursive: true, force: true });
51
51
  }
52
52
 
53
- function ensureDir(dirPath) {
54
- fs.mkdirSync(dirPath, { recursive: true });
55
- }
53
+ function ensureDir(dirPath) {
54
+ fs.mkdirSync(dirPath, { recursive: true });
55
+ }
56
56
 
57
57
  function resolveSourceDir(repoRelative, fallbackRelative) {
58
58
  const primary = path.join(repoRoot, repoRelative);
@@ -65,43 +65,50 @@ function resolveSourceDir(repoRelative, fallbackRelative) {
65
65
  throw new Error(`Missing source directory "${repoRelative}"${fallbackMessage} in repository root ${repoRoot}`);
66
66
  }
67
67
 
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');
72
- const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
73
- const sourceAgents = resolveSourceDir('agents', '.claude/agents');
74
- const versionDest = path.join(targetClaude, 'get-shit-done', 'VERSION');
75
- const codexVersionDest = path.join(targetCodex, 'gsd', 'VERSION');
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');
72
+ const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
73
+ const sourceAgents = resolveSourceDir('agents', '.claude/agents');
74
+ const versionDest = path.join(targetClaude, 'get-shit-done', 'VERSION');
75
+ const codexVersionDest = path.join(targetCodex, 'gsd', 'VERSION');
76
+
77
+ ensureDir(baseDir);
78
+ ensureDir(targetCodex);
79
+ 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
+ async function main() {
91
+ copyCodexToDirectory(targetDir);
76
92
 
77
- ensureDir(baseDir);
78
- ensureDir(targetCodex);
79
- ensureDir(targetClaude);
93
+ if (installGlobal) {
94
+ // Global installs should place prompts at ~/.codex/prompts (not ~/.codex/.codex/prompts).
95
+ const globalBase = os.homedir();
96
+ copyCodexToDirectory(globalBase);
97
+ }
80
98
 
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`);
99
+ console.log(`\n${pkg.name}@${pkg.version} installed to:`);
100
+ console.log(` local: ${targetDir}`);
101
+ if (installGlobal) {
102
+ console.log(' global: ~/.codex');
103
+ }
104
+ console.log('\nNext steps:');
105
+ console.log(' 1) Open your project in Codex');
106
+ console.log(' 2) Run /prompts:gsd-new-project, then /prompts:gsd-discuss-phase, /prompts:gsd-plan-phase, /prompts:gsd-execute-phase');
107
+ console.log(' 3) If something looks off, run /prompts:gsd-doctor');
108
+ console.log(' 4) Use .codex/prompts/* for all GSD commands in this fork');
88
109
  }
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);
96
- }
97
-
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 prompt gsd-new-project, then gsd-discuss-phase, gsd-plan-phase, gsd-execute-phase');
106
- console.log(' 3) If something looks off, run prompt gsd-doctor');
107
- console.log(' 4) Use .codex/prompts/* for all GSD commands in this fork');
110
+
111
+ main().catch((error) => {
112
+ console.error(error instanceof Error ? error.message : error);
113
+ process.exit(1);
114
+ });
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: gsd:new-milestone
3
- description: Start a new milestone cycle update PROJECT.md and route to requirements
3
+ description: Start a new milestone cycle end-to-end (questioning -> requirements -> roadmap)
4
4
  argument-hint: "[milestone name, e.g., 'v1.1 Notifications']"
5
5
  allowed-tools:
6
6
  - Read
@@ -48,4 +48,7 @@ Milestone name: $ARGUMENTS (optional - will prompt if not provided)
48
48
  <process>
49
49
  Execute the new-milestone workflow from @~/.claude/get-shit-done/workflows/new-milestone.md end-to-end.
50
50
  Preserve all workflow gates (validation, questioning, research, requirements, roadmap approval, commits).
51
+ Hard gates:
52
+ - If `.planning/MILESTONE-CONTEXT.md` is missing, present milestone direction options and capture user confirmation before defining requirements.
53
+ - Do not finish successfully unless `.planning/ROADMAP.md` exists (or explicit blocked reason is reported).
51
54
  </process>
@@ -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
@@ -26,9 +26,15 @@ Read all files referenced by the invoking prompt's execution_context before star
26
26
  - Present summary for confirmation
27
27
 
28
28
  **If no context file:**
29
- - Present what shipped in last milestone
30
- - Ask: "What do you want to build next?"
31
- - Use AskUserQuestion to explore features, priorities, constraints, scope
29
+ - Present what shipped in last milestone plus pending todos/blockers.
30
+ - Run an explicit AskUserQuestion with milestone direction options before drafting scope:
31
+ - "Ship features (Recommended)" Build the next user-facing capability set
32
+ - "Stabilize quality" — Focus on bug fixes, reliability, and hardening
33
+ - "Platform + ops" — Improve architecture, performance, tooling, and observability
34
+ - "Custom scope" — User provides bespoke milestone goals
35
+ - If "Custom scope", ask one focused follow-up question and capture the goals verbatim.
36
+ - Summarize the selected direction as draft milestone goals and ask for confirm/adjust.
37
+ - Hard gate: do not continue to Step 3 until user confirms goals.
32
38
 
33
39
  ## 3. Determine Milestone Version
34
40
 
@@ -319,6 +325,9 @@ Success criteria:
319
325
  **If "Adjust":** Get notes, re-spawn roadmapper with revision context, loop until approved.
320
326
  **If "Review":** Display raw ROADMAP.md, re-ask.
321
327
 
328
+ **Hard gate before completion:** verify `.planning/ROADMAP.md` exists on disk.
329
+ - If missing, treat as `## ROADMAP BLOCKED` (agent returned success without writing file), explain the issue, and re-spawn roadmapper with explicit instruction to write `.planning/ROADMAP.md`, `.planning/STATE.md`, and REQUIREMENTS traceability updates before returning.
330
+
322
331
  **Commit roadmap** (after approval):
323
332
  ```bash
324
333
  node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: create milestone v[X.Y] roadmap ([N] phases)" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md
@@ -364,6 +373,7 @@ Also: `/gsd:plan-phase [N]` — skip discussion, plan directly
364
373
  - [ ] REQUIREMENTS.md created with REQ-IDs
365
374
  - [ ] gsd-roadmapper spawned with phase numbering context
366
375
  - [ ] Roadmap files written immediately (not draft)
376
+ - [ ] `.planning/ROADMAP.md` exists on disk before Done
367
377
  - [ ] User feedback incorporated (if any)
368
378
  - [ ] ROADMAP.md phases continue from previous milestone
369
379
  - [ ] All commits made (if planning docs committed)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-codex-cli",
3
- "version": "1.20.10",
3
+ "version": "1.20.12",
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",