oh-my-codex 0.16.0 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +2 -2
  4. package/crates/omx-explore/src/main.rs +434 -28
  5. package/dist/agents/__tests__/native-config.test.js +50 -0
  6. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  7. package/dist/agents/native-config.d.ts.map +1 -1
  8. package/dist/agents/native-config.js +3 -2
  9. package/dist/agents/native-config.js.map +1 -1
  10. package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -0
  11. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  12. package/dist/cli/__tests__/doctor-warning-copy.test.js +1 -1
  13. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  14. package/dist/cli/__tests__/explore.test.js +120 -3
  15. package/dist/cli/__tests__/explore.test.js.map +1 -1
  16. package/dist/cli/__tests__/imagegen-continuation.test.d.ts +2 -0
  17. package/dist/cli/__tests__/imagegen-continuation.test.d.ts.map +1 -0
  18. package/dist/cli/__tests__/imagegen-continuation.test.js +135 -0
  19. package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -0
  20. package/dist/cli/__tests__/index.test.js +182 -18
  21. package/dist/cli/__tests__/index.test.js.map +1 -1
  22. package/dist/cli/__tests__/launch-fallback.test.js +88 -2
  23. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  24. package/dist/cli/__tests__/ralph.test.js +62 -0
  25. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  26. package/dist/cli/__tests__/setup-install-mode.test.js +48 -0
  27. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  28. package/dist/cli/__tests__/setup-scope.test.js +12 -0
  29. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  30. package/dist/cli/__tests__/team.test.js +465 -12
  31. package/dist/cli/__tests__/team.test.js.map +1 -1
  32. package/dist/cli/__tests__/ultragoal.test.js +50 -5
  33. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  34. package/dist/cli/__tests__/uninstall.test.js +6 -2
  35. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  36. package/dist/cli/explore.d.ts.map +1 -1
  37. package/dist/cli/explore.js +211 -12
  38. package/dist/cli/explore.js.map +1 -1
  39. package/dist/cli/index.d.ts +11 -3
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +124 -18
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/ralph.d.ts.map +1 -1
  44. package/dist/cli/ralph.js +37 -3
  45. package/dist/cli/ralph.js.map +1 -1
  46. package/dist/cli/setup.d.ts.map +1 -1
  47. package/dist/cli/setup.js +100 -9
  48. package/dist/cli/setup.js.map +1 -1
  49. package/dist/cli/team.d.ts +1 -0
  50. package/dist/cli/team.d.ts.map +1 -1
  51. package/dist/cli/team.js +42 -7
  52. package/dist/cli/team.js.map +1 -1
  53. package/dist/cli/ultragoal.d.ts +1 -1
  54. package/dist/cli/ultragoal.d.ts.map +1 -1
  55. package/dist/cli/ultragoal.js +29 -8
  56. package/dist/cli/ultragoal.js.map +1 -1
  57. package/dist/cli/uninstall.d.ts.map +1 -1
  58. package/dist/cli/uninstall.js +2 -1
  59. package/dist/cli/uninstall.js.map +1 -1
  60. package/dist/config/__tests__/codex-hooks.test.js +97 -2
  61. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  62. package/dist/config/__tests__/generator-idempotent.test.js +1 -1
  63. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  64. package/dist/config/__tests__/generator-notify.test.js +22 -0
  65. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  66. package/dist/config/__tests__/models.test.js +18 -1
  67. package/dist/config/__tests__/models.test.js.map +1 -1
  68. package/dist/config/__tests__/wiki-config-contract.test.js +2 -1
  69. package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -1
  70. package/dist/config/codex-hooks.d.ts +17 -3
  71. package/dist/config/codex-hooks.d.ts.map +1 -1
  72. package/dist/config/codex-hooks.js +102 -2
  73. package/dist/config/codex-hooks.js.map +1 -1
  74. package/dist/config/generator.d.ts +4 -1
  75. package/dist/config/generator.d.ts.map +1 -1
  76. package/dist/config/generator.js +69 -12
  77. package/dist/config/generator.js.map +1 -1
  78. package/dist/config/models.d.ts +6 -0
  79. package/dist/config/models.d.ts.map +1 -1
  80. package/dist/config/models.js +37 -0
  81. package/dist/config/models.js.map +1 -1
  82. package/dist/exec/followup.d.ts +1 -0
  83. package/dist/exec/followup.d.ts.map +1 -1
  84. package/dist/exec/followup.js +9 -3
  85. package/dist/exec/followup.js.map +1 -1
  86. package/dist/hooks/__tests__/anti-slop-workflow.test.js +19 -0
  87. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
  88. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +19 -2
  89. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  90. package/dist/hooks/__tests__/deep-interview-contract.test.js +40 -0
  91. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  92. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts +2 -0
  93. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts.map +1 -0
  94. package/dist/hooks/__tests__/foreground-isolation-contract.test.js +28 -0
  95. package/dist/hooks/__tests__/foreground-isolation-contract.test.js.map +1 -0
  96. package/dist/hooks/__tests__/keyword-detector.test.js +37 -25
  97. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  98. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +10 -4
  99. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  100. package/dist/hooks/__tests__/session.test.js +32 -0
  101. package/dist/hooks/__tests__/session.test.js.map +1 -1
  102. package/dist/hooks/__tests__/wiki-docs-contract.test.js +6 -4
  103. package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -1
  104. package/dist/hooks/codebase-map.d.ts.map +1 -1
  105. package/dist/hooks/codebase-map.js +3 -2
  106. package/dist/hooks/codebase-map.js.map +1 -1
  107. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  108. package/dist/hooks/extensibility/dispatcher.js +6 -4
  109. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  110. package/dist/hooks/extensibility/logging.d.ts.map +1 -1
  111. package/dist/hooks/extensibility/logging.js +3 -2
  112. package/dist/hooks/extensibility/logging.js.map +1 -1
  113. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
  114. package/dist/hooks/extensibility/sdk/paths.js +4 -3
  115. package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
  116. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  117. package/dist/hooks/keyword-detector.js +2 -4
  118. package/dist/hooks/keyword-detector.js.map +1 -1
  119. package/dist/hooks/session.d.ts.map +1 -1
  120. package/dist/hooks/session.js +22 -12
  121. package/dist/hooks/session.js.map +1 -1
  122. package/dist/hud/__tests__/hud-tmux-injection.test.js +8 -7
  123. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  124. package/dist/hud/__tests__/reconcile.test.js +1 -1
  125. package/dist/hud/__tests__/state.test.js +24 -0
  126. package/dist/hud/__tests__/state.test.js.map +1 -1
  127. package/dist/hud/index.js +1 -1
  128. package/dist/hud/index.js.map +1 -1
  129. package/dist/hud/state.d.ts.map +1 -1
  130. package/dist/hud/state.js +22 -8
  131. package/dist/hud/state.js.map +1 -1
  132. package/dist/hud/tmux.js +1 -1
  133. package/dist/hud/tmux.js.map +1 -1
  134. package/dist/imagegen/continuation.d.ts +44 -0
  135. package/dist/imagegen/continuation.d.ts.map +1 -0
  136. package/dist/imagegen/continuation.js +220 -0
  137. package/dist/imagegen/continuation.js.map +1 -0
  138. package/dist/mcp/__tests__/bootstrap.test.js +47 -2
  139. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  140. package/dist/mcp/__tests__/server-lifecycle.test.js +49 -1
  141. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  142. package/dist/mcp/__tests__/state-server.test.js +145 -6
  143. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  144. package/dist/mcp/__tests__/wiki-server.test.js +97 -1
  145. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
  146. package/dist/mcp/bootstrap.d.ts +2 -0
  147. package/dist/mcp/bootstrap.d.ts.map +1 -1
  148. package/dist/mcp/bootstrap.js +95 -15
  149. package/dist/mcp/bootstrap.js.map +1 -1
  150. package/dist/mcp/lifecycle-telemetry.d.ts +16 -0
  151. package/dist/mcp/lifecycle-telemetry.d.ts.map +1 -0
  152. package/dist/mcp/lifecycle-telemetry.js +95 -0
  153. package/dist/mcp/lifecycle-telemetry.js.map +1 -0
  154. package/dist/mcp/wiki-server.d.ts.map +1 -1
  155. package/dist/mcp/wiki-server.js +11 -2
  156. package/dist/mcp/wiki-server.js.map +1 -1
  157. package/dist/pipeline/__tests__/stages.test.js +274 -5
  158. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  159. package/dist/pipeline/stages/team-exec.d.ts +2 -0
  160. package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
  161. package/dist/pipeline/stages/team-exec.js +51 -26
  162. package/dist/pipeline/stages/team-exec.js.map +1 -1
  163. package/dist/planning/__tests__/artifacts.test.js +138 -3
  164. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  165. package/dist/planning/__tests__/context-pack-status.test.d.ts +2 -0
  166. package/dist/planning/__tests__/context-pack-status.test.d.ts.map +1 -0
  167. package/dist/planning/__tests__/context-pack-status.test.js +271 -0
  168. package/dist/planning/__tests__/context-pack-status.test.js.map +1 -0
  169. package/dist/planning/artifacts.d.ts +12 -1
  170. package/dist/planning/artifacts.d.ts.map +1 -1
  171. package/dist/planning/artifacts.js +32 -9
  172. package/dist/planning/artifacts.js.map +1 -1
  173. package/dist/planning/context-pack-status.d.ts +42 -0
  174. package/dist/planning/context-pack-status.d.ts.map +1 -0
  175. package/dist/planning/context-pack-status.js +479 -0
  176. package/dist/planning/context-pack-status.js.map +1 -0
  177. package/dist/runtime/__tests__/process-tree.test.d.ts +2 -0
  178. package/dist/runtime/__tests__/process-tree.test.d.ts.map +1 -0
  179. package/dist/runtime/__tests__/process-tree.test.js +107 -0
  180. package/dist/runtime/__tests__/process-tree.test.js.map +1 -0
  181. package/dist/runtime/process-tree.d.ts +28 -0
  182. package/dist/runtime/process-tree.d.ts.map +1 -0
  183. package/dist/runtime/process-tree.js +230 -0
  184. package/dist/runtime/process-tree.js.map +1 -0
  185. package/dist/scripts/__tests__/codex-native-hook.test.js +267 -2
  186. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  187. package/dist/scripts/__tests__/notify-state-io.test.d.ts +2 -0
  188. package/dist/scripts/__tests__/notify-state-io.test.d.ts.map +1 -0
  189. package/dist/scripts/__tests__/notify-state-io.test.js +40 -0
  190. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -0
  191. package/dist/scripts/codex-execution-surface.d.ts +1 -1
  192. package/dist/scripts/codex-execution-surface.d.ts.map +1 -1
  193. package/dist/scripts/codex-execution-surface.js.map +1 -1
  194. package/dist/scripts/codex-native-hook.d.ts +1 -1
  195. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  196. package/dist/scripts/codex-native-hook.js +141 -9
  197. package/dist/scripts/codex-native-hook.js.map +1 -1
  198. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  199. package/dist/scripts/notify-hook/managed-tmux.js +6 -9
  200. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  201. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
  202. package/dist/scripts/notify-hook/process-runner.js +4 -1
  203. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  204. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  205. package/dist/scripts/notify-hook/state-io.js +4 -7
  206. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  207. package/dist/scripts/notify-hook.js +25 -3
  208. package/dist/scripts/notify-hook.js.map +1 -1
  209. package/dist/scripts/verify-native-agents.d.ts.map +1 -1
  210. package/dist/scripts/verify-native-agents.js +3 -1
  211. package/dist/scripts/verify-native-agents.js.map +1 -1
  212. package/dist/sidecar/__tests__/tmux.test.js +1 -1
  213. package/dist/sidecar/__tests__/tmux.test.js.map +1 -1
  214. package/dist/sidecar/tmux.js +1 -1
  215. package/dist/sidecar/tmux.js.map +1 -1
  216. package/dist/state/__tests__/operations.test.js +79 -0
  217. package/dist/state/__tests__/operations.test.js.map +1 -1
  218. package/dist/state/__tests__/skill-active.test.js +10 -18
  219. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  220. package/dist/state/__tests__/workflow-transition.test.js +45 -1
  221. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  222. package/dist/state/operations.d.ts.map +1 -1
  223. package/dist/state/operations.js +1 -20
  224. package/dist/state/operations.js.map +1 -1
  225. package/dist/state/skill-active.d.ts +1 -0
  226. package/dist/state/skill-active.d.ts.map +1 -1
  227. package/dist/state/skill-active.js +28 -18
  228. package/dist/state/skill-active.js.map +1 -1
  229. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  230. package/dist/state/workflow-transition-reconcile.js +3 -2
  231. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  232. package/dist/state/workflow-transition.js +2 -2
  233. package/dist/state/workflow-transition.js.map +1 -1
  234. package/dist/team/__tests__/approved-execution.test.js +96 -0
  235. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  236. package/dist/team/__tests__/followup-planner.test.js +16 -0
  237. package/dist/team/__tests__/followup-planner.test.js.map +1 -1
  238. package/dist/team/__tests__/model-contract.test.js +16 -0
  239. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  240. package/dist/team/__tests__/repo-aware-decomposition.test.js +20 -0
  241. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
  242. package/dist/team/__tests__/runtime-cli.test.js +16 -0
  243. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  244. package/dist/team/__tests__/runtime.test.js +209 -11
  245. package/dist/team/__tests__/runtime.test.js.map +1 -1
  246. package/dist/team/__tests__/scaling.test.js +110 -0
  247. package/dist/team/__tests__/scaling.test.js.map +1 -1
  248. package/dist/team/__tests__/tmux-session.test.js +9 -0
  249. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  250. package/dist/team/__tests__/worker-runtime-identity.test.js +6 -0
  251. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  252. package/dist/team/approved-execution.d.ts +13 -0
  253. package/dist/team/approved-execution.d.ts.map +1 -1
  254. package/dist/team/approved-execution.js +40 -22
  255. package/dist/team/approved-execution.js.map +1 -1
  256. package/dist/team/followup-planner.d.ts +1 -0
  257. package/dist/team/followup-planner.d.ts.map +1 -1
  258. package/dist/team/followup-planner.js +9 -9
  259. package/dist/team/followup-planner.js.map +1 -1
  260. package/dist/team/model-contract.d.ts +1 -1
  261. package/dist/team/model-contract.d.ts.map +1 -1
  262. package/dist/team/model-contract.js +4 -3
  263. package/dist/team/model-contract.js.map +1 -1
  264. package/dist/team/repo-aware-decomposition.d.ts +1 -0
  265. package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
  266. package/dist/team/repo-aware-decomposition.js +5 -1
  267. package/dist/team/repo-aware-decomposition.js.map +1 -1
  268. package/dist/team/runtime-cli.d.ts +4 -0
  269. package/dist/team/runtime-cli.d.ts.map +1 -1
  270. package/dist/team/runtime-cli.js +14 -1
  271. package/dist/team/runtime-cli.js.map +1 -1
  272. package/dist/team/runtime.d.ts +1 -0
  273. package/dist/team/runtime.d.ts.map +1 -1
  274. package/dist/team/runtime.js +46 -16
  275. package/dist/team/runtime.js.map +1 -1
  276. package/dist/team/scaling.d.ts.map +1 -1
  277. package/dist/team/scaling.js +13 -6
  278. package/dist/team/scaling.js.map +1 -1
  279. package/dist/team/tmux-session.d.ts.map +1 -1
  280. package/dist/team/tmux-session.js +7 -0
  281. package/dist/team/tmux-session.js.map +1 -1
  282. package/dist/ultragoal/__tests__/artifacts.test.js +129 -4
  283. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  284. package/dist/ultragoal/__tests__/docs-contract.test.d.ts +2 -0
  285. package/dist/ultragoal/__tests__/docs-contract.test.d.ts.map +1 -0
  286. package/dist/ultragoal/__tests__/docs-contract.test.js +31 -0
  287. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -0
  288. package/dist/ultragoal/artifacts.d.ts +6 -2
  289. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  290. package/dist/ultragoal/artifacts.js +108 -4
  291. package/dist/ultragoal/artifacts.js.map +1 -1
  292. package/dist/utils/paths.d.ts +3 -1
  293. package/dist/utils/paths.d.ts.map +1 -1
  294. package/dist/utils/paths.js +6 -2
  295. package/dist/utils/paths.js.map +1 -1
  296. package/dist/verification/__tests__/ci-rust-gates.test.js +44 -14
  297. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  298. package/dist/wiki/__tests__/ingest.test.js +35 -1
  299. package/dist/wiki/__tests__/ingest.test.js.map +1 -1
  300. package/dist/wiki/__tests__/lint.test.js +14 -1
  301. package/dist/wiki/__tests__/lint.test.js.map +1 -1
  302. package/dist/wiki/__tests__/query.test.js +28 -3
  303. package/dist/wiki/__tests__/query.test.js.map +1 -1
  304. package/dist/wiki/__tests__/session-hooks.test.js +30 -2
  305. package/dist/wiki/__tests__/session-hooks.test.js.map +1 -1
  306. package/dist/wiki/__tests__/storage.test.js +62 -22
  307. package/dist/wiki/__tests__/storage.test.js.map +1 -1
  308. package/dist/wiki/index.d.ts +2 -2
  309. package/dist/wiki/index.d.ts.map +1 -1
  310. package/dist/wiki/index.js +2 -2
  311. package/dist/wiki/index.js.map +1 -1
  312. package/dist/wiki/ingest.js +2 -2
  313. package/dist/wiki/ingest.js.map +1 -1
  314. package/dist/wiki/lifecycle.d.ts +5 -0
  315. package/dist/wiki/lifecycle.d.ts.map +1 -1
  316. package/dist/wiki/lifecycle.js +31 -4
  317. package/dist/wiki/lifecycle.js.map +1 -1
  318. package/dist/wiki/lint.d.ts.map +1 -1
  319. package/dist/wiki/lint.js +12 -8
  320. package/dist/wiki/lint.js.map +1 -1
  321. package/dist/wiki/query.d.ts.map +1 -1
  322. package/dist/wiki/query.js +3 -2
  323. package/dist/wiki/query.js.map +1 -1
  324. package/dist/wiki/storage.d.ts +4 -0
  325. package/dist/wiki/storage.d.ts.map +1 -1
  326. package/dist/wiki/storage.js +54 -18
  327. package/dist/wiki/storage.js.map +1 -1
  328. package/package.json +1 -1
  329. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  330. package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +9 -0
  331. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +25 -2
  332. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
  333. package/plugins/oh-my-codex/skills/plan/SKILL.md +7 -4
  334. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +13 -3
  335. package/plugins/oh-my-codex/skills/team/SKILL.md +2 -2
  336. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +11 -7
  337. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +8 -0
  338. package/plugins/oh-my-codex/skills/wiki/SKILL.md +5 -5
  339. package/prompts/planner.md +1 -1
  340. package/skills/ai-slop-cleaner/SKILL.md +9 -0
  341. package/skills/deep-interview/SKILL.md +25 -2
  342. package/skills/omx-setup/SKILL.md +1 -1
  343. package/skills/plan/SKILL.md +7 -4
  344. package/skills/ralplan/SKILL.md +13 -3
  345. package/skills/team/SKILL.md +2 -2
  346. package/skills/ultragoal/SKILL.md +11 -7
  347. package/skills/visual-ralph/SKILL.md +8 -0
  348. package/skills/wiki/SKILL.md +5 -5
  349. package/src/scripts/__tests__/codex-native-hook.test.ts +302 -2
  350. package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
  351. package/src/scripts/codex-execution-surface.ts +2 -0
  352. package/src/scripts/codex-native-hook.ts +163 -16
  353. package/src/scripts/notify-hook/managed-tmux.ts +6 -7
  354. package/src/scripts/notify-hook/process-runner.ts +4 -1
  355. package/src/scripts/notify-hook/state-io.ts +5 -7
  356. package/src/scripts/notify-hook.ts +26 -3
  357. package/src/scripts/verify-native-agents.ts +3 -1
