oh-my-codex 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +45 -19
  4. package/crates/omx-api/src/lib.rs +66 -9
  5. package/crates/omx-sparkshell/src/exec.rs +125 -3
  6. package/crates/omx-sparkshell/src/main.rs +126 -36
  7. package/crates/omx-sparkshell/tests/execution.rs +225 -1
  8. package/dist/agents/__tests__/definitions.test.js +14 -0
  9. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  10. package/dist/agents/__tests__/native-config.test.js +19 -0
  11. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  12. package/dist/agents/definitions.d.ts.map +1 -1
  13. package/dist/agents/definitions.js +30 -0
  14. package/dist/agents/definitions.js.map +1 -1
  15. package/dist/agents/native-config.d.ts +1 -0
  16. package/dist/agents/native-config.d.ts.map +1 -1
  17. package/dist/agents/native-config.js +4 -0
  18. package/dist/agents/native-config.js.map +1 -1
  19. package/dist/catalog/__tests__/generator.test.js +4 -0
  20. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  21. package/dist/cli/__tests__/codex-plugin-layout.test.js +15 -7
  22. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  23. package/dist/cli/__tests__/doctor-warning-copy.test.js +137 -8
  24. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  25. package/dist/cli/__tests__/index.test.js +203 -15
  26. package/dist/cli/__tests__/index.test.js.map +1 -1
  27. package/dist/cli/__tests__/install-docs-contract.test.d.ts +2 -0
  28. package/dist/cli/__tests__/install-docs-contract.test.d.ts.map +1 -0
  29. package/dist/cli/__tests__/install-docs-contract.test.js +55 -0
  30. package/dist/cli/__tests__/install-docs-contract.test.js.map +1 -0
  31. package/dist/cli/__tests__/launch-fallback.test.js +163 -0
  32. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  33. package/dist/cli/__tests__/question.test.js +29 -43
  34. package/dist/cli/__tests__/question.test.js.map +1 -1
  35. package/dist/cli/__tests__/setup-install-mode.test.js +94 -35
  36. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  37. package/dist/cli/__tests__/sparkshell-cli.test.js +20 -1
  38. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  39. package/dist/cli/__tests__/sparkshell-packaging.test.js +1 -0
  40. package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -1
  41. package/dist/cli/__tests__/ultragoal.test.js +227 -4
  42. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  43. package/dist/cli/__tests__/update.test.js +72 -1
  44. package/dist/cli/__tests__/update.test.js.map +1 -1
  45. package/dist/cli/codex-feature-probe.d.ts +5 -0
  46. package/dist/cli/codex-feature-probe.d.ts.map +1 -1
  47. package/dist/cli/codex-feature-probe.js +13 -7
  48. package/dist/cli/codex-feature-probe.js.map +1 -1
  49. package/dist/cli/doctor.d.ts +7 -0
  50. package/dist/cli/doctor.d.ts.map +1 -1
  51. package/dist/cli/doctor.js +297 -17
  52. package/dist/cli/doctor.js.map +1 -1
  53. package/dist/cli/index.d.ts +9 -1
  54. package/dist/cli/index.d.ts.map +1 -1
  55. package/dist/cli/index.js +465 -110
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/cli/plugin-marketplace.d.ts +2 -0
  58. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  59. package/dist/cli/plugin-marketplace.js +15 -1
  60. package/dist/cli/plugin-marketplace.js.map +1 -1
  61. package/dist/cli/setup.d.ts.map +1 -1
  62. package/dist/cli/setup.js +71 -11
  63. package/dist/cli/setup.js.map +1 -1
  64. package/dist/cli/sparkshell.d.ts +7 -1
  65. package/dist/cli/sparkshell.d.ts.map +1 -1
  66. package/dist/cli/sparkshell.js +13 -3
  67. package/dist/cli/sparkshell.js.map +1 -1
  68. package/dist/cli/ultragoal.d.ts +1 -1
  69. package/dist/cli/ultragoal.d.ts.map +1 -1
  70. package/dist/cli/ultragoal.js +184 -10
  71. package/dist/cli/ultragoal.js.map +1 -1
  72. package/dist/cli/update.d.ts +2 -0
  73. package/dist/cli/update.d.ts.map +1 -1
  74. package/dist/cli/update.js +14 -3
  75. package/dist/cli/update.js.map +1 -1
  76. package/dist/compat/__tests__/doctor-contract.test.js +3 -0
  77. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
  78. package/dist/config/__tests__/codex-feature-flags.test.js +11 -1
  79. package/dist/config/__tests__/codex-feature-flags.test.js.map +1 -1
  80. package/dist/config/__tests__/codex-hooks.test.js +22 -11
  81. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  82. package/dist/config/__tests__/commit-lore-guard.test.d.ts +2 -0
  83. package/dist/config/__tests__/commit-lore-guard.test.d.ts.map +1 -0
  84. package/dist/config/__tests__/commit-lore-guard.test.js +20 -0
  85. package/dist/config/__tests__/commit-lore-guard.test.js.map +1 -0
  86. package/dist/config/codex-feature-flags.d.ts +4 -0
  87. package/dist/config/codex-feature-flags.d.ts.map +1 -1
  88. package/dist/config/codex-feature-flags.js +4 -0
  89. package/dist/config/codex-feature-flags.js.map +1 -1
  90. package/dist/config/codex-hooks.d.ts +1 -0
  91. package/dist/config/codex-hooks.d.ts.map +1 -1
  92. package/dist/config/codex-hooks.js +8 -10
  93. package/dist/config/codex-hooks.js.map +1 -1
  94. package/dist/config/commit-lore-guard.d.ts +1 -0
  95. package/dist/config/commit-lore-guard.d.ts.map +1 -1
  96. package/dist/config/commit-lore-guard.js +29 -3
  97. package/dist/config/commit-lore-guard.js.map +1 -1
  98. package/dist/config/generator.d.ts +17 -1
  99. package/dist/config/generator.d.ts.map +1 -1
  100. package/dist/config/generator.js +124 -11
  101. package/dist/config/generator.js.map +1 -1
  102. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +21 -0
  103. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  104. package/dist/goal-workflows/codex-goal-snapshot.d.ts +4 -0
  105. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  106. package/dist/goal-workflows/codex-goal-snapshot.js +50 -3
  107. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  108. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +27 -6
  109. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  110. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +1 -1
  111. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +13 -11
  112. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  113. package/dist/hooks/__tests__/deep-interview-contract.test.js +4 -3
  114. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  115. package/dist/hooks/__tests__/keyword-detector.test.js +173 -17
  116. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  117. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +33 -0
  118. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  119. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts +2 -0
  120. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts.map +1 -0
  121. package/dist/hooks/__tests__/prometheus-strict-contract.test.js +320 -0
  122. package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -0
  123. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +12 -0
  124. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
  125. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts +2 -0
  126. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts.map +1 -0
  127. package/dist/hooks/__tests__/research-workflow-boundaries.test.js +35 -0
  128. package/dist/hooks/__tests__/research-workflow-boundaries.test.js.map +1 -0
  129. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +26 -3
  130. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
  131. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  132. package/dist/hooks/extensibility/dispatcher.js +29 -14
  133. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  134. package/dist/hooks/keyword-detector.d.ts +1 -1
  135. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  136. package/dist/hooks/keyword-detector.js +36 -9
  137. package/dist/hooks/keyword-detector.js.map +1 -1
  138. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  139. package/dist/hooks/keyword-registry.js +1 -0
  140. package/dist/hooks/keyword-registry.js.map +1 -1
  141. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  142. package/dist/hooks/prompt-guidance-contract.js +14 -2
  143. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  144. package/dist/hud/__tests__/hud-tmux-injection.test.js +36 -8
  145. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  146. package/dist/hud/__tests__/reconcile.test.js +122 -11
  147. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  148. package/dist/hud/__tests__/render.test.js +84 -0
  149. package/dist/hud/__tests__/render.test.js.map +1 -1
  150. package/dist/hud/__tests__/resource-leak-watch.test.d.ts +2 -0
  151. package/dist/hud/__tests__/resource-leak-watch.test.d.ts.map +1 -0
  152. package/dist/hud/__tests__/resource-leak-watch.test.js +28 -0
  153. package/dist/hud/__tests__/resource-leak-watch.test.js.map +1 -0
  154. package/dist/hud/__tests__/state.test.js +51 -1
  155. package/dist/hud/__tests__/state.test.js.map +1 -1
  156. package/dist/hud/__tests__/tmux.test.js +69 -23
  157. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  158. package/dist/hud/index.d.ts +2 -2
  159. package/dist/hud/index.d.ts.map +1 -1
  160. package/dist/hud/index.js +17 -6
  161. package/dist/hud/index.js.map +1 -1
  162. package/dist/hud/reconcile.d.ts.map +1 -1
  163. package/dist/hud/reconcile.js +6 -3
  164. package/dist/hud/reconcile.js.map +1 -1
  165. package/dist/hud/render.d.ts.map +1 -1
  166. package/dist/hud/render.js +26 -0
  167. package/dist/hud/render.js.map +1 -1
  168. package/dist/hud/state.d.ts +2 -1
  169. package/dist/hud/state.d.ts.map +1 -1
  170. package/dist/hud/state.js +62 -1
  171. package/dist/hud/state.js.map +1 -1
  172. package/dist/hud/tmux.d.ts +10 -3
  173. package/dist/hud/tmux.d.ts.map +1 -1
  174. package/dist/hud/tmux.js +60 -11
  175. package/dist/hud/tmux.js.map +1 -1
  176. package/dist/hud/types.d.ts +22 -0
  177. package/dist/hud/types.d.ts.map +1 -1
  178. package/dist/hud/types.js.map +1 -1
  179. package/dist/notifications/__tests__/http-client-resource.test.d.ts +2 -0
  180. package/dist/notifications/__tests__/http-client-resource.test.d.ts.map +1 -0
  181. package/dist/notifications/__tests__/http-client-resource.test.js +41 -0
  182. package/dist/notifications/__tests__/http-client-resource.test.js.map +1 -0
  183. package/dist/notifications/__tests__/verbosity.test.js +20 -0
  184. package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
  185. package/dist/notifications/config.d.ts.map +1 -1
  186. package/dist/notifications/config.js +6 -3
  187. package/dist/notifications/config.js.map +1 -1
  188. package/dist/notifications/http-client.d.ts.map +1 -1
  189. package/dist/notifications/http-client.js +78 -27
  190. package/dist/notifications/http-client.js.map +1 -1
  191. package/dist/notifications/types.d.ts +2 -0
  192. package/dist/notifications/types.d.ts.map +1 -1
  193. package/dist/openclaw/__tests__/dispatcher.test.js +49 -1
  194. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
  195. package/dist/openclaw/dispatcher.d.ts +7 -4
  196. package/dist/openclaw/dispatcher.d.ts.map +1 -1
  197. package/dist/openclaw/dispatcher.js +32 -69
  198. package/dist/openclaw/dispatcher.js.map +1 -1
  199. package/dist/pipeline/__tests__/orchestrator.test.js +128 -4
  200. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  201. package/dist/pipeline/__tests__/stages.test.js +460 -9
  202. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  203. package/dist/pipeline/index.d.ts +8 -2
  204. package/dist/pipeline/index.d.ts.map +1 -1
  205. package/dist/pipeline/index.js +5 -2
  206. package/dist/pipeline/index.js.map +1 -1
  207. package/dist/pipeline/orchestrator.d.ts +5 -4
  208. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  209. package/dist/pipeline/orchestrator.js +85 -17
  210. package/dist/pipeline/orchestrator.js.map +1 -1
  211. package/dist/pipeline/stages/code-review.d.ts +2 -2
  212. package/dist/pipeline/stages/code-review.d.ts.map +1 -1
  213. package/dist/pipeline/stages/code-review.js +5 -3
  214. package/dist/pipeline/stages/code-review.js.map +1 -1
  215. package/dist/pipeline/stages/deep-interview.d.ts +15 -0
  216. package/dist/pipeline/stages/deep-interview.d.ts.map +1 -0
  217. package/dist/pipeline/stages/deep-interview.js +32 -0
  218. package/dist/pipeline/stages/deep-interview.js.map +1 -0
  219. package/dist/pipeline/stages/ralph-verify.d.ts +5 -5
  220. package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
  221. package/dist/pipeline/stages/ralph-verify.js +2 -2
  222. package/dist/pipeline/stages/ralph-verify.js.map +1 -1
  223. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  224. package/dist/pipeline/stages/ralplan.js +41 -6
  225. package/dist/pipeline/stages/ralplan.js.map +1 -1
  226. package/dist/pipeline/stages/ultragoal.d.ts +19 -0
  227. package/dist/pipeline/stages/ultragoal.d.ts.map +1 -0
  228. package/dist/pipeline/stages/ultragoal.js +38 -0
  229. package/dist/pipeline/stages/ultragoal.js.map +1 -0
  230. package/dist/pipeline/stages/ultraqa.d.ts +30 -0
  231. package/dist/pipeline/stages/ultraqa.d.ts.map +1 -0
  232. package/dist/pipeline/stages/ultraqa.js +46 -0
  233. package/dist/pipeline/stages/ultraqa.js.map +1 -0
  234. package/dist/pipeline/types.d.ts +8 -6
  235. package/dist/pipeline/types.d.ts.map +1 -1
  236. package/dist/pipeline/types.js +2 -2
  237. package/dist/question/__tests__/ui.test.js +43 -10
  238. package/dist/question/__tests__/ui.test.js.map +1 -1
  239. package/dist/question/ui.d.ts +12 -0
  240. package/dist/question/ui.d.ts.map +1 -1
  241. package/dist/question/ui.js +83 -46
  242. package/dist/question/ui.js.map +1 -1
  243. package/dist/ralplan/__tests__/runtime.test.js +200 -10
  244. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  245. package/dist/ralplan/consensus-gate.d.ts +23 -0
  246. package/dist/ralplan/consensus-gate.d.ts.map +1 -0
  247. package/dist/ralplan/consensus-gate.js +212 -0
  248. package/dist/ralplan/consensus-gate.js.map +1 -0
  249. package/dist/ralplan/runtime.d.ts +25 -0
  250. package/dist/ralplan/runtime.d.ts.map +1 -1
  251. package/dist/ralplan/runtime.js +144 -8
  252. package/dist/ralplan/runtime.js.map +1 -1
  253. package/dist/scripts/__tests__/codex-native-hook.test.js +1358 -79
  254. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  255. package/dist/scripts/__tests__/docs-site-contract.test.d.ts +2 -0
  256. package/dist/scripts/__tests__/docs-site-contract.test.d.ts.map +1 -0
  257. package/dist/scripts/__tests__/docs-site-contract.test.js +42 -0
  258. package/dist/scripts/__tests__/docs-site-contract.test.js.map +1 -0
  259. package/dist/scripts/__tests__/notify-dispatcher.test.js +115 -2
  260. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
  261. package/dist/scripts/__tests__/run-test-files.test.js +57 -0
  262. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  263. package/dist/scripts/__tests__/smoke-packed-install.test.js +23 -1
  264. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  265. package/dist/scripts/__tests__/verify-native-agents.test.js +18 -3
  266. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  267. package/dist/scripts/cleanup-explore-harness.js +1 -0
  268. package/dist/scripts/cleanup-explore-harness.js.map +1 -1
  269. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  270. package/dist/scripts/codex-native-hook.js +372 -44
  271. package/dist/scripts/codex-native-hook.js.map +1 -1
  272. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  273. package/dist/scripts/codex-native-pre-post.js +9 -1
  274. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  275. package/dist/scripts/notify-dispatcher.js +188 -4
  276. package/dist/scripts/notify-dispatcher.js.map +1 -1
  277. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
  278. package/dist/scripts/notify-hook/process-runner.js +39 -17
  279. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  280. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  281. package/dist/scripts/notify-hook/team-dispatch.js +9 -5
  282. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  283. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +1 -1
  284. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  285. package/dist/scripts/notify-hook/team-tmux-guard.js +7 -1
  286. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  287. package/dist/scripts/run-test-files.js +13 -0
  288. package/dist/scripts/run-test-files.js.map +1 -1
  289. package/dist/scripts/smoke-packed-install.d.ts +3 -0
  290. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  291. package/dist/scripts/smoke-packed-install.js +99 -1
  292. package/dist/scripts/smoke-packed-install.js.map +1 -1
  293. package/dist/scripts/sync-plugin-mirror.js +2 -2
  294. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  295. package/dist/scripts/verify-native-agents.js +2 -2
  296. package/dist/scripts/verify-native-agents.js.map +1 -1
  297. package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts +2 -0
  298. package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts.map +1 -0
  299. package/dist/sidecar/__tests__/resource-leak-watch.test.js +38 -0
  300. package/dist/sidecar/__tests__/resource-leak-watch.test.js.map +1 -0
  301. package/dist/sidecar/index.d.ts +1 -1
  302. package/dist/sidecar/index.d.ts.map +1 -1
  303. package/dist/sidecar/index.js +29 -12
  304. package/dist/sidecar/index.js.map +1 -1
  305. package/dist/state/__tests__/operations-ralph-phase.test.js +88 -1
  306. package/dist/state/__tests__/operations-ralph-phase.test.js.map +1 -1
  307. package/dist/state/__tests__/workflow-transition.test.js +6 -0
  308. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  309. package/dist/state/operations.d.ts.map +1 -1
  310. package/dist/state/operations.js +11 -0
  311. package/dist/state/operations.js.map +1 -1
  312. package/dist/state/workflow-transition.d.ts +1 -1
  313. package/dist/state/workflow-transition.d.ts.map +1 -1
  314. package/dist/state/workflow-transition.js +7 -0
  315. package/dist/state/workflow-transition.js.map +1 -1
  316. package/dist/subagents/tracker.d.ts.map +1 -1
  317. package/dist/subagents/tracker.js +4 -3
  318. package/dist/subagents/tracker.js.map +1 -1
  319. package/dist/team/__tests__/runtime.test.js +36 -44
  320. package/dist/team/__tests__/runtime.test.js.map +1 -1
  321. package/dist/team/__tests__/tmux-session.test.js +163 -15
  322. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  323. package/dist/team/runtime.d.ts.map +1 -1
  324. package/dist/team/runtime.js +10 -20
  325. package/dist/team/runtime.js.map +1 -1
  326. package/dist/team/tmux-session.d.ts.map +1 -1
  327. package/dist/team/tmux-session.js +51 -21
  328. package/dist/team/tmux-session.js.map +1 -1
  329. package/dist/ultragoal/__tests__/artifacts.test.js +764 -10
  330. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  331. package/dist/ultragoal/__tests__/docs-contract.test.js +57 -1
  332. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  333. package/dist/ultragoal/__tests__/steering-fixtures.d.ts +68 -0
  334. package/dist/ultragoal/__tests__/steering-fixtures.d.ts.map +1 -0
  335. package/dist/ultragoal/__tests__/steering-fixtures.js +259 -0
  336. package/dist/ultragoal/__tests__/steering-fixtures.js.map +1 -0
  337. package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts +2 -0
  338. package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts.map +1 -0
  339. package/dist/ultragoal/__tests__/steering-fixtures.test.js +65 -0
  340. package/dist/ultragoal/__tests__/steering-fixtures.test.js.map +1 -0
  341. package/dist/ultragoal/artifacts.d.ts +97 -2
  342. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  343. package/dist/ultragoal/artifacts.js +837 -256
  344. package/dist/ultragoal/artifacts.js.map +1 -1
  345. package/dist/utils/__tests__/sleep-resource.test.d.ts +2 -0
  346. package/dist/utils/__tests__/sleep-resource.test.d.ts.map +1 -0
  347. package/dist/utils/__tests__/sleep-resource.test.js +39 -0
  348. package/dist/utils/__tests__/sleep-resource.test.js.map +1 -0
  349. package/dist/utils/sleep.d.ts.map +1 -1
  350. package/dist/utils/sleep.js +17 -6
  351. package/dist/utils/sleep.js.map +1 -1
  352. package/package.json +2 -1
  353. package/plugins/oh-my-codex/.codex-plugin/plugin.json +4 -3
  354. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +56 -0
  355. package/plugins/oh-my-codex/hooks/hooks.json +77 -0
  356. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +92 -50
  357. package/plugins/oh-my-codex/skills/autoresearch/SKILL.md +4 -0
  358. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +1 -1
  359. package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +1 -1
  360. package/plugins/oh-my-codex/skills/cancel/SKILL.md +2 -2
  361. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +8 -8
  362. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
  363. package/plugins/oh-my-codex/skills/pipeline/SKILL.md +23 -12
  364. package/plugins/oh-my-codex/skills/plan/SKILL.md +8 -8
  365. package/plugins/oh-my-codex/skills/prometheus-strict/README.md +35 -0
  366. package/plugins/oh-my-codex/skills/prometheus-strict/SKILL.md +219 -0
  367. package/plugins/oh-my-codex/skills/ralph/SKILL.md +7 -0
  368. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +22 -7
  369. package/plugins/oh-my-codex/skills/team/SKILL.md +1 -1
  370. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +38 -4
  371. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +1 -1
  372. package/prompts/planner.md +1 -1
  373. package/prompts/prometheus-strict-metis.md +274 -0
  374. package/prompts/prometheus-strict-momus.md +82 -0
  375. package/prompts/prometheus-strict-oracle.md +107 -0
  376. package/prompts/researcher.md +22 -3
  377. package/skills/autopilot/SKILL.md +92 -50
  378. package/skills/autoresearch/SKILL.md +4 -0
  379. package/skills/autoresearch-goal/SKILL.md +1 -1
  380. package/skills/best-practice-research/SKILL.md +1 -1
  381. package/skills/cancel/SKILL.md +2 -2
  382. package/skills/deep-interview/SKILL.md +8 -8
  383. package/skills/omx-setup/SKILL.md +1 -1
  384. package/skills/pipeline/SKILL.md +23 -12
  385. package/skills/plan/SKILL.md +8 -8
  386. package/skills/prometheus-strict/README.md +35 -0
  387. package/skills/prometheus-strict/SKILL.md +219 -0
  388. package/skills/ralph/SKILL.md +7 -0
  389. package/skills/ralplan/SKILL.md +22 -7
  390. package/skills/team/SKILL.md +1 -1
  391. package/skills/ultragoal/SKILL.md +38 -4
  392. package/skills/ultrawork/SKILL.md +1 -1
  393. package/src/scripts/__tests__/codex-native-hook.test.ts +1757 -210
  394. package/src/scripts/__tests__/docs-site-contract.test.ts +47 -0
  395. package/src/scripts/__tests__/notify-dispatcher.test.ts +132 -3
  396. package/src/scripts/__tests__/run-test-files.test.ts +67 -0
  397. package/src/scripts/__tests__/smoke-packed-install.test.ts +31 -0
  398. package/src/scripts/__tests__/verify-native-agents.test.ts +23 -3
  399. package/src/scripts/cleanup-explore-harness.ts +1 -0
  400. package/src/scripts/codex-native-hook.ts +393 -40
  401. package/src/scripts/codex-native-pre-post.ts +16 -1
  402. package/src/scripts/notify-dispatcher.ts +202 -4
  403. package/src/scripts/notify-hook/process-runner.ts +40 -16
  404. package/src/scripts/notify-hook/team-dispatch.ts +9 -5
  405. package/src/scripts/notify-hook/team-tmux-guard.ts +7 -0
  406. package/src/scripts/run-test-files.ts +13 -0
  407. package/src/scripts/smoke-packed-install.ts +105 -0
  408. package/src/scripts/sync-plugin-mirror.ts +3 -3
  409. package/src/scripts/verify-native-agents.ts +2 -2
  410. package/templates/catalog-manifest.json +22 -0
