oh-my-codex 0.18.13 → 0.18.15

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 (360) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +41 -18
  4. package/dist/agents/__tests__/native-config.test.js +62 -0
  5. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  6. package/dist/agents/native-config.d.ts.map +1 -1
  7. package/dist/agents/native-config.js +15 -2
  8. package/dist/agents/native-config.js.map +1 -1
  9. package/dist/autopilot/__tests__/fsm.test.js +7 -0
  10. package/dist/autopilot/__tests__/fsm.test.js.map +1 -1
  11. package/dist/autopilot/__tests__/planner-routing.test.d.ts +2 -0
  12. package/dist/autopilot/__tests__/planner-routing.test.d.ts.map +1 -0
  13. package/dist/autopilot/__tests__/planner-routing.test.js +74 -0
  14. package/dist/autopilot/__tests__/planner-routing.test.js.map +1 -0
  15. package/dist/autopilot/__tests__/ralplan-gate.test.js +315 -0
  16. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  17. package/dist/autopilot/completion-gate.js +1 -1
  18. package/dist/autopilot/completion-gate.js.map +1 -1
  19. package/dist/autopilot/fsm.d.ts +2 -2
  20. package/dist/autopilot/fsm.d.ts.map +1 -1
  21. package/dist/autopilot/fsm.js +3 -0
  22. package/dist/autopilot/fsm.js.map +1 -1
  23. package/dist/autopilot/planner-routing.d.ts +21 -0
  24. package/dist/autopilot/planner-routing.d.ts.map +1 -0
  25. package/dist/autopilot/planner-routing.js +59 -0
  26. package/dist/autopilot/planner-routing.js.map +1 -0
  27. package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
  28. package/dist/autopilot/ralplan-gate.js +30 -0
  29. package/dist/autopilot/ralplan-gate.js.map +1 -1
  30. package/dist/autoresearch/goal.d.ts.map +1 -1
  31. package/dist/autoresearch/goal.js +10 -1
  32. package/dist/autoresearch/goal.js.map +1 -1
  33. package/dist/cli/__tests__/autoresearch-goal.test.js +33 -0
  34. package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -1
  35. package/dist/cli/__tests__/autoresearch-guided.test.js +3 -0
  36. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
  37. package/dist/cli/__tests__/codex-plugin-layout.test.js +30 -0
  38. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  39. package/dist/cli/__tests__/doctor-artifact-ownership.test.d.ts +2 -0
  40. package/dist/cli/__tests__/doctor-artifact-ownership.test.d.ts.map +1 -0
  41. package/dist/cli/__tests__/doctor-artifact-ownership.test.js +158 -0
  42. package/dist/cli/__tests__/doctor-artifact-ownership.test.js.map +1 -0
  43. package/dist/cli/__tests__/doctor-explore-deprecated.test.d.ts +2 -0
  44. package/dist/cli/__tests__/doctor-explore-deprecated.test.d.ts.map +1 -0
  45. package/dist/cli/__tests__/doctor-explore-deprecated.test.js +33 -0
  46. package/dist/cli/__tests__/doctor-explore-deprecated.test.js.map +1 -0
  47. package/dist/cli/__tests__/doctor-spark-routing.test.js +13 -0
  48. package/dist/cli/__tests__/doctor-spark-routing.test.js.map +1 -1
  49. package/dist/cli/__tests__/doctor-warning-copy.test.js +132 -2
  50. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  51. package/dist/cli/__tests__/index.test.js +5 -0
  52. package/dist/cli/__tests__/index.test.js.map +1 -1
  53. package/dist/cli/__tests__/mcp-parity.test.js +40 -0
  54. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  55. package/dist/cli/__tests__/nested-help-routing.test.js +4 -0
  56. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
  57. package/dist/cli/__tests__/package-bin-contract.test.js +7 -1
  58. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  59. package/dist/cli/__tests__/performance-goal.test.js +22 -0
  60. package/dist/cli/__tests__/performance-goal.test.js.map +1 -1
  61. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.d.ts +2 -0
  62. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.d.ts.map +1 -0
  63. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js +64 -0
  64. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js.map +1 -0
  65. package/dist/cli/__tests__/resume.test.js +96 -0
  66. package/dist/cli/__tests__/resume.test.js.map +1 -1
  67. package/dist/cli/__tests__/session-scoped-runtime.test.js +162 -0
  68. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  69. package/dist/cli/__tests__/session-search.test.js +36 -0
  70. package/dist/cli/__tests__/session-search.test.js.map +1 -1
  71. package/dist/cli/__tests__/setup-agents-overwrite.test.js +70 -1
  72. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  73. package/dist/cli/__tests__/setup-install-mode.test.js +33 -0
  74. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  75. package/dist/cli/__tests__/team.test.js +17 -3
  76. package/dist/cli/__tests__/team.test.js.map +1 -1
  77. package/dist/cli/__tests__/ultragoal.test.js +37 -0
  78. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  79. package/dist/cli/__tests__/update.test.js +81 -2
  80. package/dist/cli/__tests__/update.test.js.map +1 -1
  81. package/dist/cli/__tests__/url.test.d.ts +2 -0
  82. package/dist/cli/__tests__/url.test.d.ts.map +1 -0
  83. package/dist/cli/__tests__/url.test.js +82 -0
  84. package/dist/cli/__tests__/url.test.js.map +1 -0
  85. package/dist/cli/autoresearch-goal.d.ts.map +1 -1
  86. package/dist/cli/autoresearch-goal.js +2 -1
  87. package/dist/cli/autoresearch-goal.js.map +1 -1
  88. package/dist/cli/autoresearch-intake.d.ts.map +1 -1
  89. package/dist/cli/autoresearch-intake.js +2 -0
  90. package/dist/cli/autoresearch-intake.js.map +1 -1
  91. package/dist/cli/doctor.d.ts +39 -1
  92. package/dist/cli/doctor.d.ts.map +1 -1
  93. package/dist/cli/doctor.js +460 -40
  94. package/dist/cli/doctor.js.map +1 -1
  95. package/dist/cli/index.d.ts +2 -2
  96. package/dist/cli/index.d.ts.map +1 -1
  97. package/dist/cli/index.js +71 -4
  98. package/dist/cli/index.js.map +1 -1
  99. package/dist/cli/performance-goal.d.ts.map +1 -1
  100. package/dist/cli/performance-goal.js +4 -2
  101. package/dist/cli/performance-goal.js.map +1 -1
  102. package/dist/cli/plugin-marketplace.d.ts +1 -0
  103. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  104. package/dist/cli/plugin-marketplace.js +88 -67
  105. package/dist/cli/plugin-marketplace.js.map +1 -1
  106. package/dist/cli/project-runtime-codex-homes.d.ts +2 -0
  107. package/dist/cli/project-runtime-codex-homes.d.ts.map +1 -1
  108. package/dist/cli/project-runtime-codex-homes.js +112 -5
  109. package/dist/cli/project-runtime-codex-homes.js.map +1 -1
  110. package/dist/cli/setup.d.ts.map +1 -1
  111. package/dist/cli/setup.js +15 -6
  112. package/dist/cli/setup.js.map +1 -1
  113. package/dist/cli/ultragoal.d.ts.map +1 -1
  114. package/dist/cli/ultragoal.js +5 -1
  115. package/dist/cli/ultragoal.js.map +1 -1
  116. package/dist/cli/update.d.ts.map +1 -1
  117. package/dist/cli/update.js +23 -4
  118. package/dist/cli/update.js.map +1 -1
  119. package/dist/cli/url.d.ts +8 -0
  120. package/dist/cli/url.d.ts.map +1 -0
  121. package/dist/cli/url.js +69 -0
  122. package/dist/cli/url.js.map +1 -0
  123. package/dist/config/__tests__/codex-hooks.test.js +20 -4
  124. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  125. package/dist/config/__tests__/models.test.js +21 -1
  126. package/dist/config/__tests__/models.test.js.map +1 -1
  127. package/dist/config/codex-hooks.d.ts.map +1 -1
  128. package/dist/config/codex-hooks.js +1 -4
  129. package/dist/config/codex-hooks.js.map +1 -1
  130. package/dist/config/models.d.ts +5 -0
  131. package/dist/config/models.d.ts.map +1 -1
  132. package/dist/config/models.js +23 -0
  133. package/dist/config/models.js.map +1 -1
  134. package/dist/goal-workflows/codex-goal-snapshot.d.ts +2 -0
  135. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  136. package/dist/goal-workflows/codex-goal-snapshot.js +10 -0
  137. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  138. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +7 -0
  139. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  140. package/dist/hooks/__tests__/keyword-detector.test.js +46 -0
  141. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  142. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +100 -0
  143. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  144. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +75 -0
  145. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  146. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +225 -0
  147. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  148. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +75 -0
  149. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  150. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +563 -0
  151. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  152. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +187 -12
  153. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  154. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +225 -0
  155. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  156. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
  157. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  158. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +75 -0
  159. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  160. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  161. package/dist/hooks/keyword-detector.js +4 -0
  162. package/dist/hooks/keyword-detector.js.map +1 -1
  163. package/dist/hud/__tests__/reconcile.test.js +137 -2
  164. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  165. package/dist/hud/__tests__/state.test.js +107 -0
  166. package/dist/hud/__tests__/state.test.js.map +1 -1
  167. package/dist/hud/__tests__/tmux.test.js +17 -0
  168. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  169. package/dist/hud/reconcile.d.ts.map +1 -1
  170. package/dist/hud/reconcile.js +21 -7
  171. package/dist/hud/reconcile.js.map +1 -1
  172. package/dist/hud/render.d.ts.map +1 -1
  173. package/dist/hud/render.js +9 -0
  174. package/dist/hud/render.js.map +1 -1
  175. package/dist/hud/state.d.ts.map +1 -1
  176. package/dist/hud/state.js +43 -5
  177. package/dist/hud/state.js.map +1 -1
  178. package/dist/hud/types.d.ts +6 -0
  179. package/dist/hud/types.d.ts.map +1 -1
  180. package/dist/hud/types.js.map +1 -1
  181. package/dist/index.d.ts +1 -0
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +1 -0
  184. package/dist/index.js.map +1 -1
  185. package/dist/mcp/__tests__/bootstrap.test.js +24 -1
  186. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  187. package/dist/mcp/__tests__/state-paths.test.js +53 -0
  188. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  189. package/dist/mcp/bootstrap.d.ts +2 -0
  190. package/dist/mcp/bootstrap.d.ts.map +1 -1
  191. package/dist/mcp/bootstrap.js +32 -6
  192. package/dist/mcp/bootstrap.js.map +1 -1
  193. package/dist/mcp/state-paths.d.ts.map +1 -1
  194. package/dist/mcp/state-paths.js +11 -5
  195. package/dist/mcp/state-paths.js.map +1 -1
  196. package/dist/modes/__tests__/base-autopilot-gates.test.js +48 -0
  197. package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
  198. package/dist/modes/base.d.ts.map +1 -1
  199. package/dist/modes/base.js +1 -0
  200. package/dist/modes/base.js.map +1 -1
  201. package/dist/notifications/__tests__/http-client.test.js +9 -0
  202. package/dist/notifications/__tests__/http-client.test.js.map +1 -1
  203. package/dist/notifications/http-client.js +1 -1
  204. package/dist/notifications/http-client.js.map +1 -1
  205. package/dist/performance-goal/artifacts.d.ts.map +1 -1
  206. package/dist/performance-goal/artifacts.js +10 -1
  207. package/dist/performance-goal/artifacts.js.map +1 -1
  208. package/dist/ralplan/__tests__/consensus-gate.test.js +112 -0
  209. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  210. package/dist/ralplan/consensus-gate.d.ts +23 -0
  211. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  212. package/dist/ralplan/consensus-gate.js +133 -21
  213. package/dist/ralplan/consensus-gate.js.map +1 -1
  214. package/dist/scripts/__tests__/codex-native-hook.test.js +1251 -13
  215. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  216. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  217. package/dist/scripts/codex-native-hook.js +601 -24
  218. package/dist/scripts/codex-native-hook.js.map +1 -1
  219. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +1 -0
  220. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  221. package/dist/scripts/notify-hook/team-leader-nudge.js +279 -86
  222. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  223. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  224. package/dist/scripts/notify-hook/team-tmux-guard.js +87 -8
  225. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  226. package/dist/scripts/notify-hook/tmux-injection.js +1 -1
  227. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  228. package/dist/scripts/run-compiled-ci.d.ts +2 -0
  229. package/dist/scripts/run-compiled-ci.d.ts.map +1 -0
  230. package/dist/scripts/run-compiled-ci.js +77 -0
  231. package/dist/scripts/run-compiled-ci.js.map +1 -0
  232. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  233. package/dist/scripts/sync-plugin-mirror.js +1 -0
  234. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  235. package/dist/session-history/search.d.ts.map +1 -1
  236. package/dist/session-history/search.js +24 -9
  237. package/dist/session-history/search.js.map +1 -1
  238. package/dist/sidecar/__tests__/args.test.d.ts +2 -0
  239. package/dist/sidecar/__tests__/args.test.d.ts.map +1 -0
  240. package/dist/sidecar/__tests__/args.test.js +18 -0
  241. package/dist/sidecar/__tests__/args.test.js.map +1 -0
  242. package/dist/sidecar/index.d.ts.map +1 -1
  243. package/dist/sidecar/index.js +12 -4
  244. package/dist/sidecar/index.js.map +1 -1
  245. package/dist/state/__tests__/operations.test.js +107 -3
  246. package/dist/state/__tests__/operations.test.js.map +1 -1
  247. package/dist/state/operations.d.ts.map +1 -1
  248. package/dist/state/operations.js +57 -2
  249. package/dist/state/operations.js.map +1 -1
  250. package/dist/team/__tests__/delivery-e2e-smoke.test.js +22 -1
  251. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  252. package/dist/team/__tests__/model-contract.test.js +57 -1
  253. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  254. package/dist/team/__tests__/runtime.test.js +1468 -110
  255. package/dist/team/__tests__/runtime.test.js.map +1 -1
  256. package/dist/team/__tests__/scaling.test.js +63 -0
  257. package/dist/team/__tests__/scaling.test.js.map +1 -1
  258. package/dist/team/__tests__/state.test.js +24 -1
  259. package/dist/team/__tests__/state.test.js.map +1 -1
  260. package/dist/team/__tests__/tmux-session.test.js +512 -0
  261. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  262. package/dist/team/__tests__/worker-bootstrap.test.js +42 -9
  263. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  264. package/dist/team/model-contract.d.ts +16 -0
  265. package/dist/team/model-contract.d.ts.map +1 -1
  266. package/dist/team/model-contract.js +41 -1
  267. package/dist/team/model-contract.js.map +1 -1
  268. package/dist/team/runtime.d.ts.map +1 -1
  269. package/dist/team/runtime.js +116 -30
  270. package/dist/team/runtime.js.map +1 -1
  271. package/dist/team/scaling.d.ts.map +1 -1
  272. package/dist/team/scaling.js +9 -1
  273. package/dist/team/scaling.js.map +1 -1
  274. package/dist/team/state/types.d.ts +2 -0
  275. package/dist/team/state/types.d.ts.map +1 -1
  276. package/dist/team/state/types.js.map +1 -1
  277. package/dist/team/state.d.ts +3 -0
  278. package/dist/team/state.d.ts.map +1 -1
  279. package/dist/team/state.js +20 -0
  280. package/dist/team/state.js.map +1 -1
  281. package/dist/team/tmux-session.d.ts +38 -3
  282. package/dist/team/tmux-session.d.ts.map +1 -1
  283. package/dist/team/tmux-session.js +275 -36
  284. package/dist/team/tmux-session.js.map +1 -1
  285. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  286. package/dist/team/worker-bootstrap.js +26 -1
  287. package/dist/team/worker-bootstrap.js.map +1 -1
  288. package/dist/ultragoal/__tests__/artifacts.test.js +388 -0
  289. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  290. package/dist/ultragoal/__tests__/docs-contract.test.js +3 -0
  291. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  292. package/dist/ultragoal/artifacts.d.ts +23 -0
  293. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  294. package/dist/ultragoal/artifacts.js +275 -12
  295. package/dist/ultragoal/artifacts.js.map +1 -1
  296. package/dist/url-reader/__tests__/url-reader.test.d.ts +2 -0
  297. package/dist/url-reader/__tests__/url-reader.test.d.ts.map +1 -0
  298. package/dist/url-reader/__tests__/url-reader.test.js +433 -0
  299. package/dist/url-reader/__tests__/url-reader.test.js.map +1 -0
  300. package/dist/url-reader/index.d.ts +4 -0
  301. package/dist/url-reader/index.d.ts.map +1 -0
  302. package/dist/url-reader/index.js +522 -0
  303. package/dist/url-reader/index.js.map +1 -0
  304. package/dist/url-reader/types.d.ts +41 -0
  305. package/dist/url-reader/types.d.ts.map +1 -0
  306. package/dist/url-reader/types.js +2 -0
  307. package/dist/url-reader/types.js.map +1 -0
  308. package/dist/utils/__tests__/agents-md.test.js +39 -1
  309. package/dist/utils/__tests__/agents-md.test.js.map +1 -1
  310. package/dist/utils/__tests__/agents-model-table.test.js +28 -0
  311. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  312. package/dist/utils/agents-md.d.ts +4 -0
  313. package/dist/utils/agents-md.d.ts.map +1 -1
  314. package/dist/utils/agents-md.js +28 -0
  315. package/dist/utils/agents-md.js.map +1 -1
  316. package/dist/utils/agents-model-table.d.ts +7 -3
  317. package/dist/utils/agents-model-table.d.ts.map +1 -1
  318. package/dist/utils/agents-model-table.js +16 -8
  319. package/dist/utils/agents-model-table.js.map +1 -1
  320. package/dist/utils/platform-command.d.ts +7 -1
  321. package/dist/utils/platform-command.d.ts.map +1 -1
  322. package/dist/utils/platform-command.js +12 -1
  323. package/dist/utils/platform-command.js.map +1 -1
  324. package/dist/verification/__tests__/ci-rust-gates.test.js +4 -0
  325. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  326. package/dist/vscode/__tests__/index.test.d.ts +2 -0
  327. package/dist/vscode/__tests__/index.test.d.ts.map +1 -0
  328. package/dist/vscode/__tests__/index.test.js +236 -0
  329. package/dist/vscode/__tests__/index.test.js.map +1 -0
  330. package/dist/vscode/index.d.ts +76 -0
  331. package/dist/vscode/index.d.ts.map +1 -0
  332. package/dist/vscode/index.js +196 -0
  333. package/dist/vscode/index.js.map +1 -0
  334. package/package.json +3 -3
  335. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  336. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +59 -8
  337. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +9 -5
  338. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +3 -0
  339. package/plugins/oh-my-codex/skills/performance-goal/SKILL.md +3 -0
  340. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +1 -1
  341. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +22 -4
  342. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +2 -2
  343. package/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md +61 -0
  344. package/skills/autopilot/SKILL.md +9 -5
  345. package/skills/autoresearch-goal/SKILL.md +3 -0
  346. package/skills/ecomode/SKILL.md +1 -1
  347. package/skills/ecomode/references/agent-tiers.md +61 -0
  348. package/skills/performance-goal/SKILL.md +3 -0
  349. package/skills/ralplan/SKILL.md +1 -1
  350. package/skills/ultragoal/SKILL.md +22 -4
  351. package/skills/ultrawork/SKILL.md +2 -2
  352. package/skills/ultrawork/references/agent-tiers.md +61 -0
  353. package/src/scripts/__tests__/codex-native-hook.test.ts +1560 -181
  354. package/src/scripts/codex-native-hook.ts +663 -24
  355. package/src/scripts/notify-hook/team-leader-nudge.ts +298 -91
  356. package/src/scripts/notify-hook/team-tmux-guard.ts +92 -8
  357. package/src/scripts/notify-hook/tmux-injection.ts +1 -1
  358. package/src/scripts/run-compiled-ci.ts +85 -0
  359. package/src/scripts/sync-plugin-mirror.ts +1 -0
  360. package/templates/AGENTS.md +6 -0
