orcastrator 0.2.23 → 0.2.24

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bradley Inniss
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  # Orca
8
8
 
9
- Coordinated agent run harness. Breaks down a task into a task graph, then executes it end-to-end via a persistent [Codex](https://github.com/ratley/codex-client) session with full context across tasks.
9
+ Coordinated agent run harness. Breaks a task into a graph, then executes it end-to-end via a persistent [Codex](https://github.com/ratley/codex-client) session.
10
10
 
11
11
  ## Install
12
12
 
@@ -14,449 +14,267 @@ Coordinated agent run harness. Breaks down a task into a task graph, then execut
14
14
  npm install -g orcastrator
15
15
  ```
16
16
 
17
- ## Run A Task
18
-
19
- Start with a plain-language task:
17
+ ## Quick Start
20
18
 
21
19
  ```bash
22
- orca "add auth to the app"
23
- ```
20
+ # 1. Go into a git repo
21
+ cd /path/to/repo
24
22
 
25
- Orca will create a run, plan tasks, run a pre-execution review/improvement pass on the task graph, execute the reviewed graph, and persist run state.
23
+ # 2. Run a task
24
+ orca "add input validation to the signup form in src/auth/signup.ts"
26
25
 
27
- ### Pre-execution review-improvement stage
26
+ # 3. Check status
27
+ orca status --last
28
28
 
29
- After planning, Orca runs a structured review pass that can edit the task graph before execution starts. The review output is schema-validated and supports concrete graph operations:
30
-
31
- - update task fields (`name`, `description`, `acceptance_criteria`)
32
- - add/remove task
33
- - add/remove dependency
29
+ # 4. Once done, open a PR
30
+ orca pr create --last
31
+ ```
34
32
 
35
- By default, Orca applies valid review improvements and continues execution. The edited graph is re-validated as a DAG. If the review stage output is invalid, Orca fails with an actionable error (`review.plan.onInvalid: "fail"`). Set `review.plan.onInvalid: "warn_skip"` to log a warning and continue with the original planner graph instead.
33
+ **Write specific goals.** Orca passes your task to a planner vague input produces vague plans.
36
34
 
37
- ### Post-execution review / fix cycles
35
+ - Bad: `"fix the bug"`
36
+ - Good: `"Fix the TypeError thrown on logout with an expired token in src/auth/session.ts. Ensure existing tests pass and add a regression test."`
38
37
 
39
- After task execution, Orca can run deterministic validation commands, then ask Codex to review findings and optionally auto-fix issues in bounded cycles.
38
+ ---
40
39
 
41
- - `review.execution.enabled` (default `true`)
42
- - `review.execution.maxCycles` (default `2`)
43
- - `review.execution.onFindings`:
44
- - `auto_fix` (default): apply fixes and continue until clean or max cycles
45
- - `report_only`: report findings and stop
46
- - `fail`: mark run failed when findings exist
47
- - `review.execution.validator.auto` (default `true`): auto-detect validator commands from `package.json`
48
- - Caveat: `ORCA_SKIP_VALIDATORS=1` forces this to `false` at runtime
49
- - `review.execution.validator.commands` (optional explicit command list)
50
- - `review.execution.prompt` (optional custom reviewer instruction)
40
+ ## Common Workflows
51
41
 
52
- When using the Codex executor, Orca enforces a strict reviewer JSON schema (`{summary, findings, fixed}`) as the primary path. If the first response is malformed, Orca issues one deterministic repair prompt (max 2 attempts total); if still invalid, it emits an `onFindings` event with an explicit parse error and stops auto-fix progression for that cycle.
42
+ ### Status & monitoring
53
43
 
54
- Run the dedicated integration coverage for this JSON retry/validation path with `npm run test:postexec-json`.
44
+ ```bash
45
+ orca status # list all runs
46
+ orca status --last # most recent run
47
+ orca status --run <run-id> # specific run
48
+ orca list # alias for status
49
+ ```
55
50
 
56
- Orca then prints a final post-execution review summary.
51
+ Run states: `planning` `running` `completed` | `failed` | `cancelled` | `waiting_for_answer`
57
52
 
58
- ## Spec And Plan Files
53
+ ### Answering questions
59
54
 
60
- Use a spec/plan markdown file when you already have a written breakdown:
55
+ If a run hits `waiting_for_answer`, it's blocked until you respond:
61
56
 
62
57
  ```bash
63
- orca --spec ./specs/feature.md
64
- orca --plan ./specs/feature.md
58
+ orca status --last # read the question
59
+ orca answer <run-id> "yes, use migration A" # unblock it
65
60
  ```
66
61
 
67
- If you only want planning (no execution):
62
+ ### Spec / plan files
63
+
64
+ Use a markdown spec instead of an inline task:
68
65
 
69
66
  ```bash
70
- orca plan --spec ./specs/feature.md
67
+ orca --spec ./specs/feature.md # plan + execute
68
+ orca plan --spec ./specs/feature.md # plan only, no execution
71
69
  ```
72
70
 
73
- ## Run Management
71
+ ### Failure & recovery
74
72
 
75
73
  ```bash
76
- orca status # list all runs (summary table)
77
- orca status --last # status of the most recent run
78
- orca status --run <run-id> # status of a specific run
79
-
80
- orca list
74
+ orca resume --last # retry from last checkpoint
75
+ orca cancel --last # abort
76
+ ```
81
77
 
82
- orca resume --last
83
- orca resume --run <run-id>
78
+ Common failures:
79
+ - `auth error` → re-auth Codex (`codex auth`) or set `OPENAI_API_KEY` / `ORCA_OPENAI_API_KEY`
80
+ - `no git repo` → `cd` into a git repo
81
+ - `plan invalid` → goal too vague; cancel and restate
82
+ - Session logs: `./session-logs/` (or `sessionLogs` config path)
84
83
 
85
- orca cancel --last
86
- orca cancel --run <run-id>
84
+ ### PR workflow
87
85
 
88
- orca answer <run-id> "yes, use migration A"
86
+ ```bash
87
+ orca pr draft --last # open a draft PR (won't trigger CI)
88
+ orca pr publish --last # un-draft it
89
+ orca pr create --last # draft + publish in one step
90
+ orca pr status --last # check PR and CI status
89
91
  ```
90
92
 
91
- ## PR Workflow
93
+ Orca always works on a branch — never pushes directly to main/master.
92
94
 
93
- ```bash
94
- orca pr
95
- orca pr draft --run <run-id>
96
- orca pr create --run <run-id>
97
- orca pr publish --run <run-id>
98
- orca pr status --run <run-id>
99
-
100
- orca pr publish --last
101
- orca pr publish --config ./orca.config.js # accepted, currently unused by PR command resolution
102
-
103
- # Non-TTY requires explicit run selection
104
- orca pr publish --run <run-id>
105
- orca pr publish --last
106
- ```
95
+ ---
107
96
 
108
97
  ## Config
109
98
 
110
- Orca auto-discovers config in this order:
99
+ Orca loads config in this order (later overrides earlier):
111
100
 
112
- 1. Global config: `~/.orca/config.ts` (preferred when both exist) or `~/.orca/config.js`
113
- 2. Project config: `./orca.config.ts` (preferred when both exist) or `./orca.config.js`
114
- 3. `--config <path>` (if passed)
101
+ 1. `~/.orca/config.ts` or `~/.orca/config.js` (global)
102
+ 2. `./orca.config.ts` or `./orca.config.js` (project)
103
+ 3. `--config <path>` (explicit)
115
104
 
116
- Later entries override earlier ones.
105
+ `.ts` is preferred over `.js` when both exist.
117
106
 
118
107
  ```ts
119
108
  // orca.config.ts
120
109
  import { defineOrcaConfig } from "orcastrator";
121
110
 
122
111
  export default defineOrcaConfig({
123
- executor: "codex", openaiApiKey: process.env.OPENAI_API_KEY,
124
- runsDir: "./.orca/runs",
112
+ executor: "codex", // only supported value
113
+ runsDir: "./.orca/runs", // default: ~/.orca/runs
125
114
  sessionLogs: "./session-logs",
126
115
  skills: ["./.orca/skills"],
127
116
  maxRetries: 1,
128
117
 
129
118
  codex: {
130
- enabled: true,
131
119
  model: "gpt-5.3-codex",
132
- effort: "medium",
133
- command: "codex",
120
+ effort: "medium", // "low" | "medium" | "high" — applies to all Codex turns
134
121
  timeoutMs: 300000,
135
- multiAgent: false,
122
+ multiAgent: false, // see Multi-agent section
136
123
  perCwdExtraUserRoots: [
137
124
  { cwd: process.cwd(), extraUserRoots: ["/tmp/shared-skills"] }
138
- ]
139
- },
140
- hooks: {
141
- onTaskComplete: async (event, context) => {
142
- console.log(`task done: ${event.taskId} (${event.taskName}) from pid ${context.pid}`);
143
- },
144
- onError: async (event) => {
145
- console.error(event.error);
146
- }
147
- },
148
- hookCommands: {
149
- onTaskComplete: "node ./scripts/on-task-complete.mjs",
150
- onComplete: "echo run complete",
151
- onError: "echo run failed"
152
- },
153
- pr: {
154
- enabled: true,
155
- requireConfirmation: true
125
+ ],
156
126
  },
127
+
157
128
  review: {
158
- // Deprecated compatibility aliases (prefer review.plan.*):
159
- // enabled: true,
160
- // onInvalid: "fail",
161
129
  plan: {
162
130
  enabled: true,
163
- onInvalid: "fail"
131
+ onInvalid: "fail", // "fail" | "warn_skip"
164
132
  },
165
133
  execution: {
166
134
  enabled: true,
167
135
  maxCycles: 2,
168
- onFindings: "auto_fix",
136
+ onFindings: "auto_fix", // "auto_fix" | "report_only" | "fail"
169
137
  validator: {
170
- auto: true,
171
- // commands: ["npm run validate"]
138
+ auto: true, // auto-detect validators from package.json
139
+ // commands: ["npm run validate"] // explicit override
172
140
  },
173
141
  // prompt: "Prefer minimal safe fixes"
174
- }
175
- }
176
- });
177
- ```
178
-
179
- ### Config field reference (OrcaConfig)
180
-
181
- Top-level: `executor`, `openaiApiKey`, `runsDir`, `sessionLogs`, `skills`, `maxRetries`, `hooks`, `hookCommands`, `pr`, `review`, `codex`.
182
-
183
- - `pr.enabled`, `pr.requireConfirmation`
184
- - `maxRetries` is part of `OrcaConfig`; current planner-generated task retries remain fixed in task graph contracts
185
- - `codex.enabled`, `codex.model`, `codex.effort`, `codex.command`, `codex.timeoutMs`, `codex.multiAgent`, `codex.perCwdExtraUserRoots`
186
- - `review.plan.enabled`, `review.plan.onInvalid`
187
- - `review.execution.enabled`, `review.execution.maxCycles`, `review.execution.onFindings`, `review.execution.validator.auto`, `review.execution.validator.commands`, `review.execution.prompt`
188
- - Deprecated compatibility aliases: `review.enabled`, `review.onInvalid` (still accepted; prefer `review.plan.*`)
189
-
190
- ### Multi-agent mode
142
+ },
143
+ },
191
144
 