@@ -194,6 +194,11 @@ describe('keyword detector team compatibility', () => {
194
194
  assert.equal(detectPrimaryKeyword('cleanup stale deep-interview state after session clear'), null);
195
195
  assert.equal(detectPrimaryKeyword('remove the stale deep interview lock from .omx/state'), null);
196
196
  });
197
+ it('does not trigger deep-interview from casual discussion mentions', () => {
198
+ assert.equal(detectPrimaryKeyword('the deep interview report is useful context for the next plan'), null);
199
+ assert.equal(detectPrimaryKeyword('we already did a deep interview and should not reactivate it'), null);
200
+ assert.equal(detectPrimaryKeyword('this interview transcript says implementation is ready'), null);
201
+ });
197
202
  it('maps "gather requirements" to deep-interview skill', () => {
198
203
  const match = detectPrimaryKeyword('let us gather requirements first');
199
204
  assert.ok(match);
@@ -285,6 +290,13 @@ describe('explicit skill-name invocation requirement', () => {
285
290
  it('does not trigger ralplan from bare skill-name usage', () => {
286
291
  assert.equal(detectPrimaryKeyword('please do ralplan first'), null);
287
292
  });
293
+ it('detects explicit prometheus-strict invocation only', () => {
294
+ const match = detectPrimaryKeyword('please run $prometheus-strict before implementation');
295
+ assert.ok(match);
296
+ assert.equal(match.skill, 'prometheus-strict');
297
+ assert.equal(match.keyword.toLowerCase(), '$prometheus-strict');
298
+ assert.equal(detectPrimaryKeyword('please use prometheus-strict planning here'), null);
299
+ });
288
300
  });
289
301
  describe('keyword registry coverage', () => {
290
302
  it('includes key team aliases in runtime keyword registry', () => {
@@ -304,6 +316,7 @@ describe('keyword registry coverage', () => {
304
316
  assert.ok(registryKeywords.has('wiki lint'));
305
317
  assert.ok(registryKeywords.has('$autoresearch'));
306
318
  assert.ok(registryKeywords.has('$ultragoal'));
319
+ assert.ok(registryKeywords.has('$prometheus-strict'));
307
320
  assert.ok(registryKeywords.has('ultragoal'));
308
321
  });
309
322
  });
@@ -398,7 +411,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
398
411
  await rm(root, { recursive: true, force: true });
399
412
  }
400
413
  });
401
- it('writes skill-active-state.json with ralplan phase when autopilot keyword activates', async () => {
414
+ it('writes skill-active-state.json with deep-interview phase when autopilot keyword activates', async () => {
402
415
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-'));
403
416
  const stateDir = join(cwd, '.omx', 'state');
404
417
  try {
@@ -413,11 +426,11 @@ describe('keyword detector skill-active-state lifecycle', () => {
413
426
  });
414
427
  assert.ok(result);
415
428
  assert.equal(result.skill, 'autopilot');
416
- assert.equal(result.phase, 'ralplan');
429
+ assert.equal(result.phase, 'deep-interview');
417
430
  assert.equal(result.active, true);
418
431
  assert.deepEqual(result.active_skills, [{
419
432
  skill: 'autopilot',
420
- phase: 'ralplan',
433
+ phase: 'deep-interview',
421
434
  active: true,
422
435
  activated_at: '2026-02-25T00:00:00.000Z',
423
436
  updated_at: '2026-02-25T00:00:00.000Z',
@@ -434,13 +447,34 @@ describe('keyword detector skill-active-state lifecycle', () => {
434
447
  const modeState = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-1', 'autopilot-state.json'), 'utf-8'));
435
448
  assert.equal(modeState.mode, 'autopilot');
436
449
  assert.equal(modeState.active, true);
437
- assert.equal(modeState.current_phase, 'ralplan');
450
+ assert.equal(modeState.current_phase, 'deep-interview');
438
451
  assert.equal(modeState.iteration, 1);
439
452
  assert.equal(modeState.review_cycle, 0);
440
453
  assert.equal(modeState.max_iterations, 10);
441
- assert.deepEqual(modeState.state.phase_cycle, ['ralplan', 'ralph', 'code-review']);
442
- assert.deepEqual(modeState.state.handoff_artifacts, { ralplan: null, ralph: null, code_review: null });
454
+ assert.deepEqual(modeState.state.phase_cycle, ['deep-interview', 'ralplan', 'ultragoal', 'code-review', 'ultraqa']);
455
+ assert.deepEqual(modeState.state.deep_interview_gate, {
456
+ status: 'required',
457
+ skip_reason: null,
458
+ rationale: 'Autopilot starts at the deep-interview gate by default; clear bounded tasks may skip only with an explicit persisted skip reason.',
459
+ });
460
+ assert.deepEqual(modeState.state.handoff_artifacts, {
461
+ deep_interview: null,
462
+ ralplan: null,
463
+ ralplan_consensus_gate: {
464
+ required: true,
465
+ sequence: ['architect-review', 'critic-review'],
466
+ planning_artifacts_are_not_consensus: true,
467
+ required_review_roles: ['architect', 'critic'],
468
+ ralplan_architect_review: null,
469
+ ralplan_critic_review: null,
470
+ complete: false,
471
+ },
472
+ ultragoal: null,
473
+ code_review: null,
474
+ ultraqa: null,
475
+ });
443
476
  assert.equal(modeState.state.review_verdict, null);
477
+ assert.equal(modeState.state.qa_verdict, null);
444
478
  assert.equal(modeState.state.return_to_ralplan_reason, null);
445
479
  }
446
480
  finally {
@@ -791,18 +825,56 @@ describe('keyword detector skill-active-state lifecycle', () => {
791
825
  }, null, 2));
792
826
  const result = await recordSkillActivation({
793
827
  stateDir,
794
- text: '$ralplan implement the approved contract',
828
+ text: '$ultragoal turn the clarified spec into goals',
795
829
  sessionId: 'sess-handoff',
796
830
  nowIso: '2026-04-10T00:00:00.000Z',
797
831
  });
798
832
  assert.equal(result?.transition_error, undefined);
799
- assert.equal(result?.transition_message, 'mode transiting: deep-interview -> ralplan');
833
+ assert.equal(result?.skill, 'ultragoal');
834
+ assert.equal(result?.initialized_mode, 'ultragoal');
835
+ assert.equal(result?.initialized_state_path, '.omx/state/sessions/sess-handoff/ultragoal-state.json');
836
+ assert.equal(result?.transition_message, 'mode transiting: deep-interview -> ultragoal');
800
837
  const completed = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-handoff', 'deep-interview-state.json'), 'utf-8'));
801
838
  assert.equal(completed.active, false);
802
839
  assert.equal(completed.current_phase, 'completed');
803
840
  assert.equal(completed.question_enforcement?.status, 'cleared');
804
841
  assert.equal(completed.question_enforcement?.clear_reason, 'handoff');
805
842
  assert.ok(completed.question_enforcement?.cleared_at);
843
+ const ultragoal = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-handoff', 'ultragoal-state.json'), 'utf-8'));
844
+ assert.equal(ultragoal.active, true);
845
+ assert.equal(ultragoal.mode, 'ultragoal');
846
+ assert.equal(ultragoal.current_phase, 'planning');
847
+ }
848
+ finally {
849
+ await rm(cwd, { recursive: true, force: true });
850
+ }
851
+ });
852
+ it('keeps ralplan as an allowlisted deep-interview forward handoff', async () => {
853
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-ralplan-handoff-'));
854
+ const stateDir = join(cwd, '.omx', 'state');
855
+ try {
856
+ await mkdir(join(stateDir, 'sessions', 'sess-ralplan-handoff'), { recursive: true });
857
+ await writeFile(join(stateDir, 'sessions', 'sess-ralplan-handoff', SKILL_ACTIVE_STATE_FILE), JSON.stringify({
858
+ version: 1,
859
+ active: true,
860
+ skill: 'deep-interview',
861
+ phase: 'planning',
862
+ session_id: 'sess-ralplan-handoff',
863
+ active_skills: [{ skill: 'deep-interview', phase: 'planning', active: true, session_id: 'sess-ralplan-handoff' }],
864
+ }, null, 2));
865
+ await writeFile(join(stateDir, 'sessions', 'sess-ralplan-handoff', 'deep-interview-state.json'), JSON.stringify({ active: true, mode: 'deep-interview', current_phase: 'intent-first' }, null, 2));
866
+ const result = await recordSkillActivation({
867
+ stateDir,
868
+ text: '$ralplan implement the approved contract',
869
+ sessionId: 'sess-ralplan-handoff',
870
+ nowIso: '2026-04-10T00:00:00.000Z',
871
+ });
872
+ assert.equal(result?.transition_error, undefined);
873
+ assert.equal(result?.skill, 'ralplan');
874
+ assert.equal(result?.transition_message, 'mode transiting: deep-interview -> ralplan');
875
+ const completed = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-ralplan-handoff', 'deep-interview-state.json'), 'utf-8'));
876
+ assert.equal(completed.active, false);
877
+ assert.equal(completed.current_phase, 'completed');
806
878
  }
807
879
  finally {
808
880
  await rm(cwd, { recursive: true, force: true });
@@ -1150,7 +1222,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
1150
1222
  await rm(cwd, { recursive: true, force: true });
1151
1223
  }
1152
1224
  });
1153
- it('records ultragoal as a prompt skill without seeding unrelated mode state', async () => {
1225
+ it('records ultragoal as a prompt skill with first-class mode state', async () => {
1154
1226
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-ultragoal-'));
1155
1227
  const stateDir = join(cwd, '.omx', 'state');
1156
1228
  try {
@@ -1162,9 +1234,12 @@ describe('keyword detector skill-active-state lifecycle', () => {
1162
1234
  assert.ok(result);
1163
1235
  assert.equal(result.skill, 'ultragoal');
1164
1236
  assert.equal(result.keyword, '$ultragoal');
1165
- assert.equal(result.initialized_mode, undefined);
1166
- assert.equal(result.initialized_state_path, undefined);
1167
- assert.equal(existsSync(join(stateDir, 'ultragoal-state.json')), false);
1237
+ assert.equal(result.initialized_mode, 'ultragoal');
1238
+ assert.equal(result.initialized_state_path, '.omx/state/ultragoal-state.json');
1239
+ const modeState = JSON.parse(await readFile(join(stateDir, 'ultragoal-state.json'), 'utf-8'));
1240
+ assert.equal(modeState.active, true);
1241
+ assert.equal(modeState.mode, 'ultragoal');
1242
+ assert.equal(modeState.current_phase, 'planning');
1168
1243
  }
1169
1244
  finally {
1170
1245
  await rm(cwd, { recursive: true, force: true });
@@ -1695,7 +1770,7 @@ describe('isUnderspecifiedForExecution', () => {
1695
1770
  });
1696
1771
  });
1697
1772
  describe('applyRalplanGate', () => {
1698
- it('does not re-enter ralplan for a short approved team follow-up', async () => {
1773
+ it('gates short team follow-up when only PRD/test-spec artifacts exist', async () => {
1699
1774
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-'));
1700
1775
  try {
1701
1776
  const plansDir = join(cwd, '.omx', 'plans');
@@ -1703,20 +1778,32 @@ describe('applyRalplanGate', () => {
1703
1778
  await writeFile(join(plansDir, 'prd-issue-831.md'), '# Approved plan\n\nLaunch hint: omx team 3:executor "Execute approved issue 831 plan"\n');
1704
1779
  await writeFile(join(plansDir, 'test-spec-issue-831.md'), '# Test spec\n');
1705
1780
  const result = applyRalplanGate(['team'], 'team', { cwd });
1706
- assert.equal(result.gateApplied, false);
1707
- assert.deepEqual(result.keywords, ['team']);
1781
+ assert.equal(result.gateApplied, true);
1782
+ assert.deepEqual(result.keywords, ['ralplan']);
1708
1783
  }
1709
1784
  finally {
1710
1785
  await rm(cwd, { recursive: true, force: true });
1711
1786
  }
1712
1787
  });
1713
- it('does not re-enter ralplan for a short approved Korean team follow-up', async () => {
1788
+ it('does not re-enter ralplan for a short approved team follow-up with durable consensus', async () => {
1714
1789
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-ko-'));
1715
1790
  try {
1716
1791
  const plansDir = join(cwd, '.omx', 'plans');
1792
+ const stateDir = join(cwd, '.omx', 'state');
1717
1793
  await mkdir(plansDir, { recursive: true });
1794
+ await mkdir(stateDir, { recursive: true });
1718
1795
  await writeFile(join(plansDir, 'prd-issue-831.md'), '# Approved plan\n\nLaunch hint: omx team 3:executor "Execute approved issue 831 plan"\n');
1719
1796
  await writeFile(join(plansDir, 'test-spec-issue-831.md'), '# Test spec\n');
1797
+ await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
1798
+ current_phase: 'complete',
1799
+ planning_complete: true,
1800
+ ralplan_consensus_gate: {
1801
+ complete: true,
1802
+ sequence: ['architect-review', 'critic-review'],
1803
+ ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
1804
+ ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
1805
+ },
1806
+ }));
1720
1807
  const result = applyRalplanGate(['team'], 'team으로 해줘', { cwd });
1721
1808
  assert.equal(result.gateApplied, false);
1722
1809
  assert.deepEqual(result.keywords, ['team']);
@@ -1725,13 +1812,25 @@ describe('applyRalplanGate', () => {
1725
1812
  await rm(cwd, { recursive: true, force: true });
1726
1813
  }
1727
1814
  });
1728
- it('does not re-enter ralplan for a short approved ralph follow-up', async () => {
1815
+ it('does not re-enter ralplan for a short approved ralph follow-up with durable consensus', async () => {
1729
1816
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-ralph-'));
1730
1817
  try {
1731
1818
  const plansDir = join(cwd, '.omx', 'plans');
1819
+ const stateDir = join(cwd, '.omx', 'state');
1732
1820
  await mkdir(plansDir, { recursive: true });
1821
+ await mkdir(stateDir, { recursive: true });
1733
1822
  await writeFile(join(plansDir, 'prd-issue-832.md'), '# Approved plan\n\nLaunch hint: omx ralph "Execute approved issue 832 plan"\n');
1734
1823
  await writeFile(join(plansDir, 'test-spec-issue-832.md'), '# Test spec\n');
1824
+ await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
1825
+ current_phase: 'complete',
1826
+ planning_complete: true,
1827
+ ralplan_consensus_gate: {
1828
+ complete: true,
1829
+ sequence: ['architect-review', 'critic-review'],
1830
+ ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
1831
+ ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
1832
+ },
1833
+ }));
1735
1834
  const result = applyRalplanGate(['ralph'], 'ralph please', { cwd, priorSkill: 'ralplan' });
1736
1835
  assert.equal(result.gateApplied, false);
1737
1836
  assert.deepEqual(result.keywords, ['ralph']);
@@ -1740,6 +1839,63 @@ describe('applyRalplanGate', () => {
1740
1839
  await rm(cwd, { recursive: true, force: true });
1741
1840
  }
1742
1841
  });
1842
+ it('ignores ambient OMX_ROOT consensus state for local PRD/test-spec-only follow-up gating', async () => {
1843
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-local-'));
1844
+ const ambientRoot = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-ambient-'));
1845
+ const previousOmxRoot = process.env.OMX_ROOT;
1846
+ try {
1847
+ const plansDir = join(cwd, '.omx', 'plans');
1848
+ await mkdir(plansDir, { recursive: true });
1849
+ await writeFile(join(plansDir, 'prd-local.md'), '# Plan\n');
1850
+ await writeFile(join(plansDir, 'test-spec-local.md'), '# Test spec\n');
1851
+ const ambientStateDir = join(ambientRoot, '.omx', 'state');
1852
+ await mkdir(ambientStateDir, { recursive: true });
1853
+ await writeFile(join(ambientStateDir, 'ralplan-state.json'), JSON.stringify({
1854
+ current_phase: 'complete',
1855
+ planning_complete: true,
1856
+ ralplan_consensus_gate: {
1857
+ complete: true,
1858
+ ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
1859
+ ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
1860
+ },
1861
+ }));
1862
+ process.env.OMX_ROOT = ambientRoot;
1863
+ const result = applyRalplanGate(['team'], 'team', { cwd });
1864
+ assert.equal(result.gateApplied, true);
1865
+ assert.deepEqual(result.keywords, ['ralplan']);
1866
+ }
1867
+ finally {
1868
+ if (previousOmxRoot === undefined)
1869
+ delete process.env.OMX_ROOT;
1870
+ else
1871
+ process.env.OMX_ROOT = previousOmxRoot;
1872
+ await rm(cwd, { recursive: true, force: true });
1873
+ await rm(ambientRoot, { recursive: true, force: true });
1874
+ }
1875
+ });
1876
+ it('gates short follow-up when local state only has latest verdict fields', async () => {
1877
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-latest-only-'));
1878
+ try {
1879
+ const plansDir = join(cwd, '.omx', 'plans');
1880
+ const stateDir = join(cwd, '.omx', 'state');
1881
+ await mkdir(plansDir, { recursive: true });
1882
+ await mkdir(stateDir, { recursive: true });
1883
+ await writeFile(join(plansDir, 'prd-local.md'), '# Plan\n\nLaunch hint: omx team 3:executor "Execute approved local plan"\n');
1884
+ await writeFile(join(plansDir, 'test-spec-local.md'), '# Test spec\n');
1885
+ await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
1886
+ current_phase: 'complete',
1887
+ planning_complete: true,
1888
+ latest_architect_verdict: 'approve',
1889
+ latest_critic_verdict: 'approve',
1890
+ }));
1891
+ const result = applyRalplanGate(['team'], 'team', { cwd });
1892
+ assert.equal(result.gateApplied, true);
1893
+ assert.deepEqual(result.keywords, ['ralplan']);
1894
+ }
1895
+ finally {
1896
+ await rm(cwd, { recursive: true, force: true });
1897
+ }
1898
+ });
1743
1899
  it('redirects underspecified execution keywords to ralplan', () => {
1744
1900
  const result = applyRalplanGate(['ralph'], 'ralph fix this');
1745
1901
  assert.equal(result.gateApplied, true);