@@ -27,6 +27,12 @@ function cleanQualityGate() {
27
27
  architect: { agentRole: 'architect', evidence: 'architect subagent returned CLEAR' },
28
28
  },
29
29
  },
30
+ architectureInvariantGate: {
31
+ status: 'passed',
32
+ sourceArtifacts: ['.omx/ultragoal/brief.md', '.omx/ultragoal/goals.json'],
33
+ invariants: [],
34
+ evidence: 'architect verified no additional architecture invariants were declared in the brief',
35
+ },
30
36
  };
31
37
  }
32
38
  async function writeFixturePlan(cwd, plan) {
@@ -610,6 +616,12 @@ describe('ultragoal artifacts', () => {
610
616
  });
611
617
  assert.equal(result.blockedGoal.status, 'review_blocked');
612
618
  assert.equal(result.addedGoal.status, 'pending');
619
+ assert.equal(result.addedGoal.resolvesReviewBlockedGoalId, result.blockedGoal.id);
620
+ assert.deepEqual(result.blockedGoal.reviewBlockerResolution, {
621
+ resolverGoalId: result.addedGoal.id,
622
+ status: 'pending',
623
+ evidence: 'code-review REQUEST CHANGES',
624
+ });
613
625
  assert.equal(result.plan.activeGoalId, undefined);
614
626
  assert.equal(result.plan.codexObjective, objective);
615
627
  const next = await startNextUltragoal(cwd);
@@ -619,6 +631,150 @@ describe('ultragoal artifacts', () => {
619
631
  assert.match(ledger, /"event":"goal_review_blocked"/);
620
632
  });
621
633
  });