192
- Codex supports experimental [multi-agent workflows](https://developers.openai.com/codex/multi-agent) where it can spawn parallel sub-agents for complex tasks.
145
+ pr: {
146
+ enabled: true,
147
+ requireConfirmation: true,
148
+ },
193
149
 
194
- To enable it in Orca, set `codex.multiAgent: true` in your config:
150
+ hooks: {
151
+ onTaskComplete: async (event, context) => {
152
+ console.log(`task done: ${event.taskId} from pid ${context.pid}`);
153
+ },
154
+ onError: async (event) => { console.error(event.error); },
155
+ },
195
156
 
196
- ```js
197
- export default {
198
- codex: { multiAgent: true }
199
- };
157
+ hookCommands: {
158
+ onComplete: "echo run complete",
159
+ onError: "echo run failed",
160
+ onTaskComplete: "node ./scripts/on-task-complete.mjs",
161
+ },
162
+ });
200
163
  ```
201
164
 
202
- When enabled, Orca adds `multi_agent = true` to your global `~/.codex/config.toml`. If you already have multi-agent enabled in your Codex config, it will work automatically without setting anything in Orca.
203
-
204
- > **Note:** Multi-agent is off by default because enabling it modifies your global Codex configuration. It is currently an experimental Codex feature.
205
-
206
- ## Reference
207
-
208
- ### Flags
209
-
210
- Global:
211
-
212
- - `-h, --help`
213
- - `-V, --version`
214
-
215
- `orca` / `orca run`:
216
-
217
- - positional: `[task]`
218
- - also works: `--task <text>`, `-p, --prompt <text>`
219
- - `--spec <path>`
220
- - `--plan <path>`
221
- - `--config <path>`
222
- - `--codex-only` (force Codex executor for this run)
223
- - `--codex-effort <low|medium|high>`
224
- - `--on-milestone <cmd>`
225
- - `--on-task-complete <cmd>`
226
- - `--on-task-fail <cmd>`
227
- - `--on-invalid-plan <cmd>`
228
- - `--on-findings <cmd>`
229
- - `--on-complete <cmd>`
230
- - `--on-error <cmd>`
231
-
232
- `orca plan`:
165
+ ### Review cycle
233
166
 
234
- - `--spec <path>`
235
- - `--config <path>`
236
- - `--on-milestone <cmd>`
237
- - `--on-error <cmd>`
167
+ After planning, Orca runs a pre-execution review that can edit the task graph (add/remove tasks, update fields, adjust dependencies) before execution starts.
238
168
 
239
- `orca status`:
169
+ After execution, Orca runs validation commands and asks Codex to review findings. With `onFindings: "auto_fix"`, it applies fixes and retries up to `maxCycles` times, then reports. Set `ORCA_SKIP_VALIDATORS=1` to skip validator auto-detection at runtime.
240
170
 
241
- - `--run <run-id>`
242
- - `--last`
243
- - `--config <path>`
244
-
245
- `orca resume`:
246
-
247
- - `--run <run-id>`
248
- - `--last`
249
- - `--config <path>`
250
- - `--codex-only`
251
- - `--codex-effort <low|medium|high>`
252
-
253
- `orca cancel`:
254
-
255
- - `--run <run-id>`
256
- - `--last`
257
- - `--config <path>`
171
+ ### Multi-agent mode
258
172
 
259
- `orca answer`:
173
+ Set `codex.multiAgent: true` to spawn parallel Codex agents per task. Faster for large refactors with independent subtasks; higher token cost. **Note:** this writes `multi_agent = true` to your global `~/.codex/config.toml`.
260
174
 
261
- - positional: `[run-id] [answer]`
262
- - `--run <id>`
175
+ ### Skills
263
176
 
264
- `orca list`:
177
+ Orca auto-loads skills in this precedence order (first name wins):
265
178
 
266
- - `--config <path>`
179
+ 1. `config.skills[]`
180
+ 2. `./.orca/skills/` (project-local)
181
+ 3. `~/.orca/skills/` (global)
182
+ 4. Bundled defaults (includes `code-simplifier`)
267
183
 
268
- `orca pr draft|create|publish|status`:
184
+ Inject additional app-server-visible skills via `codex.perCwdExtraUserRoots`.
269
185
 
270
- - `--run <run-id>`
271
- - `--last`
272
- - `--config <path>` (accepted for compatibility; currently unused by PR command run resolution)
186
+ ---
273
187
 
274
- `orca pr publish`:
188
+ ## CLI Reference
275
189
 
276
- - `--run <run-id>`
277
- - `--last`
278
- - `--config <path>` (accepted for compatibility; currently unused by PR command run resolution)
279
- - If neither `--run` nor `--last` is provided: interactive run picker in TTY; non-TTY requires `--run` or `--last`
190
+ ```
191
+ orca <task> Start a run
192
+ orca --spec <path> Run from a spec file
193
+ orca plan --spec <path> Plan only, no execution
194
+
195
+ orca status [--last | --run <id>] Run status
196
+ orca list List all runs
197
+ orca resume [--last | --run <id>] Retry from checkpoint
198
+ orca cancel [--last | --run <id>] Abort a run
199
+ orca answer <run-id> "<text>" Answer a waiting question
200
+
201
+ orca pr draft [--last | --run <id>] Open draft PR
202
+ orca pr create [--last | --run <id>] Create and publish PR
203
+ orca pr publish [--last | --run <id>] Un-draft an existing PR
204
+ orca pr status [--last | --run <id>] PR and CI status
205
+ (non-TTY: --run or --last required)
206
+
207
+ orca skills List loaded skills
208
+ orca setup Interactive setup wizard
209
+ ```
280
210
 
281
- `orca skills`:
211
+ **Key flags for `orca` (run):**
282
212
 
283
- - `--config <path>`
213
+ - `--codex-only` — force Codex executor
214
+ - `--codex-effort <low|medium|high>` — override effort for this run
215
+ - `--config <path>` — explicit config file
216
+ - `--on-complete <cmd>`, `--on-error <cmd>`, `--on-task-complete <cmd>`, `--on-findings <cmd>`, etc.
284
217
 
285
- `orca setup`:
218
+ **Key flags for `orca resume`:**
286
219
 
287
- - auto-detect is default
288
- - `--openai-key <key>` — override OpenAI API key (written to config)
289
- - `--executor <codex>` — explicitly set executor in written config
290
- - `--ts` — write TS config output (`~/.orca/config.ts` / `./orca.config.ts`)
291
- - `--global` — save to global config (`~/.orca/config.js` by default, or `.ts` with `--ts`)
292
- - `--project` — save to project config (`./orca.config.js` by default, or `.ts` with `--ts`)
293
- - `--project-config-template` / `--skip-project-config` removed
220
+ - `--codex-only`, `--codex-effort <low|medium|high>`, `--config <path>`, `--run <id>`, `--last`
294
221
 
295
- `orca help`:
222
+ **`orca setup` flags:**
296
223
 
297
- - positional: `[command]`show help for a specific command (e.g. `orca help plan`)
298
- - no flags; also works as `orca --help` or `orca <command> --help`
224
+ - `--openai-key <key>`write key to config
225
+ - `--executor <codex>` set executor
226
+ - `--ts` — write TypeScript config
227
+ - `--global` — write to `~/.orca/config.js`
228
+ - `--project` — write to `./orca.config.js`
299
229
 
300
230
  ### Hooks
301
231
 
302
- Hook names:
303
-
304
- - `onMilestone`
305
- - `onTaskComplete`
306
- - `onTaskFail`
307
- - `onInvalidPlan`
308
- - `onFindings`
309
- - `onComplete`
310
- - `onError` (fires on run failures and hook-dispatch failures)
311
-
312
- Run hooks from CLI with `--on-...` flags or from config via `hooks` / `hookCommands`.
313
- Unknown hook keys in config are rejected at load time with an explicit allowed-hook list.
314
-
315
- Hook contract:
316
- - Function hooks (`config.hooks`) are the primary path and are strongly typed per hook event.
317
- - Every function hook receives `(event, context)` where `context` is deterministic: `{ cwd, pid, invokedAt }`.
318
- - Command hooks (`--on-...` and `config.hookCommands`) receive the full event payload as JSON over stdin.
319
- - Orca no longer injects hook payload via `ORCA_*` env vars.
320
-
321
- Smoke-test the hook contract (function + command + concurrency): `npm run smoke:hooks`.
322
-
323
- ### Run ID Format
324
-
325
- Run IDs are generated as:
326
-
327
- - `<slug>-<unix-ms>-<hex4>`
328
- - Example: `feature-auth-1766228123456-1a2b`
329
-
330
- ### Config File Locations
331
-
332
- - Global: `~/.orca/config.ts` (preferred when both exist) or `~/.orca/config.js`
333
- - Project: `./orca.config.ts` (preferred when both exist) or `./orca.config.js`
334
- - Explicit: `--config <path>`
335
-
336
- ### Project Instruction Files
337
-
338
- During planning, Orca automatically injects project instruction files when present:
339
-
340
- 1. `AGENTS.md`
341
-
342
- Files are discovered from the project root (nearest `.git` from the spec/task context) and injected when present.
343
-
344
- ### Project Skills
345
-
346
- Orca auto-loads skills in this precedence order (first matching skill name wins):
347
-
348
- 1. `config.skills[]`
349
- 2. `./.orca/skills/` (project-local, from current working directory)
350
- 3. `~/.orca/skills/` (global)
351
- 4. Bundled defaults from the Orca package: `<orca package root>/.orca/skills/`
232
+ Available hook names: `onMilestone`, `onTaskComplete`, `onTaskFail`, `onInvalidPlan`, `onFindings`, `onComplete`, `onError`.
352
233
 
353
- This repo ships a bundled default `code-simplifier` skill at `./.orca/skills/code-simplifier/SKILL.md`, and it loads even when Orca runs in arbitrary target repositories. Project/global/config skills can still override it by reusing the same skill name. Planner/reviewer/executor prompts explicitly apply `code-simplifier` guidance for all code-writing and code-review steps while keeping behavior unchanged unless a task explicitly requires behavior changes.
234
+ - Function hooks (`config.hooks`): receive `(event, context)` where `context = { cwd, pid, invokedAt }`
235
+ - Command hooks (`config.hookCommands` / `--on-*` flags): receive full event JSON over stdin
236
+ - Unknown hook keys in config are rejected at load time
354
237
 
355
- When Orca uses the Codex executor, each turn is sent with both:
356
- - a text input item (`{ type: "text", text: ... }`), and
357
- - explicit skill input items (`{ type: "skill", name, path }`) for every loaded skill in the same precedence order above.
238
+ ### Run ID format
358
239
 
359
- At session startup, Orca also calls Codex app-server `skills/list` with `forceReload: true` (and optional `codex.perCwdExtraUserRoots`) so additional app-server-visible skills can be appended deterministically without overriding Orca-local precedence.
240
+ `<slug>-<unix-ms>-<hex4>` e.g. `feature-auth-1766228123456-1a2b`
360
241
 
361
- This keeps Codex skill loading deterministic instead of relying only on prompt/context pickup.
242
+ ### Run state locations
362
243
 
363
- ### Run State Locations
364
-
365
- - Run status: `<runsDir>/<run-id>/status.json`
244
+ - Status: `<runsDir>/<run-id>/status.json`
366
245
  - Answer payloads: `<runsDir>/<run-id>/answer.txt`
367
- - `runsDir` defaults to `~/.orca/runs` unless overridden by `ORCA_RUNS_DIR`.
246
+ - `runsDir` defaults to `~/.orca/runs` (override with `ORCA_RUNS_DIR`)
368
247
 
369
- ## Development
248
+ ### Project instruction files
370
249
 
371
- Install dependencies with npm (primary lockfile):
250
+ Orca injects `AGENTS.md` into planning context when found at the project root.
372
251
 
373
- ```bash
374
- npm install
375
- ```
252
+ ---
376
253
 
377
- Run local development and tests with Bun (faster runtime for this project):
254
+ ## Development
378
255
 
379
256
  ```bash
380
- bun run src/cli/index.ts "your task here"
257
+ npm install # canonical install (use npm for deps)
258
+ bun run src/cli/index.ts "task" # local dev
381
259
  bun test src
382
260
  npm run test:postexec-json
383
261
  ```
384
262
 
385
- ## Validation pipeline
386
-
387
- Use the full validation gate before opening/publishing changes:
263
+ Full validation gate (runs lint → type-check → tests → build):
388
264
 
389
265
  ```bash
390
266
  npm run validate
391
267
  ```
392
268
 
393
- This runs, in order:
394
-
395
- 1. `npm run lint` (Oxlint syntax/style/static rules)
396
- 2. `npm run lint:type-aware` (Oxlint + tsgolint alpha type-aware + type-check diagnostics)
397
- 3. `npm run typecheck` (TypeScript Native Preview via `tsgo --noEmit`, with environment fallback to `tsc --noEmit`)
398
- 4. `npm run test`
399
- 5. `npm run build`
400
-
401
- `npm run build` remains `tsc` because the native preview compiler is used here as a fast typecheck gate; production JS emission stays on stable `typescript` for predictable package output.
402
-
403
- ## GitHub release tracking (tags only)
404
-
405
- Orca includes a lightweight GitHub Actions workflow at `.github/workflows/release.yml`:
406
-
407
- - Trigger: push a tag matching `v*` (workflow only releases SemVer tags like `v0.4.0` or `v0.4.0-rc.1`)
408
- - Behavior: create or update the matching GitHub Release
409
- - Notes: auto-generated by GitHub (`generate_release_notes: true`)
410
-
411
- This workflow is for release tracking/changelogs only. It does not publish to npm.
412
-
413
- ## npm publish automation (GitHub Actions)
269
+ ### Package manager policy
414
270
 
415
- Orca includes a publish workflow at `.github/workflows/publish.yml`.
271
+ - **npm** canonical for deps, CI, and publish (`package-lock.json`)
272
+ - **Bun** — used as runtime/test runner locally (`bun.lock`)
416
273
 
417
- - Primary trigger: push a tag matching `v*` (for example `v1.2.3` or `v1.2.3-rc.1`)
418
- - Optional fallback: manual `workflow_dispatch`
419
- - Required secret: `NPM_TOKEN`
420
- - Behavior: checkout → Node setup (npm registry auth) → safety checks → `npm ci` → `npm run validate` → publish if version is not already on npm
274
+ Commit both lockfiles. When changing deps: `npm install && bun install`.
421
275
 
422
- Safety checks enforced before publish:
276
+ ---
423
277
 
424
- 1. Tag must be SemVer-like (`vX.Y.Z` with optional prerelease/build metadata)
425
- 2. Release commit must be reachable from the repository default branch
426
- 3. `package.json` version must match the tag version (without the leading `v`)
427
- 4. If the version already exists on npm, publish is skipped as a safe no-op
428
-
429
- ### Safe setup
430
-
431
- 1. In GitHub, open **Settings → Secrets and variables → Actions** for this repository.
432
- 2. Add a repository secret named `NPM_TOKEN`.
433
- - Create this token in npm as a granular automation/publish token scoped only to `orcastrator`.
434
- 3. Use least privilege, avoid reusing broad account tokens, and rotate the token periodically.
435
-
436
- ### Safe run flow
437
-
438
- 1. Bump `package.json` to the intended release version.
439
- 2. Create and push a matching tag, for example: `git tag v1.2.3 && git push origin v1.2.3`.
440
- 3. Verify the package on npm after the workflow completes.
441
- 4. If needed, run the same workflow manually from **Actions → npm Publish → Run workflow** as a fallback (use an existing tag so the workflow publishes that exact tagged commit).
442
-
443
- ## Package manager + lockfile policy
444
-
445
- Orca uses a mixed runtime/tooling model on purpose:
446
-
447
- - **npm is canonical for dependency resolution, release builds, and deterministic installs**.
448
- - **Bun is used as a runtime/test runner in local workflows** (`dev`, `start`, `test`).
449
-
450
- Commit both lockfiles:
451
-
452
- - `package-lock.json` — canonical dependency graph for npm/CI/publish
453
- - `bun.lock` — Bun runtime resolution parity for local Bun commands
454
-
455
- When dependencies change, update both lockfiles in the same PR:
456
-
457
- ```bash
458
- npm install
459
- bun install
460
- ```
278
+ ## License
461
279
 
462
- This keeps npm and Bun behavior aligned without forcing a disruptive full migration.
280
+ MIT see [LICENSE](./LICENSE).
@@ -1,5 +1,9 @@
1
1
  import type { OrcaConfig, PlanResult, Task, TaskExecutionResult, TaskGraphReviewResult } from "../../types/index.js";
2
2
  export type { PlanResult, TaskExecutionResult };
3
+ export interface PlanNeedDecision {
4
+ needsPlan: boolean;
5
+ reason: string;
6
+ }
3
7
  /**
4
8
  * Create a persistent Codex session. The thread persists across calls —
5
9
  * planSpec and executeTask share context within the same session.
@@ -9,6 +13,7 @@ export interface ConsultationResult {
9
13
  ok: boolean;
10
14
  }
11
15
  export declare function createCodexSession(cwd: string, config?: OrcaConfig): Promise<{
16
+ decidePlanningNeed: (spec: string, systemContext: string) => Promise<PlanNeedDecision>;
12
17
  planSpec: (spec: string, systemContext: string) => Promise<PlanResult>;
13
18
  reviewTaskGraph: (tasks: Task[], systemContext: string) => Promise<TaskGraphReviewResult>;
14
19
  executeTask: (task: Task, runId: string, systemContext?: string) => Promise<TaskExecutionResult>;
@@ -23,6 +28,7 @@ export declare function createCodexSession(cwd: string, config?: OrcaConfig): Pr
23
28
  * Each call creates a new client + thread (no persistence).
24
29
  * Use createCodexSession() for persistent threads.
25
30
  */
31
+ export declare function decidePlanningNeed(spec: string, systemContext: string, config?: OrcaConfig): Promise<PlanNeedDecision>;
26
32
  export declare function planSpec(spec: string, systemContext: string, config?: OrcaConfig): Promise<PlanResult>;
27
33
  export declare function reviewTaskGraph(tasks: Task[], systemContext: string, config?: OrcaConfig): Promise<TaskGraphReviewResult>;
28
34
  export declare function executeTask(task: Task, runId: string, config?: OrcaConfig, systemContext?: string): Promise<TaskExecutionResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/agents/codex/session.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,IAAI,EACJ,mBAAmB,EAEnB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAK9B,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;AA8XhD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC;IACT,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACvE,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1F,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjG,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjE,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAoLD;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAQ9B"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/agents/codex/session.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,IAAI,EACJ,mBAAmB,EAEnB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAK9B,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;AA8JhD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AA2RD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC;IACT,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACvE,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1F,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjG,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjE,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAiKD;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAQ9B"}
