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
@@ -400,7 +400,7 @@ export async function handleTeamWorkerPostToolUseSuccess(
400
400
  if (readToolName(payload) !== 'Bash') return { handled: false, status: 'skipped', reason: 'not_bash', operationKinds: [] };
401
401
  if (readExitCode(payload) !== 0) return { handled: false, status: 'skipped', reason: 'nonzero_exit', operationKinds: [] };
402
402
 
403
- const parsedWorker = parseTeamWorkerEnv(env.OMX_TEAM_WORKER);
403
+ const parsedWorker = parseTeamWorkerEnv(env.OMX_TEAM_INTERNAL_WORKER ?? env.OMX_TEAM_WORKER);
404
404
  if (!parsedWorker) return { handled: false, status: 'skipped', reason: 'missing_worker_env', operationKinds: [] };
405
405
 
406
406
  const resolvedStateRoot = await resolveWorkerTeamStateRoot(cwd, parsedWorker, env);
@@ -0,0 +1,246 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * Native worker Stop leader nudge.
4
+ *
5
+ * This path is intentionally tied to a resolved, allowed native Stop event.
6
+ * It must not depend on idle/heartbeat freshness or inferred progress stalls.
7
+ */
8
+
9
+ import { appendFile, mkdir, rename, writeFile } from 'fs/promises';
10
+ import { dirname, join } from 'path';
11
+ import { DEFAULT_MARKER } from '../tmux-hook-engine.js';
12
+ import { appendTeamDeliveryLog } from '../../team/delivery-log.js';
13
+ import { safeString, asNumber } from './utils.js';
14
+ import { readJsonIfExists } from './state-io.js';
15
+ import { logTmuxHookEvent } from './log.js';
16
+ import { evaluatePaneInjectionReadiness, sendPaneInput } from './team-tmux-guard.js';
17
+ import { resolvePaneTarget } from './tmux-injection.js';
18
+ import { readTeamWorkersForIdleCheck } from './team-worker.js';
19
+
20
+ const STOP_NUDGE_COOLDOWN_MS = 30_000;
21
+ const SOURCE_TYPE = 'worker_stop';
22
+ const LEADER_PANE_MISSING_NO_INJECTION_REASON = 'leader_pane_missing_no_injection';
23
+ const LEADER_PANE_SHELL_NO_INJECTION_REASON = 'leader_pane_shell_no_injection';
24
+
25
+ function resolveWorkerStopCooldownMs() {
26
+ const raw = safeString(process.env.OMX_TEAM_WORKER_STOP_COOLDOWN_MS || '');
27
+ const parsed = asNumber(raw);
28
+ if (parsed !== null && parsed >= 5_000 && parsed <= 10 * 60_000) return parsed;
29
+ return STOP_NUDGE_COOLDOWN_MS;
30
+ }
31
+
32
+ async function resolveCanonicalLeaderPaneId(leaderPaneId) {
33
+ const normalizedLeaderPaneId = safeString(leaderPaneId).trim();
34
+ if (!normalizedLeaderPaneId) return '';
35
+ try {
36
+ const resolved = await resolvePaneTarget({ type: 'pane', value: normalizedLeaderPaneId }, '', '', '', {});
37
+ const paneTarget = safeString(resolved?.paneTarget).trim();
38
+ if (paneTarget) return paneTarget;
39
+ } catch {
40
+ // Fall back to the recorded pane id; readiness guard remains authoritative.
41
+ }
42
+ return normalizedLeaderPaneId;
43
+ }
44
+
45
+ async function appendWorkerStopEvent(stateDir, teamName, event) {
46
+ const eventsDir = join(stateDir, 'team', teamName, 'events');
47
+ const eventsPath = join(eventsDir, 'events.ndjson');
48
+ await mkdir(eventsDir, { recursive: true }).catch(() => {});
49
+ await appendFile(eventsPath, JSON.stringify(event) + '\n').catch(() => {});
50
+ }
51
+
52
+ async function writeStopNudgeState(statePath, state) {
53
+ await mkdir(dirname(statePath), { recursive: true }).catch(() => {});
54
+ const tmpPath = `${statePath}.tmp.${process.pid}`;
55
+ await writeFile(tmpPath, JSON.stringify(state, null, 2));
56
+ await rename(tmpPath, statePath);
57
+ }
58
+
59
+ async function recordDeferred({
60
+ stateDir,
61
+ logsDir,
62
+ teamName,
63
+ workerName,
64
+ statePath,
65
+ nextState,
66
+ reason,
67
+ tmuxSession,
68
+ leaderPaneId,
69
+ paneCurrentCommand = '',
70
+ }) {
71
+ const nowIso = nextState.last_notified_at;
72
+ await writeStopNudgeState(statePath, {
73
+ ...nextState,
74
+ delivery: 'deferred',
75
+ reason,
76
+ pane_current_command: paneCurrentCommand || null,
77
+ }).catch(() => {});
78
+ await appendWorkerStopEvent(stateDir, teamName, {
79
+ event_id: `worker-stop-deferred-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
80
+ team: teamName,
81
+ type: 'worker_stop_leader_nudge',
82
+ worker: workerName,
83
+ to_worker: 'leader-fixed',
84
+ delivery: 'deferred',
85
+ reason,
86
+ created_at: nowIso,
87
+ source_type: SOURCE_TYPE,
88
+ });
89
+ await logTmuxHookEvent(logsDir, {
90
+ timestamp: nowIso,
91
+ type: 'leader_notification_deferred',
92
+ team: teamName,
93
+ worker: workerName,
94
+ to_worker: 'leader-fixed',
95
+ reason,
96
+ leader_pane_id: leaderPaneId || null,
97
+ tmux_session: tmuxSession || null,
98
+ tmux_injection_attempted: false,
99
+ pane_current_command: paneCurrentCommand || null,
100
+ source_type: SOURCE_TYPE,
101
+ }).catch(() => {});
102
+ await appendTeamDeliveryLog(logsDir, {
103
+ event: 'nudge_triggered',
104
+ source: SOURCE_TYPE,
105
+ team: teamName,
106
+ from_worker: workerName,
107
+ to_worker: 'leader-fixed',
108
+ transport: 'none',
109
+ result: 'deferred',
110
+ reason,
111
+ }).catch(() => {});
112
+ }
113
+
114
+ export async function maybeNudgeLeaderForAllowedWorkerStop({
115
+ stateDir,
116
+ logsDir,
117
+ workerContext,
118
+ }) {
119
+ const { teamName, workerName } = workerContext || {};
120
+ if (!teamName || !workerName || !stateDir) return { ok: false, result: 'unresolved' };
121
+
122
+ const workerDir = join(stateDir, 'team', teamName, 'workers', workerName);
123
+ const statePath = join(workerDir, 'worker-stop-nudge.json');
124
+ const nowMs = Date.now();
125
+ const nowIso = new Date(nowMs).toISOString();
126
+ const existing = (await readJsonIfExists(statePath, null)) || {};
127
+ const lastNotifiedMs = asNumber(existing.last_notified_at_ms) ?? 0;
128
+ const cooldownMs = resolveWorkerStopCooldownMs();
129
+ if ((nowMs - lastNotifiedMs) < cooldownMs) {
130
+ return { ok: true, result: 'suppressed_cooldown' };
131
+ }
132
+
133
+ const teamInfo = await readTeamWorkersForIdleCheck(stateDir, teamName);
134
+ if (!teamInfo) return { ok: false, result: 'unresolved' };
135
+ const { tmuxSession, leaderPaneId } = teamInfo;
136
+ const tmuxTarget = await resolveCanonicalLeaderPaneId(leaderPaneId);
137
+ const nextState = {
138
+ last_notified_at_ms: nowMs,
139
+ last_notified_at: nowIso,
140
+ team: teamName,
141
+ worker: workerName,
142
+ source_type: SOURCE_TYPE,
143
+ };
144
+
145
+ if (!tmuxTarget) {
146
+ await recordDeferred({
147
+ stateDir,
148
+ logsDir,
149
+ teamName,
150
+ workerName,
151
+ statePath,
152
+ nextState,
153
+ reason: LEADER_PANE_MISSING_NO_INJECTION_REASON,
154
+ tmuxSession,
155
+ leaderPaneId,
156
+ });
157
+ return { ok: true, result: 'deferred' };
158
+ }
159
+
160
+ const paneGuard = await evaluatePaneInjectionReadiness(tmuxTarget, {
161
+ skipIfScrolling: true,
162
+ requireRunningAgent: true,
163
+ requireReady: false,
164
+ requireIdle: false,
165
+ });
166
+ if (!paneGuard.ok) {
167
+ await recordDeferred({
168
+ stateDir,
169
+ logsDir,
170
+ teamName,
171
+ workerName,
172
+ statePath,
173
+ nextState,
174
+ reason: paneGuard.reason === 'pane_running_shell' ? LEADER_PANE_SHELL_NO_INJECTION_REASON : paneGuard.reason,
175
+ tmuxSession,
176
+ leaderPaneId,
177
+ paneCurrentCommand: paneGuard.paneCurrentCommand,
178
+ });
179
+ return { ok: true, result: 'deferred' };
180
+ }
181
+
182
+ const prompt =
183
+ `[OMX] ${workerName} native Stop allowed. `
184
+ + `Run \`omx team status ${teamName}\`, read worker messages/results, then assign next task, reconcile completion, or shut down. `
185
+ + DEFAULT_MARKER;
186
+
187
+ try {
188
+ const sendResult = await sendPaneInput({
189
+ paneTarget: tmuxTarget,
190
+ prompt,
191
+ submitKeyPresses: 2,
192
+ submitDelayMs: 100,
193
+ });
194
+ if (!sendResult.ok) throw new Error(sendResult.error || sendResult.reason || 'send_failed');
195
+
196
+ await writeStopNudgeState(statePath, {
197
+ ...nextState,
198
+ delivery: 'sent',
199
+ leader_pane_id: leaderPaneId || null,
200
+ tmux_target: tmuxTarget,
201
+ });
202
+ await appendWorkerStopEvent(stateDir, teamName, {
203
+ event_id: `worker-stop-nudge-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
204
+ team: teamName,
205
+ type: 'worker_stop_leader_nudge',
206
+ worker: workerName,
207
+ to_worker: 'leader-fixed',
208
+ delivery: 'sent',
209
+ created_at: nowIso,
210
+ source_type: SOURCE_TYPE,
211
+ });
212
+ await logTmuxHookEvent(logsDir, {
213
+ timestamp: nowIso,
214
+ type: 'worker_stop_leader_nudge',
215
+ team: teamName,
216
+ worker: workerName,
217
+ to_worker: 'leader-fixed',
218
+ tmux_target: tmuxTarget,
219
+ source_type: SOURCE_TYPE,
220
+ }).catch(() => {});
221
+ await appendTeamDeliveryLog(logsDir, {
222
+ event: 'nudge_triggered',
223
+ source: SOURCE_TYPE,
224
+ team: teamName,
225
+ from_worker: workerName,
226
+ to_worker: 'leader-fixed',
227
+ transport: 'send-keys',
228
+ result: 'sent',
229
+ reason: 'worker_stop_allowed',
230
+ }).catch(() => {});
231
+ return { ok: true, result: 'sent' };
232
+ } catch (err) {
233
+ await recordDeferred({
234
+ stateDir,
235
+ logsDir,
236
+ teamName,
237
+ workerName,
238
+ statePath,
239
+ nextState,
240
+ reason: err instanceof Error ? err.message : safeString(err),
241
+ tmuxSession,
242
+ leaderPaneId,
243
+ });
244
+ return { ok: true, result: 'deferred' };
245
+ }
246
+ }
@@ -199,26 +199,35 @@ export async function readWorkerStatusState(stateDir, teamName, workerName) {
199
199
  }
200
200
 
201
201
  export async function readTeamWorkersForIdleCheck(stateDir, teamName) {
202
- // Try manifest.v2.json first (preferred), then config.json
202
+ // Try manifest.v2.json first (preferred), then config.json. Some older or
203
+ // synthetic team states have a partial manifest plus the usable worker pane
204
+ // metadata in config.json, so fall through when a candidate is incomplete.
203
205
  const manifestPath = join(stateDir, 'team', teamName, 'manifest.v2.json');
204
206
  const configPath = join(stateDir, 'team', teamName, 'config.json');
205
- const srcPath = existsSync(manifestPath) ? manifestPath : existsSync(configPath) ? configPath : null;
206
- if (!srcPath) return null;
207
+ const candidatePaths = [manifestPath, configPath].filter((path) => existsSync(path));
208
+ let fallback = null;
207
209
 
208
- try {
209
- const raw = await readFile(srcPath, 'utf-8');
210
- const parsed = JSON.parse(raw);
211
- if (!parsed || typeof parsed !== 'object') return null;
212
- const workers = parsed.workers;
213
- if (!Array.isArray(workers) || workers.length === 0) return null;
214
- const tmuxSession = safeString(parsed.tmux_session || '').trim();
215
- const leaderPaneId = safeString(parsed.leader_pane_id || '').trim();
216
- return { workers, tmuxSession, leaderPaneId };
217
- } catch {
218
- return null;
210
+ for (const srcPath of candidatePaths) {
211
+ try {
212
+ const raw = await readFile(srcPath, 'utf-8');
213
+ const parsed = JSON.parse(raw);
214
+ if (!parsed || typeof parsed !== 'object') continue;
215
+ const workers = parsed.workers;
216
+ if (!Array.isArray(workers) || workers.length === 0) continue;
217
+ const tmuxSession = safeString(parsed.tmux_session || '').trim();
218
+ const leaderPaneId = safeString(parsed.leader_pane_id || '').trim();
219
+ const result = { workers, tmuxSession, leaderPaneId };
220
+ if (leaderPaneId) return result;
221
+ if (!fallback) fallback = result;
222
+ } catch {
223
+ // Try the next state source.
224
+ }
219
225
  }
226
+
227
+ return fallback;
220
228
  }
221
229
 
230
+
222
231
  async function readTeamTaskCounts(stateDir, teamName) {
223
232
  const tasksDir = join(stateDir, 'team', teamName, 'tasks');
224
233
  const taskCounts = { pending: 0, blocked: 0, in_progress: 0, completed: 0, failed: 0 };
@@ -179,7 +179,7 @@ async function main() {
179
179
  const isTurnComplete = isTurnCompletePayload(payload);
180
180
 
181
181
  // Team worker detection via environment variable
182
- const teamWorkerEnv = process.env.OMX_TEAM_WORKER; // e.g., "fix-ts/worker-1"
182
+ const teamWorkerEnv = process.env.OMX_TEAM_INTERNAL_WORKER || process.env.OMX_TEAM_WORKER; // e.g., "fix-ts/worker-1"
183
183
  const parsedTeamWorker = parseTeamWorkerEnv(teamWorkerEnv);
184
184
  const isTeamWorker = !!parsedTeamWorker;
185
185
 
@@ -4,6 +4,7 @@ import { join, resolve } from 'node:path';
4
4
 
5
5
  const DEFAULT_TEST_TIMEOUT_MS = 0;
6
6
  const DEFAULT_RUNNER_TIMEOUT_MS = 30 * 60 * 1_000;
7
+ const DEFAULT_CI_TEST_CONCURRENCY = 1;
7
8
 
8
9
  function collectTests(path: string, out: string[]): void {
9
10
  let stats;
@@ -32,6 +33,17 @@ function parseTimeoutMs(value: string | undefined, defaultTimeoutMs: number): nu
32
33
  return Math.floor(parsed);
33
34
  }
34
35
 
36
+ function parseTestConcurrency(env: NodeJS.ProcessEnv): number | undefined {
37
+ const rawValue = env.OMX_NODE_TEST_CONCURRENCY;
38
+ if (rawValue) {
39
+ const parsed = Number(rawValue);
40
+ if (Number.isFinite(parsed) && parsed >= 1) return Math.floor(parsed);
41
+ return undefined;
42
+ }
43
+
44
+ return env.CI === 'true' || env.GITHUB_ACTIONS === 'true' ? DEFAULT_CI_TEST_CONCURRENCY : undefined;
45
+ }
46
+
35
47
  const roots = process.argv.slice(2);
36
48
  const targets = roots.length > 0 ? roots : ['dist'];
37
49
  const files: string[] = [];
@@ -48,16 +60,22 @@ if (files.length === 0) {
48
60
 
49
61
  const testTimeoutMs = parseTimeoutMs(process.env.OMX_NODE_TEST_TIMEOUT_MS, DEFAULT_TEST_TIMEOUT_MS);
50
62
  const runnerTimeoutMs = parseTimeoutMs(process.env.OMX_NODE_TEST_RUNNER_TIMEOUT_MS, DEFAULT_RUNNER_TIMEOUT_MS);
63
+ const testConcurrency = parseTestConcurrency(process.env);
51
64
  const testArgs = ['--test'];
52
65
  if (testTimeoutMs > 0) {
53
66
  testArgs.push(`--test-timeout=${testTimeoutMs}`);
54
67
  }
68
+ if (testConcurrency) {
69
+ testArgs.push(`--test-concurrency=${testConcurrency}`);
70
+ }
55
71
  testArgs.push(...files);
56
72
 
57
73
  console.error(
58
74
  `[run-test-files] running ${files.length} test file(s) from ${targets.join(', ')}${
59
75
  testTimeoutMs > 0 ? ` with per-test timeout ${testTimeoutMs}ms` : ' with per-test timeout disabled'
60
- }${runnerTimeoutMs > 0 ? ` and runner timeout ${runnerTimeoutMs}ms` : ' and runner timeout disabled'}`,
76
+ }${testConcurrency ? `, test concurrency ${testConcurrency}` : ', default test concurrency'}${
77
+ runnerTimeoutMs > 0 ? `, and runner timeout ${runnerTimeoutMs}ms` : ', and runner timeout disabled'
78
+ }`,
61
79
  );
62
80
 
63
81
  const childEnv = { ...process.env };
@@ -82,6 +100,7 @@ console.error(
82
100
  `[run-test-files] node --test did not exit normally${result.signal ? ` (signal: ${result.signal})` : ''}. `
83
101
  + `Roots: ${targets.join(', ')}. Test files: ${files.length}. `
84
102
  + `Per-test timeout: ${testTimeoutMs > 0 ? `${testTimeoutMs}ms` : 'disabled'}. `
103
+ + `Test concurrency: ${testConcurrency ?? 'default'}. `
85
104
  + `Runner timeout: ${runnerTimeoutMs > 0 ? `${runnerTimeoutMs}ms` : 'disabled'}.`,
86
105
  );
87
106
  process.exit(1);
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { existsSync } from "node:fs";
3
3
  import { cp, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
4
- import { dirname, join } from "node:path";
4
+ import { dirname, join, resolve } from "node:path";
5
5
  import process from "node:process";
6
+ import { fileURLToPath } from "node:url";
6
7
  import {
7
8
  getSetupInstallableSkillNames,
8
9
  isCatalogInstallableStatus,
@@ -144,14 +145,14 @@ async function assertRootSkillCatalogConsistency(
144
145
  .filter((skillName) => {
145
146
  if (expectedSkillNames.has(skillName)) return false;
146
147
  const status = manifestByName.get(skillName)?.status;
147
- return status !== "alias" && status !== "merged";
148
+ return status !== "alias" && status !== "merged" && status !== "deprecated";
148
149
  })
149
150
  .sort();
150
151
  if (nonInstallableRootSkillDirs.length > 0) {
151
152
  throw new Error(
152
153
  [
153
154
  "canonical_skill_catalog_out_of_sync",
154
- "message=root skill directories excluded from plugin must be alias or merged catalog entries",
155
+ "message=root skill directories excluded from plugin must be alias, merged, or deprecated catalog entries",
155
156
  `skills=${JSON.stringify(nonInstallableRootSkillDirs)}`,
156
157
  ].join("\n"),
157
158
  );
@@ -345,7 +346,15 @@ function parseArgs(argv: string[]): SyncPluginMirrorOptions {
345
346
  };
346
347
  }
347
348
 
348
- if (import.meta.url === `file://${process.argv[1]}`) {
349
+ export function isDirectCliInvocation(
350
+ importMetaUrl: string,
351
+ argvPath: string | undefined,
352
+ ): boolean {
353
+ if (!argvPath) return false;
354
+ return fileURLToPath(importMetaUrl) === resolve(argvPath);
355
+ }
356
+
357
+ if (isDirectCliInvocation(import.meta.url, process.argv[1])) {
349
358
  syncPluginMirror(parseArgs(process.argv.slice(2)))
350
359
  .then((result) => {
351
360
  const action = result.checked ? "verified" : "synced";
@@ -33,8 +33,7 @@
33
33
  {
34
34
  "name": "ecomode",
35
35
  "category": "execution",
36
- "status": "merged",
37
- "canonical": "ultrawork",
36
+ "status": "deprecated",
38
37
  "core": false,
39
38
  "internalRequired": false
40
39
  },
@@ -52,6 +51,20 @@
52
51
  "core": false,
53
52
  "internalRequired": false
54
53
  },
54
+ {
55
+ "name": "autoresearch-goal",
56
+ "category": "execution",
57
+ "status": "active",
58
+ "core": false,
59
+ "internalRequired": false
60
+ },
61
+ {
62
+ "name": "performance-goal",
63
+ "category": "execution",
64
+ "status": "active",
65
+ "core": false,
66
+ "internalRequired": false
67
+ },
55
68
  {
56
69
  "name": "pipeline",
57
70
  "category": "execution",
@@ -59,11 +72,17 @@
59
72
  "core": false,
60
73
  "internalRequired": false
61
74
  },
75
+ {
76
+ "name": "ultragoal",
77
+ "category": "execution",
78
+ "status": "active",
79
+ "core": true,
80
+ "internalRequired": false
81
+ },
62
82
  {
63
83
  "name": "swarm",
64
84
  "category": "execution",
65
- "status": "alias",
66
- "canonical": "team",
85
+ "status": "deprecated",
67
86
  "core": false,
68
87
  "internalRequired": false
69
88
  },
@@ -99,24 +118,21 @@
99
118
  {
100
119
  "name": "deepsearch",
101
120
  "category": "shortcut",
102
- "status": "alias",
103
- "canonical": "explore",
121
+ "status": "deprecated",
104
122
  "core": false,
105
123
  "internalRequired": false
106
124
  },
107
125
  {
108
126
  "name": "tdd",
109
127
  "category": "shortcut",
110
- "status": "alias",
111
- "canonical": "test-engineer",
128
+ "status": "deprecated",
112
129
  "core": false,
113
130
  "internalRequired": false
114
131
  },
115
132
  {
116
133
  "name": "build-fix",
117
134
  "category": "shortcut",
118
- "status": "alias",
119
- "canonical": "build-fixer",
135
+ "status": "deprecated",
120
136
  "core": false,
121
137
  "internalRequired": false
122
138
  },
@@ -138,24 +154,21 @@
138
154
  {
139
155
  "name": "security-review",
140
156
  "category": "shortcut",
141
- "status": "active",
142
- "canonical": "security-reviewer",
157
+ "status": "deprecated",
143
158
  "core": false,
144
159
  "internalRequired": false
145
160
  },
146
161
  {
147
162
  "name": "visual-verdict",
148
163
  "category": "shortcut",
149
- "status": "active",
150
- "canonical": "vision",
164
+ "status": "deprecated",
151
165
  "core": false,
152
166
  "internalRequired": false
153
167
  },
154
168
  {
155
169
  "name": "web-clone",
156
170
  "category": "shortcut",
157
- "status": "merged",
158
- "canonical": "visual-ralph",
171
+ "status": "deprecated",
159
172
  "core": false,
160
173
  "internalRequired": false
161
174
  },
@@ -186,22 +199,28 @@
186
199
  {
187
200
  "name": "review",
188
201
  "category": "shortcut",
189
- "status": "alias",
190
- "canonical": "plan --review",
202
+ "status": "deprecated",
191
203
  "core": false,
192
204
  "internalRequired": false
193
205
  },
194
206
  {
195
- "name": "ask-claude",
207
+ "name": "ask",
196
208
  "category": "shortcut",
197
209
  "status": "active",
198
210
  "core": false,
199
211
  "internalRequired": false
200
212
  },
213
+ {
214
+ "name": "ask-claude",
215
+ "category": "shortcut",
216
+ "status": "deprecated",
217
+ "core": false,
218
+ "internalRequired": false
219
+ },
201
220
  {
202
221
  "name": "ask-gemini",
203
222
  "category": "shortcut",
204
- "status": "active",
223
+ "status": "deprecated",
205
224
  "core": false,
206
225
  "internalRequired": false
207
226
  },
@@ -222,21 +241,21 @@
222
241
  {
223
242
  "name": "help",
224
243
  "category": "utility",
225
- "status": "active",
244
+ "status": "deprecated",
226
245
  "core": false,
227
246
  "internalRequired": false
228
247
  },
229
248
  {
230
249
  "name": "note",
231
250
  "category": "utility",
232
- "status": "active",
251
+ "status": "deprecated",
233
252
  "core": false,
234
253
  "internalRequired": false
235
254
  },
236
255
  {
237
256
  "name": "trace",
238
257
  "category": "utility",
239
- "status": "active",
258
+ "status": "deprecated",
240
259
  "core": false,
241
260
  "internalRequired": false
242
261
  },
@@ -303,8 +322,7 @@
303
322
  {
304
323
  "name": "ralph-init",
305
324
  "category": "utility",
306
- "status": "merged",
307
- "canonical": "plan",
325
+ "status": "deprecated",
308
326
  "core": false,
309
327
  "internalRequired": false
310
328
  },
@@ -378,7 +396,7 @@
378
396
  {
379
397
  "name": "security-reviewer",
380
398
  "category": "review",
381
- "status": "active"
399
+ "status": "deprecated"
382
400
  },
383
401
  {
384
402
  "name": "performance-reviewer",
@@ -410,7 +428,7 @@
410
428
  {
411
429
  "name": "build-fixer",
412
430
  "category": "domain",
413
- "status": "active"
431
+ "status": "deprecated"
414
432
  },
415
433
  {
416
434
  "name": "designer",
@@ -1,61 +0,0 @@
1
- ---
2
- name: ask-claude
3
- description: Ask Claude via local CLI and capture a reusable artifact
4
- ---
5
-
6
- # Ask Claude (Local CLI)
7
-
8
- Use the locally installed Claude CLI as a direct external advisor for focused questions, reviews, or second opinions.
9
-
10
- ## Usage
11
-
12
- ```bash
13
- /ask-claude <question or task>
14
- ```
15
-
16
- ## Routing
17
-
18
- ### Preferred: Local CLI execution
19
- Run Claude through the canonical OMX CLI command path (no MCP routing):
20
-
21
- ```bash
22
- omx ask claude "{{ARGUMENTS}}"
23
- ```
24
-
25
- Exact non-interactive Claude CLI command from `claude --help`:
26
-
27
- ```bash
28
- claude -p "{{ARGUMENTS}}"
29
- # equivalent: claude --print "{{ARGUMENTS}}"
30
- ```
31
-
32
- If needed, adapt to the user's installed Claude CLI variant while keeping local execution as the default path.
33
-
34
- Legacy compatibility entrypoints (`./scripts/ask-claude.sh`, `npm run ask:claude -- ...`) are transitional wrappers.
35
-
36
- ### Missing binary behavior
37
- If `claude` is not found, do **not** switch to MCP.
38
- Instead:
39
- 1. Explain that local Claude CLI is required for this skill.
40
- 2. Ask the user to install/configure Claude CLI.
41
- 3. Provide a quick verification command:
42
-
43
- ```bash
44
- claude --version
45
- ```
46
-
47
- ## Artifact requirement
48
- After local execution, save a markdown artifact to:
49
-
50
- ```text
51
- .omx/artifacts/claude-<slug>-<timestamp>.md
52
- ```
53
-
54
- Minimum artifact sections:
55
- 1. Original user task
56
- 2. Final prompt sent to Claude CLI
57
- 3. Claude output (raw)
58
- 4. Concise summary
59
- 5. Action items / next steps
60
-
61
- Task: {{ARGUMENTS}}