oh-my-codex 0.7.6 → 0.8.1

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 (376) hide show
  1. package/README.de.md +315 -0
  2. package/README.es.md +296 -17
  3. package/README.fr.md +315 -0
  4. package/README.it.md +315 -0
  5. package/README.ja.md +297 -18
  6. package/README.ko.md +296 -17
  7. package/README.md +110 -13
  8. package/README.pt.md +296 -17
  9. package/README.ru.md +296 -17
  10. package/README.tr.md +315 -0
  11. package/README.vi.md +297 -18
  12. package/README.zh-TW.md +362 -0
  13. package/README.zh.md +293 -17
  14. package/dist/catalog/__tests__/generator.test.js +2 -0
  15. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  16. package/dist/catalog/__tests__/schema.test.js +7 -0
  17. package/dist/catalog/__tests__/schema.test.js.map +1 -1
  18. package/dist/cli/__tests__/ask.test.d.ts +2 -0
  19. package/dist/cli/__tests__/ask.test.d.ts.map +1 -0
  20. package/dist/cli/__tests__/ask.test.js +236 -0
  21. package/dist/cli/__tests__/ask.test.js.map +1 -0
  22. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts +2 -0
  23. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts.map +1 -0
  24. package/dist/cli/__tests__/doctor-warning-copy.test.js +45 -0
  25. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -0
  26. package/dist/cli/__tests__/index.test.js +85 -2
  27. package/dist/cli/__tests__/index.test.js.map +1 -1
  28. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts +2 -0
  29. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts.map +1 -0
  30. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +15 -0
  31. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -0
  32. package/dist/cli/__tests__/ralph.test.js +19 -43
  33. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  34. package/dist/cli/__tests__/setup-scope.test.js +2 -0
  35. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  36. package/dist/cli/__tests__/team.test.js +219 -1
  37. package/dist/cli/__tests__/team.test.js.map +1 -1
  38. package/dist/cli/__tests__/version.test.d.ts +2 -0
  39. package/dist/cli/__tests__/version.test.d.ts.map +1 -0
  40. package/dist/cli/__tests__/version.test.js +21 -0
  41. package/dist/cli/__tests__/version.test.js.map +1 -0
  42. package/dist/cli/ask.d.ts +13 -0
  43. package/dist/cli/ask.d.ts.map +1 -0
  44. package/dist/cli/ask.js +174 -0
  45. package/dist/cli/ask.js.map +1 -0
  46. package/dist/cli/constants.d.ts +10 -0
  47. package/dist/cli/constants.d.ts.map +1 -0
  48. package/dist/cli/constants.js +10 -0
  49. package/dist/cli/constants.js.map +1 -0
  50. package/dist/cli/doctor.js +16 -5
  51. package/dist/cli/doctor.js.map +1 -1
  52. package/dist/cli/index.d.ts +8 -2
  53. package/dist/cli/index.d.ts.map +1 -1
  54. package/dist/cli/index.js +150 -52
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/ralph.d.ts +3 -11
  57. package/dist/cli/ralph.d.ts.map +1 -1
  58. package/dist/cli/ralph.js +64 -45
  59. package/dist/cli/ralph.js.map +1 -1
  60. package/dist/cli/setup.d.ts.map +1 -1
  61. package/dist/cli/setup.js +17 -18
  62. package/dist/cli/setup.js.map +1 -1
  63. package/dist/cli/team.d.ts.map +1 -1
  64. package/dist/cli/team.js +257 -0
  65. package/dist/cli/team.js.map +1 -1
  66. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts +2 -0
  67. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts.map +1 -0
  68. package/dist/hooks/__tests__/deep-interview-contract.test.js +55 -0
  69. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -0
  70. package/dist/hooks/__tests__/emulator.test.js +6 -0
  71. package/dist/hooks/__tests__/emulator.test.js.map +1 -1
  72. package/dist/hooks/__tests__/keyword-detector.test.js +44 -22
  73. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  74. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +23 -7
  75. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  76. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +59 -0
  77. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  78. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +264 -1
  79. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  80. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +61 -1
  81. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  82. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +17 -7
  83. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  84. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts +2 -0
  85. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts.map +1 -0
  86. package/dist/hooks/__tests__/openclaw-setup-contract.test.js +61 -0
  87. package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -0
  88. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts +2 -0
  89. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts.map +1 -0
  90. package/dist/hooks/__tests__/pre-context-gate-skills.test.js +34 -0
  91. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -0
  92. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts +2 -0
  93. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts.map +1 -0
  94. package/dist/hooks/__tests__/visual-verdict-loop.test.js +35 -0
  95. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -0
  96. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  97. package/dist/hooks/agents-overlay.js +18 -16
  98. package/dist/hooks/agents-overlay.js.map +1 -1
  99. package/dist/hooks/codebase-map.d.ts.map +1 -1
  100. package/dist/hooks/codebase-map.js +6 -2
  101. package/dist/hooks/codebase-map.js.map +1 -1
  102. package/dist/hooks/emulator.d.ts.map +1 -1
  103. package/dist/hooks/emulator.js +2 -0
  104. package/dist/hooks/emulator.js.map +1 -1
  105. package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
  106. package/dist/hooks/extensibility/sdk.js +2 -1
  107. package/dist/hooks/extensibility/sdk.js.map +1 -1
  108. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  109. package/dist/hooks/keyword-registry.js +6 -0
  110. package/dist/hooks/keyword-registry.js.map +1 -1
  111. package/dist/hud/index.d.ts.map +1 -1
  112. package/dist/hud/index.js +2 -24
  113. package/dist/hud/index.js.map +1 -1
  114. package/dist/mcp/__tests__/path-traversal.test.js +9 -227
  115. package/dist/mcp/__tests__/path-traversal.test.js.map +1 -1
  116. package/dist/mcp/__tests__/state-server-schema.test.js +16 -20
  117. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
  118. package/dist/mcp/__tests__/state-server-team-tools.test.js +30 -487
  119. package/dist/mcp/__tests__/state-server-team-tools.test.js.map +1 -1
  120. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  121. package/dist/mcp/code-intel-server.js +18 -8
  122. package/dist/mcp/code-intel-server.js.map +1 -1
  123. package/dist/mcp/memory-server.js +72 -11
  124. package/dist/mcp/memory-server.js.map +1 -1
  125. package/dist/mcp/state-paths.d.ts.map +1 -1
  126. package/dist/mcp/state-paths.js +4 -1
  127. package/dist/mcp/state-paths.js.map +1 -1
  128. package/dist/mcp/state-server.d.ts +179 -0
  129. package/dist/mcp/state-server.d.ts.map +1 -1
  130. package/dist/mcp/state-server.js +221 -1111
  131. package/dist/mcp/state-server.js.map +1 -1
  132. package/dist/mcp/team-server.d.ts.map +1 -1
  133. package/dist/mcp/team-server.js +9 -3
  134. package/dist/mcp/team-server.js.map +1 -1
  135. package/dist/mcp/trace-server.d.ts.map +1 -1
  136. package/dist/mcp/trace-server.js +8 -3
  137. package/dist/mcp/trace-server.js.map +1 -1
  138. package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts +5 -0
  139. package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts.map +1 -0
  140. package/dist/notifications/__tests__/dispatch-cooldown.test.js +100 -0
  141. package/dist/notifications/__tests__/dispatch-cooldown.test.js.map +1 -0
  142. package/dist/notifications/__tests__/temp-mode.test.d.ts +2 -0
  143. package/dist/notifications/__tests__/temp-mode.test.d.ts.map +1 -0
  144. package/dist/notifications/__tests__/temp-mode.test.js +172 -0
  145. package/dist/notifications/__tests__/temp-mode.test.js.map +1 -0
  146. package/dist/notifications/config.d.ts.map +1 -1
  147. package/dist/notifications/config.js +67 -7
  148. package/dist/notifications/config.js.map +1 -1
  149. package/dist/notifications/dispatch-cooldown.d.ts +36 -0
  150. package/dist/notifications/dispatch-cooldown.d.ts.map +1 -0
  151. package/dist/notifications/dispatch-cooldown.js +109 -0
  152. package/dist/notifications/dispatch-cooldown.js.map +1 -0
  153. package/dist/notifications/dispatcher.d.ts.map +1 -1
  154. package/dist/notifications/dispatcher.js +4 -4
  155. package/dist/notifications/dispatcher.js.map +1 -1
  156. package/dist/notifications/index.d.ts +5 -0
  157. package/dist/notifications/index.d.ts.map +1 -1
  158. package/dist/notifications/index.js +39 -8
  159. package/dist/notifications/index.js.map +1 -1
  160. package/dist/notifications/reply-listener.d.ts.map +1 -1
  161. package/dist/notifications/reply-listener.js +6 -2
  162. package/dist/notifications/reply-listener.js.map +1 -1
  163. package/dist/notifications/session-registry.d.ts.map +1 -1
  164. package/dist/notifications/session-registry.js +2 -2
  165. package/dist/notifications/session-registry.js.map +1 -1
  166. package/dist/notifications/temp-contract.d.ts +22 -0
  167. package/dist/notifications/temp-contract.d.ts.map +1 -0
  168. package/dist/notifications/temp-contract.js +147 -0
  169. package/dist/notifications/temp-contract.js.map +1 -0
  170. package/dist/notifications/tmux.js +2 -2
  171. package/dist/notifications/tmux.js.map +1 -1
  172. package/dist/notifications/types.d.ts +18 -0
  173. package/dist/notifications/types.d.ts.map +1 -1
  174. package/dist/openclaw/__tests__/config.test.js +81 -0
  175. package/dist/openclaw/__tests__/config.test.js.map +1 -1
  176. package/dist/openclaw/__tests__/dispatcher.test.js +40 -1
  177. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
  178. package/dist/openclaw/config.d.ts +4 -0
  179. package/dist/openclaw/config.d.ts.map +1 -1
  180. package/dist/openclaw/config.js +110 -16
  181. package/dist/openclaw/config.js.map +1 -1
  182. package/dist/openclaw/dispatcher.d.ts +9 -3
  183. package/dist/openclaw/dispatcher.d.ts.map +1 -1
  184. package/dist/openclaw/dispatcher.js +42 -9
  185. package/dist/openclaw/dispatcher.js.map +1 -1
  186. package/dist/openclaw/types.d.ts +5 -1
  187. package/dist/openclaw/types.d.ts.map +1 -1
  188. package/dist/ralph/__tests__/persistence.test.js +28 -1
  189. package/dist/ralph/__tests__/persistence.test.js.map +1 -1
  190. package/dist/ralph/persistence.d.ts +21 -0
  191. package/dist/ralph/persistence.d.ts.map +1 -1
  192. package/dist/ralph/persistence.js +85 -2
  193. package/dist/ralph/persistence.js.map +1 -1
  194. package/dist/state/paths.d.ts +3 -0
  195. package/dist/state/paths.d.ts.map +1 -0
  196. package/dist/state/paths.js +2 -0
  197. package/dist/state/paths.js.map +1 -0
  198. package/dist/team/__tests__/api-interop.test.d.ts +2 -0
  199. package/dist/team/__tests__/api-interop.test.d.ts.map +1 -0
  200. package/dist/team/__tests__/api-interop.test.js +1052 -0
  201. package/dist/team/__tests__/api-interop.test.js.map +1 -0
  202. package/dist/team/__tests__/idle-nudge.test.d.ts +2 -0
  203. package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
  204. package/dist/team/__tests__/idle-nudge.test.js +225 -0
  205. package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
  206. package/dist/team/__tests__/mcp-comm.test.js +30 -0
  207. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  208. package/dist/team/__tests__/runtime.test.js +33 -26
  209. package/dist/team/__tests__/runtime.test.js.map +1 -1
  210. package/dist/team/__tests__/state-root.test.d.ts +2 -0
  211. package/dist/team/__tests__/state-root.test.d.ts.map +1 -0
  212. package/dist/team/__tests__/state-root.test.js +9 -0
  213. package/dist/team/__tests__/state-root.test.js.map +1 -0
  214. package/dist/team/__tests__/state.test.js +52 -17
  215. package/dist/team/__tests__/state.test.js.map +1 -1
  216. package/dist/team/__tests__/team-ops-contract.test.d.ts +2 -0
  217. package/dist/team/__tests__/team-ops-contract.test.d.ts.map +1 -0
  218. package/dist/team/__tests__/team-ops-contract.test.js +90 -0
  219. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -0
  220. package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts +2 -0
  221. package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts.map +1 -0
  222. package/dist/team/__tests__/tmux-claude-workers-demo.test.js +176 -0
  223. package/dist/team/__tests__/tmux-claude-workers-demo.test.js.map +1 -0
  224. package/dist/team/__tests__/tmux-session.test.js +8 -0
  225. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  226. package/dist/team/__tests__/worker-bootstrap.test.js +29 -0
  227. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  228. package/dist/team/__tests__/worktree.test.js +54 -1
  229. package/dist/team/__tests__/worktree.test.js.map +1 -1
  230. package/dist/team/api-interop.d.ts +19 -0
  231. package/dist/team/api-interop.d.ts.map +1 -0
  232. package/dist/team/api-interop.js +578 -0
  233. package/dist/team/api-interop.js.map +1 -0
  234. package/dist/team/mcp-comm.d.ts.map +1 -1
  235. package/dist/team/mcp-comm.js +32 -2
  236. package/dist/team/mcp-comm.js.map +1 -1
  237. package/dist/team/orchestrator.d.ts +1 -10
  238. package/dist/team/orchestrator.d.ts.map +1 -1
  239. package/dist/team/orchestrator.js +8 -0
  240. package/dist/team/orchestrator.js.map +1 -1
  241. package/dist/team/runtime-cli.js +14 -8
  242. package/dist/team/runtime-cli.js.map +1 -1
  243. package/dist/team/runtime.d.ts +2 -1
  244. package/dist/team/runtime.d.ts.map +1 -1
  245. package/dist/team/runtime.js +103 -30
  246. package/dist/team/runtime.js.map +1 -1
  247. package/dist/team/scaling.d.ts.map +1 -1
  248. package/dist/team/scaling.js +33 -12
  249. package/dist/team/scaling.js.map +1 -1
  250. package/dist/team/state/approvals.d.ts +25 -0
  251. package/dist/team/state/approvals.d.ts.map +1 -0
  252. package/dist/team/state/approvals.js +31 -0
  253. package/dist/team/state/approvals.js.map +1 -0
  254. package/dist/team/state/config.d.ts +2 -0
  255. package/dist/team/state/config.d.ts.map +1 -0
  256. package/dist/team/state/config.js +2 -0
  257. package/dist/team/state/config.js.map +1 -0
  258. package/dist/team/state/dispatch-lock.d.ts +3 -0
  259. package/dist/team/state/dispatch-lock.d.ts.map +1 -0
  260. package/dist/team/state/dispatch-lock.js +81 -0
  261. package/dist/team/state/dispatch-lock.js.map +1 -0
  262. package/dist/team/state/dispatch.d.ts +61 -0
  263. package/dist/team/state/dispatch.d.ts.map +1 -0
  264. package/dist/team/state/dispatch.js +158 -0
  265. package/dist/team/state/dispatch.js.map +1 -0
  266. package/dist/team/state/events.d.ts +2 -0
  267. package/dist/team/state/events.d.ts.map +1 -0
  268. package/dist/team/state/events.js +2 -0
  269. package/dist/team/state/events.js.map +1 -0
  270. package/dist/team/state/index.d.ts +11 -0
  271. package/dist/team/state/index.d.ts.map +1 -0
  272. package/dist/team/state/index.js +11 -0
  273. package/dist/team/state/index.js.map +1 -0
  274. package/dist/team/state/io.d.ts +2 -0
  275. package/dist/team/state/io.d.ts.map +1 -0
  276. package/dist/team/state/io.js +2 -0
  277. package/dist/team/state/io.js.map +1 -0
  278. package/dist/team/state/locks.d.ts +16 -0
  279. package/dist/team/state/locks.d.ts.map +1 -0
  280. package/dist/team/state/locks.js +201 -0
  281. package/dist/team/state/locks.js.map +1 -0
  282. package/dist/team/state/mailbox.d.ts +39 -0
  283. package/dist/team/state/mailbox.d.ts.map +1 -0
  284. package/dist/team/state/mailbox.js +58 -0
  285. package/dist/team/state/mailbox.js.map +1 -0
  286. package/dist/team/state/monitor.d.ts +96 -0
  287. package/dist/team/state/monitor.d.ts.map +1 -0
  288. package/dist/team/state/monitor.js +163 -0
  289. package/dist/team/state/monitor.js.map +1 -0
  290. package/dist/team/state/shutdown.d.ts +2 -0
  291. package/dist/team/state/shutdown.d.ts.map +1 -0
  292. package/dist/team/state/shutdown.js +2 -0
  293. package/dist/team/state/shutdown.js.map +1 -0
  294. package/dist/team/state/summary.d.ts +2 -0
  295. package/dist/team/state/summary.d.ts.map +1 -0
  296. package/dist/team/state/summary.js +2 -0
  297. package/dist/team/state/summary.js.map +1 -0
  298. package/dist/team/state/tasks.d.ts +49 -0
  299. package/dist/team/state/tasks.d.ts.map +1 -0
  300. package/dist/team/state/tasks.js +182 -0
  301. package/dist/team/state/tasks.js.map +1 -0
  302. package/dist/team/state/types.d.ts +281 -0
  303. package/dist/team/state/types.d.ts.map +1 -0
  304. package/dist/team/state/types.js +3 -0
  305. package/dist/team/state/types.js.map +1 -0
  306. package/dist/team/state/workers.d.ts +2 -0
  307. package/dist/team/state/workers.d.ts.map +1 -0
  308. package/dist/team/state/workers.js +2 -0
  309. package/dist/team/state/workers.js.map +1 -0
  310. package/dist/team/state-root.d.ts +5 -0
  311. package/dist/team/state-root.d.ts.map +1 -0
  312. package/dist/team/state-root.js +8 -0
  313. package/dist/team/state-root.js.map +1 -0
  314. package/dist/team/state.d.ts +4 -1
  315. package/dist/team/state.d.ts.map +1 -1
  316. package/dist/team/state.js +200 -881
  317. package/dist/team/state.js.map +1 -1
  318. package/dist/team/tmux-session.d.ts.map +1 -1
  319. package/dist/team/tmux-session.js +11 -10
  320. package/dist/team/tmux-session.js.map +1 -1
  321. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  322. package/dist/team/worker-bootstrap.js +58 -26
  323. package/dist/team/worker-bootstrap.js.map +1 -1
  324. package/dist/team/worktree.d.ts.map +1 -1
  325. package/dist/team/worktree.js +43 -1
  326. package/dist/team/worktree.js.map +1 -1
  327. package/dist/utils/safe-json.d.ts +3 -0
  328. package/dist/utils/safe-json.d.ts.map +1 -0
  329. package/dist/utils/safe-json.js +19 -0
  330. package/dist/utils/safe-json.js.map +1 -0
  331. package/dist/utils/sleep.d.ts +3 -0
  332. package/dist/utils/sleep.d.ts.map +1 -0
  333. package/dist/utils/sleep.js +15 -0
  334. package/dist/utils/sleep.js.map +1 -0
  335. package/dist/visual/__tests__/verdict.test.d.ts +2 -0
  336. package/dist/visual/__tests__/verdict.test.d.ts.map +1 -0
  337. package/dist/visual/__tests__/verdict.test.js +81 -0
  338. package/dist/visual/__tests__/verdict.test.js.map +1 -0
  339. package/dist/visual/constants.d.ts +4 -0
  340. package/dist/visual/constants.d.ts.map +1 -0
  341. package/dist/visual/constants.js +3 -0
  342. package/dist/visual/constants.js.map +1 -0
  343. package/dist/visual/verdict.d.ts +17 -0
  344. package/dist/visual/verdict.d.ts.map +1 -0
  345. package/dist/visual/verdict.js +61 -0
  346. package/dist/visual/verdict.js.map +1 -0
  347. package/package.json +10 -3
  348. package/scripts/ask-claude.sh +17 -0
  349. package/scripts/ask-gemini.sh +14 -0
  350. package/scripts/demo-claude-workers.sh +241 -0
  351. package/scripts/demo-team-e2e.sh +179 -0
  352. package/scripts/fixtures/ask-advisor-stub.js +12 -0
  353. package/scripts/notify-hook/team-dispatch.js +234 -12
  354. package/scripts/notify-hook/team-leader-nudge.js +42 -2
  355. package/scripts/notify-hook/team-worker.js +63 -4
  356. package/scripts/notify-hook/visual-verdict.js +50 -1
  357. package/scripts/notify-hook.js +1 -0
  358. package/scripts/run-provider-advisor.js +179 -0
  359. package/skills/ask-claude/SKILL.md +61 -0
  360. package/skills/ask-gemini/SKILL.md +61 -0
  361. package/skills/autopilot/SKILL.md +32 -2
  362. package/skills/configure-notifications/SKILL.md +188 -186
  363. package/skills/deep-interview/SKILL.md +247 -0
  364. package/skills/omx-setup/SKILL.md +1 -1
  365. package/skills/ralph/SKILL.md +42 -11
  366. package/skills/ralplan/SKILL.md +17 -0
  367. package/skills/team/SKILL.md +64 -5
  368. package/skills/visual-verdict/SKILL.md +76 -0
  369. package/skills/web-clone/SKILL.md +366 -0
  370. package/skills/worker/SKILL.md +42 -11
  371. package/templates/AGENTS.md +9 -0
  372. package/templates/catalog-manifest.json +39 -18
  373. package/skills/configure-discord/SKILL.md +0 -256
  374. package/skills/configure-openclaw/SKILL.md +0 -267
  375. package/skills/configure-slack/SKILL.md +0 -226
  376. package/skills/configure-telegram/SKILL.md +0 -232
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-codex",
3
- "version": "0.7.6",
3
+ "version": "0.8.1",
4
4
  "description": "Multi-agent orchestration layer for OpenAI Codex CLI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -11,9 +11,14 @@
