oh-my-codex 0.15.2 → 0.16.0

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 (524) hide show
  1. package/Cargo.lock +10 -7
  2. package/Cargo.toml +1 -1
  3. package/README.md +3 -0
  4. package/crates/omx-explore/Cargo.toml +3 -0
  5. package/crates/omx-explore/src/main.rs +517 -16
  6. package/dist/agents/__tests__/native-config.test.js +33 -0
  7. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  8. package/dist/autoresearch/goal.d.ts +90 -0
  9. package/dist/autoresearch/goal.d.ts.map +1 -0
  10. package/dist/autoresearch/goal.js +237 -0
  11. package/dist/autoresearch/goal.js.map +1 -0
  12. package/dist/autoresearch/skill-validation.d.ts +1 -0
  13. package/dist/autoresearch/skill-validation.d.ts.map +1 -1
  14. package/dist/autoresearch/skill-validation.js +10 -3
  15. package/dist/autoresearch/skill-validation.js.map +1 -1
  16. package/dist/catalog/__tests__/generator.test.js +9 -4
  17. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  18. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js +29 -2
  19. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js.map +1 -1
  20. package/dist/catalog/__tests__/schema.test.js +14 -3
  21. package/dist/catalog/__tests__/schema.test.js.map +1 -1
  22. package/dist/catalog/schema.js +1 -1
  23. package/dist/catalog/schema.js.map +1 -1
  24. package/dist/cli/__tests__/autoresearch-goal.test.d.ts +2 -0
  25. package/dist/cli/__tests__/autoresearch-goal.test.d.ts.map +1 -0
  26. package/dist/cli/__tests__/autoresearch-goal.test.js +194 -0
  27. package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -0
  28. package/dist/cli/__tests__/cleanup.test.js +82 -1
  29. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  30. package/dist/cli/__tests__/codex-plugin-layout.test.js +7 -4
  31. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  32. package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts +2 -0
  33. package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts.map +1 -0
  34. package/dist/cli/__tests__/doctor-context-window-warning.test.js +122 -0
  35. package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -0
  36. package/dist/cli/__tests__/doctor-warning-copy.test.js +25 -2
  37. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  38. package/dist/cli/__tests__/exec.test.js +1 -0
  39. package/dist/cli/__tests__/exec.test.js.map +1 -1
  40. package/dist/cli/__tests__/explore.test.js +48 -18
  41. package/dist/cli/__tests__/explore.test.js.map +1 -1
  42. package/dist/cli/__tests__/index.test.js +222 -10
  43. package/dist/cli/__tests__/index.test.js.map +1 -1
  44. package/dist/cli/__tests__/launch-fallback.test.js +58 -0
  45. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  46. package/dist/cli/__tests__/mcp-serve.test.js +27 -1
  47. package/dist/cli/__tests__/mcp-serve.test.js.map +1 -1
  48. package/dist/cli/__tests__/native-assets.test.js +26 -1
  49. package/dist/cli/__tests__/native-assets.test.js.map +1 -1
  50. package/dist/cli/__tests__/package-bin-contract.test.js +2 -2
  51. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  52. package/dist/cli/__tests__/performance-goal.test.d.ts +2 -0
  53. package/dist/cli/__tests__/performance-goal.test.d.ts.map +1 -0
  54. package/dist/cli/__tests__/performance-goal.test.js +144 -0
  55. package/dist/cli/__tests__/performance-goal.test.js.map +1 -0
  56. package/dist/cli/__tests__/question.test.js +8 -0
  57. package/dist/cli/__tests__/question.test.js.map +1 -1
  58. package/dist/cli/__tests__/ralph-goal-mode-contract.test.d.ts +2 -0
  59. package/dist/cli/__tests__/ralph-goal-mode-contract.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +31 -0
  61. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -0
  62. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +5 -4
  63. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -1
  64. package/dist/cli/__tests__/ralph-prd-smoke.test.js +7 -0
  65. package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -1
  66. package/dist/cli/__tests__/ralph.test.js +59 -1
  67. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  68. package/dist/cli/__tests__/setup-install-mode.test.js +57 -21
  69. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  70. package/dist/cli/__tests__/setup-refresh.test.js +27 -8
  71. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  72. package/dist/cli/__tests__/setup-scope.test.js +20 -10
  73. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  74. package/dist/cli/__tests__/setup-skill-validation.test.js +11 -11
  75. package/dist/cli/__tests__/setup-skill-validation.test.js.map +1 -1
  76. package/dist/cli/__tests__/setup-skills-overwrite.test.js +12 -12
  77. package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -1
  78. package/dist/cli/__tests__/team.test.js +242 -10
  79. package/dist/cli/__tests__/team.test.js.map +1 -1
  80. package/dist/cli/__tests__/ultragoal.test.d.ts +2 -0
  81. package/dist/cli/__tests__/ultragoal.test.d.ts.map +1 -0
  82. package/dist/cli/__tests__/ultragoal.test.js +106 -0
  83. package/dist/cli/__tests__/ultragoal.test.js.map +1 -0
  84. package/dist/cli/__tests__/uninstall.test.js +11 -0
  85. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  86. package/dist/cli/autoresearch-goal.d.ts +3 -0
  87. package/dist/cli/autoresearch-goal.d.ts.map +1 -0
  88. package/dist/cli/autoresearch-goal.js +175 -0
  89. package/dist/cli/autoresearch-goal.js.map +1 -0
  90. package/dist/cli/cleanup.d.ts +3 -1
  91. package/dist/cli/cleanup.d.ts.map +1 -1
  92. package/dist/cli/cleanup.js +42 -2
  93. package/dist/cli/cleanup.js.map +1 -1
  94. package/dist/cli/doctor.d.ts.map +1 -1
  95. package/dist/cli/doctor.js +95 -3
  96. package/dist/cli/doctor.js.map +1 -1
  97. package/dist/cli/explore.d.ts.map +1 -1
  98. package/dist/cli/explore.js +10 -2
  99. package/dist/cli/explore.js.map +1 -1
  100. package/dist/cli/index.d.ts +21 -2
  101. package/dist/cli/index.d.ts.map +1 -1
  102. package/dist/cli/index.js +268 -30
  103. package/dist/cli/index.js.map +1 -1
  104. package/dist/cli/mcp-serve.d.ts +1 -0
  105. package/dist/cli/mcp-serve.d.ts.map +1 -1
  106. package/dist/cli/mcp-serve.js +8 -0
  107. package/dist/cli/mcp-serve.js.map +1 -1
  108. package/dist/cli/native-assets.js +1 -1
  109. package/dist/cli/native-assets.js.map +1 -1
  110. package/dist/cli/performance-goal.d.ts +3 -0
  111. package/dist/cli/performance-goal.d.ts.map +1 -0
  112. package/dist/cli/performance-goal.js +186 -0
  113. package/dist/cli/performance-goal.js.map +1 -0
  114. package/dist/cli/ralph.d.ts +2 -0
  115. package/dist/cli/ralph.d.ts.map +1 -1
  116. package/dist/cli/ralph.js +25 -1
  117. package/dist/cli/ralph.js.map +1 -1
  118. package/dist/cli/setup.d.ts.map +1 -1
  119. package/dist/cli/setup.js +13 -6
  120. package/dist/cli/setup.js.map +1 -1
  121. package/dist/cli/team.d.ts +6 -0
  122. package/dist/cli/team.d.ts.map +1 -1
  123. package/dist/cli/team.js +113 -33
  124. package/dist/cli/team.js.map +1 -1
  125. package/dist/cli/tmux-hook.d.ts.map +1 -1
  126. package/dist/cli/tmux-hook.js +2 -1
  127. package/dist/cli/tmux-hook.js.map +1 -1
  128. package/dist/cli/ultragoal.d.ts +3 -0
  129. package/dist/cli/ultragoal.d.ts.map +1 -0
  130. package/dist/cli/ultragoal.js +191 -0
  131. package/dist/cli/ultragoal.js.map +1 -0
  132. package/dist/cli/uninstall.d.ts.map +1 -1
  133. package/dist/cli/uninstall.js +4 -2
  134. package/dist/cli/uninstall.js.map +1 -1
  135. package/dist/config/__tests__/generator-idempotent.test.js +39 -6
  136. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  137. package/dist/config/__tests__/generator-notify.test.js +5 -0
  138. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  139. package/dist/config/commit-lore-guard.d.ts +3 -0
  140. package/dist/config/commit-lore-guard.d.ts.map +1 -0
  141. package/dist/config/commit-lore-guard.js +9 -0
  142. package/dist/config/commit-lore-guard.js.map +1 -0
  143. package/dist/config/generator.d.ts +14 -4
  144. package/dist/config/generator.d.ts.map +1 -1
  145. package/dist/config/generator.js +166 -66
  146. package/dist/config/generator.js.map +1 -1
  147. package/dist/config/omx-first-party-mcp.d.ts +1 -0
  148. package/dist/config/omx-first-party-mcp.d.ts.map +1 -1
  149. package/dist/config/omx-first-party-mcp.js +4 -1
  150. package/dist/config/omx-first-party-mcp.js.map +1 -1
  151. package/dist/goal-workflows/__tests__/artifacts.test.d.ts +2 -0
  152. package/dist/goal-workflows/__tests__/artifacts.test.d.ts.map +1 -0
  153. package/dist/goal-workflows/__tests__/artifacts.test.js +96 -0
  154. package/dist/goal-workflows/__tests__/artifacts.test.js.map +1 -0
  155. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.d.ts +2 -0
  156. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.d.ts.map +1 -0
  157. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +54 -0
  158. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -0
  159. package/dist/goal-workflows/artifacts.d.ts +62 -0
  160. package/dist/goal-workflows/artifacts.d.ts.map +1 -0
  161. package/dist/goal-workflows/artifacts.js +132 -0
  162. package/dist/goal-workflows/artifacts.js.map +1 -0
  163. package/dist/goal-workflows/codex-goal-snapshot.d.ts +28 -0
  164. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -0
  165. package/dist/goal-workflows/codex-goal-snapshot.js +110 -0
  166. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -0
  167. package/dist/goal-workflows/handoff.d.ts +10 -0
  168. package/dist/goal-workflows/handoff.d.ts.map +1 -0
  169. package/dist/goal-workflows/handoff.js +31 -0
  170. package/dist/goal-workflows/handoff.js.map +1 -0
  171. package/dist/goal-workflows/validation.d.ts +13 -0
  172. package/dist/goal-workflows/validation.d.ts.map +1 -0
  173. package/dist/goal-workflows/validation.js +36 -0
  174. package/dist/goal-workflows/validation.js.map +1 -0
  175. package/dist/hooks/__tests__/agents-overlay.test.js +59 -0
  176. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  177. package/dist/hooks/__tests__/anti-slop-workflow.test.js +109 -18
  178. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
  179. package/dist/hooks/__tests__/keyword-detector.test.js +45 -32
  180. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  181. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +3 -3
  182. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  183. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +2 -1
  184. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  185. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +17 -24
  186. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  187. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +3 -3
  188. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
  189. package/dist/hooks/__tests__/task-size-detector.test.js +1 -1
  190. package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -1
  191. package/dist/hooks/__tests__/visual-ralph-skill.test.js +3 -3
  192. package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -1
  193. package/dist/hooks/__tests__/visual-verdict-loop.test.js +7 -11
  194. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -1
  195. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  196. package/dist/hooks/agents-overlay.js +23 -2
  197. package/dist/hooks/agents-overlay.js.map +1 -1
  198. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  199. package/dist/hooks/keyword-detector.js +12 -13
  200. package/dist/hooks/keyword-detector.js.map +1 -1
  201. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  202. package/dist/hooks/keyword-registry.js +2 -10
  203. package/dist/hooks/keyword-registry.js.map +1 -1
  204. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  205. package/dist/hooks/prompt-guidance-contract.js +0 -4
  206. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  207. package/dist/hooks/session.js +2 -2
  208. package/dist/hooks/session.js.map +1 -1
  209. package/dist/hooks/task-size-detector.d.ts.map +1 -1
  210. package/dist/hooks/task-size-detector.js +1 -0
  211. package/dist/hooks/task-size-detector.js.map +1 -1
  212. package/dist/hud/__tests__/index.test.js +30 -14
  213. package/dist/hud/__tests__/index.test.js.map +1 -1
  214. package/dist/hud/__tests__/reconcile.test.js +29 -7
  215. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  216. package/dist/hud/reconcile.d.ts +2 -1
  217. package/dist/hud/reconcile.d.ts.map +1 -1
  218. package/dist/hud/reconcile.js +12 -0
  219. package/dist/hud/reconcile.js.map +1 -1
  220. package/dist/mcp/__tests__/bootstrap.test.js +15 -2
  221. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  222. package/dist/mcp/__tests__/state-paths.test.js +54 -0
  223. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  224. package/dist/mcp/__tests__/state-server.test.js +36 -0
  225. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  226. package/dist/mcp/bootstrap.d.ts +1 -1
  227. package/dist/mcp/bootstrap.d.ts.map +1 -1
  228. package/dist/mcp/bootstrap.js +9 -7
  229. package/dist/mcp/bootstrap.js.map +1 -1
  230. package/dist/mcp/state-paths.d.ts +17 -0
  231. package/dist/mcp/state-paths.d.ts.map +1 -1
  232. package/dist/mcp/state-paths.js +36 -2
  233. package/dist/mcp/state-paths.js.map +1 -1
  234. package/dist/modes/__tests__/base-session-scope.test.js +26 -0
  235. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  236. package/dist/modes/base.d.ts +1 -0
  237. package/dist/modes/base.d.ts.map +1 -1
  238. package/dist/modes/base.js +35 -5
  239. package/dist/modes/base.js.map +1 -1
  240. package/dist/notifications/__tests__/http-client.test.d.ts +2 -0
  241. package/dist/notifications/__tests__/http-client.test.d.ts.map +1 -0
  242. package/dist/notifications/__tests__/http-client.test.js +90 -0
  243. package/dist/notifications/__tests__/http-client.test.js.map +1 -0
  244. package/dist/notifications/__tests__/notifier.test.js +22 -60
  245. package/dist/notifications/__tests__/notifier.test.js.map +1 -1
  246. package/dist/notifications/dispatcher.d.ts.map +1 -1
  247. package/dist/notifications/dispatcher.js +35 -60
  248. package/dist/notifications/dispatcher.js.map +1 -1
  249. package/dist/notifications/http-client.d.ts +22 -0
  250. package/dist/notifications/http-client.d.ts.map +1 -0
  251. package/dist/notifications/http-client.js +298 -0
  252. package/dist/notifications/http-client.js.map +1 -0
  253. package/dist/notifications/notifier.d.ts +3 -2
  254. package/dist/notifications/notifier.d.ts.map +1 -1
  255. package/dist/notifications/notifier.js +17 -22
  256. package/dist/notifications/notifier.js.map +1 -1
  257. package/dist/openclaw/__tests__/dispatcher.test.js +63 -2
  258. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
  259. package/dist/openclaw/dispatcher.d.ts.map +1 -1
  260. package/dist/openclaw/dispatcher.js +3 -2
  261. package/dist/openclaw/dispatcher.js.map +1 -1
  262. package/dist/performance-goal/artifacts.d.ts +76 -0
  263. package/dist/performance-goal/artifacts.d.ts.map +1 -0
  264. package/dist/performance-goal/artifacts.js +221 -0
  265. package/dist/performance-goal/artifacts.js.map +1 -0
  266. package/dist/pipeline/__tests__/stages.test.js +423 -14
  267. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  268. package/dist/pipeline/stages/team-exec.d.ts +8 -4
  269. package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
  270. package/dist/pipeline/stages/team-exec.js +181 -13
  271. package/dist/pipeline/stages/team-exec.js.map +1 -1
  272. package/dist/planning/__tests__/artifacts.test.js +261 -1
  273. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  274. package/dist/planning/artifact-names.d.ts +13 -0
  275. package/dist/planning/artifact-names.d.ts.map +1 -0
  276. package/dist/planning/artifact-names.js +108 -0
  277. package/dist/planning/artifact-names.js.map +1 -0
  278. package/dist/planning/artifacts.d.ts +23 -1
  279. package/dist/planning/artifacts.d.ts.map +1 -1
  280. package/dist/planning/artifacts.js +171 -59
  281. package/dist/planning/artifacts.js.map +1 -1
  282. package/dist/ralph/__tests__/persistence.test.js +21 -1
  283. package/dist/ralph/__tests__/persistence.test.js.map +1 -1
  284. package/dist/ralph/persistence.d.ts.map +1 -1
  285. package/dist/ralph/persistence.js +6 -4
  286. package/dist/ralph/persistence.js.map +1 -1
  287. package/dist/ralplan/__tests__/runtime.test.js +2 -0
  288. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  289. package/dist/ralplan/runtime.d.ts.map +1 -1
  290. package/dist/ralplan/runtime.js +6 -0
  291. package/dist/ralplan/runtime.js.map +1 -1
  292. package/dist/scripts/__tests__/codex-native-hook.test.js +1749 -88
  293. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  294. package/dist/scripts/__tests__/hook-derived-watcher.test.js +33 -1
  295. package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -1
  296. package/dist/scripts/__tests__/run-test-files.test.js +36 -0
  297. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  298. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  299. package/dist/scripts/codex-native-hook.js +570 -45
  300. package/dist/scripts/codex-native-hook.js.map +1 -1
  301. package/dist/scripts/codex-native-pre-post.d.ts +7 -0
  302. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  303. package/dist/scripts/codex-native-pre-post.js +341 -15
  304. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  305. package/dist/scripts/hook-derived-watcher.js +2 -1
  306. package/dist/scripts/hook-derived-watcher.js.map +1 -1
  307. package/dist/scripts/notify-fallback-watcher.js +2 -1
  308. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  309. package/dist/scripts/notify-hook/orchestration-intent.d.ts +1 -2
  310. package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -1
  311. package/dist/scripts/notify-hook/orchestration-intent.js +2 -3
  312. package/dist/scripts/notify-hook/orchestration-intent.js.map +1 -1
  313. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +0 -2
  314. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  315. package/dist/scripts/notify-hook/team-leader-nudge.js +8 -60
  316. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  317. package/dist/scripts/notify-hook/team-worker-posttooluse.js +1 -1
  318. package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -1
  319. package/dist/scripts/notify-hook/team-worker-stop.d.ts +15 -0
  320. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -0
  321. package/dist/scripts/notify-hook/team-worker-stop.js +224 -0
  322. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -0
  323. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  324. package/dist/scripts/notify-hook/team-worker.js +26 -18
  325. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  326. package/dist/scripts/notify-hook.js +1 -1
  327. package/dist/scripts/notify-hook.js.map +1 -1
  328. package/dist/scripts/run-test-files.js +17 -1
  329. package/dist/scripts/run-test-files.js.map +1 -1
  330. package/dist/scripts/sync-plugin-mirror.d.ts +1 -0
  331. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  332. package/dist/scripts/sync-plugin-mirror.js +10 -4
  333. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  334. package/dist/state/__tests__/operations.test.js +26 -0
  335. package/dist/state/__tests__/operations.test.js.map +1 -1
  336. package/dist/state/__tests__/skill-active.test.js +76 -0
  337. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  338. package/dist/state/operations.d.ts +3 -1
  339. package/dist/state/operations.d.ts.map +1 -1
  340. package/dist/state/operations.js +8 -4
  341. package/dist/state/operations.js.map +1 -1
  342. package/dist/state/skill-active.d.ts +1 -0
  343. package/dist/state/skill-active.d.ts.map +1 -1
  344. package/dist/state/skill-active.js +54 -13
  345. package/dist/state/skill-active.js.map +1 -1
  346. package/dist/team/__tests__/api-interop.test.js +279 -0
  347. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  348. package/dist/team/__tests__/approved-execution.test.d.ts +2 -0
  349. package/dist/team/__tests__/approved-execution.test.d.ts.map +1 -0
  350. package/dist/team/__tests__/approved-execution.test.js +124 -0
  351. package/dist/team/__tests__/approved-execution.test.js.map +1 -0
  352. package/dist/team/__tests__/delivery-e2e-smoke.test.js +2 -4
  353. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  354. package/dist/team/__tests__/delivery-log.test.d.ts +2 -0
  355. package/dist/team/__tests__/delivery-log.test.d.ts.map +1 -0
  356. package/dist/team/__tests__/delivery-log.test.js +44 -0
  357. package/dist/team/__tests__/delivery-log.test.js.map +1 -0
  358. package/dist/team/__tests__/model-contract.test.js +40 -9
  359. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  360. package/dist/team/__tests__/repo-aware-decomposition.test.js +41 -0
  361. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
  362. package/dist/team/__tests__/role-router.test.js +4 -4
  363. package/dist/team/__tests__/role-router.test.js.map +1 -1
  364. package/dist/team/__tests__/runtime-boxed-state.test.d.ts +2 -0
  365. package/dist/team/__tests__/runtime-boxed-state.test.d.ts.map +1 -0
  366. package/dist/team/__tests__/runtime-boxed-state.test.js +39 -0
  367. package/dist/team/__tests__/runtime-boxed-state.test.js.map +1 -0
  368. package/dist/team/__tests__/runtime-cli.test.js +24 -0
  369. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  370. package/dist/team/__tests__/runtime.test.js +563 -72
  371. package/dist/team/__tests__/runtime.test.js.map +1 -1
  372. package/dist/team/__tests__/state-root.test.js +13 -0
  373. package/dist/team/__tests__/state-root.test.js.map +1 -1
  374. package/dist/team/__tests__/state.test.js +13 -0
  375. package/dist/team/__tests__/state.test.js.map +1 -1
  376. package/dist/team/__tests__/team-identity.test.d.ts +2 -0
  377. package/dist/team/__tests__/team-identity.test.d.ts.map +1 -0
  378. package/dist/team/__tests__/team-identity.test.js +166 -0
  379. package/dist/team/__tests__/team-identity.test.js.map +1 -0
  380. package/dist/team/__tests__/tmux-session.test.js +58 -1
  381. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  382. package/dist/team/__tests__/worker-bootstrap.test.js +62 -0
  383. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  384. package/dist/team/api-interop.d.ts +1 -0
  385. package/dist/team/api-interop.d.ts.map +1 -1
  386. package/dist/team/api-interop.js +163 -132
  387. package/dist/team/api-interop.js.map +1 -1
  388. package/dist/team/approved-execution.d.ts +37 -0
  389. package/dist/team/approved-execution.d.ts.map +1 -0
  390. package/dist/team/approved-execution.js +136 -0
  391. package/dist/team/approved-execution.js.map +1 -0
  392. package/dist/team/delivery-log.d.ts +1 -1
  393. package/dist/team/delivery-log.d.ts.map +1 -1
  394. package/dist/team/delivery-log.js +2 -1
  395. package/dist/team/delivery-log.js.map +1 -1
  396. package/dist/team/followup-planner.js +2 -2
  397. package/dist/team/followup-planner.js.map +1 -1
  398. package/dist/team/goal-workflow.d.ts +20 -0
  399. package/dist/team/goal-workflow.d.ts.map +1 -0
  400. package/dist/team/goal-workflow.js +57 -0
  401. package/dist/team/goal-workflow.js.map +1 -0
  402. package/dist/team/orchestrator.js +2 -2
  403. package/dist/team/orchestrator.js.map +1 -1
  404. package/dist/team/repo-aware-decomposition.d.ts +3 -0
  405. package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
  406. package/dist/team/repo-aware-decomposition.js +2 -0
  407. package/dist/team/repo-aware-decomposition.js.map +1 -1
  408. package/dist/team/role-router.js +5 -5
  409. package/dist/team/role-router.js.map +1 -1
  410. package/dist/team/runtime-cli.d.ts +32 -2
  411. package/dist/team/runtime-cli.d.ts.map +1 -1
  412. package/dist/team/runtime-cli.js +78 -26
  413. package/dist/team/runtime-cli.js.map +1 -1
  414. package/dist/team/runtime.d.ts +7 -1
  415. package/dist/team/runtime.d.ts.map +1 -1
  416. package/dist/team/runtime.js +383 -40
  417. package/dist/team/runtime.js.map +1 -1
  418. package/dist/team/scaling.d.ts.map +1 -1
  419. package/dist/team/scaling.js +2 -0
  420. package/dist/team/scaling.js.map +1 -1
  421. package/dist/team/state.d.ts +9 -0
  422. package/dist/team/state.d.ts.map +1 -1
  423. package/dist/team/state.js +21 -0
  424. package/dist/team/state.js.map +1 -1
  425. package/dist/team/team-identity.d.ts +26 -0
  426. package/dist/team/team-identity.d.ts.map +1 -0
  427. package/dist/team/team-identity.js +169 -0
  428. package/dist/team/team-identity.js.map +1 -0
  429. package/dist/team/tmux-session.d.ts +18 -0
  430. package/dist/team/tmux-session.d.ts.map +1 -1
  431. package/dist/team/tmux-session.js +65 -3
  432. package/dist/team/tmux-session.js.map +1 -1
  433. package/dist/team/worker-bootstrap.d.ts +4 -0
  434. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  435. package/dist/team/worker-bootstrap.js +28 -2
  436. package/dist/team/worker-bootstrap.js.map +1 -1
  437. package/dist/ultragoal/__tests__/artifacts.test.d.ts +2 -0
  438. package/dist/ultragoal/__tests__/artifacts.test.d.ts.map +1 -0
  439. package/dist/ultragoal/__tests__/artifacts.test.js +93 -0
  440. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -0
  441. package/dist/ultragoal/artifacts.d.ts +89 -0
  442. package/dist/ultragoal/artifacts.d.ts.map +1 -0
  443. package/dist/ultragoal/artifacts.js +233 -0
  444. package/dist/ultragoal/artifacts.js.map +1 -0
  445. package/dist/utils/__tests__/agents-model-table.test.js +3 -1
  446. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  447. package/dist/utils/__tests__/paths.test.js +31 -1
  448. package/dist/utils/__tests__/paths.test.js.map +1 -1
  449. package/dist/utils/agents-model-table.d.ts.map +1 -1
  450. package/dist/utils/agents-model-table.js +12 -1
  451. package/dist/utils/agents-model-table.js.map +1 -1
  452. package/dist/utils/paths.d.ts +2 -0
  453. package/dist/utils/paths.d.ts.map +1 -1
  454. package/dist/utils/paths.js +23 -7
  455. package/dist/utils/paths.js.map +1 -1
  456. package/dist/verification/__tests__/ci-rust-gates.test.js +30 -19
  457. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  458. package/package.json +5 -5
  459. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  460. package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +30 -5
  461. package/plugins/oh-my-codex/skills/ask/SKILL.md +58 -0
  462. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +36 -0
  463. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +2 -2
  464. package/plugins/oh-my-codex/skills/performance-goal/SKILL.md +65 -0
  465. package/plugins/oh-my-codex/skills/plan/SKILL.md +1 -1
  466. package/plugins/oh-my-codex/skills/ralph/SKILL.md +22 -3
  467. package/plugins/oh-my-codex/skills/team/SKILL.md +6 -2
  468. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +49 -0
  469. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +9 -9
  470. package/prompts/api-reviewer.md +1 -1
  471. package/prompts/code-reviewer.md +2 -0
  472. package/prompts/performance-reviewer.md +1 -1
  473. package/prompts/quality-reviewer.md +1 -1
  474. package/prompts/quality-strategist.md +2 -2
  475. package/prompts/style-reviewer.md +1 -1
  476. package/prompts/test-engineer.md +1 -1
  477. package/skills/ai-slop-cleaner/SKILL.md +30 -5
  478. package/skills/ask/SKILL.md +58 -0
  479. package/skills/ask-claude/SKILL.md +3 -54
  480. package/skills/ask-gemini/SKILL.md +3 -54
  481. package/skills/autoresearch-goal/SKILL.md +36 -0
  482. package/skills/build-fix/SKILL.md +4 -139
  483. package/skills/deepsearch/SKILL.md +4 -32
  484. package/skills/ecomode/SKILL.md +4 -108
  485. package/skills/help/SKILL.md +4 -196
  486. package/skills/note/SKILL.md +4 -56
  487. package/skills/omx-setup/SKILL.md +2 -2
  488. package/skills/performance-goal/SKILL.md +65 -0
  489. package/skills/plan/SKILL.md +1 -1
  490. package/skills/ralph/SKILL.md +22 -3
  491. package/skills/ralph-init/SKILL.md +4 -40
  492. package/skills/review/SKILL.md +4 -32
  493. package/skills/security-review/SKILL.md +4 -294
  494. package/skills/swarm/SKILL.md +4 -19
  495. package/skills/tdd/SKILL.md +4 -100
  496. package/skills/team/SKILL.md +6 -2
  497. package/skills/trace/SKILL.md +4 -27
  498. package/skills/ultragoal/SKILL.md +49 -0
  499. package/skills/visual-ralph/SKILL.md +9 -9
  500. package/skills/visual-verdict/SKILL.md +4 -70
  501. package/skills/web-clone/SKILL.md +4 -18
  502. package/src/scripts/__tests__/codex-native-hook.test.ts +2923 -1030
  503. package/src/scripts/__tests__/hook-derived-watcher.test.ts +45 -1
  504. package/src/scripts/__tests__/run-test-files.test.ts +46 -0
  505. package/src/scripts/codex-native-hook.ts +696 -46
  506. package/src/scripts/codex-native-pre-post.ts +369 -16
  507. package/src/scripts/hook-derived-watcher.ts +2 -1
  508. package/src/scripts/notify-fallback-watcher.ts +2 -1
  509. package/src/scripts/notify-hook/orchestration-intent.ts +1 -3
  510. package/src/scripts/notify-hook/team-leader-nudge.ts +7 -63
  511. package/src/scripts/notify-hook/team-worker-posttooluse.ts +1 -1
  512. package/src/scripts/notify-hook/team-worker-stop.ts +246 -0
  513. package/src/scripts/notify-hook/team-worker.ts +23 -14
  514. package/src/scripts/notify-hook.ts +1 -1
  515. package/src/scripts/run-test-files.ts +20 -1
  516. package/src/scripts/sync-plugin-mirror.ts +13 -4
  517. package/templates/catalog-manifest.json +45 -27
  518. package/plugins/oh-my-codex/skills/ask-claude/SKILL.md +0 -61
  519. package/plugins/oh-my-codex/skills/ask-gemini/SKILL.md +0 -61
  520. package/plugins/oh-my-codex/skills/help/SKILL.md +0 -202
  521. package/plugins/oh-my-codex/skills/note/SKILL.md +0 -62
  522. package/plugins/oh-my-codex/skills/security-review/SKILL.md +0 -300
  523. package/plugins/oh-my-codex/skills/trace/SKILL.md +0 -33
  524. package/plugins/oh-my-codex/skills/visual-verdict/SKILL.md +0 -76