@@ -1,8 +1,9 @@
1
1
  import { afterEach, beforeEach, describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
+ import { createHash } from 'node:crypto';
3
4
  import { execFileSync, spawn } from 'child_process';
4
5
  import { mkdtemp, rm, writeFile, readFile, mkdir, chmod, readdir } from 'fs/promises';
5
- import { join } from 'path';
6
+ import { join, relative } from 'path';
6
7
  import { tmpdir } from 'os';
7
8
  import { existsSync } from 'fs';
8
9
  import { HUD_TMUX_TEAM_HEIGHT_LINES } from '../../hud/constants.js';
@@ -32,6 +33,45 @@ async function addWorktree(repo, branchName, pathPrefix) {
32
33
  execFileSync('git', ['worktree', 'add', '-b', branchName, worktreePath, 'HEAD'], { cwd: repo, stdio: 'ignore' });
33
34
  return worktreePath;
34
35
  }
36
+ function computeGitBlobSha1(content) {
37
+ const buffer = Buffer.from(content, 'utf-8');
38
+ const header = Buffer.from(`blob ${buffer.length}\0`, 'utf-8');
39
+ return createHash('sha1').update(header).update(buffer).digest('hex');
40
+ }
41
+ function canonicalContextPackRelativePath(slug) {
42
+ return `.omx/context/context-20260507T120000Z-${slug}.json`;
43
+ }
44
+ function buildContextPackOutcome(relativePackPath) {
45
+ return [
46
+ '## Context Pack Outcome',
47
+ '',
48
+ `- pack: created \`${relativePackPath}\``,
49
+ ].join('\n');
50
+ }
51
+ async function writeReadyContextPack(cwd, slug, prdPath, testSpecPath) {
52
+ const contextDir = join(cwd, '.omx', 'context');
53
+ const packPath = join(cwd, canonicalContextPackRelativePath(slug));
54
+ const prdContent = await readFile(prdPath, 'utf-8');
55
+ const testSpecContent = await readFile(testSpecPath, 'utf-8');
56
+ await mkdir(contextDir, { recursive: true });
57
+ await writeFile(packPath, JSON.stringify({
58
+ slug,
59
+ basis: {
60
+ prd: {
61
+ path: relative(cwd, prdPath).replaceAll('\\', '/'),
62
+ sha1: computeGitBlobSha1(prdContent),
63
+ },
64
+ testSpecs: [{
65
+ path: relative(cwd, testSpecPath).replaceAll('\\', '/'),
66
+ sha1: computeGitBlobSha1(testSpecContent),
67
+ }],
68
+ },
69
+ entries: ['scope', 'build', 'verify'].map((role, index) => ({
70
+ path: `src/${role}-${index}.ts`,
71
+ roles: [role],
72
+ })),
73
+ }, null, 2));
74
+ }
35
75
  async function attachDirtyWorkerRepo(teamName, cwd, repoName) {
36
76
  const repo = join(cwd, repoName);
37
77
  await mkdir(repo, { recursive: true });
@@ -61,6 +101,7 @@ function withIsolatedDefaultModelEnv(run) {
61
101
  'OMX_DEFAULT_STANDARD_MODEL',
62
102
  'OMX_DEFAULT_SPARK_MODEL',
63
103
  'OMX_SPARK_MODEL',
104
+ 'OMX_TEAM_WORKER_LAUNCH_ARGS',
64
105
  ]) {
65
106
  savedEnv.set(key, process.env[key]);
66
107
  delete process.env[key];
@@ -86,6 +127,7 @@ async function withIsolatedDefaultModelEnvAsync(run) {
86
127
  'OMX_DEFAULT_STANDARD_MODEL',
87
128
  'OMX_DEFAULT_SPARK_MODEL',
88
129
  'OMX_SPARK_MODEL',
130
+ 'OMX_TEAM_WORKER_LAUNCH_ARGS',
89
131
  ]) {
90
132
  savedEnv.set(key, process.env[key]);
91
133
  delete process.env[key];
@@ -2840,7 +2882,7 @@ process.exit(0);
2840
2882
  await rm(cwd, { recursive: true, force: true });
2841
2883
  }
2842
2884
  });