11
11
  "build": "tsc",
12
12
  "check:no-unused": "tsc -p tsconfig.no-unused.json",
13
13
  "dev": "tsc --watch",
14
+ "lint": "biome lint .",
14
15
  "setup": "node bin/omx.js setup",
15
16
  "doctor": "node bin/omx.js doctor",
16
- "test": "npm run build && node --test $(find dist -name '*.test.js') && node scripts/generate-catalog-docs.js --check"
17
+ "ask:claude": "./scripts/ask-claude.sh",
18
+ "ask:gemini": "./scripts/ask-gemini.sh",
19
+ "test:node": "node --test $(find dist -name '*.test.js')",
20
+ "test": "npm run build && npm run test:node && node scripts/generate-catalog-docs.js --check",
21
+ "coverage:team-critical": "npm run build && c8 --all --src dist/team --src dist/state --include 'dist/team/**/*.js' --include 'dist/state/**/*.js' --exclude '**/__tests__/**' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/team --check-coverage --lines=78 --functions=90 --branches=70 --statements=78 node --test $(find dist/team/__tests__ dist/state/__tests__ -name '*.test.js')"
17
22
  },
18
23
  "engines": {
19
24
  "node": ">=20"
@@ -46,10 +51,12 @@
46
51
  },
47
52
  "license": "MIT",
