@nbardy/oompa 0.4.4 → 0.4.5

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.
@@ -141,8 +141,8 @@
141
141
  [harness model]
142
142
  (try
143
143
  (let [cmd (case harness
144
- :claude ["claude" "--model" model "-p" "say ok" "--max-turns" "1"]
145
- :codex ["codex" "exec" "--dangerously-bypass-approvals-and-sandbox" "--skip-git-repo-check" "--model" model "--" "say ok"])
144
+ :claude ["claude" "--model" model "-p" "[oompa:probe] say ok" "--max-turns" "1"]
145
+ :codex ["codex" "exec" "--dangerously-bypass-approvals-and-sandbox" "--skip-git-repo-check" "--model" model "--" "[oompa:probe] say ok"])
146
146
  null-in (io/input-stream (io/file "/dev/null"))
147
147
  proc (process/process cmd {:out :string :err :string :in null-in})
148
148
  result (deref proc 30000 :timeout)]
@@ -97,6 +97,26 @@
97
97
  "Root of the oompa package — set by bin/oompa.js, falls back to cwd."
98
98
  (or (System/getenv "OOMPA_PACKAGE_ROOT") "."))
99
99
 
100
+ ;; Resolve absolute paths for CLI binaries at first use.
101
+ ;; ProcessBuilder with :dir set can fail to find bare command names on some
102
+ ;; platforms (macOS + babashka), so we resolve once via `which` and cache.
103
+ (def ^:private binary-paths* (atom {}))
104
+
105
+ (defn- resolve-binary!
106
+ "Resolve the absolute path of a CLI binary. Caches result.
107
+ Throws if binary not found on PATH."
108
+ [name]
109
+ (or (get @binary-paths* name)
110
+ (let [result (try
111
+ (process/sh ["which" name] {:out :string :err :string})
112
+ (catch Exception _ {:exit -1 :out "" :err ""}))
113
+ path (when (zero? (:exit result))
114
+ (str/trim (:out result)))]
115
+ (if path
116
+ (do (swap! binary-paths* assoc name path)
117
+ path)
118
+ (throw (ex-info (str "Binary not found on PATH: " name) {:binary name}))))))
119
+
100
120
  (defn- load-prompt
101
121
  "Load a prompt file. Tries path as-is first, then from package root."
102
122
  [path]
@@ -172,14 +192,14 @@
172
192
  ;; Build command — both harnesses run with cwd=worktree, no sandbox
173
193
  ;; so agents can `..` to reach project root for task management
174
194
  cmd (case harness
175
- :codex (cond-> ["codex" "exec"
195
+ :codex (cond-> [(resolve-binary! "codex") "exec"
176
196
  "--dangerously-bypass-approvals-and-sandbox"
177
197
  "--skip-git-repo-check"
178
198
  "-C" abs-worktree]
179
199
  model (into ["--model" model])
180
200
  reasoning (into ["-c" (str "model_reasoning_effort=\"" reasoning "\"")])
181
201
  true (conj "--" full-prompt))
182
- :claude (cond-> ["claude" "-p" "--dangerously-skip-permissions"
202
+ :claude (cond-> [(resolve-binary! "claude") "-p" "--dangerously-skip-permissions"
183
203
  "--session-id" session-id]
184
204
  model (into ["--model" model])))
185
205
 
@@ -227,13 +247,13 @@
227
247
 
228
248
  ;; Build command — cwd=worktree, no sandbox
229
249
  cmd (case review-harness
230
- :codex (cond-> ["codex" "exec"
250
+ :codex (cond-> [(resolve-binary! "codex") "exec"
231
251
  "--dangerously-bypass-approvals-and-sandbox"
232
252
  "--skip-git-repo-check"
233
253
  "-C" abs-wt]
234
254
  review-model (into ["--model" review-model])
235
255
  true (conj "--" review-prompt))
236
- :claude (cond-> ["claude" "-p" "--dangerously-skip-permissions"]
256
+ :claude (cond-> [(resolve-binary! "claude") "-p" "--dangerously-skip-permissions"]
237
257
  review-model (into ["--model" review-model])))
238
258
 
239
259
  ;; Run reviewer — cwd=worktree
@@ -265,13 +285,13 @@
265
285
  abs-wt (.getAbsolutePath (io/file worktree-path))
266
286
 
267
287
  cmd (case harness
268
- :codex (cond-> ["codex" "exec"
288
+ :codex (cond-> [(resolve-binary! "codex") "exec"
269
289
  "--dangerously-bypass-approvals-and-sandbox"
270
290
  "--skip-git-repo-check"
271
291
  "-C" abs-wt]
272
292
  model (into ["--model" model])
273
293
  true (conj "--" fix-prompt))
274
- :claude (cond-> ["claude" "-p" "--dangerously-skip-permissions"]
294
+ :claude (cond-> [(resolve-binary! "claude") "-p" "--dangerously-skip-permissions"]
275
295
  model (into ["--model" model])))
276
296
 
277
297
  result (try
package/bin/test-models CHANGED
@@ -37,9 +37,9 @@ if [ -z "$MODELS" ]; then
37
37
  exit 1
38
38
  fi
39
39
 
40
- # Create results directory
40
+ # Create results directory in /tmp so it doesn't litter the project
41
41
  RUN_ID=$(python3 -c "import uuid; print(str(uuid.uuid4())[:8])")
42
- RESULTS_DIR="tst_results_${RUN_ID}"
42
+ RESULTS_DIR="/tmp/oompa_tst_${RUN_ID}"
43
43
  mkdir -p "$RESULTS_DIR"
44
44
 
45
45
  MODEL_COUNT=$(echo "$MODELS" | wc -l | tr -d ' ')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nbardy/oompa",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Git-worktree multi-agent swarm orchestrator for Codex and Claude",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",