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
@@ -5,14 +5,176 @@
5
5
  * PipelineStage. The execution backend is always teams — this is the
6
6
  * canonical OMX execution surface.
7
7
  */
8
+ import { readFileSync } from 'node:fs';
9
+ import { basename, dirname, isAbsolute, join, normalize, relative, resolve } from 'node:path';
10
+ import { buildRepoAwareTeamExecutionPlan } from '../../team/repo-aware-decomposition.js';
11
+ import { buildTeamExecutionPlan, parseTeamArgs } from '../../cli/team.js';
8
12
  import { buildFollowupStaffingPlan, resolveAvailableAgentTypes, } from '../../team/followup-planner.js';
13
+ import { decodeApprovedExecutionQuotedValue, readLatestPlanningArtifacts, readPlanningArtifacts, } from '../../planning/artifacts.js';
14
+ import { packageRoot, sameFilePath } from '../../utils/paths.js';
15
+ const APPROVED_TEAM_LAUNCH_PATTERN = /(?<command>(?:omx\s+team|\$team)\s+(?<ralph>ralph\s+)?(?<count>\d+)(?::(?<role>[a-z][a-z0-9-]*))?\s+(?<task>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'))/gi;
16
+ function resolveRequestedTask(ctx, ralplanArtifacts) {
17
+ const ralplanTask = typeof ralplanArtifacts?.task === 'string' ? ralplanArtifacts.task.trim() : '';
18
+ return ralplanTask || ctx.task;
19
+ }
20
+ function normalizePlanningRelativePath(rawPath) {
21
+ const trimmed = rawPath.trim().replace(/^`|`$/g, '').replace(/\\/g, '/');
22
+ const withoutDotPrefix = trimmed.startsWith('./') ? trimmed.slice(2) : trimmed;
23
+ return normalize(withoutDotPrefix).replace(/\\/g, '/');
24
+ }
25
+ function planningArtifactSlug(path, prefixPattern) {
26
+ const file = basename(path);
27
+ const match = file.match(prefixPattern);
28
+ return match?.groups?.slug ?? null;
29
+ }
30
+ function matchingTestSpecPathsForPrd(artifacts, prdPath) {
31
+ const prdSlug = planningArtifactSlug(prdPath, /^prd-(?<slug>.*)\.md$/i);
32
+ if (!prdSlug)
33
+ return [];
34
+ return artifacts.testSpecPaths.filter((testSpecPath) => planningArtifactSlug(testSpecPath, /^test-?spec-(?<slug>.*)\.md$/i) === prdSlug);
35
+ }
36
+ function resolvePlanningPrdPath(artifacts, cwd, rawPath) {
37
+ const normalizedRawPath = rawPath.trim();
38
+ if (isAbsolute(normalizedRawPath)) {
39
+ const resolvedPath = resolve(normalizedRawPath);
40
+ const matchedPath = artifacts.prdPaths.find((candidatePath) => sameFilePath(candidatePath, resolvedPath)) ?? null;
41
+ return { matchedPath, fallbackPath: resolvedPath };
42
+ }
43
+ const repoRoot = dirname(dirname(artifacts.plansDir));
44
+ const normalizedPath = normalizePlanningRelativePath(normalizedRawPath);
45
+ const resolvedPath = resolve(cwd, normalizedPath);
46
+ const matchedPath = artifacts.prdPaths.find((candidatePath) => {
47
+ const artifactPath = normalizePlanningRelativePath(candidatePath);
48
+ const repoRelativePath = normalizePlanningRelativePath(relative(repoRoot, candidatePath));
49
+ const plansRelativePath = normalizePlanningRelativePath(relative(artifacts.plansDir, candidatePath));
50
+ return normalizedPath === artifactPath
51
+ || normalizedPath === repoRelativePath
52
+ || normalizedPath === plansRelativePath;
53
+ }) ?? artifacts.prdPaths.find((candidatePath) => sameFilePath(candidatePath, resolvedPath)) ?? null;
54
+ return {
55
+ matchedPath,
56
+ fallbackPath: resolvedPath,
57
+ };
58
+ }
59
+ function readRuntimeLatestPlanningSelection(artifacts, cwd, ralplanArtifacts) {
60
+ const drafts = Array.isArray(ralplanArtifacts?.drafts) ? ralplanArtifacts.drafts : [];
61
+ for (let index = drafts.length - 1; index >= 0; index -= 1) {
62
+ const draft = drafts[index];
63
+ if (!draft || typeof draft !== 'object')
64
+ continue;
65
+ const draftRecord = draft;
66
+ const draftPlanPath = typeof draftRecord.planPath === 'string'
67
+ ? draftRecord.planPath.trim()
68
+ : '';
69
+ if (!draftPlanPath)
70
+ continue;
71
+ const resolvedDraftPlanPath = resolvePlanningPrdPath(artifacts, cwd, draftPlanPath).matchedPath;
72
+ return {
73
+ prdPath: resolvedDraftPlanPath,
74
+ testSpecPaths: resolvedDraftPlanPath ? matchingTestSpecPathsForPrd(artifacts, resolvedDraftPlanPath) : [],
75
+ };
76
+ }
77
+ return null;
78
+ }
79
+ function resolveApprovedTeamPlanPath(cwd, latestPlanPath, ralplanArtifacts) {
80
+ const artifacts = readPlanningArtifacts(cwd);
81
+ const resolvedLatestPlanPath = resolvePlanningPrdPath(artifacts, cwd, latestPlanPath);
82
+ const selection = readRuntimeLatestPlanningSelection(artifacts, cwd, ralplanArtifacts) ?? readLatestPlanningArtifacts(cwd);
83
+ const selectedPrdPath = selection.prdPath
84
+ ? resolvePlanningPrdPath(artifacts, cwd, selection.prdPath).matchedPath
85
+ : null;
86
+ if (!selectedPrdPath || selection.testSpecPaths.length === 0 || !resolvedLatestPlanPath.matchedPath) {
87
+ throw new Error(`team_exec_approved_handoff_missing:${resolvedLatestPlanPath.fallbackPath}`);
88
+ }
89
+ if (selectedPrdPath !== resolvedLatestPlanPath.matchedPath) {
90
+ throw new Error(`team_exec_approved_handoff_stale:${resolvedLatestPlanPath.matchedPath}:${selectedPrdPath}`);
91
+ }
92
+ return selectedPrdPath;
93
+ }
94
+ function resolveApprovedTeamTaskFromPlanPath(cwd, latestPlanPath, ralplanArtifacts) {
95
+ const approvedPlanPath = resolveApprovedTeamPlanPath(cwd, latestPlanPath, ralplanArtifacts);
96
+ let content = '';
97
+ try {
98
+ content = readFileSync(approvedPlanPath, 'utf-8');
99
+ }
100
+ catch {
101
+ throw new Error(`team_exec_approved_handoff_missing:${approvedPlanPath}`);
102
+ }
103
+ const matches = [...content.matchAll(APPROVED_TEAM_LAUNCH_PATTERN)];
104
+ if (matches.length === 0) {
105
+ throw new Error(`team_exec_approved_handoff_missing:${approvedPlanPath}`);
106
+ }
107
+ if (matches.length > 1) {
108
+ throw new Error(`team_exec_approved_handoff_ambiguous:${approvedPlanPath}`);
109
+ }
110
+ const task = matches[0]?.groups?.task ? decodeApprovedExecutionQuotedValue(matches[0].groups.task) : null;
111
+ if (!task) {
112
+ throw new Error(`team_exec_approved_handoff_missing:${approvedPlanPath}`);
113
+ }
114
+ return task;
115
+ }
116
+ function resolveTeamExecTask(ctx, ralplanArtifacts) {
117
+ const requestedTask = resolveRequestedTask(ctx, ralplanArtifacts);
118
+ const latestPlanPath = typeof ralplanArtifacts?.latestPlanPath === 'string'
119
+ ? ralplanArtifacts.latestPlanPath.trim()
120
+ : '';
121
+ if (!latestPlanPath) {
122
+ return requestedTask;
123
+ }
124
+ return resolveApprovedTeamTaskFromPlanPath(ctx.cwd, latestPlanPath, ralplanArtifacts);
125
+ }
126
+ function quotePosixShellArg(value) {
127
+ return `'${value.replace(/'/g, `'\"'\"'`)}'`;
128
+ }
129
+ function quoteWindowsCmdArg(value) {
130
+ return `"${value.replace(/%/g, '%%').replace(/"/g, '""')}"`;
131
+ }
132
+ function quoteShellArg(value, platform) {
133
+ return platform === 'win32' ? quoteWindowsCmdArg(value) : quotePosixShellArg(value);
134
+ }
135
+ function buildTeamRuntimeCliLaunchInput(descriptor) {
136
+ const parsed = parseTeamArgs([`${descriptor.workerCount}:${descriptor.agentType}`, descriptor.task], descriptor.cwd);
137
+ const executionPlan = buildRepoAwareTeamExecutionPlan({
138
+ task: parsed.task,
139
+ workerCount: parsed.workerCount,
140
+ agentType: parsed.agentType,
141
+ explicitAgentType: parsed.explicitAgentType,
142
+ explicitWorkerCount: parsed.explicitWorkerCount,
143
+ cwd: descriptor.cwd,
144
+ buildLegacyPlan: buildTeamExecutionPlan,
145
+ allowDagHandoff: parsed.allowRepoAwareDagHandoff,
146
+ approvedRepositoryContextSummary: parsed.approvedRepositoryContextSummary,
147
+ });
148
+ return {
149
+ teamName: parsed.teamName,
150
+ workerCount: executionPlan.workerCount,
151
+ agentType: descriptor.agentType,
152
+ tasks: executionPlan.tasks.map(({ subject, description, owner, blocked_by, depends_on, symbolic_depends_on, role, requires_code_change, filePaths, domains, lane, allocation_reason, symbolic_id, }) => ({
153
+ subject,
154
+ description,
155
+ ...(owner ? { owner } : {}),
156
+ ...(blocked_by?.length ? { blocked_by } : {}),
157
+ ...(depends_on?.length ? { depends_on } : {}),
158
+ ...(symbolic_depends_on?.length ? { symbolic_depends_on } : {}),
159
+ ...(role ? { role } : {}),
160
+ ...(requires_code_change ? { requires_code_change } : {}),
161
+ ...(filePaths?.length ? { filePaths } : {}),
162
+ ...(domains?.length ? { domains } : {}),
163
+ ...(lane ? { lane } : {}),
164
+ ...(allocation_reason ? { allocation_reason } : {}),
165
+ ...(symbolic_id ? { symbolic_id } : {}),
166
+ })),
167
+ cwd: descriptor.cwd,
168
+ ...(executionPlan.metadata ? { decompositionMetadata: executionPlan.metadata } : {}),
169
+ };
170
+ }
9
171
  /**
10
172
  * Create a team-exec pipeline stage.
11
173
  *
12
174
  * This stage delegates to the existing `omx team` infrastructure, which
13
- * starts real Codex CLI workers in tmux panes. The stage collects the
14
- * plan artifacts from the previous RALPLAN stage and passes them as
15
- * the team task description.
175
+ * starts real Codex CLI workers in tmux panes. When RALPLAN names a
176
+ * concrete approved PRD handoff, team-exec reuses that exact task text;
177
+ * otherwise it stays on the generic request-task path.
16
178
  */
17
179
  export function createTeamExecStage(options = {}) {
18
180
  const workerCount = options.workerCount ?? 2;
@@ -22,19 +184,18 @@ export function createTeamExecStage(options = {}) {
22
184
  async run(ctx) {
23
185
  const startTime = Date.now();
24
186
  try {
25
- // Extract plan context from previous stage artifacts
26
- const ralplanArtifacts = ctx.artifacts['ralplan'];
27
- const planContext = ralplanArtifacts
28
- ? `Plan from RALPLAN stage:\n${JSON.stringify(ralplanArtifacts, null, 2)}\n\nTask: ${ctx.task}`
29
- : ctx.task;
187
+ const ralplanArtifacts = typeof ctx.artifacts['ralplan'] === 'object' && ctx.artifacts['ralplan'] !== null
188
+ ? ctx.artifacts['ralplan']
189
+ : undefined;
190
+ const task = resolveTeamExecTask(ctx, ralplanArtifacts);
30
191
  const availableAgentTypes = await resolveAvailableAgentTypes(ctx.cwd);
31
- const staffingPlan = buildFollowupStaffingPlan('team', ctx.task, availableAgentTypes, {
192
+ const staffingPlan = buildFollowupStaffingPlan('team', task, availableAgentTypes, {
32
193
  workerCount,
33
194
  fallbackRole: agentType,
34
195
  });
35
196
  // Build team execution descriptor
36
197
  const teamDescriptor = {
37
- task: planContext,
198
+ task,
38
199
  workerCount,
39
200
  agentType,
40
201
  availableAgentTypes,
@@ -71,8 +232,15 @@ export function createTeamExecStage(options = {}) {
71
232
  /**
72
233
  * Build the `omx team` CLI instruction from a descriptor.
73
234
  */
74
- export function buildTeamInstruction(descriptor) {
75
- const launchCommand = `omx team ${descriptor.workerCount}:${descriptor.agentType} ${JSON.stringify(descriptor.task)}`;
76
- return `${launchCommand} # staffing=${descriptor.staffingPlan.staffingSummary} # verify=${descriptor.staffingPlan.verificationPlan.summary}`;
235
+ export function buildTeamInstruction(descriptor, options = {}) {
236
+ const runtimeCliInput = buildTeamRuntimeCliLaunchInput(descriptor);
237
+ const runtimeCliPath = join(packageRoot(), 'dist', 'team', 'runtime-cli.js');
238
+ const platform = options.platform ?? process.platform;
239
+ const encodedInput = Buffer.from(JSON.stringify(runtimeCliInput), 'utf-8').toString('base64url');
240
+ const launchCommand = `${quoteShellArg(process.execPath, platform)} ${quoteShellArg(runtimeCliPath, platform)} --input-json-base64 ${encodedInput}`;
241
+ if (platform === 'win32') {
242
+ return launchCommand;
243
+ }
244
+ return `${launchCommand} # task=${JSON.stringify(descriptor.task)} # staffing=${descriptor.staffingPlan.staffingSummary} # verify=${descriptor.staffingPlan.verificationPlan.summary}`;
77
245
  }
78
246
  //# sourceMappingURL=team-exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"team-exec.js","sourceRoot":"","sources":["../../../src/pipeline/stages/team-exec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AAgBxC;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAgC,EAAE;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,WAAW;QAEjB,KAAK,CAAC,GAAG,CAAC,GAAiB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC;gBACH,qDAAqD;gBACrD,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAwC,CAAC;gBACzF,MAAM,WAAW,GAAG,gBAAgB;oBAClC,CAAC,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,EAAE;oBAC/F,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;gBACb,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtE,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE;oBACpF,WAAW;oBACX,YAAY,EAAE,SAAS;iBACxB,CAAC,CAAC;gBAEH,kCAAkC;gBAClC,MAAM,cAAc,GAAuB;oBACzC,IAAI,EAAE,WAAW;oBACjB,WAAW;oBACX,SAAS;oBACT,mBAAmB;oBACnB,YAAY;oBACZ,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;oBAC3C,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC;gBAEF,OAAO;oBACL,MAAM,EAAE,WAAW;oBACnB,SAAS,EAAE;wBACT,cAAc;wBACd,WAAW;wBACX,SAAS;wBACT,mBAAmB;wBACnB,YAAY;wBACZ,KAAK,EAAE,WAAW;wBAClB,WAAW,EAAE,oBAAoB,CAAC,cAAc,CAAC;qBAClD;oBACD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACpC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,EAAE;oBACb,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACnC,KAAK,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBAC1F,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAoBD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA8B;IACjE,MAAM,aAAa,GAAG,YAAY,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACtH,OAAO,GAAG,aAAa,eAAe,UAAU,CAAC,YAAY,CAAC,eAAe,aAAa,UAAU,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;AAC/I,CAAC"}
1
+ {"version":3,"file":"team-exec.js","sourceRoot":"","sources":["../../../src/pipeline/stages/team-exec.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,14 @@ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
4
4
  import { existsSync } from 'node:fs';
5
5
  import { tmpdir } from 'node:os';
6
6
  import { join } from 'node:path';
7
- import { isPlanningComplete, readApprovedExecutionLaunchHint, readPlanningArtifacts, readTeamDagArtifactResolution } from '../artifacts.js';
7
+ import { decodeApprovedExecutionQuotedValue, isPlanningComplete, readApprovedExecutionLaunchHint, readLatestPlanningArtifacts, readPlanningArtifacts, readTeamDagArtifactResolution, } from '../artifacts.js';
8
8
  import { readTeamDagHandoffForLatestPlan } from '../../team/dag-schema.js';
9
9
  let tempDir;
10
+ function encodeApprovedExecutionTask(task, quote) {
11
+ return quote === 'single'
12
+ ? `'${task.replace(/'/g, "\\'")}'`
13
+ : `"${task.replace(/"/g, '\\"')}"`;
14
+ }
10
15
  async function setup() {
11
16
  tempDir = await mkdtemp(join(tmpdir(), 'omx-planning-artifacts-'));
12
17
  }
@@ -18,6 +23,16 @@ async function cleanup() {
18
23
  describe('planning artifacts', () => {
19
24
  beforeEach(async () => { await setup(); });
20
25
  afterEach(async () => { await cleanup(); });
26
+ it('round-trips single-quoted approved execution tasks with only escaped apostrophes normalized', () => {
27
+ const task = String.raw `Fix Bob's regression in C:\\tmp`;
28
+ assert.equal(decodeApprovedExecutionQuotedValue(encodeApprovedExecutionTask(task, 'single')), task);
29
+ });
30
+ it('round-trips double-quoted approved execution tasks without applying JSON escapes', () => {
31
+ const task = String.raw `Use C:\tmp and keep \n literal plus "quotes"`;
32
+ assert.equal(decodeApprovedExecutionQuotedValue(encodeApprovedExecutionTask(task, 'double')), task);
33
+ const literalEscapeTask = String.raw `Keep \t and \u1234 literal`;
34
+ assert.equal(decodeApprovedExecutionQuotedValue(encodeApprovedExecutionTask(literalEscapeTask, 'double')), literalEscapeTask);
35
+ });
21
36
  it('requires both PRD and test spec for planning completion', async () => {
22
37
  const plansDir = join(tempDir, '.omx', 'plans');
23
38
  await mkdir(plansDir, { recursive: true });
@@ -79,6 +94,75 @@ describe('planning artifacts', () => {
79
94
  assert.equal(resolution.planSlug, 'repo-aware');
80
95
  assert.deepEqual(resolution.warnings, ['missing_matching_test_spec']);
81
96
  });
97
+ it('prefers timestamped PRD/test-spec pairs while keeping legacy artifacts compatible', async () => {
98
+ const plansDir = join(tempDir, '.omx', 'plans');
99
+ const specsDir = join(tempDir, '.omx', 'specs');
100
+ await mkdir(plansDir, { recursive: true });
101
+ await mkdir(specsDir, { recursive: true });
102
+ await writeFile(join(plansDir, 'prd-legacy.md'), '# Legacy\n\nLaunch via omx ralph "Execute legacy plan"\n');
103
+ await writeFile(join(plansDir, 'test-spec-legacy.md'), '# Legacy Test Spec\n');
104
+ await writeFile(join(plansDir, 'prd-20260427T153000Z-alpha.md'), '# Old Alpha\n\nLaunch via omx ralph "Execute old alpha plan"\n');
105
+ await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Legacy Test Spec\n');
106
+ await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# New Alpha\n\nLaunch via omx ralph "Execute new alpha plan"\n');
107
+ await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Timestamped Test Spec\n');
108
+ await writeFile(join(specsDir, 'deep-interview-alpha.md'), '# Alpha Legacy Deep Interview\n');
109
+ await writeFile(join(specsDir, 'deep-interview-20260427T153100Z-alpha.md'), '# Alpha Timestamped Deep Interview\n');
110
+ await writeFile(join(specsDir, 'deep-interview-autoresearch-20260427T153100Z-alpha.md'), '# Autoresearch Draft\n');
111
+ const selection = readLatestPlanningArtifacts(tempDir);
112
+ assert.equal(selection.prdPath, join(plansDir, 'prd-20260427T153100Z-alpha.md'));
113
+ assert.deepEqual(selection.testSpecPaths, [join(plansDir, 'test-spec-20260427T153100Z-alpha.md')]);
114
+ assert.deepEqual(selection.deepInterviewSpecPaths, [
115
+ join(specsDir, 'deep-interview-alpha.md'),
116
+ join(specsDir, 'deep-interview-20260427T153100Z-alpha.md'),
117
+ ]);
118
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
119
+ assert.ok(hint);
120
+ assert.equal(hint?.task, 'Execute new alpha plan');
121
+ assert.deepEqual(hint?.testSpecPaths, [join(plansDir, 'test-spec-20260427T153100Z-alpha.md')]);
122
+ assert.deepEqual(hint?.deepInterviewSpecPaths, [
123
+ join(specsDir, 'deep-interview-alpha.md'),
124
+ join(specsDir, 'deep-interview-20260427T153100Z-alpha.md'),
125
+ ]);
126
+ const artifacts = readPlanningArtifacts(tempDir);
127
+ assert.equal(isPlanningComplete(artifacts), true);
128
+ });
129
+ it('keeps legacy test-spec compatibility aliases for non-timestamped PRDs', async () => {
130
+ const plansDir = join(tempDir, '.omx', 'plans');
131
+ await mkdir(plansDir, { recursive: true });
132
+ await writeFile(join(plansDir, 'prd-alpha.md'), '# Alpha\n\nLaunch via omx ralph "Execute alpha"\n');
133
+ await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Test Spec\n');
134
+ await writeFile(join(plansDir, 'testspec-alpha.md'), '# Alpha Compatibility Test Spec\n');
135
+ await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Timestamped Test Spec\n');
136
+ const selection = readLatestPlanningArtifacts(tempDir);
137
+ assert.equal(selection.prdPath, join(plansDir, 'prd-alpha.md'));
138
+ assert.deepEqual(selection.testSpecPaths, [
139
+ join(plansDir, 'test-spec-alpha.md'),
140
+ join(plansDir, 'testspec-alpha.md'),
141
+ ]);
142
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
143
+ assert.ok(hint);
144
+ assert.deepEqual(hint?.testSpecPaths, [
145
+ join(plansDir, 'test-spec-alpha.md'),
146
+ join(plansDir, 'testspec-alpha.md'),
147
+ ]);
148
+ });
149
+ it('fails closed for timestamped PRDs when only legacy slug test specs exist', async () => {
150
+ const plansDir = join(tempDir, '.omx', 'plans');
151
+ await mkdir(plansDir, { recursive: true });
152
+ await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# Alpha\n\nLaunch via omx ralph "Execute alpha"\n');
153
+ await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Legacy Test Spec\n');
154
+ const artifacts = readPlanningArtifacts(tempDir);
155
+ assert.equal(isPlanningComplete(artifacts), false);
156
+ const selection = readLatestPlanningArtifacts(tempDir);
157
+ assert.equal(selection.prdPath, join(plansDir, 'prd-20260427T153100Z-alpha.md'));
158
+ assert.deepEqual(selection.testSpecPaths, []);
159
+ assert.equal(readApprovedExecutionLaunchHint(tempDir, 'ralph'), null);
160
+ const resolution = readTeamDagArtifactResolution(tempDir);
161
+ assert.equal(resolution.source, 'none');
162
+ assert.equal(resolution.prdPath, join(plansDir, 'prd-20260427T153100Z-alpha.md'));
163
+ assert.equal(resolution.planSlug, '20260427T153100Z-alpha');
164
+ assert.deepEqual(resolution.warnings, ['missing_matching_test_spec']);
165
+ });
82
166
  it('parses $ralph aliases with single-quoted task text for approved launch hints', async () => {
83
167
  const plansDir = join(tempDir, '.omx', 'plans');
84
168
  const specsDir = join(tempDir, '.omx', 'specs');
@@ -185,6 +269,168 @@ describe('planning artifacts', () => {
185
269
  assert.deepEqual(hint?.testSpecPaths, [join(plansDir, 'test-spec-zeta.md')]);
186
270
  assert.deepEqual(hint?.deepInterviewSpecPaths, [join(specsDir, 'deep-interview-zeta.md')]);
187
271
  });
272
+ it('binds approved launch hints to the requested prd path', async () => {
273
+ const plansDir = join(tempDir, '.omx', 'plans');
274
+ await mkdir(plansDir, { recursive: true });
275
+ const alphaPrdPath = join(plansDir, 'prd-alpha.md');
276
+ await writeFile(alphaPrdPath, '# Alpha\n\nLaunch via omx ralph "Execute alpha"\n');
277
+ await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Test Spec\n');
278
+ await writeFile(join(plansDir, 'prd-zeta.md'), '# Zeta\n\nLaunch via omx ralph "Execute zeta"\n');
279
+ await writeFile(join(plansDir, 'test-spec-zeta.md'), '# Zeta Test Spec\n');
280
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph', { prdPath: alphaPrdPath });
281
+ assert.ok(hint);
282
+ assert.equal(hint?.task, 'Execute alpha');
283
+ assert.equal(hint?.sourcePath, alphaPrdPath);
284
+ assert.deepEqual(hint?.testSpecPaths, [join(plansDir, 'test-spec-alpha.md')]);
285
+ });
286
+ it('honors the requested Ralph task when a single plan lists multiple Ralph launch hints', async () => {
287
+ const plansDir = join(tempDir, '.omx', 'plans');
288
+ await mkdir(plansDir, { recursive: true });
289
+ await writeFile(join(plansDir, 'prd-issue-909.md'), [
290
+ '# PRD',
291
+ '',
292
+ 'Launch via omx ralph "Execute alpha"',
293
+ 'Launch via omx ralph "Execute beta"',
294
+ ].join('\n'));
295
+ await writeFile(join(plansDir, 'test-spec-issue-909.md'), '# Test Spec\n');
296
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph', { task: 'Execute alpha' });
297
+ assert.ok(hint);
298
+ assert.equal(hint?.task, 'Execute alpha');
299
+ assert.equal(hint?.command, 'omx ralph "Execute alpha"');
300
+ });
301
+ it('fails closed for bare Ralph lookups when a single plan lists multiple Ralph launch hints', async () => {
302
+ const plansDir = join(tempDir, '.omx', 'plans');
303
+ await mkdir(plansDir, { recursive: true });
304
+ await writeFile(join(plansDir, 'prd-issue-909-bare.md'), [
305
+ '# PRD',
306
+ '',
307
+ 'Launch via omx ralph "Execute alpha"',
308
+ 'Launch via omx ralph "Execute beta"',
309
+ ].join('\n'));
310
+ await writeFile(join(plansDir, 'test-spec-issue-909-bare.md'), '# Test Spec\n');
311
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
312
+ assert.equal(hint, null);
313
+ });
314
+ it('honors the requested team task when a single plan lists multiple team launch hints', async () => {
315
+ const plansDir = join(tempDir, '.omx', 'plans');
316
+ await mkdir(plansDir, { recursive: true });
317
+ await writeFile(join(plansDir, 'prd-issue-910.md'), [
318
+ '# PRD',
319
+ '',
320
+ 'Launch via omx team 2:executor "Execute alpha"',
321
+ 'Launch via omx team 5:debugger "Execute beta"',
322
+ ].join('\n'));
323
+ await writeFile(join(plansDir, 'test-spec-issue-910.md'), '# Test Spec\n');
324
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team', { task: 'Execute alpha' });
325
+ assert.ok(hint);
326
+ assert.equal(hint?.task, 'Execute alpha');
327
+ assert.equal(hint?.workerCount, 2);
328
+ assert.equal(hint?.agentType, 'executor');
329
+ assert.equal(hint?.command, 'omx team 2:executor "Execute alpha"');
330
+ });
331
+ it('fails closed when a single plan repeats the same team task in multiple launch hints', async () => {
332
+ const plansDir = join(tempDir, '.omx', 'plans');
333
+ const prdPath = join(plansDir, 'prd-issue-910-duplicate.md');
334
+ await mkdir(plansDir, { recursive: true });
335
+ await writeFile(prdPath, [
336
+ '# PRD',
337
+ '',
338
+ 'Launch via omx team 2:executor "Execute alpha"',
339
+ 'Launch via $team 5:debugger "Execute alpha"',
340
+ ].join('\n'));
341
+ await writeFile(join(plansDir, 'test-spec-issue-910-duplicate.md'), '# Test Spec\n');
342
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team', {
343
+ prdPath,
344
+ task: 'Execute alpha',
345
+ });
346
+ assert.equal(hint, null);
347
+ });
348
+ it('rehydrates the exact team launch hint by command when one PRD repeats the same task', async () => {
349
+ const plansDir = join(tempDir, '.omx', 'plans');
350
+ const sharedTask = 'Ship feature';
351
+ const primaryCommand = `omx team 2:executor ${JSON.stringify(sharedTask)}`;
352
+ const secondaryCommand = `$team ralph 5:debugger ${JSON.stringify(sharedTask)}`;
353
+ const prdPath = join(plansDir, 'prd-issue-910-command.md');
354
+ await mkdir(plansDir, { recursive: true });
355
+ await writeFile(prdPath, [
356
+ '# Approved plan',
357
+ '',
358
+ `Launch via ${primaryCommand}`,
359
+ `Launch via ${secondaryCommand}`,
360
+ ].join('\n'));
361
+ await writeFile(join(plansDir, 'test-spec-issue-910-command.md'), '# Test Spec\n');
362
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team', {
363
+ prdPath,
364
+ task: sharedTask,
365
+ command: primaryCommand,
366
+ });
367
+ assert.ok(hint);
368
+ assert.equal(hint?.command, primaryCommand);
369
+ assert.equal(hint?.workerCount, 2);
370
+ assert.equal(hint?.agentType, 'executor');
371
+ assert.equal(hint?.linkedRalph, false);
372
+ });
373
+ it('fails closed for bare team lookups when a single plan lists multiple team launch hints', async () => {
374
+ const plansDir = join(tempDir, '.omx', 'plans');
375
+ await mkdir(plansDir, { recursive: true });
376
+ await writeFile(join(plansDir, 'prd-issue-910-bare.md'), [
377
+ '# PRD',
378
+ '',
379
+ 'Launch via omx team 2:executor "Execute alpha"',
380
+ 'Launch via omx team 5:debugger "Execute beta"',
381
+ ].join('\n'));
382
+ await writeFile(join(plansDir, 'test-spec-issue-910-bare.md'), '# Test Spec\n');
383
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
384
+ assert.equal(hint, null);
385
+ });
386
+ it('attaches bounded approved repository context from a matching latest-plan sidecar', async () => {
387
+ const plansDir = join(tempDir, '.omx', 'plans');
388
+ await mkdir(plansDir, { recursive: true });
389
+ await writeFile(join(plansDir, 'prd-issue-2039.md'), '# PRD\n\nLaunch via omx team 3:executor "Execute approved issue 2039 plan"\n');
390
+ await writeFile(join(plansDir, 'test-spec-issue-2039.md'), '# Test Spec\n');
391
+ await writeFile(join(plansDir, 'repo-context-issue-2039.md'), 'Key files: src/planning/artifacts.ts\n'.repeat(120));
392
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
393
+ assert.ok(hint?.repositoryContextSummary);
394
+ assert.equal(hint.repositoryContextSummary.sourcePath, join(plansDir, 'repo-context-issue-2039.md'));
395
+ assert.match(hint.repositoryContextSummary.content, /Key files: src\/planning\/artifacts\.ts/);
396
+ assert.equal(hint.repositoryContextSummary.truncated, true);
397
+ assert.ok(hint.repositoryContextSummary.content.split('\n').length <= 80);
398
+ });
399
+ it('prefers exact timestamped repository context sidecars for timestamped PRDs', async () => {
400
+ const plansDir = join(tempDir, '.omx', 'plans');
401
+ await mkdir(plansDir, { recursive: true });
402
+ await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# Alpha\n\nLaunch via omx team 2:executor "Execute alpha"\n');
403
+ await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Test Spec\n');
404
+ await writeFile(join(plansDir, 'repo-context-alpha.md'), 'stale alpha context\n');
405
+ await writeFile(join(plansDir, 'repo-context-20260427T153100Z-alpha.md'), 'fresh alpha context\n');
406
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
407
+ assert.ok(hint?.repositoryContextSummary);
408
+ assert.equal(hint.repositoryContextSummary.sourcePath, join(plansDir, 'repo-context-20260427T153100Z-alpha.md'));
409
+ assert.equal(hint.repositoryContextSummary.content, 'fresh alpha context');
410
+ });
411
+ it('does not attach stale repository context from a different PRD slug', async () => {
412
+ const plansDir = join(tempDir, '.omx', 'plans');
413
+ await mkdir(plansDir, { recursive: true });
414
+ await writeFile(join(plansDir, 'prd-alpha.md'), '# Alpha\n\nLaunch via omx team 2:executor "Execute alpha"\n');
415
+ await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Test Spec\n');
416
+ await writeFile(join(plansDir, 'repo-context-alpha.md'), 'stale alpha context\n');
417
+ await writeFile(join(plansDir, 'prd-zeta.md'), '# Zeta\n\nLaunch via omx team 3:executor "Execute zeta"\n');
418
+ await writeFile(join(plansDir, 'test-spec-zeta.md'), '# Zeta Test Spec\n');
419
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
420
+ assert.ok(hint);
421
+ assert.equal(hint.task, 'Execute zeta');
422
+ assert.equal(hint.repositoryContextSummary, undefined);
423
+ });
424
+ it('falls back to an inline approved repository context section when no sidecar exists', async () => {
425
+ const plansDir = join(tempDir, '.omx', 'plans');
426
+ await mkdir(plansDir, { recursive: true });
427
+ await writeFile(join(plansDir, 'prd-inline.md'), '# PRD\n\nLaunch via omx ralph "Execute inline"\n\n## Approved Repository Context Summary\n\n- Reuse src/cli/ralph.ts.\n\n## Verification\nRun tests.\n');
428
+ await writeFile(join(plansDir, 'test-spec-inline.md'), '# Inline Test Spec\n');
429
+ const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
430
+ assert.ok(hint?.repositoryContextSummary);
431
+ assert.equal(hint.repositoryContextSummary.sourcePath, join(plansDir, 'prd-inline.md'));
432
+ assert.equal(hint.repositoryContextSummary.content, '- Reuse src/cli/ralph.ts.');
433
+ });
188
434
  it('surfaces deep-interview specs for downstream traceability', async () => {
189
435
  const plansDir = join(tempDir, '.omx', 'plans');
190
436
  const specsDir = join(tempDir, '.omx', 'specs');
@@ -211,6 +457,20 @@ describe('planning artifacts', () => {
211
457
  assert.equal(result.planSlug, 'alpha');
212
458
  assert.equal(result.dag?.nodes[0]?.id, 'impl');
213
459
  });
460
+ it('prefers exact timestamped Team DAG sidecars for timestamped PRDs', async () => {
461
+ const plansDir = join(tempDir, '.omx', 'plans');
462
+ await mkdir(plansDir, { recursive: true });
463
+ await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# Alpha\n');
464
+ await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Test\n');
465
+ await writeFile(join(plansDir, 'team-dag-alpha.json'), '{"source":"stale"}\n');
466
+ await writeFile(join(plansDir, 'team-dag-20260427T153100Z-alpha.json'), '{"source":"fresh"}\n');
467
+ const resolution = readTeamDagArtifactResolution(tempDir);
468
+ assert.equal(resolution.source, 'json-sidecar');
469
+ assert.equal(resolution.planSlug, '20260427T153100Z-alpha');
470
+ assert.equal(resolution.artifactPath, join(plansDir, 'team-dag-20260427T153100Z-alpha.json'));
471
+ assert.equal(resolution.content, '{"source":"fresh"}\n');
472
+ assert.deepEqual(resolution.warnings, []);
473
+ });
214
474
  it('does not overmatch sidecars for a different slug prefix', async () => {
215
475
  const plansDir = join(tempDir, '.omx', 'plans');
216
476
  await mkdir(plansDir, { recursive: true });