2843
- it('startTeam preserves routed task roles into team state and worker launch args', async () => {
2885
+ it('startTeam preserves routed task roles into team state and override-aware worker launch args', async () => {
2844
2886
  const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-role-routing-'));
2845
2887
  const binDir = join(cwd, 'bin');
2846
2888
  const fakeCodexPath = join(binDir, 'codex');
@@ -2875,10 +2917,19 @@ process.on('SIGTERM', () => process.exit(0));
2875
2917
  delete process.env.OMX_DEFAULT_STANDARD_MODEL;
2876
2918
  let runtime = null;
2877
2919
  try {
2878
- runtime = await withIsolatedDefaultModelEnvAsync(async () => await withMockPromptModeCodexAllowed(() => withoutTeamWorkerEnv(() => startTeam('team-role-routing', 'heuristic routing handoff', 'executor', 2, [
2879
- { subject: 'test routing report only', description: 'test routing report only', owner: 'worker-1', role: 'test-engineer' },
2880
- { subject: 'document routing report only', description: 'document routing report only', owner: 'worker-2', role: 'writer' },
2881
- ], cwd))));
2920
+ runtime = await withIsolatedDefaultModelEnvAsync(async () => {
2921
+ assert.ok(process.env.CODEX_HOME, 'isolated CODEX_HOME should be set');
2922
+ await mkdir(process.env.CODEX_HOME, { recursive: true });
2923
+ await writeFile(join(process.env.CODEX_HOME, '.omx-config.json'), JSON.stringify({
2924
+ agentReasoning: {
2925
+ writer: 'xhigh',
2926
+ },
2927
+ }));
2928
+ return await withMockPromptModeCodexAllowed(() => withoutTeamWorkerEnv(() => startTeam('team-role-routing', 'heuristic routing handoff', 'executor', 2, [
2929
+ { subject: 'test routing report only', description: 'test routing report only', owner: 'worker-1', role: 'test-engineer' },
2930
+ { subject: 'document routing report only', description: 'document routing report only', owner: 'worker-2', role: 'writer' },
2931
+ ], cwd)));
2932
+ });
2882
2933
  assert.equal(runtime.config.worker_launch_mode, 'prompt');
2883
2934
  assert.equal(runtime.config.workers[0]?.role, 'test-engineer');
2884
2935
  assert.equal(runtime.config.workers[1]?.role, 'writer');
@@ -2917,7 +2968,7 @@ process.on('SIGTERM', () => process.exit(0));
2917
2968
  assert.match(worker1Joined, /model_reasoning_effort="medium"/);
2918
2969
  assert.match(worker1Joined, /model_instructions_file=.*worker-1\/AGENTS\.md/);
2919
2970
  assert.match(worker1Joined, /--model gpt-5\.5/);
2920
- assert.match(worker2Joined, /model_reasoning_effort="high"/);
2971
+ assert.match(worker2Joined, /model_reasoning_effort="xhigh"/);
2921
2972
  assert.match(worker2Joined, /model_instructions_file=.*worker-2\/AGENTS\.md/);
2922
2973
  assert.match(worker2Joined, /--model gpt-5\.5/);
2923
2974
  await shutdownTeam(runtime.teamName, cwd, { force: true });
@@ -5115,6 +5166,56 @@ esac
5115
5166
  await rm(cwd, { recursive: true, force: true });
5116
5167
  }
5117
5168
  });
5169
+ it('resumeTeam fails closed when the persisted approved binding is ambiguous', async () => {
5170
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-resume-ambiguous-'));
5171
+ const approvedTask = 'Execute approved issue 2111 plan';
5172
+ try {
5173
+ await initTeamState('team-approved-resume', 'approved resume test', 'executor', 1, cwd);
5174
+ await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
5175
+ const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-2111.md');
5176
+ await writeFile(prdPath, [
5177
+ '# Approved plan',
5178
+ '',
5179
+ `Launch via omx team 2:executor "${approvedTask}"`,
5180
+ `Launch via omx team 5:debugger "${approvedTask}"`,
5181
+ ].join('\n'));
5182
+ await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-2111.md'), '# Test spec\n');
5183
+ await writePersistedApprovedTeamExecutionBinding('team-approved-resume', cwd, {
5184
+ prd_path: prdPath,
5185
+ task: approvedTask,
5186
+ });
5187
+ await assert.rejects(() => resumeTeam('team-approved-resume', cwd), /approved_execution_binding_ambiguous:.*Execute approved issue 2111 plan/);
5188
+ }
5189
+ finally {
5190
+ await rm(cwd, { recursive: true, force: true });
5191
+ }
5192
+ });
5193
+ it('resumeTeam fails closed when the persisted approved binding is nonready', async () => {
5194
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-resume-nonready-'));
5195
+ try {
5196
+ await initTeamState('team-approved-resume', 'approved resume test', 'executor', 1, cwd);
5197
+ await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
5198
+ const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-2112.md');
5199
+ await writeFile(prdPath, [
5200
+ '# Approved plan',
5201
+ '',
5202
+ '## Context Pack Outcome',
5203
+ '',
5204
+ '- pack: created `.omx/context/context-20260507T120000Z-other.json`',
5205
+ '',
5206
+ 'Launch via omx team 1:executor "Execute approved issue 2112 plan"',
5207
+ ].join('\n'));
5208
+ await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-2112.md'), '# Test spec\n');
5209
+ await writePersistedApprovedTeamExecutionBinding('team-approved-resume', cwd, {
5210
+ prd_path: prdPath,
5211
+ task: 'Execute approved issue 2112 plan',
5212
+ });
5213
+ await assert.rejects(() => resumeTeam('team-approved-resume', cwd), /approved_execution_binding_nonready:invalid:.*Execute approved issue 2112 plan/);
5214
+ }
5215
+ finally {
5216
+ await rm(cwd, { recursive: true, force: true });
5217
+ }
5218
+ });
5118
5219
  it('resumeTeam resolves approved binding continuity against the persisted leader cwd', async () => {
5119
5220
  const teamName = 'team-approved-shared-root';
5120
5221
  const leaderCwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-leader-'));
@@ -5312,14 +5413,23 @@ esac
5312
5413
  const fakeCodexPath = join(binDir, 'codex');
5313
5414
  await mkdir(binDir, { recursive: true });
5314
5415
  await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
5315
- await writeFile(join(cwd, '.omx', 'plans', 'prd-issue-1314.md'), '# Approved plan\n\nLaunch via omx team 1:executor "Execute approved issue 1314 plan"\n');
5316
- await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1314.md'), '# Test spec\n');
5416
+ const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-1314.md');
5417
+ const testSpecPath = join(cwd, '.omx', 'plans', 'test-spec-issue-1314.md');
5418
+ await writeFile(prdPath, [
5419
+ '# Approved plan',
5420
+ '',
5421
+ buildContextPackOutcome(canonicalContextPackRelativePath('issue-1314')),
5422
+ '',
5423
+ 'Launch via omx team 1:executor "Execute approved issue 1314 plan"',
5424
+ ].join('\n'));
5425
+ await writeFile(testSpecPath, '# Test spec\n');
5426
+ await writeReadyContextPack(cwd, 'issue-1314', prdPath, testSpecPath);
5317
5427
  await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
5318
5428
  let runtime = null;
5319
5429
  try {
5320
5430
  runtime = await withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding', 'approved binding persistence test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
5321
5431
  approvedExecution: {
5322
- prd_path: join(cwd, '.omx', 'plans', 'prd-issue-1314.md'),
5432
+ prd_path: prdPath,
5323
5433
  task: 'Execute approved issue 1314 plan',
5324
5434
  command: 'omx team 1:executor "Execute approved issue 1314 plan"',
5325
5435
  },
@@ -5327,7 +5437,7 @@ esac
5327
5437
  const bindingPath = join(runtime.config.team_state_root ?? join(cwd, '.omx', 'state'), 'team', runtime.teamName, 'approved-execution.json');
5328
5438
  const binding = JSON.parse(await readFile(bindingPath, 'utf-8'));
5329
5439
  assert.deepEqual(binding, {
5330
- prd_path: join(cwd, '.omx', 'plans', 'prd-issue-1314.md'),
5440
+ prd_path: prdPath,
5331
5441
  task: 'Execute approved issue 1314 plan',
5332
5442
  command: 'omx team 1:executor "Execute approved issue 1314 plan"',
5333
5443
  });
@@ -5340,6 +5450,65 @@ esac
5340
5450
  await rm(cwd, { recursive: true, force: true });
5341
5451
  }
5342
5452
  });
5453
+ it('startTeam keeps explicit plan-only approved bindings on the generic path', async () => {
5454
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-plan-only-'));
5455
+ const binDir = join(cwd, 'bin');
5456
+ const fakeCodexPath = join(binDir, 'codex');
5457
+ await mkdir(binDir, { recursive: true });
5458
+ await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
5459
+ await writeFile(join(cwd, '.omx', 'plans', 'prd-issue-1314-plan-only.md'), '# Approved plan\n\nLaunch via omx team 1:executor "Execute approved issue 1314 plan-only"\n');
5460
+ await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1314-plan-only.md'), '# Test spec\n');
5461
+ await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
5462
+ let runtime = null;
5463
+ try {
5464
+ runtime = await withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding-plan-only', 'approved binding generic fallback test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
5465
+ approvedExecution: {
5466
+ prd_path: join(cwd, '.omx', 'plans', 'prd-issue-1314-plan-only.md'),
5467
+ task: 'Execute approved issue 1314 plan-only',
5468
+ command: 'omx team 1:executor "Execute approved issue 1314 plan-only"',
5469
+ },
5470
+ })));
5471
+ const bindingPath = join(runtime.config.team_state_root ?? join(cwd, '.omx', 'state'), 'team', runtime.teamName, 'approved-execution.json');
5472
+ assert.equal(existsSync(bindingPath), false);
5473
+ }
5474
+ finally {
5475
+ if (runtime) {
5476
+ await shutdownTeam(runtime.teamName, cwd, { force: true }).catch(() => { });
5477
+ }
5478
+ await rm(cwd, { recursive: true, force: true });
5479
+ }
5480
+ });
5481
+ it('startTeam fails closed when an explicit approved execution binding is nonready', async () => {
5482
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-nonready-'));
5483
+ const binDir = join(cwd, 'bin');
5484
+ const fakeCodexPath = join(binDir, 'codex');
5485
+ await mkdir(binDir, { recursive: true });
5486
+ await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
5487
+ const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-1314-nonready.md');
5488
+ await writeFile(prdPath, [
5489
+ '# Approved plan',
5490
+ '',
5491
+ '## Context Pack Outcome',
5492
+ '',
5493
+ '- pack: created `.omx/context/context-20260507T120000Z-other.json`',
5494
+ '',
5495
+ 'Launch via omx team 1:executor "Execute approved issue 1314 nonready plan"',
5496
+ ].join('\n'));
5497
+ await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1314-nonready.md'), '# Test spec\n');
5498
+ await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
5499
+ try {
5500
+ await assert.rejects(() => withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding-nonready', 'approved binding nonready start test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
5501
+ approvedExecution: {
5502
+ prd_path: prdPath,
5503
+ task: 'Execute approved issue 1314 nonready plan',
5504
+ },
5505
+ }))), /approved_execution_binding_nonready:invalid:.*Execute approved issue 1314 nonready plan/);
5506
+ assert.equal(existsSync(join(cwd, '.omx', 'state', 'team', 'team-approved-binding-nonready')), false);
5507
+ }
5508
+ finally {
5509
+ await rm(cwd, { recursive: true, force: true });
5510
+ }
5511
+ });
5343
5512
  it('startTeam fails closed when an explicit approved execution binding is stale', async () => {
5344
5513
  const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-stale-'));
5345
5514
  const binDir = join(cwd, 'bin');
@@ -5364,6 +5533,35 @@ esac
5364
5533
  await rm(cwd, { recursive: true, force: true });
5365
5534
  }
5366
5535
  });