634
+ it('reconciles a review-blocked final story when the appended resolver completes with a clean quality gate', async () => {
635
+ await withTempRepo(async (cwd) => {
636
+ await createUltragoalPlan(cwd, {
637
+ brief: 'brief',
638
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
639
+ });
640
+ const started = await startNextUltragoal(cwd);
641
+ const objective = started.plan.codexObjective;
642
+ const blocked = await recordFinalReviewBlockers(cwd, {
643
+ goalId: started.goal.id,
644
+ title: 'Resolve final code-review blockers',
645
+ objective: 'Fix final code-review blockers and rerun final gates.',
646
+ evidence: 'code-reviewer REQUEST CHANGES before resolver',
647
+ codexGoal: { goal: { objective, status: 'active' } },
648
+ });
649
+ assert.equal(blocked.blockedGoal.status, 'review_blocked');
650
+ assert.equal(summarizeUltragoalPlan(blocked.plan).reviewBlocked, 1);
651
+ const resolver = await startNextUltragoal(cwd);
652
+ assert.equal(resolver.goal?.id, blocked.addedGoal.id);
653
+ assert.equal(isFinalRunCompletionCandidate(resolver.plan, resolver.goal), true);
654
+ const completed = await checkpointUltragoal(cwd, {
655
+ goalId: blocked.addedGoal.id,
656
+ status: 'complete',
657
+ evidence: `${blocked.addedGoal.id} fixed blockers; final gate passed for .omx/ultragoal/goals.json`,
658
+ codexGoal: { goal: { objective, status: 'complete' } },
659
+ qualityGate: cleanQualityGate(),
660
+ });
661
+ const parent = completed.goals.find((goal) => goal.id === blocked.blockedGoal.id);
662
+ const summary = summarizeUltragoalPlan(completed);
663
+ assert.equal(parent?.status, 'complete');
664
+ assert.equal(parent?.reviewBlockerResolution?.status, 'complete');
665
+ assert.equal(parent?.reviewBlockerResolution?.resolverGoalId, blocked.addedGoal.id);
666
+ assert.equal(summary.complete, 2);
667
+ assert.equal(summary.reviewBlocked, 0);
668
+ assert.equal(summary.steeringBlocked, 0);
669
+ assert.equal(summary.aggregateComplete, true);
670
+ assert.equal(summary.artifactComplete, true);
671
+ assert.equal(isUltragoalDone(completed), true);
672
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
673
+ assert.match(ledger, /"event":"final_review_failed"/);
674
+ assert.match(ledger, /code-reviewer REQUEST CHANGES before resolver/);
675
+ assert.match(ledger, /Review-blocked final story resolved by/);
676
+ assert.match(ledger, /"event":"aggregate_completed"/);
677
+ });
678
+ });
679
+ it('does not reconcile a review-blocked parent from a non-designated resolver goal', async () => {
680
+ await withTempRepo(async (cwd) => {
681
+ await createUltragoalPlan(cwd, {
682
+ brief: 'brief',
683
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
684
+ });
685
+ const started = await startNextUltragoal(cwd);
686
+ const objective = started.plan.codexObjective;
687
+ const blocked = await recordFinalReviewBlockers(cwd, {
688
+ goalId: started.goal.id,
689
+ title: 'Resolve final code-review blockers',
690
+ objective: 'Fix final code-review blockers and rerun final gates.',
691
+ evidence: 'code-reviewer REQUEST CHANGES before resolver',
692
+ codexGoal: { goal: { objective, status: 'active' } },
693
+ });
694
+ const planPath = join(cwd, '.omx/ultragoal/goals.json');
695
+ const tampered = JSON.parse(await readFile(planPath, 'utf-8'));
696
+ tampered.goals.push({
697
+ id: 'G999-forged-resolver',
698
+ title: 'Forged resolver',
699
+ objective: 'Try to forge resolver metadata.',
700
+ status: 'in_progress',
701
+ attempt: 1,
702
+ createdAt: '2026-06-24T00:00:00.000Z',
703
+ updatedAt: '2026-06-24T00:00:00.000Z',
704
+ startedAt: '2026-06-24T00:00:00.000Z',
705
+ resolvesReviewBlockedGoalId: blocked.blockedGoal.id,
706
+ });
707
+ tampered.activeGoalId = 'G999-forged-resolver';
708
+ await writeFile(planPath, `${JSON.stringify(tampered, null, 2)}\n`);
709
+ const completed = await checkpointUltragoal(cwd, {
710
+ goalId: 'G999-forged-resolver',
711
+ status: 'complete',
712
+ evidence: 'forged resolver completed with tests but is not the designated review blocker resolver',
713
+ codexGoal: { goal: { objective, status: 'active' } },
714
+ });
715
+ const parent = completed.goals.find((goal) => goal.id === blocked.blockedGoal.id);
716
+ const summary = summarizeUltragoalPlan(completed);
717
+ assert.equal(parent?.status, 'review_blocked');
718
+ assert.equal(parent?.reviewBlockerResolution?.resolverGoalId, blocked.addedGoal.id);
719
+ assert.equal(summary.reviewBlocked, 1);
720
+ assert.equal(summary.aggregateComplete, false);
721
+ assert.equal(summary.artifactComplete, false);
722
+ });
723
+ });
724
+ it('fails closed when a forged non-designated resolver presents completed task-scoped aggregate proof', async () => {
725
+ await withTempRepo(async (cwd) => {
726
+ const taskObjective = 'Fix review-blocked ultragoal resolver reconciliation tracked in .omx/ultragoal/goals.json without allowing forged aggregate completion.';
727
+ await createUltragoalPlan(cwd, {
728
+ brief: taskObjective,
729
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
730
+ });
731
+ const started = await startNextUltragoal(cwd);
732
+ const aggregateObjective = started.plan.codexObjective;
733
+ const blocked = await recordFinalReviewBlockers(cwd, {
734
+ goalId: started.goal.id,
735
+ title: 'Resolve final code-review blockers',
736
+ objective: 'Fix final code-review blockers and rerun final gates.',
737
+ evidence: 'code-reviewer REQUEST CHANGES before resolver',
738
+ codexGoal: { goal: { objective: aggregateObjective, status: 'active' } },
739
+ });
740
+ const planPath = join(cwd, '.omx/ultragoal/goals.json');
741
+ const tampered = JSON.parse(await readFile(planPath, 'utf-8'));
742
+ tampered.goals.push({
743
+ id: 'G999-forged-resolver',
744
+ title: 'Forged resolver',
745
+ objective: 'Try to forge resolver metadata.',
746
+ status: 'in_progress',
747
+ attempt: 1,
748
+ createdAt: '2026-06-24T00:00:00.000Z',
749
+ updatedAt: '2026-06-24T00:00:00.000Z',
750
+ startedAt: '2026-06-24T00:00:00.000Z',
751
+ resolvesReviewBlockedGoalId: blocked.blockedGoal.id,
752
+ });
753
+ tampered.activeGoalId = 'G999-forged-resolver';
754
+ await writeFile(planPath, `${JSON.stringify(tampered, null, 2)}\n`);
755
+ await assert.rejects(() => checkpointUltragoal(cwd, {
756
+ goalId: 'G999-forged-resolver',
757
+ status: 'complete',
758
+ evidence: 'G999-forged-resolver completed planned work for .omx/ultragoal/goals.json; passed tests; final quality gate clean.',
759
+ codexGoal: { goal: { objective: taskObjective, status: 'complete' } },
760
+ qualityGate: cleanQualityGate(),
761
+ }), /Completed task-scoped aggregate reconciliation (?:requires|is not allowed)|objective mismatch/);
762
+ const plan = await readUltragoalPlan(cwd);
763
+ const parent = plan.goals.find((goal) => goal.id === blocked.blockedGoal.id);
764
+ const designatedResolver = plan.goals.find((goal) => goal.id === blocked.addedGoal.id);
765
+ const forgedResolver = plan.goals.find((goal) => goal.id === 'G999-forged-resolver');
766
+ const summary = summarizeUltragoalPlan(plan);
767
+ assert.equal(parent?.status, 'review_blocked');
768
+ assert.equal(parent?.reviewBlockerResolution?.resolverGoalId, blocked.addedGoal.id);
769
+ assert.equal(designatedResolver?.status, 'pending');
770
+ assert.equal(forgedResolver?.status, 'in_progress');
771
+ assert.equal(plan.aggregateCompletion, undefined);
772
+ assert.equal(summary.reviewBlocked, 1);
773
+ assert.equal(summary.aggregateComplete, false);
774
+ assert.equal(summary.artifactComplete, false);
775
+ assert.equal(isUltragoalDone(plan), false);
776
+ });
777
+ });
622
778
  it('records final per-story review blockers without claiming Codex completion', async () => {
623
779
  await withTempRepo(async (cwd) => {
624
780
  await createUltragoalPlan(cwd, {
@@ -737,6 +893,238 @@ describe('ultragoal artifacts', () => {
737
893
  assert.match(ledger, /"codeReview"/);
738
894
  });
739
895
  });
896
+ it('requires final architecture invariant proof from the brief before clean completion', async () => {
897
+ await withTempRepo(async (cwd) => {
898
+ await createUltragoalPlan(cwd, {
899
+ brief: [
900
+ 'Ship the integration safely.',
901
+ '',
902
+ '## Architecture Invariants',
903
+ '- Preserve the existing parser boundary.',
904
+ '- Do not introduce a second scheduler.',
905
+ ].join('\n'),
906
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
907
+ });
908
+ const started = await startNextUltragoal(cwd);
909
+ const objective = started.plan.codexObjective;
910
+ await assert.rejects(() => checkpointUltragoal(cwd, {
911
+ goalId: started.goal.id,
912
+ status: 'complete',
913
+ evidence: 'tests passed',
914
+ codexGoal: { goal: { objective, status: 'complete' } },
915
+ qualityGate: cleanQualityGate(),
916
+ }), /missing proof for required invariant from \.omx\/ultragoal\/brief\.md: Preserve the existing parser boundary/i);
917
+ await checkpointUltragoal(cwd, {
918
+ goalId: started.goal.id,
919
+ status: 'complete',
920
+ evidence: 'final gates passed',
921
+ codexGoal: { goal: { objective, status: 'complete' } },
922
+ qualityGate: {
923
+ ...cleanQualityGate(),
924
+ architectureInvariantGate: {
925
+ status: 'passed',
926
+ sourceArtifacts: ['.omx/ultragoal/brief.md', '.omx/ultragoal/goals.json'],
927
+ evidence: 'all declared invariants have implementation, test, and review proof',
928
+ invariants: [
929
+ {
930
+ invariant: 'Preserve the existing parser boundary.',
931
+ source: '.omx/ultragoal/brief.md#architecture-invariants',
932
+ status: 'proved',
933
+ implementationEvidence: 'parser changes stayed inside src/parser without scheduler coupling',
934
+ testEvidence: 'parser boundary regression test passed',
935
+ reviewEvidence: 'architect review confirmed parser boundary remained intact',
936
+ },
937
+ {
938
+ invariant: 'Do not introduce a second scheduler.',
939
+ source: '.omx/ultragoal/brief.md#architecture-invariants',
940
+ status: 'proved',
941
+ implementationEvidence: 'implementation reused the existing scheduler entrypoint',
942
+ testEvidence: 'scheduler singleton regression passed',
943
+ reviewEvidence: 'architect review confirmed no duplicate scheduler path',
944
+ },
945
+ ],
946
+ },
947
+ },
948
+ });
949
+ const plan = await readUltragoalPlan(cwd);
950
+ assert.equal(isUltragoalDone(plan), true);
951
+ });
952
+ });
953
+ it('requires final architecture invariant proof from accepted steering annotations', async () => {
954
+ await withTempRepo(async (cwd) => {
955
+ await createUltragoalPlan(cwd, {
956
+ brief: 'Ship the integration safely without a brief invariant section.',
957
+ goals: [
958
+ { title: 'Audit steering invariant', objective: 'Accept steering invariant annotation.' },
959
+ { title: 'Final', objective: 'Complete final milestone.' },
960
+ ],
961
+ });
962
+ const first = await startNextUltragoal(cwd);
963
+ await steerUltragoal(cwd, {
964
+ kind: 'annotate_ledger',
965
+ source: 'finding',
966
+ evidence: 'Reviewer finding. Architecture invariant: Ledger entries remain append-only',
967
+ rationale: 'Non-negotiable architecture invariant: Ledger entries remain append-only',
968
+ });
969
+ await checkpointUltragoal(cwd, {
970
+ goalId: first.goal.id,
971
+ status: 'complete',
972
+ evidence: 'steering invariant accepted for final gate coverage',
973
+ codexGoal: { goal: { objective: first.plan.codexObjective, status: 'active' } },
974
+ allowActiveFinalCodexGoal: true,
975
+ });
976
+ const final = await startNextUltragoal(cwd);
977
+ const objective = final.plan.codexObjective;
978
+ await assert.rejects(() => checkpointUltragoal(cwd, {
979
+ goalId: final.goal.id,
980
+ status: 'complete',
981
+ evidence: 'tests passed',
982
+ codexGoal: { goal: { objective, status: 'complete' } },
983
+ qualityGate: {
984
+ ...cleanQualityGate(),
985
+ architectureInvariantGate: {
986
+ status: 'passed',
987
+ sourceArtifacts: ['.omx/ultragoal/ledger.jsonl'],
988
+ invariants: [],
989
+ evidence: 'architect verified no additional architecture invariants were declared in the brief',
990
+ },
991
+ },
992
+ }), /missing proof for required invariant from \.omx\/ultragoal\/ledger\.jsonl: Ledger entries remain append-only/i);
993
+ await checkpointUltragoal(cwd, {
994
+ goalId: final.goal.id,
995
+ status: 'complete',
996
+ evidence: 'final gates passed',
997
+ codexGoal: { goal: { objective, status: 'complete' } },
998
+ qualityGate: {
999
+ ...cleanQualityGate(),
1000
+ architectureInvariantGate: {
1001
+ status: 'passed',
1002
+ sourceArtifacts: ['.omx/ultragoal/ledger.jsonl'],
1003
+ evidence: 'accepted steering invariant has implementation, test, and review proof',
1004
+ invariants: [
1005
+ {
1006
+ invariant: 'Ledger entries remain append-only',
1007
+ source: '.omx/ultragoal/ledger.jsonl#steering-3-inline-architecture-invariant',
1008
+ status: 'proved',
1009
+ implementationEvidence: 'appendLedger only appends JSONL records',
1010
+ testEvidence: 'ledger append-only regression passed',
1011
+ reviewEvidence: 'architect review confirmed ledger mutation remains append-only',
1012
+ },
1013
+ ],
1014
+ },
1015
+ },
1016
+ });
1017
+ const plan = await readUltragoalPlan(cwd);
1018
+ assert.equal(isUltragoalDone(plan), true);
1019
+ });
1020
+ });
1021
+ it('rejects decorative architecture invariant provenance labels that omit source artifacts', async () => {
1022
+ await withTempRepo(async (cwd) => {
1023
+ await createUltragoalPlan(cwd, {
1024
+ brief: [
1025
+ 'Ship the integration safely.',
1026
+ '',
1027
+ '## Architecture Invariants',
1028
+ '- Preserve the existing parser boundary.',
1029
+ ].join('\n'),
1030
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
1031
+ });
1032
+ const started = await startNextUltragoal(cwd);
1033
+ const objective = started.plan.codexObjective;
1034
+ await assert.rejects(() => checkpointUltragoal(cwd, {
1035
+ goalId: started.goal.id,
1036
+ status: 'complete',
1037
+ evidence: 'tests passed',
1038
+ codexGoal: { goal: { objective, status: 'complete' } },
1039
+ qualityGate: {
1040
+ ...cleanQualityGate(),
1041
+ architectureInvariantGate: {
1042
+ status: 'passed',
1043
+ sourceArtifacts: ['review-note: claims brief coverage'],
1044
+ evidence: 'decorative label claims the invariant came from the brief',
1045
+ invariants: [
1046
+ {
1047
+ invariant: 'Preserve the existing parser boundary.',
1048
+ source: 'review-note: brief architecture invariant',
1049
+ status: 'proved',
1050
+ implementationEvidence: 'parser boundary preserved',
1051
+ testEvidence: 'parser boundary test passed',
1052
+ reviewEvidence: 'architect review confirmed parser boundary',
1053
+ },
1054
+ ],
1055
+ },
1056
+ },
1057
+ }), /sourceArtifacts must include required invariant source artifact: \.omx\/ultragoal\/brief\.md/i);
1058
+ await assert.rejects(() => checkpointUltragoal(cwd, {
1059
+ goalId: started.goal.id,
1060
+ status: 'complete',
1061
+ evidence: 'tests passed',
1062
+ codexGoal: { goal: { objective, status: 'complete' } },
1063
+ qualityGate: {
1064
+ ...cleanQualityGate(),
1065
+ architectureInvariantGate: {
1066
+ status: 'passed',
1067
+ sourceArtifacts: ['.omx/ultragoal/brief.md'],
1068
+ evidence: 'source artifact is listed but record source is decorative',
1069
+ invariants: [
1070
+ {
1071
+ invariant: 'Preserve the existing parser boundary.',
1072
+ source: 'review-note: brief architecture invariant',
1073
+ status: 'proved',
1074
+ implementationEvidence: 'parser boundary preserved',
1075
+ testEvidence: 'parser boundary test passed',
1076
+ reviewEvidence: 'architect review confirmed parser boundary',
1077
+ },
1078
+ ],
1079
+ },
1080
+ },
1081
+ }), /source must reference one of architectureInvariantGate\.sourceArtifacts|decorative provenance labels/i);
1082
+ });
1083
+ });
1084
+ it('blocks final completion when architecture invariants are unproved or carry blockers', async () => {
1085
+ await withTempRepo(async (cwd) => {
1086
+ await createUltragoalPlan(cwd, {
1087
+ brief: '## Domain Invariants\n- Ledger entries remain append-only.',
1088
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
1089
+ });
1090
+ const started = await startNextUltragoal(cwd);
1091
+ const objective = started.plan.codexObjective;
1092
+ await assert.rejects(() => checkpointUltragoal(cwd, {
1093
+ goalId: started.goal.id,
1094
+ status: 'complete',
1095
+ evidence: 'tests passed',
1096
+ codexGoal: { goal: { objective, status: 'complete' } },
1097
+ qualityGate: {
1098
+ ...cleanQualityGate(),
1099
+ architectureInvariantGate: {
1100
+ status: 'passed',
1101
+ sourceArtifacts: ['.omx/ultragoal/brief.md'],
1102
+ evidence: 'invariant audit found unresolved blocker',
1103
+ invariants: [
1104
+ {
1105
+ invariant: 'Ledger entries remain append-only.',
1106
+ source: '.omx/ultragoal/brief.md#domain-invariants',
1107
+ status: 'blocked',
1108
+ implementationEvidence: 'mutation path still rewrites prior entries',
1109
+ testEvidence: 'append-only regression not written',
1110
+ reviewEvidence: 'architect BLOCK',
1111
+ blockers: ['existing migration rewrites ledger history'],
1112
+ },
1113
+ ],
1114
+ },
1115
+ },
1116
+ }), /not proved|blocker-resolution work/i);
1117
+ const result = await recordFinalReviewBlockers(cwd, {
1118
+ goalId: started.goal.id,
1119
+ title: 'Resolve final architecture invariant blockers',
1120
+ objective: 'Prove ledger append-only behavior and rerun final quality gates.',
1121
+ evidence: 'architectureInvariantGate found unproved invariant: Ledger entries remain append-only.',
1122
+ codexGoal: { goal: { objective, status: 'active' } },
1123
+ });
1124
+ assert.equal(result.blockedGoal.status, 'review_blocked');
1125
+ assert.match(result.addedGoal.objective, /ledger append-only/i);
1126
+ });
1127
+ });
740
1128
  it('records a completed legacy Codex-goal blocker without failing the active ultragoal', async () => {
741
1129
  await withTempRepo(async (cwd) => {
742
1130
  await createUltragoalPlan(cwd, {