@@ -6,6 +6,9 @@ function getCodeSimplifierGuidance() {
6
6
  return [
7
7
  "For every code-writing step, explicitly apply code-simplifier guidance (use the bundled code-simplifier skill when available).",
8
8
  "For every code-review step, explicitly apply code-simplifier guidance (use the bundled code-simplifier skill when available).",
9
+ "Bias toward the simplest implementation that satisfies the task.",
10
+ "Do not add compatibility fallbacks, legacy branches, or dead code unless explicitly required by the task.",
11
+ "Before finalizing, run a simplification pass: remove unnecessary complexity while preserving required behavior.",
9
12
  "Keep changes behavior-preserving unless the task explicitly requires behavior changes.",
10
13
  ];
11
14
  }
@@ -13,6 +16,8 @@ function buildPlanningPrompt(spec, systemContext) {
13
16
  return [
14
17
  systemContext,
15
18
  "You are decomposing a spec into an ordered task graph.",
19
+ "Prefer task decomposition that maximizes safe parallelism for independent workstreams.",
20
+ "Isolate task ownership (files/subsystems) to avoid cross-task collisions.",
16
21
  ...getCodeSimplifierGuidance(),
17
22
  "Return a JSON array of tasks.",
18
23
  "Each task must include fields: id, name, description, dependencies, acceptance_criteria, status, retries, maxRetries.",
@@ -45,6 +50,18 @@ function buildTaskExecutionPrompt(task, runId, cwd, systemContext) {
45
50
  "Do not wrap it in markdown fences. Do not add any text after the JSON line. The JSON line is required.",
46
51
  ].join("\n\n");
47
52
  }
53
+ function buildPlanDecisionPrompt(spec, systemContext) {
54
+ return [
55
+ systemContext,
56
+ "You are Orca's planning gate.",
57
+ "Decide whether this spec needs multi-step planning or can run as one direct execution task.",
58
+ "Set needsPlan=true when coordination/dependencies/research/design across multiple steps are required.",
59
+ "Set needsPlan=false when a single focused execution task is sufficient.",
60
+ "Return JSON only with shape: {\"needsPlan\":boolean,\"reason\":string}",
61
+ "Spec:",
62
+ spec,
63
+ ].join("\n\n");
64
+ }
48
65
  function buildTaskGraphReviewPrompt(tasks, systemContext) {
49
66
  return [
50
67
  systemContext,
@@ -120,6 +137,24 @@ function parseTaskArray(raw) {
120
137
  }
121
138
  return parsed;
122
139
  }
140
+ function parsePlanDecision(raw) {
141
+ const json = extractJson(raw);
142
+ const parsed = JSON.parse(json);
143
+ if (!parsed || typeof parsed !== "object") {
144
+ throw new Error("Codex plan decision response was not a JSON object");
145
+ }
146
+ const candidate = parsed;
147
+ if (typeof candidate.needsPlan !== "boolean") {
148
+ throw new Error("Codex plan decision response missing boolean needsPlan");
149
+ }
150
+ if (typeof candidate.reason !== "string" || candidate.reason.trim().length === 0) {
151
+ throw new Error("Codex plan decision response missing non-empty reason");
152
+ }
153
+ return {
154
+ needsPlan: candidate.needsPlan,
155
+ reason: candidate.reason,
156
+ };
157
+ }
123
158
  const POSITIVE_COMPLETION_PATTERNS = [
124
159
  /\bdone\b/i,
125
160
  /\bcomplet/i,
@@ -201,8 +236,20 @@ function getCodexPath() {
201
236
  return (process.env.ORCA_CODEX_PATH ??
202
237
  `${process.env.HOME}/.nvm/versions/node/v22.22.0/bin/codex`);
203
238
  }
204
- function getEffort(config) {
205
- return config?.codex?.effort;
239
+ const DEFAULT_THINKING_BY_STEP = {
240
+ decision: "low",
241
+ planning: "high",
242
+ execution: "medium",
243
+ };
244
+ function getEffort(config, step) {
245
+ const explicitThinkingLevel = config?.codex?.thinkingLevel?.[step];
246
+ if (explicitThinkingLevel !== undefined) {
247
+ return explicitThinkingLevel;
248
+ }
249
+ if (config?.codex?.effort !== undefined) {
250
+ return config.codex.effort;
251
+ }
252
+ return DEFAULT_THINKING_BY_STEP[step];
206
253
  }
207
254
  function buildTurnInput(text, skills) {
208
255
  return [
@@ -247,7 +294,7 @@ async function loadCodexListedSkills(client, cwd, config) {
247
294
  let response;
248
295
  try {
249
296
  response = await request.call(client, "skills/list", {
250
- cwd,
297
+ cwds: [cwd],
251
298
  forceReload: true,
252
299
  ...(perCwdExtraUserRoots.length > 0 ? { perCwdExtraUserRoots } : {}),
253
300
  });
@@ -336,18 +383,21 @@ export async function createCodexSession(cwd, config) {
336
383
  }
337
384
  return {
338
385
  threadId,
386
+ async decidePlanningNeed(spec, systemContext) {
387
+ const result = await client.runTurn({
388
+ threadId,
389
+ effort: getEffort(config, "decision"),
390
+ input: buildTurnInput(buildPlanDecisionPrompt(spec, systemContext), skills),
391
+ });
392
+ const rawResponse = extractAgentText(result);
393
+ return parsePlanDecision(rawResponse);
394
+ },
339
395
  async planSpec(spec, systemContext) {
340
- const effort = getEffort(config);
341
- const result = effort
342
- ? await client.runTurn({
343
- threadId,
344
- effort,
345
- input: buildTurnInput(buildPlanningPrompt(spec, systemContext), skills),
346
- })
347
- : await client.runTurn({
348
- threadId,
349
- input: buildTurnInput(buildPlanningPrompt(spec, systemContext), skills),
350
- });
396
+ const result = await client.runTurn({
397
+ threadId,
398
+ effort: getEffort(config, "planning"),
399
+ input: buildTurnInput(buildPlanningPrompt(spec, systemContext), skills),
400
+ });
351
401
  const rawResponse = extractAgentText(result);
352
402
  return {
353
403
  tasks: parseTaskArray(rawResponse),
@@ -355,32 +405,20 @@ export async function createCodexSession(cwd, config) {
355
405
  };
356
406
  },
357
407
  async reviewTaskGraph(tasks, systemContext) {
358
- const effort = getEffort(config);
359
- const result = effort
360
- ? await client.runTurn({
361
- threadId,
362
- effort,
363
- input: buildTurnInput(buildTaskGraphReviewPrompt(tasks, systemContext), skills),
364
- })
365
- : await client.runTurn({
366
- threadId,
367
- input: buildTurnInput(buildTaskGraphReviewPrompt(tasks, systemContext), skills),
368
- });
408
+ const result = await client.runTurn({
409
+ threadId,
410
+ effort: getEffort(config, "planning"),
411
+ input: buildTurnInput(buildTaskGraphReviewPrompt(tasks, systemContext), skills),
412
+ });
369
413
  const rawResponse = extractAgentText(result);
370
414
  return parseTaskGraphReview(rawResponse);
371
415
  },
372
416
  async executeTask(task, runId, systemContext) {
373
- const effort = getEffort(config);
374
- const result = effort
375
- ? await client.runTurn({
376
- threadId,
377
- effort,
378
- input: buildTurnInput(buildTaskExecutionPrompt(task, runId, cwd, systemContext), skills),
379
- })
380
- : await client.runTurn({
381
- threadId,
382
- input: buildTurnInput(buildTaskExecutionPrompt(task, runId, cwd, systemContext), skills),
383
- });
417
+ const result = await client.runTurn({
418
+ threadId,
419
+ effort: getEffort(config, "execution"),
420
+ input: buildTurnInput(buildTaskExecutionPrompt(task, runId, cwd, systemContext), skills),
421
+ });
384
422
  const rawResponse = extractAgentText(result);
385
423
  // Primary signal: use the SDK's structured turn status.
386
424
  const status = result.turn.status;
@@ -415,17 +453,11 @@ export async function createCodexSession(cwd, config) {
415
453
  "Task graph:",
416
454
  taskGraphJson,
417
455
  ].join("\n");
418
- const effort = getEffort(config);
419
- const result = effort
420
- ? await client.runTurn({
421
- threadId,
422
- effort,
423
- input: buildTurnInput(prompt, skills),
424
- })
425
- : await client.runTurn({
426
- threadId,
427
- input: buildTurnInput(prompt, skills),
428
- });
456
+ const result = await client.runTurn({
457
+ threadId,
458
+ effort: getEffort(config, "decision"),
459
+ input: buildTurnInput(prompt, skills),
460
+ });
429
461
  const rawResponse = extractAgentText(result);
430
462
  const json = extractJson(rawResponse);
431
463
  const parsed = JSON.parse(json);
@@ -448,17 +480,11 @@ export async function createCodexSession(cwd, config) {
448
480
  return result.reviewText;
449
481
  },
450
482
  async runPrompt(prompt) {
451
- const effort = getEffort(config);
452
- const result = effort
453
- ? await client.runTurn({
454
- threadId,
455
- effort,
456
- input: buildTurnInput(prompt, skills),
457
- })
458
- : await client.runTurn({
459
- threadId,
460
- input: buildTurnInput(prompt, skills),
461
- });
483
+ const result = await client.runTurn({
484
+ threadId,
485
+ effort: getEffort(config, "execution"),
486
+ input: buildTurnInput(prompt, skills),
487
+ });
462
488
  return extractAgentText(result);
463
489
  },
464
490
  async disconnect() {
@@ -471,6 +497,15 @@ export async function createCodexSession(cwd, config) {
471
497
  * Each call creates a new client + thread (no persistence).
472
498
  * Use createCodexSession() for persistent threads.
473
499
  */
500
+ export async function decidePlanningNeed(spec, systemContext, config) {
501
+ const session = await createCodexSession(process.cwd(), config);
502
+ try {
503
+ return await session.decidePlanningNeed(spec, systemContext);
504
+ }
505
+ finally {
506
+ await session.disconnect();
507
+ }
508
+ }
474
509
  export async function planSpec(spec, systemContext, config) {
475
510
  const session = await createCodexSession(process.cwd(), config);
476
511
  try {
@@ -41,7 +41,7 @@ function printStyledHelpPage() {
41
41
  { command: "--last", description: "use the most recent run" },
42
42
  { command: "--config <path>", description: "explicit config file (auto-discovered by default)" },
43
43
  { command: "--codex-only", description: "override executor to Codex for the current run" },
44
- { command: "--codex-effort <value>", description: "override Codex effort for the current run" },
44
+ { command: "--codex-effort <value>", description: "override Codex thinking level for the current run" },
45
45
  { command: "--full-auto", description: "skip all questions, proceed autonomously" },
46
46
  { command: "--on-complete <cmd>", description: "shell hook on run complete" },
47
47
  { command: "--on-error <cmd>", description: "shell hook on run error" },
@@ -102,7 +102,7 @@ export function registerResumeCommand(program) {
102
102
  .option("--last", "Use the most recent run")
103
103
  .option("--config <path>", "Path to orca config file")
104
104
  .option("--codex-only", "Force Codex executor for this resumed run (overrides config)")
105
- .option("--codex-effort <value>", "Codex effort override for this resumed run", parseCodexEffortOption)
105
+ .option("--codex-effort <value>", "Codex thinking level override for this resumed run", parseCodexEffortOption)
106
106
  .action(async (options) => {
107
107
  try {
108
108
  await resumeCommandHandler(options);
@@ -327,7 +327,7 @@ export async function runCommandHandler(options) {
327
327
  await dispatcher.dispatch(event);
328
328
  };
329
329
  try {
330
- await runPlanner(specPath, store, runId, effectiveConfig);
330
+ await runPlanner(specPath, store, runId, effectiveConfig, { allowPlanSkip: true });
331
331
  }
332
332
  catch (error) {
333
333
  if (error instanceof InvalidPlanError) {
@@ -475,7 +475,7 @@ export function registerRunCommand(program) {
475
475
  .option("-p, --prompt <text>", "Inline task text (alias for --task)")
476
476
  .option("--config <path>", "Path to orca config file")
477
477
  .option("--codex-only", "Force Codex executor for this run (overrides config)")
478
- .option("--codex-effort <value>", "Codex effort override for this run", parseCodexEffortOption)
478
+ .option("--codex-effort <value>", "Codex thinking level override for this run", parseCodexEffortOption)
479
479
  .option("--on-milestone <cmd>", "Shell hook command for onMilestone")
480
480
  .option("--on-task-complete <cmd>", "Shell hook command for onTaskComplete")
481
481
  .option("--on-task-fail <cmd>", "Shell hook command for onTaskFail")
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAY,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA8P9D,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAarF;AAOD,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,UAAU,GAAG,SAAS,CAwD9F;AAiBD,wBAAsB,sBAAsB,CAC1C,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAMjC;AAED,wBAAsB,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA2B3F"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAY,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAkR9D,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAarF;AAOD,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,UAAU,GAAG,SAAS,CAmE9F;AAiBD,wBAAsB,sBAAsB,CAC1C,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAMjC;AAED,wBAAsB,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA2B3F"}
@@ -82,7 +82,24 @@ function coerceConfig(candidate) {
82
82
  if (typeof candidate.codex.effort !== "string") {
83
83
  throw new Error(`Config.codex.effort must be a string, got ${describeType(candidate.codex.effort)}`);
84
84
  }
85
- parseCodexEffort(candidate.codex.effort);
85
+ candidate.codex.effort = parseCodexEffort(candidate.codex.effort);
86
+ }
87
+ if ("thinkingLevel" in candidate.codex && candidate.codex.thinkingLevel !== undefined) {
88
+ if (!isObject(candidate.codex.thinkingLevel)) {
89
+ throw new Error(`Config.codex.thinkingLevel must be an object, got ${describeType(candidate.codex.thinkingLevel)}`);
90
+ }
91
+ for (const key of ["decision", "planning", "execution"]) {
92
+ const value = candidate.codex.thinkingLevel[key];
93
+ if (value !== undefined) {
94
+ if (typeof value !== "string") {
95
+ throw new Error(`Config.codex.thinkingLevel.${key} must be a string, got ${describeType(value)}`);
96
+ }
97
+ candidate.codex.thinkingLevel[key] = parseCodexEffort(value);
98
+ }
99
+ }
100
+ }
101
+ if ("thinking" in candidate.codex && candidate.codex.thinking !== undefined) {
102
+ throw new Error("Config.codex.thinking is no longer supported. Use Config.codex.thinkingLevel instead.");
86
103
  }
87
104
  if ("perCwdExtraUserRoots" in candidate.codex && candidate.codex.perCwdExtraUserRoots !== undefined) {
88
105
  if (!Array.isArray(candidate.codex.perCwdExtraUserRoots)) {
@@ -211,7 +228,17 @@ export function mergeConfigs(...configs) {
211
228
  }
212
229
  }
213
230
  if (merged.codex !== undefined || config.codex !== undefined) {
214
- merged.codex = { ...merged.codex, ...config.codex };
231
+ const mergedThinkingLevel = (merged.codex?.thinkingLevel !== undefined || config.codex?.thinkingLevel !== undefined)
232
+ ? {
233
+ ...merged.codex?.thinkingLevel,
234
+ ...config.codex?.thinkingLevel
235
+ }
236
+ : undefined;
237
+ merged.codex = {
238
+ ...merged.codex,
239
+ ...config.codex,
240
+ ...(mergedThinkingLevel !== undefined ? { thinkingLevel: mergedThinkingLevel } : {})
241
+ };
215
242
  }
216
243
  if (merged.pr !== undefined || config.pr !== undefined) {
217
244
  merged.pr = { ...merged.pr, ...config.pr };
@@ -1,14 +1,19 @@
1
- import { planSpec as planSpecWithCodex, reviewTaskGraph as reviewTaskGraphWithCodex } from "../agents/codex/session.js";
1
+ import { decidePlanningNeed as decidePlanningNeedWithCodex, planSpec as planSpecWithCodex, reviewTaskGraph as reviewTaskGraphWithCodex } from "../agents/codex/session.js";
2
2
  import type { OrcaConfig } from "../types/index.js";
3
3
  import { RunStore } from "../state/store.js";
4
4
  type PlanSpecFn = typeof planSpecWithCodex;
5
+ type DecidePlanningNeedFn = typeof decidePlanningNeedWithCodex;
5
6
  type ReviewTaskGraphFn = typeof reviewTaskGraphWithCodex;
6
7
  export declare class InvalidPlanError extends Error {
7
8
  readonly stage: "planner" | "review";
8
9
  constructor(stage: "planner" | "review", message: string);
9
10
  }
10
11
  export declare function setPlanSpecForTests(fn: PlanSpecFn | null): void;
12
+ export declare function setDecidePlanningNeedForTests(fn: DecidePlanningNeedFn | null): void;
11
13
  export declare function setReviewTaskGraphForTests(fn: ReviewTaskGraphFn | null): void;
12
- export declare function runPlanner(specPath: string, store: RunStore, runId: string, config?: OrcaConfig): Promise<void>;
13
- export type { PlanSpecFn, ReviewTaskGraphFn };
14
+ type PlannerOptions = {
15
+ allowPlanSkip?: boolean;
16
+ };
17
+ export declare function runPlanner(specPath: string, store: RunStore, runId: string, config?: OrcaConfig, options?: PlannerOptions): Promise<void>;
18
+ export type { PlanSpecFn, DecidePlanningNeedFn, ReviewTaskGraphFn };
14
19
  //# sourceMappingURL=planner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/core/planner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACxH,OAAO,KAAK,EAAE,UAAU,EAA+B,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQ7C,KAAK,UAAU,GAAG,OAAO,iBAAiB,CAAC;AAC3C,KAAK,iBAAiB,GAAG,OAAO,wBAAwB,CAAC;AAEzD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;gBAEzB,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM;CAKzD;AAYD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAoKD,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/core/planner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,IAAI,2BAA2B,EAAE,QAAQ,IAAI,iBAAiB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3K,OAAO,KAAK,EAAE,UAAU,EAA+B,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQ7C,KAAK,UAAU,GAAG,OAAO,iBAAiB,CAAC;AAC3C,KAAK,oBAAoB,GAAG,OAAO,2BAA2B,CAAC;AAC/D,KAAK,iBAAiB,GAAG,OAAO,wBAAwB,CAAC;AAEzD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;gBAEzB,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM;CAKzD;AAaD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAEnF;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAwKD,KAAK,cAAc,GAAG;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AA+CF,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { promises as fs } from "node:fs";
2
2
  import path from "node:path";
3
- import { planSpec as planSpecWithCodex, reviewTaskGraph as reviewTaskGraphWithCodex } from "../agents/codex/session.js";
3
+ import { decidePlanningNeed as decidePlanningNeedWithCodex, planSpec as planSpecWithCodex, reviewTaskGraph as reviewTaskGraphWithCodex } from "../agents/codex/session.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { loadSkills } from "../utils/skill-loader.js";
6
6
  import { validateDAG } from "./dependency-graph.js";
@@ -17,16 +17,23 @@ export class InvalidPlanError extends Error {
17
17
  }
18
18
  }
19
19
  let testPlanSpecOverride = null;
20
+ let testDecidePlanningNeedOverride = null;
20
21
  let testReviewTaskGraphOverride = null;
21
22
  export function setPlanSpecForTests(fn) {
22
23
  testPlanSpecOverride = fn;
23
24
  }
25
+ export function setDecidePlanningNeedForTests(fn) {
26
+ testDecidePlanningNeedOverride = fn;
27
+ }
24
28
  export function setReviewTaskGraphForTests(fn) {
25
29
  testReviewTaskGraphOverride = fn;
26
30
  }
27
31
  function resolvePlanSpecImpl(_config) {
28
32
  return testPlanSpecOverride ?? planSpecWithCodex;
29
33
  }
34
+ function resolveDecidePlanningNeedImpl(_config) {
35
+ return testDecidePlanningNeedOverride ?? decidePlanningNeedWithCodex;
36
+ }
30
37
  function resolveReviewTaskGraphImpl(_config) {
31
38
  return testReviewTaskGraphOverride ?? reviewTaskGraphWithCodex;
32
39
  }
@@ -153,10 +160,22 @@ async function runTaskGraphReview(tasks, systemContext, config) {
153
160
  logger.success(`Review made ${review.changes.length} changes: ${summary}`);
154
161
  return { finalTasks: updated, review };
155
162
  }
156
- export async function runPlanner(specPath, store, runId, config) {
157
- const spec = await fs.readFile(specPath, "utf8");
158
- const [skills, instructions] = await Promise.all([loadSkills(config), loadProjectInstructions(specPath)]);
159
- const systemContext = buildSystemContext(skills, instructions);
163
+ function buildSingleExecutionTask(spec) {
164
+ const trimmed = spec.trim();
165
+ return [
166
+ {
167
+ id: "task-1",
168
+ name: "Execute requested work",
169
+ description: trimmed.length > 0 ? trimmed : "Execute the provided spec.",
170
+ dependencies: [],
171
+ acceptance_criteria: ["Requested work is completed and verified."],
172
+ status: "pending",
173
+ retries: 0,
174
+ maxRetries: 3,
175
+ },
176
+ ];
177
+ }
178
+ async function runFullPlanning(spec, systemContext, config) {
160
179
  const planSpecImpl = resolvePlanSpecImpl(config);
161
180
  const result = await planSpecImpl(spec, systemContext, config);
162
181
  try {
@@ -183,6 +202,28 @@ export async function runPlanner(specPath, store, runId, config) {
183
202
  throw new InvalidPlanError("review", `Review stage failed. ${error instanceof Error ? error.message : String(error)}`);
184
203
  }
185
204
  }
205
+ return finalTasks;
206
+ }
207
+ export async function runPlanner(specPath, store, runId, config, options) {
208
+ const spec = await fs.readFile(specPath, "utf8");
209
+ const [skills, instructions] = await Promise.all([loadSkills(config), loadProjectInstructions(specPath)]);
210
+ const systemContext = buildSystemContext(skills, instructions);
211
+ let finalTasks;
212
+ if (options?.allowPlanSkip === true) {
213
+ const decidePlanningNeed = resolveDecidePlanningNeedImpl(config);
214
+ const decision = await decidePlanningNeed(spec, systemContext, config);
215
+ if (!decision.needsPlan) {
216
+ logger.info(`Planning skipped: ${decision.reason}`);
217
+ finalTasks = buildSingleExecutionTask(spec);
218
+ }
219
+ else {
220
+ logger.info(`Planning required: ${decision.reason}`);
221
+ finalTasks = await runFullPlanning(spec, systemContext, config);
222
+ }
223
+ }
224
+ else {
225
+ finalTasks = await runFullPlanning(spec, systemContext, config);
226
+ }
186
227
  await store.writeTasks(runId, finalTasks);
187
228
  await store.updateRun(runId, {
188
229
  overallStatus: "planning",
@@ -1,4 +1,5 @@
1
- export declare const CODEX_EFFORT_VALUES: readonly ["low", "medium", "high"];
2
- export type CodexEffort = (typeof CODEX_EFFORT_VALUES)[number];
1
+ export declare const CODEX_THINKING_LEVEL_VALUES: readonly ["low", "medium", "high", "xhigh"];
2
+ export declare const CODEX_EFFORT_VALUES: readonly ["low", "medium", "high", "xhigh"];
3
+ export type CodexEffort = (typeof CODEX_THINKING_LEVEL_VALUES)[number];
3
4
  export declare function parseCodexEffort(raw: string): CodexEffort;
4
5
  //# sourceMappingURL=effort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"effort.d.ts","sourceRoot":"","sources":["../../src/types/effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,oCAAqC,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAkB/D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAEzD"}
1
+ {"version":3,"file":"effort.d.ts","sourceRoot":"","sources":["../../src/types/effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,6CAA8C,CAAC;AACvF,eAAO,MAAM,mBAAmB,6CAA8B,CAAC;AAC/D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAkBvE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAEzD"}
@@ -1,4 +1,5 @@
1
- export const CODEX_EFFORT_VALUES = ["low", "medium", "high"];
1
+ export const CODEX_THINKING_LEVEL_VALUES = ["low", "medium", "high", "xhigh"];
2
+ export const CODEX_EFFORT_VALUES = CODEX_THINKING_LEVEL_VALUES;
2
3
  function formatAllowed(values) {
3
4
  return values.map((value) => `'${value}'`).join(", ");
4
5
  }
@@ -9,5 +10,5 @@ function parseEffort(raw, allowed, label) {
9
10
  throw new Error(`${label} must be one of ${formatAllowed(allowed)}, got '${raw}'`);
10
11
  }
11
12
  export function parseCodexEffort(raw) {
12
- return parseEffort(raw, CODEX_EFFORT_VALUES, "Codex effort");
13
+ return parseEffort(raw, CODEX_EFFORT_VALUES, "Codex thinking level");
13
14
  }
@@ -138,6 +138,11 @@ export interface OrcaConfig {
138
138
  enabled?: boolean;
139
139
  model?: string;
140
140
  effort?: CodexEffort;
141
+ thinkingLevel?: {
142
+ decision?: CodexEffort;
143
+ planning?: CodexEffort;
144
+ execution?: CodexEffort;
145
+ };
141
146
  command?: string;
142
147
  timeoutMs?: number;
143
148
  multiAgent?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orcastrator",
3
- "version": "0.2.23",
3
+ "version": "0.2.24",
4
4
  "type": "module",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {
@@ -40,21 +40,21 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@inquirer/prompts": "^8.2.1",
43
- "@ratley/codex-client": "^0.1.3",
43
+ "@ratley/codex-client": "^0.1.4",
44
44
  "chalk": "^5.3.0",
45
45
  "commander": "^13.1.0",
46
46
  "zod": "^4.3.6"
47
47
  },
48
48
  "devDependencies": {
49
+ "@arethetypeswrong/cli": "^0.17.4",
49
50
  "@types/bun": "^1.2.21",
51
+ "@typescript/native-preview": "^7.0.0-dev.20260219.1",
50
52
  "husky": "^9.1.7",
51
53
  "lint-staged": "^16.2.0",
52
54
  "oxlint": "^1.49.0",
53
- "typescript": "^5.8.2",
54
- "@typescript/native-preview": "^7.0.0-dev.20260219.1",
55
55
  "oxlint-tsgolint": "^0.14.1",
56
56
  "publint": "^0.3.15",
57
- "@arethetypeswrong/cli": "^0.17.4"
57
+ "typescript": "^5.8.2"
58
58
  },
59
59
  "lint-staged": {
60
60
  "*.ts": [