5536
+ it('startTeam fails closed when an explicit approved execution binding is ambiguous', async () => {
5537
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-ambiguous-'));
5538
+ const binDir = join(cwd, 'bin');
5539
+ const fakeCodexPath = join(binDir, 'codex');
5540
+ const approvedTask = 'Execute approved issue 1316 plan';
5541
+ await mkdir(binDir, { recursive: true });
5542
+ await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
5543
+ const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-1316.md');
5544
+ await writeFile(prdPath, [
5545
+ '# Approved plan',
5546
+ '',
5547
+ `Launch via omx team 2:executor "${approvedTask}"`,
5548
+ `Launch via omx team 5:debugger "${approvedTask}"`,
5549
+ ].join('\n'));
5550
+ await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1316.md'), '# Test spec\n');
5551
+ await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
5552
+ try {
5553
+ await assert.rejects(() => withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding-ambiguous', 'approved binding ambiguous start test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
5554
+ approvedExecution: {
5555
+ prd_path: prdPath,
5556
+ task: approvedTask,
5557
+ },
5558
+ }))), /approved_execution_binding_ambiguous:.*Execute approved issue 1316 plan/);
5559
+ assert.equal(existsSync(join(cwd, '.omx', 'state', 'team', 'team-approved-binding-ambiguous')), false);
5560
+ }
5561
+ finally {
5562
+ await rm(cwd, { recursive: true, force: true });
5563
+ }
5564
+ });
5367
5565
  it('startTeam remaps repo-aware DAG dependencies after concrete task IDs are created', async () => {
5368
5566
  const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-'));
5369
5567
  const binDir = join(cwd, 'bin');