48
53
  "dependencies": {
49
- "@modelcontextprotocol/sdk": "^1.0.0"
54
+ "@modelcontextprotocol/sdk": "^1.26.0"
50
55
  },
51
56
  "devDependencies": {
57
+ "@biomejs/biome": "^2.4.4",
52
58
  "@types/node": "^22.19.11",
59
+ "c8": "^10.1.3",
53
60
  "typescript": "^5.7.0"
54
61
  },
55
62
  "overrides": {
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ if [ "$#" -eq 0 ]; then
5
+ echo "Usage: scripts/ask-claude.sh <question or task>" >&2
6
+ exit 1
7
+ fi
8
+
9
+ SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
10
+ echo "[omx] wrapper deprecation: prefer 'omx ask claude \"...\"'." >&2
11
+ if [ -x "$SCRIPT_DIR/../bin/omx.js" ]; then
12
+ if node "$SCRIPT_DIR/../bin/omx.js" ask claude "$@"; then
13
+ exit 0
14
+ fi
15
+ echo "[omx] wrapper fallback: bin/omx ask failed, using legacy advisor script." >&2
16
+ fi
17
+ exec node "$SCRIPT_DIR/run-provider-advisor.js" claude "$@"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ if [ "$#" -eq 0 ]; then
5
+ echo "Usage: scripts/ask-gemini.sh <question or task>" >&2
6
+ exit 1
7
+ fi
8
+
9
+ SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
10
+ echo "[omx] wrapper deprecation: prefer 'omx ask gemini \"...\"'." >&2
11
+ if [ -x "$SCRIPT_DIR/../bin/omx.js" ]; then
12
+ exec node "$SCRIPT_DIR/../bin/omx.js" ask gemini "$@"
13
+ fi
14
+ exec node "$SCRIPT_DIR/run-provider-advisor.js" gemini "$@"
@@ -0,0 +1,241 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # OMX Tmux Claude Workers Demo Script
4
+ #
5
+ # This script demonstrates the tmux-based multi-agent orchestration system
6
+ # with Claude Code CLI workers. It showcases:
7
+ # - Multi-worker coordination in tmux panes
8
+ # - Task lifecycle management (create, claim, complete)
9
+ # - Mailbox-based communication between workers
10
+ # - Mixed workload distribution across Claude workers
11
+ #
12
+ # Usage:
13
+ # ./scripts/demo-claude-workers.sh
14
+ #
15
+ # Environment Variables:
16
+ # WORKER_COUNT Number of workers (default: 3, minimum: 2)
17
+ # TEAM_TASK Task description (default: "tmux claude workers demo")
18
+ # TEAM_NAME Team identifier (default: slugified TEAM_TASK)
19
+ # OMX_TEAM_WORKER_LAUNCH_MODE Worker launch mode (default: interactive)
20
+ # OMX_TEAM_WORKER_LAUNCH_ARGS Arguments passed to Claude CLI
21
+ #
22
+ # Example:
23
+ # WORKER_COUNT=5 ./scripts/demo-claude-workers.sh
24
+ #
25
+ # shellcheck disable=SC2317 # Functions are called via trap
26
+
27
+ set -euo pipefail
28
+
29
+ readonly SCRIPT_VERSION="1.0.0"
30
+ readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
31
+
32
+ require_bin() {
33
+ if ! command -v "$1" >/dev/null 2>&1; then
34
+ echo "error: required command not found: $1" >&2
35
+ exit 1
36
+ fi
37
+ }
38
+
39
+ slugify() {
40
+ echo "$1" \
41
+ | tr '[:upper:]' '[:lower:]' \
42
+ | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-+/-/g' \
43
+ | cut -c1-30
44
+ }
45
+
46
+ require_bin omx
47
+ require_bin jq
48
+ require_bin tmux
49
+
50
+ WORKER_COUNT="${WORKER_COUNT:-3}"
51
+ if ! [[ "$WORKER_COUNT" =~ ^[0-9]+$ ]]; then
52
+ echo "error: WORKER_COUNT must be a positive integer (got: $WORKER_COUNT)" >&2
53
+ exit 1
54
+ fi
55
+ if ((WORKER_COUNT < 2)); then
56
+ echo "error: WORKER_COUNT must be >= 2 for this demo (got: $WORKER_COUNT)" >&2
57
+ exit 1
58
+ fi
59
+
60
+ TEAM_TASK="${TEAM_TASK:-tmux claude workers demo}"
61
+ TEAM_NAME="${TEAM_NAME:-$(slugify "$TEAM_TASK")}"
62
+ OMX_TEAM_WORKER_LAUNCH_MODE="${OMX_TEAM_WORKER_LAUNCH_MODE:-interactive}"
63
+
64
+ # All workers use Claude CLI for this demo
65
+ build_claude_cli_map() {
66
+ local count="$1"
67
+ local entries=()
68
+ local i
69
+ for ((i = 1; i <= count; i++)); do
70
+ entries+=("claude")
71
+ done
72
+ (IFS=,; echo "${entries[*]}")
73
+ }
74
+
75
+ OMX_TEAM_WORKER_CLI="${OMX_TEAM_WORKER_CLI:-auto}"
76
+ OMX_TEAM_WORKER_CLI_MAP="${OMX_TEAM_WORKER_CLI_MAP:-$(build_claude_cli_map "$WORKER_COUNT")}"
77
+
78
+ TEAM_STARTED=0
79
+ cleanup() {
80
+ if ((TEAM_STARTED == 1)); then
81
+ echo "[cleanup] shutting down team: $TEAM_NAME"
82
+ omx team shutdown "$TEAM_NAME" >/dev/null 2>&1 || true
83
+ echo "[cleanup] cleaning state for team: $TEAM_NAME"
84
+ omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null 2>&1 || true
85
+ fi
86
+ }
87
+ trap cleanup EXIT
88
+
89
+ echo "== OMX Tmux Claude Workers Demo v${SCRIPT_VERSION} =="
90
+ echo "TEAM_TASK=$TEAM_TASK"
91
+ echo "TEAM_NAME=$TEAM_NAME"
92
+ echo "WORKER_COUNT=$WORKER_COUNT"
93
+ echo "OMX_TEAM_WORKER_CLI=$OMX_TEAM_WORKER_CLI"
94
+ echo "OMX_TEAM_WORKER_CLI_MAP=$OMX_TEAM_WORKER_CLI_MAP"
95
+ echo ""
96
+ echo "This demo showcases Claude Code CLI workers in tmux panes"
97
+ echo "coordinated through the OMX team orchestration system."
98
+ echo ""
99
+
100
+ echo "[1/10] Starting team with ${WORKER_COUNT} Claude workers..."
101
+ omx team "${WORKER_COUNT}:executor" "$TEAM_TASK"
102
+ TEAM_STARTED=1
103
+ echo ""
104
+
105
+ echo "[2/10] Checking team status..."
106
+ omx team status "$TEAM_NAME"
107
+ echo ""
108
+
109
+ echo "[3/10] Creating distributed tasks for workers..."
110
+ for i in $(seq 1 "$WORKER_COUNT"); do
111
+ TASK_SUBJECT="Demo task $i"
112
+ TASK_DESC="Demonstration task for Claude worker-$i showcasing tmux-based multi-agent orchestration"
113
+ CREATE_INPUT="$(jq -nc \
114
+ --arg team "$TEAM_NAME" \
115
+ --arg subject "$TASK_SUBJECT" \
116
+ --arg description "$TASK_DESC" \
117
+ --arg owner "worker-$i" \
118
+ '{team_name:$team,subject:$subject,description:$description,owner:$owner}')"
119
+ CREATE_JSON="$(omx team api create-task --input "$CREATE_INPUT" --json)"
120
+ TASK_ID="$(echo "$CREATE_JSON" | jq -r '.data.task.id // empty')"
121
+ if [[ -n "$TASK_ID" ]]; then
122
+ echo " Created task $TASK_ID for worker-$i"
123
+ fi
124
+ done
125
+ echo ""
126
+
127
+ echo "[4/10] Listing all tasks..."
128
+ LIST_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')"
129
+ omx team api list-tasks --input "$LIST_INPUT" --json | jq -r '.data.tasks[] | " Task \(.id): \(.subject) [\(.status)]"'
130
+ echo ""
131
+
132
+ echo "[5/10] Workers claiming their assigned tasks..."
133
+ for i in $(seq 1 "$WORKER_COUNT"); do
134
+ WORKER_NAME="worker-$i"
135
+ # Find task assigned to this worker
136
+ TASK_ID="$(omx team api list-tasks --input "$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')" --json | \
137
+ jq -r --arg owner "$WORKER_NAME" '.data.tasks[] | select(.owner == $owner) | .id' | head -1)"
138
+
139
+ if [[ -n "$TASK_ID" ]]; then
140
+ CLAIM_INPUT="$(jq -nc \
141
+ --arg team "$TEAM_NAME" \
142
+ --arg task "$TASK_ID" \
143
+ --arg worker "$WORKER_NAME" \
144
+ '{team_name:$team,task_id:$task,worker:$worker,expected_version:1}')"
145
+ CLAIM_JSON="$(omx team api claim-task --input "$CLAIM_INPUT" --json)"
146
+ if echo "$CLAIM_JSON" | jq -e '.ok' >/dev/null; then
147
+ echo " $WORKER_NAME claimed task $TASK_ID"
148
+ fi
149
+ fi
150
+ done
151
+ echo ""
152
+
153
+ echo "[6/10] Simulating work completion - transitioning tasks to completed..."
154
+ for i in $(seq 1 "$WORKER_COUNT"); do
155
+ WORKER_NAME="worker-$i"
156
+ # Get the claimed task for this worker
157
+ TASK_INFO="$(omx team api list-tasks --input "$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')" --json | \
158
+ jq -r --arg owner "$WORKER_NAME" '.data.tasks[] | select(.owner == $owner and .status == "in_progress") | [.id, .claim.token] | @tsv' | head -1)"
159
+
160
+ if [[ -n "$TASK_INFO" ]]; then
161
+ TASK_ID="$(echo "$TASK_INFO" | cut -f1)"
162
+ CLAIM_TOKEN="$(echo "$TASK_INFO" | cut -f2)"
163
+
164
+ TRANSITION_INPUT="$(jq -nc \
165
+ --arg team "$TEAM_NAME" \
166
+ --arg task "$TASK_ID" \
167
+ --arg token "$CLAIM_TOKEN" \
168
+ '{team_name:$team,task_id:$task,from:"in_progress",to:"completed",claim_token:$token}')"
169
+ omx team api transition-task-status --input "$TRANSITION_INPUT" --json >/dev/null
170
+ echo " $WORKER_NAME completed task $TASK_ID"
171
+ fi
172
+ done
173
+ echo ""
174
+
175
+ echo "[7/10] Testing mailbox communication..."
176
+ # Leader sends messages to workers
177
+ for i in $(seq 1 "$WORKER_COUNT"); do
178
+ SEND_INPUT="$(jq -nc \
179
+ --arg team "$TEAM_NAME" \
180
+ --arg to "worker-$i" \
181
+ --arg body "Hello from leader! Great work on the demo task." \
182
+ '{team_name:$team,from_worker:"leader-fixed",to_worker:$to,body:$body}')"
183
+ omx team api send-message --input "$SEND_INPUT" --json >/dev/null
184
+ echo " Sent message to worker-$i"
185
+ done
186
+
187
+ # Workers acknowledge
188
+ for i in $(seq 1 "$WORKER_COUNT"); do
189
+ WORKER_NAME="worker-$i"
190
+ MAILBOX_INPUT="$(jq -nc --arg team "$TEAM_NAME" --arg worker "$WORKER_NAME" '{team_name:$team,worker:$worker}')"
191
+ MAILBOX_JSON="$(omx team api mailbox-list --input "$MAILBOX_INPUT" --json)"
192
+ MESSAGE_COUNT="$(echo "$MAILBOX_JSON" | jq -r '.data.messages | length')"
193
+ echo " $WORKER_NAME has $MESSAGE_COUNT messages in mailbox"
194
+ done
195
+ echo ""
196
+
197
+ echo "[8/10] Broadcasting sync message to all workers..."
198
+ BROADCAST_INPUT="$(jq -nc \
199
+ --arg team "$TEAM_NAME" \
200
+ --arg body "Sync checkpoint: All workers verify tmux coordination complete" \
201
+ '{team_name:$team,from_worker:"leader-fixed",body:$body}')"
202
+ BROADCAST_RESULT="$(omx team api broadcast --input "$BROADCAST_INPUT" --json)"
203
+ BROADCAST_COUNT="$(echo "$BROADCAST_RESULT" | jq -r '.data.count')"
204
+ echo " Broadcasted to $BROADCAST_COUNT workers"
205
+ echo ""
206
+
207
+ echo "[9/10] Verifying team summary..."
208
+ SUMMARY_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')"
209
+ SUMMARY_JSON="$(omx team api get-summary --input "$SUMMARY_INPUT" --json)"
210
+ echo "$SUMMARY_JSON" | jq -e '.schema_version == "1.0" and .operation == "get-summary" and .ok == true' >/dev/null
211
+
212
+ # Extract and display summary stats
213
+ TOTAL_TASKS="$(echo "$SUMMARY_JSON" | jq -r '.data.summary.taskStatusById | length')"
214
+ COMPLETED_TASKS="$(echo "$SUMMARY_JSON" | jq -r '[.data.summary.taskStatusById[] | select(. == "completed")] | length')"
215
+ ALIVE_WORKERS="$(echo "$SUMMARY_JSON" | jq -r '[.data.summary.workerAliveByName[] | select(. == true)] | length')"
216
+ echo " Total tasks: $TOTAL_TASKS"
217
+ echo " Completed tasks: $COMPLETED_TASKS"
218
+ echo " Alive workers: $ALIVE_WORKERS"
219
+ echo ""
220
+
221
+ echo "[10/10] Shutting down team and cleaning up..."
222
+ omx team shutdown "$TEAM_NAME"
223
+ omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null
224
+ TEAM_STARTED=0
225
+ echo ""
226
+
227
+ echo "=========================================="
228
+ echo "Tmux Claude Workers Demo Complete!"
229
+ echo ""
230
+ echo "Summary:"
231
+ echo " - Spawned $WORKER_COUNT Claude workers in tmux panes"
232
+ echo " - Created and distributed $WORKER_COUNT tasks"
233
+ echo " - Demonstrated claim-safe task lifecycle"
234
+ echo " - Verified mailbox-based communication"
235
+ echo " - Tested broadcast messaging"
236
+ echo " - Clean shutdown and state cleanup"
237
+ echo ""
238
+ echo "The Claude workers were coordinated through the OMX"
239
+ echo "team orchestration system using tmux for process isolation"
240
+ echo "and the CLI interop API for state management."
241
+ echo "=========================================="
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # OMX Team E2E Demo Script
4
+ #
5
+ # This script demonstrates the tmux-based multi-agent orchestration system
6
+ # with mixed Codex/Claude workers. It performs a complete end-to-end test
7
+ # of team lifecycle, task management, and mailbox communication.
8
+ #
9
+ # Usage:
10
+ # ./scripts/demo-team-e2e.sh
11
+ #
12
+ # Environment Variables:
13
+ # WORKER_COUNT Number of workers (default: 6, minimum: 5)
14
+ # TEAM_TASK Task description (default: "e2e team demo <timestamp>")
15
+ # TEAM_NAME Team identifier (default: slugified TEAM_TASK)
16
+ # OMX_TEAM_WORKER_CLI Worker CLI mode (default: auto)
17
+ # OMX_TEAM_WORKER_CLI_MAP Comma-separated CLI assignments per worker
18
+ # OMX_TEAM_WORKER_LAUNCH_ARGS Arguments passed to worker CLIs
19
+ #
20
+ # Example:
21
+ # WORKER_COUNT=8 ./scripts/demo-team-e2e.sh
22
+ #
23
+ # shellcheck disable=SC2317 # Functions are called via trap
24
+
25
+ set -euo pipefail
26
+
27
+ readonly SCRIPT_VERSION="1.0.0"
28
+ readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
+
30
+ require_bin() {
31
+ if ! command -v "$1" >/dev/null 2>&1; then
32
+ echo "error: required command not found: $1" >&2
33
+ exit 1
34
+ fi
35
+ }
36
+
37
+ slugify() {
38
+ echo "$1" \
39
+ | tr '[:upper:]' '[:lower:]' \
40
+ | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-+/-/g' \
41
+ | cut -c1-30
42
+ }
43
+
44
+ build_default_cli_map() {
45
+ local count="$1"
46
+ # More claude than codex for mixed demos (emphasizes claude workers)
47
+ # For 6 workers: 2 codex, 4 claude
48
+ local pivot=$(((count - 1) / 2))
49
+ local entries=()
50
+ local i
51
+ for ((i = 1; i <= count; i++)); do
52
+ if ((i <= pivot)); then
53
+ entries+=("codex")
54
+ else
55
+ entries+=("claude")
56
+ fi
57
+ done
58
+ (IFS=,; echo "${entries[*]}")
59
+ }
60
+
61
+ require_bin omx
62
+ require_bin jq
63
+
64
+ WORKER_COUNT="${WORKER_COUNT:-6}"
65
+ if ! [[ "$WORKER_COUNT" =~ ^[0-9]+$ ]]; then
66
+ echo "error: WORKER_COUNT must be a positive integer (got: $WORKER_COUNT)" >&2
67
+ exit 1
68
+ fi
69
+ if ((WORKER_COUNT < 5)); then
70
+ echo "error: WORKER_COUNT must be >= 5 for this demo (got: $WORKER_COUNT)" >&2
71
+ exit 1
72
+ fi
73
+
74
+ # Validate CLI map length matches worker count when explicitly provided
75
+ if [[ -n "${OMX_TEAM_WORKER_CLI_MAP:-}" ]]; then
76
+ IFS=',' read -ra CLI_MAP_ENTRIES <<< "$OMX_TEAM_WORKER_CLI_MAP"
77
+ if (("${#CLI_MAP_ENTRIES[@]}" != WORKER_COUNT)); then
78
+ echo "error: OMX_TEAM_WORKER_CLI_MAP has ${#CLI_MAP_ENTRIES[@]} entries but WORKER_COUNT is $WORKER_COUNT" >&2
79
+ exit 1
80
+ fi
81
+ fi
82
+
83
+ TEAM_TASK="${TEAM_TASK:-e2e team demo $(date -u +%Y%m%d%H%M%S)}"
84
+ TEAM_NAME="${TEAM_NAME:-$(slugify "$TEAM_TASK")}"
85
+ OMX_TEAM_WORKER_CLI="${OMX_TEAM_WORKER_CLI:-auto}"
86
+ OMX_TEAM_WORKER_CLI_MAP="${OMX_TEAM_WORKER_CLI_MAP:-$(build_default_cli_map "$WORKER_COUNT")}"
87
+ OMX_TEAM_WORKER_LAUNCH_ARGS="${OMX_TEAM_WORKER_LAUNCH_ARGS:---model gpt-5.3-codex-spark -c model_reasoning_effort=\"low\"}"
88
+
89
+ TEAM_STARTED=0
90
+ cleanup() {
91
+ if ((TEAM_STARTED == 1)); then
92
+ echo "[cleanup] shutting down team: $TEAM_NAME"
93
+ omx team shutdown "$TEAM_NAME" >/dev/null 2>&1 || true
94
+ echo "[cleanup] cleaning state for team: $TEAM_NAME"
95
+ omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null 2>&1 || true
96
+ fi
97
+ }
98
+ trap cleanup EXIT
99
+
100
+ echo "== OMX Team E2E demo =="
101
+ echo "TEAM_TASK=$TEAM_TASK"
102
+ echo "TEAM_NAME=$TEAM_NAME"
103
+ echo "WORKER_COUNT=$WORKER_COUNT"
104
+ echo "OMX_TEAM_WORKER_CLI=$OMX_TEAM_WORKER_CLI"
105
+ echo "OMX_TEAM_WORKER_CLI_MAP=$OMX_TEAM_WORKER_CLI_MAP"
106
+ echo "OMX_TEAM_WORKER_LAUNCH_ARGS=$OMX_TEAM_WORKER_LAUNCH_ARGS"
107
+
108
+ echo "[1/8] start team (${WORKER_COUNT} mixed workers)"
109
+ omx team "${WORKER_COUNT}:executor" "$TEAM_TASK"
110
+ TEAM_STARTED=1
111
+
112
+ echo "[2/8] status"
113
+ omx team status "$TEAM_NAME"
114
+
115
+ echo "[3/8] create task"
116
+ CREATE_INPUT="$(jq -nc \
117
+ --arg team "$TEAM_NAME" \
118
+ --arg subject "one-shot lifecycle" \
119
+ --arg description "demo task" \
120
+ --arg owner "worker-1" \
121
+ '{team_name:$team,subject:$subject,description:$description,owner:$owner}')"
122
+ CREATE_JSON="$(omx team api create-task --input "$CREATE_INPUT" --json)"
123
+ TASK_ID="$(echo "$CREATE_JSON" | jq -r '.data.task.id // empty')"
124
+ if [[ -z "$TASK_ID" ]]; then
125
+ echo "error: failed to parse task id from create-task response" >&2
126
+ exit 1
127
+ fi
128
+ echo "task_id=$TASK_ID"
129
+
130
+ echo "[4/8] claim task"
131
+ CLAIM_INPUT="$(jq -nc \
132
+ --arg team "$TEAM_NAME" \
133
+ --arg task "$TASK_ID" \
134
+ --arg worker "worker-1" \
135
+ '{team_name:$team,task_id:$task,worker:$worker,expected_version:1}')"
136
+ CLAIM_JSON="$(omx team api claim-task --input "$CLAIM_INPUT" --json)"
137
+ CLAIM_TOKEN="$(echo "$CLAIM_JSON" | jq -r '.data.claimToken // empty')"
138
+ if [[ -z "$CLAIM_TOKEN" ]]; then
139
+ echo "error: failed to parse claimToken from claim-task response" >&2
140
+ exit 1
141
+ fi
142
+
143
+ echo "[5/8] transition task -> completed"
144
+ TRANSITION_INPUT="$(jq -nc \
145
+ --arg team "$TEAM_NAME" \
146
+ --arg task "$TASK_ID" \
147
+ --arg token "$CLAIM_TOKEN" \
148
+ '{team_name:$team,task_id:$task,from:"in_progress",to:"completed",claim_token:$token}')"
149
+ omx team api transition-task-status --input "$TRANSITION_INPUT" --json >/dev/null
150
+
151
+ echo "[6/8] mailbox flow"
152
+ SEND_INPUT="$(jq -nc \
153
+ --arg team "$TEAM_NAME" \
154
+ --arg body "ACK one-shot" \
155
+ '{team_name:$team,from_worker:"leader-fixed",to_worker:"worker-1",body:$body}')"
156
+ omx team api send-message --input "$SEND_INPUT" --json >/dev/null
157
+ MAILBOX_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team,worker:"worker-1"}')"
158
+ MAILBOX_JSON="$(omx team api mailbox-list --input "$MAILBOX_INPUT" --json)"
159
+ MESSAGE_ID="$(echo "$MAILBOX_JSON" | jq -r '.data.messages[0].id // empty')"
160
+ if [[ -n "$MESSAGE_ID" ]]; then
161
+ MARK_INPUT="$(jq -nc \
162
+ --arg team "$TEAM_NAME" \
163
+ --arg id "$MESSAGE_ID" \
164
+ '{team_name:$team,worker:"worker-1",message_id:$id}')"
165
+ omx team api mailbox-mark-notified --input "$MARK_INPUT" --json >/dev/null
166
+ omx team api mailbox-mark-delivered --input "$MARK_INPUT" --json >/dev/null
167
+ fi
168
+
169
+ echo "[7/8] summary envelope check"
170
+ SUMMARY_INPUT="$(jq -nc --arg team "$TEAM_NAME" '{team_name:$team}')"
171
+ SUMMARY_JSON="$(omx team api get-summary --input "$SUMMARY_INPUT" --json)"
172
+ echo "$SUMMARY_JSON" | jq -e '.schema_version == "1.0" and .operation == "get-summary" and .ok == true' >/dev/null
173
+
174
+ echo "[8/8] shutdown + cleanup"
175
+ omx team shutdown "$TEAM_NAME"
176
+ omx team api cleanup --input "{\"team_name\":\"$TEAM_NAME\"}" --json >/dev/null
177
+ TEAM_STARTED=0
178
+
179
+ echo "E2E demo complete."
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+
3
+ const [provider = '', ...rest] = process.argv.slice(2);
4
+ const prompt = rest.join(' ');
5
+
6
+ const stdout = process.env.OMX_ASK_STUB_STDOUT ?? `OUT:${provider}:${prompt}\n`;
7
+ const stderr = process.env.OMX_ASK_STUB_STDERR ?? '';
8
+ const exitCode = Number.parseInt(process.env.OMX_ASK_STUB_EXIT_CODE ?? '0', 10);
9
+
10
+ if (stdout.length > 0) process.stdout.write(stdout);
11
+ if (stderr.length > 0) process.stderr.write(stderr);
12
+ process.exit(Number.isFinite(exitCode) ? exitCode : 0);