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.
- package/.codex/agents/gsd-codebase-mapper.toml +2 -0
- package/.codex/agents/gsd-debugger.toml +2 -0
- package/.codex/agents/gsd-executor.toml +2 -0
- package/.codex/agents/gsd-integration-checker.toml +2 -0
- package/.codex/agents/gsd-phase-researcher.toml +2 -0
- package/.codex/agents/gsd-plan-checker.toml +2 -0
- package/.codex/agents/gsd-planner.toml +2 -0
- package/.codex/agents/gsd-project-researcher.toml +2 -0
- package/.codex/agents/gsd-research-synthesizer.toml +2 -0
- package/.codex/agents/gsd-roadmapper.toml +2 -0
- package/.codex/agents/gsd-verifier.toml +2 -0
- package/.codex/prompts/gsd-add-phase.md +1 -0
- package/.codex/prompts/gsd-add-todo.md +1 -0
- package/.codex/prompts/gsd-audit-milestone.md +1 -0
- package/.codex/prompts/gsd-check-todos.md +1 -0
- package/.codex/prompts/gsd-complete-milestone.md +1 -0
- package/.codex/prompts/gsd-debug.md +1 -0
- package/.codex/prompts/gsd-discuss-phase.md +1 -0
- package/.codex/prompts/gsd-doctor.md +14 -6
- package/.codex/prompts/gsd-execute-phase.md +1 -0
- package/.codex/prompts/gsd-help.md +1 -0
- package/.codex/prompts/gsd-insert-phase.md +1 -0
- package/.codex/prompts/gsd-list-phase-assumptions.md +1 -0
- package/.codex/prompts/gsd-map-codebase.md +1 -0
- package/.codex/prompts/gsd-new-milestone.md +1 -0
- package/.codex/prompts/gsd-new-project.md +1 -0
- package/.codex/prompts/gsd-pause-work.md +1 -0
- package/.codex/prompts/gsd-plan-milestone-gaps.md +1 -0
- package/.codex/prompts/gsd-plan-phase.md +1 -0
- package/.codex/prompts/gsd-progress.md +1 -0
- package/.codex/prompts/gsd-quick.md +1 -0
- package/.codex/prompts/gsd-remove-phase.md +1 -0
- package/.codex/prompts/gsd-research-phase.md +1 -0
- package/.codex/prompts/gsd-resume-work.md +1 -0
- package/.codex/prompts/gsd-set-profile.md +1 -0
- package/.codex/prompts/gsd-settings.md +1 -0
- package/.codex/prompts/gsd-update.md +1 -0
- package/.codex/prompts/gsd-verify-work.md +1 -0
- package/.codex/skills/get-shit-done-codex/SKILL.md +18 -13
- package/.codex/skills/get-shit-done-codex/references/compat.md +7 -1
- package/README.md +32 -21
- package/bin/install-codex.js +115 -57
- package/get-shit-done/bin/gsd-tools.cjs +109 -56
- package/get-shit-done/references/model-profile-resolution.md +13 -2
- package/package.json +16 -15
|
@@ -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
|
-
###
|
|
32
|
-
-
|
|
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
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
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
|
-
-
|
|
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
|
-
- `.
|
|
31
|
-
- `.claude/
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
57
|
-
--global
|
|
58
|
-
--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
|
|
package/bin/install-codex.js
CHANGED
|
@@ -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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
console.log(
|
|
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
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|