@@ -9,12 +9,20 @@ import { tmpdir } from 'node:os';
9
9
  import { fileURLToPath } from 'node:url';
10
10
  import { buildLeaderMonitoringHints, parseTeamStartArgs, teamCommand } from '../team.js';
11
11
  import { readModeState } from '../../modes/base.js';
12
+ import { readApprovedExecutionLaunchHint } from '../../planning/artifacts.js';
12
13
  import { DEFAULT_MAX_WORKERS } from '../../team/state.js';
14
+ import { sameFilePath } from '../../utils/paths.js';
13
15
  import { appendTeamEvent, createTask, initTeamState, readTeamConfig, saveTeamConfig, updateWorkerHeartbeat, writeMonitorSnapshot, writeTaskApproval, writeWorkerStatus, } from '../../team/state.js';
16
+ import { buildApprovedTeamExecutionBinding, writePersistedApprovedTeamExecutionBinding, } from '../../team/approved-execution.js';
14
17
  import { isRealTmuxAvailable, withTempTmuxSession } from '../../team/__tests__/tmux-test-fixture.js';
15
18
  const OMX_CLI_PATH = fileURLToPath(new URL('../omx.js', import.meta.url));
16
19
  const ORIGINAL_OMX_TEAM_WORKER = process.env.OMX_TEAM_WORKER;
17
20
  const ORIGINAL_OMX_TEAM_STATE_ROOT = process.env.OMX_TEAM_STATE_ROOT;
21
+ function encodeApprovedExecutionTask(task, quote) {
22
+ return quote === 'single'
23
+ ? `'${task.replace(/'/g, "\\'")}'`
24
+ : `"${task.replace(/"/g, '\\"')}"`;
25
+ }
18
26
  beforeEach(() => {
19
27
  delete process.env.OMX_TEAM_WORKER;
20
28
  delete process.env.OMX_TEAM_STATE_ROOT;
@@ -210,6 +218,205 @@ describe('parseTeamStartArgs', () => {
210
218
  await rm(wd, { recursive: true, force: true });
211
219
  }
212
220
  });
221
+ it('prefers the persisted approved binding over a newer latest approved hint for a short follow-up', async () => {
222
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-'));
223
+ const previousCwd = process.cwd();
224
+ try {
225
+ process.chdir(wd);
226
+ const plansDir = join(wd, '.omx', 'plans');
227
+ await mkdir(plansDir, { recursive: true });
228
+ const boundPrdPath = join(plansDir, 'prd-20260501T010203Z-issue-831.md');
229
+ await writeFile(boundPrdPath, '# Approved plan\n\nLaunch via omx team 2:executor "Execute approved issue 831 plan"\n');
230
+ await writeFile(join(plansDir, 'test-spec-20260501T010203Z-issue-831.md'), '# Test spec\n');
231
+ await writeFile(join(plansDir, 'prd-20260502T010203Z-issue-999.md'), '# Approved plan\n\nLaunch via omx team 5:debugger "Execute newer approved issue 999 plan"\n');
232
+ await writeFile(join(plansDir, 'test-spec-20260502T010203Z-issue-999.md'), '# Test spec\n');
233
+ await mkdir(join(wd, '.omx', 'state'), { recursive: true });
234
+ await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({ active: true, team_name: 'bound-team' }, null, 2));
235
+ await writePersistedApprovedTeamExecutionBinding('bound-team', wd, {
236
+ prd_path: boundPrdPath,
237
+ task: 'Execute approved issue 831 plan',
238
+ command: 'omx team 2:executor "Execute approved issue 831 plan"',
239
+ });
240
+ const result = parseTeamStartArgs(['team']);
241
+ assert.equal(result.parsed.task, 'Execute approved issue 831 plan');
242
+ assert.equal(result.parsed.workerCount, 2);
243
+ assert.equal(result.parsed.agentType, 'executor');
244
+ assert.equal(result.parsed.approvedExecution?.task, 'Execute approved issue 831 plan');
245
+ assert.equal(result.parsed.approvedExecution?.command, 'omx team 2:executor "Execute approved issue 831 plan"');
246
+ assert.equal(sameFilePath(result.parsed.approvedExecution?.prd_path ?? '', boundPrdPath), true);
247
+ }
248
+ finally {
249
+ process.chdir(previousCwd);
250
+ await rm(wd, { recursive: true, force: true });
251
+ }
252
+ });
253
+ it('round-trips single-quoted approved follow-ups from launch hint encoding through persisted binding', async () => {
254
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-quoted-'));
255
+ const previousCwd = process.cwd();
256
+ try {
257
+ process.chdir(wd);
258
+ const plansDir = join(wd, '.omx', 'plans');
259
+ await mkdir(plansDir, { recursive: true });
260
+ const boundTask = "Fix Bob's regression in C:\\\\tmp";
261
+ const boundCommand = `omx team 2:executor ${encodeApprovedExecutionTask(boundTask, 'single')}`;
262
+ const boundPrdPath = join(plansDir, 'prd-issue-831-quoted.md');
263
+ await writeFile(boundPrdPath, `# Approved plan\n\nLaunch via ${boundCommand}\n`);
264
+ await writeFile(join(plansDir, 'test-spec-issue-831-quoted.md'), '# Test spec\n');
265
+ await mkdir(join(wd, '.omx', 'state'), { recursive: true });
266
+ await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({ active: true, team_name: 'bound-team-quoted' }, null, 2));
267
+ const approvedHint = readApprovedExecutionLaunchHint(wd, 'team');
268
+ assert.ok(approvedHint);
269
+ assert.equal(approvedHint?.task, boundTask);
270
+ assert.equal(approvedHint?.command, boundCommand);
271
+ await writePersistedApprovedTeamExecutionBinding('bound-team-quoted', wd, buildApprovedTeamExecutionBinding(approvedHint));
272
+ const result = parseTeamStartArgs(['team']);
273
+ assert.equal(result.parsed.task, boundTask);
274
+ assert.equal(result.parsed.workerCount, 2);
275
+ assert.equal(result.parsed.agentType, 'executor');
276
+ assert.equal(result.parsed.approvedExecution?.task, boundTask);
277
+ assert.equal(result.parsed.approvedExecution?.command, boundCommand);
278
+ }
279
+ finally {
280
+ process.chdir(previousCwd);
281
+ await rm(wd, { recursive: true, force: true });
282
+ }
283
+ });
284
+ it('round-trips double-quoted approved follow-ups from launch hint encoding through persisted binding', async () => {
285
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-double-quoted-'));
286
+ const previousCwd = process.cwd();
287
+ try {
288
+ process.chdir(wd);
289
+ const plansDir = join(wd, '.omx', 'plans');
290
+ await mkdir(plansDir, { recursive: true });
291
+ const boundTask = String.raw `Use C:\tmp and keep \n literal plus "quotes"`;
292
+ const boundCommand = `omx team 2:executor ${encodeApprovedExecutionTask(boundTask, 'double')}`;
293
+ const boundPrdPath = join(plansDir, 'prd-issue-831-double-quoted.md');
294
+ await writeFile(boundPrdPath, `# Approved plan\n\nLaunch via ${boundCommand}\n`);
295
+ await writeFile(join(plansDir, 'test-spec-issue-831-double-quoted.md'), '# Test spec\n');
296
+ await mkdir(join(wd, '.omx', 'state'), { recursive: true });
297
+ await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({ active: true, team_name: 'bound-team-double-quoted' }, null, 2));
298
+ const approvedHint = readApprovedExecutionLaunchHint(wd, 'team');
299
+ assert.ok(approvedHint);
300
+ assert.equal(approvedHint?.task, boundTask);
301
+ assert.equal(approvedHint?.command, boundCommand);
302
+ await writePersistedApprovedTeamExecutionBinding('bound-team-double-quoted', wd, buildApprovedTeamExecutionBinding(approvedHint));
303
+ const result = parseTeamStartArgs(['team']);
304
+ assert.equal(result.parsed.task, boundTask);
305
+ assert.equal(result.parsed.workerCount, 2);
306
+ assert.equal(result.parsed.agentType, 'executor');
307
+ assert.equal(result.parsed.approvedExecution?.task, boundTask);
308
+ assert.equal(result.parsed.approvedExecution?.command, boundCommand);
309
+ }
310
+ finally {
311
+ process.chdir(previousCwd);
312
+ await rm(wd, { recursive: true, force: true });
313
+ }
314
+ });
315
+ it('reuses the persisted approved binding from session-scoped team state for a short follow-up', async () => {
316
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-session-'));
317
+ const previousCwd = process.cwd();
318
+ try {
319
+ process.chdir(wd);
320
+ const sessionId = 'sess-team-followup-bound';
321
+ const plansDir = join(wd, '.omx', 'plans');
322
+ await mkdir(plansDir, { recursive: true });
323
+ const prdPath = join(plansDir, 'prd-issue-954.md');
324
+ await writeFile(prdPath, '# Approved plan\n\nLaunch via omx team 5:executor "Execute approved session-scoped plan"\n');
325
+ await writeFile(join(plansDir, 'test-spec-issue-954.md'), '# Test spec\n');
326
+ await mkdir(join(wd, '.omx', 'state', 'sessions', sessionId), { recursive: true });
327
+ await writeFile(join(wd, '.omx', 'state', 'session.json'), JSON.stringify({ session_id: sessionId }, null, 2));
328
+ await writeFile(join(wd, '.omx', 'state', 'sessions', sessionId, 'team-state.json'), JSON.stringify({
329
+ active: true,
330
+ team_name: 'bound-team-session',
331
+ task_description: 'Execute approved session-scoped plan',
332
+ agent_count: 5,
333
+ }, null, 2));
334
+ await writePersistedApprovedTeamExecutionBinding('bound-team-session', wd, {
335
+ prd_path: prdPath,
336
+ task: 'Execute approved session-scoped plan',
337
+ command: 'omx team 5:executor "Execute approved session-scoped plan"',
338
+ });
339
+ const result = parseTeamStartArgs(['team']);
340
+ assert.equal(result.parsed.task, 'Execute approved session-scoped plan');
341
+ assert.equal(result.parsed.workerCount, 5);
342
+ assert.equal(result.parsed.agentType, 'executor');
343
+ }
344
+ finally {
345
+ process.chdir(previousCwd);
346
+ await rm(wd, { recursive: true, force: true });
347
+ }
348
+ });
349
+ it('fails closed for a short follow-up when the persisted approved binding is malformed', async () => {
350
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-malformed-binding-'));
351
+ const previousCwd = process.cwd();
352
+ try {
353
+ process.chdir(wd);
354
+ const plansDir = join(wd, '.omx', 'plans');
355
+ const stateDir = join(wd, '.omx', 'state');
356
+ await mkdir(plansDir, { recursive: true });
357
+ await mkdir(join(stateDir, 'team', 'broken-team'), { recursive: true });
358
+ await writeFile(join(plansDir, 'prd-issue-831.md'), '# Approved plan\n\nLaunch via omx team 3:executor "Execute approved issue 831 plan"\n');
359
+ await writeFile(join(plansDir, 'test-spec-issue-831.md'), '# Test spec\n');
360
+ await writeFile(join(stateDir, 'team-state.json'), JSON.stringify({ active: true, team_name: 'broken-team' }, null, 2));
361
+ await writeFile(join(stateDir, 'team', 'broken-team', 'approved-execution.json'), '{"prd_path":42}', 'utf-8');
362
+ assert.throws(() => parseTeamStartArgs(['team']), /approved_execution_binding_malformed:broken-team/);
363
+ }
364
+ finally {
365
+ process.chdir(previousCwd);
366
+ await rm(wd, { recursive: true, force: true });
367
+ }
368
+ });
369
+ it('fails closed for a short follow-up when the persisted approved binding is stale even if a newer PRD is ready', async () => {
370
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-stale-'));
371
+ const previousCwd = process.cwd();
372
+ try {
373
+ process.chdir(wd);
374
+ const plansDir = join(wd, '.omx', 'plans');
375
+ await mkdir(plansDir, { recursive: true });
376
+ const stalePrdPath = join(plansDir, 'prd-issue-955-alpha.md');
377
+ await writeFile(stalePrdPath, '# Approved plan\n\nLaunch via omx team 4:executor "Execute approved alpha plan"\n');
378
+ await writeFile(join(plansDir, 'test-spec-issue-955-alpha.md'), '# Test spec\n');
379
+ await writeFile(join(plansDir, 'prd-issue-955-zeta.md'), '# Approved plan\n\nLaunch via omx team 6:debugger "Execute approved zeta plan"\n');
380
+ await writeFile(join(plansDir, 'test-spec-issue-955-zeta.md'), '# Test spec\n');
381
+ await rm(stalePrdPath, { force: true });
382
+ await mkdir(join(wd, '.omx', 'state'), { recursive: true });
383
+ await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({
384
+ active: true,
385
+ team_name: 'bound-team-stale',
386
+ task_description: 'Execute approved alpha plan',
387
+ agent_count: 4,
388
+ }, null, 2));
389
+ await writePersistedApprovedTeamExecutionBinding('bound-team-stale', wd, {
390
+ prd_path: stalePrdPath,
391
+ task: 'Execute approved alpha plan',
392
+ });
393
+ assert.throws(() => parseTeamStartArgs(['team']), /approved_execution_binding_stale:.*Execute approved alpha plan/);
394
+ }
395
+ finally {
396
+ process.chdir(previousCwd);
397
+ await rm(wd, { recursive: true, force: true });
398
+ }
399
+ });
400
+ it('fails closed for a short team follow-up when the selected PRD lists multiple team launch hints', async () => {
401
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-ambiguous-'));
402
+ const previousCwd = process.cwd();
403
+ try {
404
+ process.chdir(wd);
405
+ await mkdir(join(wd, '.omx', 'plans'), { recursive: true });
406
+ await writeFile(join(wd, '.omx', 'plans', 'prd-issue-831-ambiguous.md'), [
407
+ '# Approved plan',
408
+ '',
409
+ 'Launch via omx team 3:executor "Execute approved issue 831 plan"',
410
+ 'Launch via omx team 5:debugger "Execute alternate issue 831 plan"',
411
+ ].join('\n'));
412
+ await writeFile(join(wd, '.omx', 'plans', 'test-spec-issue-831-ambiguous.md'), '# Test spec\n');
413
+ assert.throws(() => parseTeamStartArgs(['team']), /approved_execution_hint_ambiguous:team/);
414
+ }
415
+ finally {
416
+ process.chdir(previousCwd);
417
+ await rm(wd, { recursive: true, force: true });
418
+ }
419
+ });
213
420
  it('does not opt normal team startup into repo-aware DAG handoff even when a stale sidecar exists', async () => {
214
421
  const wd = await mkdtemp(join(tmpdir(), 'omx-team-dag-normal-'));
215
422
  const previousCwd = process.cwd();
@@ -244,6 +451,25 @@ describe('parseTeamStartArgs', () => {
244
451
  await rm(wd, { recursive: true, force: true });
245
452
  }
246
453
  });
454
+ it('attaches approved repository context summary only for matching team launches', async () => {
455
+ const wd = await mkdtemp(join(tmpdir(), 'omx-team-context-approved-'));
456
+ const previousCwd = process.cwd();
457
+ try {
458
+ process.chdir(wd);
459
+ await mkdir(join(wd, '.omx', 'plans'), { recursive: true });
460
+ await writeFile(join(wd, '.omx', 'plans', 'prd-issue-2039.md'), '# Approved plan\n\nLaunch via omx team 3:executor "Execute approved issue 2039 plan"\n');
461
+ await writeFile(join(wd, '.omx', 'plans', 'test-spec-issue-2039.md'), '# Test spec\n');
462
+ await writeFile(join(wd, '.omx', 'plans', 'repo-context-issue-2039.md'), 'Key boundary: latest approved handoff only.\n');
463
+ const approved = parseTeamStartArgs(['3:executor', 'Execute', 'approved', 'issue', '2039', 'plan']);
464
+ assert.equal(approved.parsed.approvedRepositoryContextSummary?.content, 'Key boundary: latest approved handoff only.');
465
+ const unrelated = parseTeamStartArgs(['3:executor', 'fix', 'unrelated', 'bug']);
466
+ assert.equal(unrelated.parsed.approvedRepositoryContextSummary, undefined);
467
+ }
468
+ finally {
469
+ process.chdir(previousCwd);
470
+ await rm(wd, { recursive: true, force: true });
471
+ }
472
+ });
247
473
  it('preserves explicit team staffing overrides while reusing the approved plan task', async () => {
248
474
  const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-override-'));
249
475
  const previousCwd = process.cwd();
@@ -1590,7 +1816,7 @@ describe('teamCommand await', () => {
1590
1816
  const teamName = parseTeamStartArgs(['1:executor', teamTask]).parsed.teamName;
1591
1817
  await mkdir(binDir, { recursive: true });
1592
1818
  await writeFile(fakeCodexPath, `#!/usr/bin/env node
1593
- setTimeout(() => process.exit(0), 150);
1819
+ setTimeout(() => process.exit(0), 0);
1594
1820
  process.stdin.resume();
1595
1821
  process.on('SIGTERM', () => process.exit(0));
1596
1822
  `);
@@ -1607,11 +1833,13 @@ process.on('SIGTERM', () => process.exit(0));
1607
1833
  return true;
1608
1834
  });
1609
1835
  await withMockPromptModeCodexAllowed(() => withoutTeamTestWorkerEnv(() => teamCommand(['1:executor', teamTask])));
1836
+ const startedState = await readModeState('team', wd);
1837
+ const runtimeTeamName = String(startedState?.team_name ?? teamName);
1610
1838
  let statusOutput = '';
1611
1839
  for (let attempt = 0; attempt < 50; attempt += 1) {
1612
1840
  logs.length = 0;
1613
1841
  stderr.length = 0;
1614
- await withoutTeamTestWorkerEnv(() => teamCommand(['status', teamName]));
1842
+ await withoutTeamTestWorkerEnv(() => teamCommand(['status', runtimeTeamName]));
1615
1843
  statusOutput = logs.join('\n');
1616
1844
  if (/phase=failed/.test(statusOutput))
1617
1845
  break;
@@ -1620,9 +1848,9 @@ process.on('SIGTERM', () => process.exit(0));
1620
1848
  assert.match(statusOutput, /phase=failed/);
1621
1849
  assert.doesNotMatch(stderr.join('\n'), /ESRCH/);
1622
1850
  logs.length = 0;
1623
- await withoutTeamTestWorkerEnv(() => teamCommand(['await', teamName, '--json', '--timeout-ms', '250']));
1851
+ await withoutTeamTestWorkerEnv(() => teamCommand(['await', runtimeTeamName, '--json', '--timeout-ms', '250']));
1624
1852
  const payload = JSON.parse(logs.at(-1) ?? '{}');
1625
- assert.equal(payload.team_name, teamName);
1853
+ assert.equal(payload.team_name, runtimeTeamName);
1626
1854
  assert.equal(payload.status, 'event');
1627
1855
  assert.equal(payload.event?.type, 'worker_stopped');
1628
1856
  assert.equal(payload.event?.worker, 'worker-1');
@@ -1676,15 +1904,17 @@ process.on('SIGTERM', () => process.exit(0));
1676
1904
  process.env.OMX_TEAM_WORKER_CLI = 'codex';
1677
1905
  await withMockPromptModeCodexAllowed(() => withoutTeamTestWorkerEnv(() => teamCommand(['1:executor', teamTask])));
1678
1906
  const startedState = await readModeState('team', wd);
1907
+ const runtimeTeamName = String(startedState?.team_name ?? teamName);
1679
1908
  assert.equal(startedState?.active, true);
1680
- assert.equal(startedState?.team_name, teamName);
1909
+ assert.equal(startedState?.team_name, runtimeTeamName);
1910
+ assert.equal(startedState?.display_name, teamName);
1681
1911
  assert.equal(startedState?.current_phase, 'team-exec');
1682
1912
  await rm(join(wd, '.omx', 'state', 'team-state.json'), { force: true });
1683
1913
  assert.equal(await readModeState('team', wd), null);
1684
- await withoutTeamTestWorkerEnv(() => teamCommand(['resume', teamName]));
1914
+ await withoutTeamTestWorkerEnv(() => teamCommand(['resume', runtimeTeamName]));
1685
1915
  const resumedState = await readModeState('team', wd);
1686
1916
  assert.equal(resumedState?.active, true);
1687
- assert.equal(resumedState?.team_name, teamName);
1917
+ assert.equal(resumedState?.team_name, runtimeTeamName);
1688
1918
  assert.equal(resumedState?.current_phase, 'team-exec');
1689
1919
  }
1690
1920
  finally {
@@ -1733,7 +1963,9 @@ process.on('SIGTERM', () => process.exit(0));
1733
1963
  process.env.OMX_TEAM_WORKER_LAUNCH_MODE = 'prompt';
1734
1964
  process.env.OMX_TEAM_WORKER_CLI = 'codex';
1735
1965
  await withMockPromptModeCodexAllowed(() => withoutTeamTestWorkerEnv(() => teamCommand(['1:executor', teamTask])));
1736
- await writeFile(join(wd, '.omx', 'state', 'team', teamName, 'phase.json'), JSON.stringify({
1966
+ const startedState = await readModeState('team', wd);
1967
+ const runtimeTeamName = String(startedState?.team_name ?? teamName);
1968
+ await writeFile(join(wd, '.omx', 'state', 'team', runtimeTeamName, 'phase.json'), JSON.stringify({
1737
1969
  current_phase: 'complete',
1738
1970
  max_fix_attempts: 3,
1739
1971
  current_fix_attempt: 0,
@@ -1741,10 +1973,10 @@ process.on('SIGTERM', () => process.exit(0));
1741
1973
  updated_at: new Date().toISOString(),
1742
1974
  }, null, 2));
1743
1975
  await rm(join(wd, '.omx', 'state', 'team-state.json'), { force: true });
1744
- await withoutTeamTestWorkerEnv(() => teamCommand(['resume', teamName]));
1976
+ await withoutTeamTestWorkerEnv(() => teamCommand(['resume', runtimeTeamName]));
1745
1977
  const resumedState = await readModeState('team', wd);
1746
1978
  assert.equal(resumedState?.active, false);
1747
- assert.equal(resumedState?.team_name, teamName);
1979
+ assert.equal(resumedState?.team_name, runtimeTeamName);
1748
1980
  assert.equal(resumedState?.current_phase, 'complete');
1749
1981
  }
1750
1982
  finally {