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
@@ -0,0 +1,366 @@
1
+ ---
2
+ name: web-clone
3
+ description: URL-driven website cloning with visual + functional verification
4
+ ---
5
+
6
+ <Purpose>
7
+ Clone a target website from its URL, replicating both visual appearance and core interactive functionality. Uses Playwright MCP for live page extraction, LLM-driven code generation, and iterative verification with `$visual-verdict` for visual scoring.
8
+ </Purpose>
9
+
10
+ <Use_When>
11
+ - User provides a target URL and wants the site replicated as working code
12
+ - User says "clone site", "clone website", "copy webpage", or "web-clone"
13
+ - Task requires both visual fidelity AND functional parity with the original
14
+ - Reference is a live URL (not a static screenshot — use `$visual-verdict` for screenshot-only tasks)
15
+ </Use_When>
16
+
17
+ <Do_Not_Use_When>
18
+ - User only has screenshot references without a live URL — use `$visual-verdict` directly
19
+ - User wants to modify, redesign, or "improve" the site — use standard implementation flow
20
+ - Target requires authentication, payment flows, or backend API parity — out of scope for v1
21
+ - Multi-page / multi-route deep cloning — v1 handles single-page scope only
22
+ </Do_Not_Use_When>
23
+
24
+ <Scope_Limits>
25
+ **v1 scope**: Single page clone of the provided URL.
26
+
27
+ Included:
28
+ - Layout structure (header, nav, content areas, sidebar, footer)
29
+ - Typography (font families, sizes, weights, line heights)
30
+ - Colors, spacing, borders, border-radius
31
+ - Core interactions: navigation links, buttons, form elements, dropdowns, modals, toggles
32
+ - Responsive hints from the extracted layout (flexbox/grid patterns)
33
+
34
+ Excluded:
35
+ - Backend API integration or data fetching
36
+ - Authentication flows or protected content
37
+ - Dynamic/personalized content (user-specific data)
38
+ - Multi-page crawling or route graph cloning
39
+ - Third-party widget functionality (maps, embeds, chat widgets)
40
+ - Image/asset replication (use placeholders for external images)
41
+
42
+ **Legal notice**: Only clone sites you own or have explicit permission to replicate. Respect copyright and trademarks.
43
+ </Scope_Limits>
44
+
45
+ <Prerequisites>
46
+ Playwright MCP server must be available for browser automation.
47
+
48
+ 1. Before first tool use, call `ToolSearch("browser")` or `ToolSearch("playwright")` to discover available browser tools.
49
+ 2. If no browser tools are found, instruct the user:
50
+ ```
51
+ Playwright MCP is required. Configure it:
52
+ codex mcp add playwright npx "@playwright/mcp@latest"
53
+ ```
54
+ 3. Required tools: `browser_navigate`, `browser_snapshot`, `browser_take_screenshot`, `browser_evaluate`, `browser_wait_for`. Optional: `browser_click`, `browser_network_requests`.
55
+ </Prerequisites>
56
+
57
+ <Inputs>
58
+ - `target_url` (required): The URL to clone
59
+ - `output_dir` (optional, default: current working directory): Where to generate the clone project
60
+ - `tech_stack` (optional, inferred from project context): HTML/CSS/JS, React, Vue, Svelte, etc.
61
+ </Inputs>
62
+
63
+ <Tool_Usage>
64
+ - Before first MCP tool use, call `ToolSearch("browser")` or `ToolSearch("playwright")` to discover deferred Playwright MCP tools.
65
+ - If no browser tools are found, stop immediately and instruct the user to configure Playwright MCP.
66
+ - Use `browser_snapshot` (accessibility tree) for structural understanding — it is far more token-efficient than screenshots.
67
+ - Use `browser_take_screenshot` only when visual verification is needed (Pass 1 baseline, Pass 4 comparison).
68
+ - Use `browser_evaluate` for DOM/style extraction — pass the scripts from this skill EXACTLY as written (do not modify them).
69
+ - If running within ralph, use `state_write` / `state_read` for web-clone state persistence between iterations.
70
+ - Skip Codex consultation for straightforward extraction; use it only if verification repeatedly fails on the same issue.
71
+ </Tool_Usage>
72
+
73
+ <State_Management>
74
+ Persist extraction and progress data so the pipeline can resume if interrupted.
75
+
76
+ - **After Pass 1 completes**: Write extraction summary to `.omx/state/{scope}/web-clone-extraction.json` containing:
77
+ - `target_url`, `extracted_at` timestamp
78
+ - `screenshot_path` (path to `target-full.png`)
79
+ - `landmark_count` (number of nav, main, footer, form elements)
80
+ - `interactive_count` (number of detected interactive elements)
81
+ - `extraction_size_kb` (approximate size of DOM extraction data)
82
+ - **After each Pass 4 verification**: Append the composite verdict to `.omx/state/{scope}/web-clone-verdicts.json`.
83
+ - **When running within ralph**: Also persist the `visual` portion of the composite verdict to `.omx/state/{scope}/ralph-progress.json` for ralph compatibility, mapping `visual.score` → top-level `score` and `visual.verdict` → top-level `verdict`.
84
+ - **On completion or failure**: Write final status with `completed_at` or `failed_at` timestamp.
85
+ </State_Management>
86
+
87
+ <Context_Budget>
88
+ Pass 1 extraction can produce very large data. Apply these limits proactively:
89
+
90
+ - **DOM tree**: If the serialized JSON exceeds ~30KB, reduce `depth` parameter from 8 to 4 and re-extract. Focus on top-level structure.
91
+ - **Accessibility snapshot**: If it exceeds ~20KB, this is normal for complex pages. Summarize key landmarks rather than keeping the full tree.
92
+ - **Interactive elements**: Cap at 50 elements. If more exist, keep only visible ones (`isVisible: true`).
93
+ - **Total extraction context**: Aim for under 60KB combined. If exceeded, prioritize: screenshot > accessibility snapshot > interactive elements > DOM styles.
94
+ - **Image tokens**: Full-page screenshots are expensive. Take one baseline in Pass 1 and one comparison in Pass 4. Do not take screenshots between iterations unless debugging a specific region.
95
+ </Context_Budget>
96
+
97
+ <Steps>
98
+
99
+ ## Pass 1 — Extract
100
+
101
+ Capture the target page's structure, styles, interactions, and visual baseline.
102
+
103
+ 1. **Navigate**: `browser_navigate` to `target_url`.
104
+ 2. **Wait for render**: `browser_wait_for` with appropriate condition (network idle or timeout of 5s) to ensure full render including lazy-loaded content.
105
+ 3. **Accessibility snapshot**: `browser_snapshot` — captures the semantic tree (roles, names, values, interactive states). This is your primary structural reference.
106
+ 4. **Full-page screenshot**: `browser_take_screenshot` with `fullPage: true` — save as reference baseline `target-full.png`.
107
+ 5. **DOM + computed styles**: `browser_evaluate` with the following script. **COPY THIS SCRIPT EXACTLY — do not modify it**:
108
+ ```javascript
109
+ (() => {
110
+ const walk = (el, depth = 0) => {
111
+ if (depth > 8 || !el.tagName) return null;
112
+ const cs = window.getComputedStyle(el);
113
+ return {
114
+ tag: el.tagName.toLowerCase(),
115
+ id: el.id || undefined,
116
+ classes: [...el.classList].slice(0, 5),
117
+ styles: {
118
+ display: cs.display, position: cs.position,
119
+ width: cs.width, height: cs.height,
120
+ padding: cs.padding, margin: cs.margin,
121
+ fontSize: cs.fontSize, fontFamily: cs.fontFamily,
122
+ fontWeight: cs.fontWeight, lineHeight: cs.lineHeight,
123
+ color: cs.color, backgroundColor: cs.backgroundColor,
124
+ border: cs.border, borderRadius: cs.borderRadius,
125
+ flexDirection: cs.flexDirection, justifyContent: cs.justifyContent,
126
+ alignItems: cs.alignItems, gap: cs.gap,
127
+ gridTemplateColumns: cs.gridTemplateColumns,
128
+ },
129
+ text: el.childNodes.length === 1 && el.childNodes[0].nodeType === 3
130
+ ? el.textContent?.trim().slice(0, 100) : undefined,
131
+ children: [...el.children].map(c => walk(c, depth + 1)).filter(Boolean),
132
+ };
133
+ };
134
+ return walk(document.body);
135
+ })()
136
+ ```
137
+ 6. **Interactive elements**: `browser_evaluate` to catalog all interactable elements. **COPY THIS SCRIPT EXACTLY — do not modify it**:
138
+ ```javascript
139
+ (() => {
140
+ const results = [];
141
+ document.querySelectorAll(
142
+ 'button, a[href], input, select, textarea, [role="button"], ' +
143
+ '[onclick], [aria-haspopup], [aria-expanded], details, dialog'
144
+ ).forEach(el => {
145
+ results.push({
146
+ tag: el.tagName.toLowerCase(),
147
+ type: el.type || el.getAttribute('role') || 'interactive',
148
+ text: (el.textContent || '').trim().slice(0, 80),
149
+ href: el.href || undefined,
150
+ ariaLabel: el.getAttribute('aria-label') || undefined,
151
+ isVisible: el.offsetParent !== null,
152
+ });
153
+ });
154
+ return results;
155
+ })()
156
+ ```
157
+ 7. **Network patterns** (optional): `browser_network_requests` — note XHR/fetch calls for reference. Do not attempt to replicate backends.
158
+
159
+ Keep all extraction results in working memory for Pass 2.
160
+
161
+ ## Pass 2 — Build Plan
162
+
163
+ Analyze extraction results and decompose into a component plan.
164
+
165
+ 1. **Identify page regions**: From DOM tree + accessibility snapshot, identify major sections:
166
+ - Navigation bar / header
167
+ - Hero / banner section
168
+ - Main content area(s)
169
+ - Sidebar (if present)
170
+ - Footer
171
+ - Overlay elements (modals, drawers)
172
+
173
+ 2. **Map components**: For each region, define:
174
+ - Component name and responsibility
175
+ - Key style properties (from computed styles)
176
+ - Content summary (headings, text, images)
177
+ - Child components if nested
178
+
179
+ 3. **Create interaction map**: From interactive elements list:
180
+ - Navigation links → anchor tags with `href`
181
+ - Form elements → proper `<form>` with inputs, labels, validation
182
+ - Buttons → click handlers (toggle, submit, navigate)
183
+ - Dropdowns/modals → show/hide toggle with transitions
184
+ - Accordions/tabs → state-based visibility
185
+
186
+ 4. **Extract design tokens**: Identify recurring values:
187
+ - Color palette (primary, secondary, background, text colors)
188
+ - Font stack (families, size scale, weight scale)
189
+ - Spacing scale (padding/margin patterns)
190
+ - Border radius values
191
+
192
+ 5. **Define file structure**:
193
+ ```
194
+ {output_dir}/
195
+ ├── index.html (or App.tsx / App.vue)
196
+ ├── styles/
197
+ │ ├── globals.css (reset + tokens)
198
+ │ └── components.css (or scoped styles)
199
+ ├── scripts/
200
+ │ └── interactions.js (toggle, modal, dropdown logic)
201
+ └── assets/ (placeholder images)
202
+ ```
203
+ Adapt to `tech_stack` if specified (React components, Vue SFCs, etc.).
204
+
205
+ ## Pass 3 — Generate Clone
206
+
207
+ Implement the clone from the plan. Work component-by-component.
208
+
209
+ 1. **Scaffold**: Create the directory structure and base files.
210
+ 2. **Design tokens first**: Implement CSS custom properties or Tailwind config from extracted tokens.
211
+ 3. **Layout shell**: Build the page-level layout matching the original's flexbox/grid structure.
212
+ 4. **Components**: Implement each region top-down:
213
+ - Match DOM structure from extraction (semantic tags, landmark roles)
214
+ - Apply computed styles — prioritize layout properties, then typography, then decorative
215
+ - Use actual extracted text content; use placeholder `<img>` for external images
216
+ 5. **Interactions**: Wire up detected behaviors:
217
+ - Navigation: working `<a>` tags (to `#` anchors or stubs for v1)
218
+ - Forms: proper structure with `<label>`, input types, placeholder text
219
+ - Toggles: JavaScript for dropdowns, modals, accordions
220
+ - Hover/focus states: CSS transitions matching original behavior
221
+ 6. **Responsive**: If the original uses responsive breakpoints (detectable from media queries in computed styles or from viewport behavior), add basic responsive rules.
222
+
223
+ ## Pass 4 — Verify
224
+
225
+ Compare the clone against the original across three dimensions.
226
+
227
+ 1. **Serve the clone**: Start a local server for the generated project:
228
+ ```bash
229
+ npx serve {output_dir} -l 3456 --no-clipboard
230
+ ```
231
+ If `npx serve` is unavailable, fall back to: `python3 -m http.server 3456 -d {output_dir}`.
232
+ The clone will be accessible at `http://localhost:3456`.
233
+ 2. **Visual verification**:
234
+ - Navigate to the clone with Playwright: `browser_navigate` to clone URL.
235
+ - Take full-page screenshot of clone.
236
+ - Run `$visual-verdict` with: `reference_images=["target-full.png"]`, `generated_screenshot="clone-full.png"`, `category_hint="web-clone"`.
237
+ - The visual portion of the verdict feeds directly into the composite verdict below.
238
+ - Visual pass threshold: **score >= 85**.
239
+
240
+ 3. **Structural verification**: Compare landmark counts:
241
+ - Count `<nav>`, `<main>`, `<footer>`, `<form>`, `<button>`, `<a>` in both original and clone.
242
+ - Structure passes when all major landmarks exist (missing landmarks = fail).
243
+
244
+ 4. **Functional spot-check**: Test 2–3 detected interactions via Playwright:
245
+ - Click a navigation link → verify URL change or scroll behavior
246
+ - Toggle a dropdown/modal → verify visibility change
247
+ - Interact with a form field → verify it accepts input
248
+ - Use `browser_click` and `browser_snapshot` to verify state changes.
249
+
250
+ 5. **Emit composite verdict**:
251
+
252
+ ```json
253
+ {
254
+ "visual": {
255
+ "score": 82,
256
+ "verdict": "revise",
257
+ "category_match": true,
258
+ "differences": ["Header spacing tighter than original"],
259
+ "suggestions": ["Increase nav gap to 24px"]
260
+ },
261
+ "functional": {
262
+ "tested": 3,
263
+ "passed": 2,
264
+ "failures": ["Dropdown does not open on click"]
265
+ },
266
+ "structure": {
267
+ "landmark_match": true,
268
+ "missing": [],
269
+ "extra": []
270
+ },
271
+ "overall_verdict": "revise",
272
+ "priority_fixes": [
273
+ "Fix dropdown toggle interaction",
274
+ "Increase header nav spacing"
275
+ ]
276
+ }
277
+ ```
278
+
279
+ ## Pass 5 — Iterate
280
+
281
+ Fix highest-impact issues and re-verify.
282
+
283
+ 1. **Prioritize fixes** by impact: layout > interactions > spacing > typography > colors.
284
+ 2. **Apply targeted edits**: Fix only the issues listed in `priority_fixes`. Do not refactor working code.
285
+ 3. **Re-verify**: Repeat Pass 4.
286
+ 4. **Loop**: Continue until `overall_verdict` is `pass` OR max **5 iterations** reached.
287
+ 5. **Final report**: Summarize what was successfully cloned, any remaining differences, and elements that could not be replicated.
288
+
289
+ </Steps>
290
+
291
+ <Output_Contract>
292
+ After each verification pass, emit a **composite web-clone verdict** JSON:
293
+
294
+ ```json
295
+ {
296
+ "visual": {
297
+ "score": 0,
298
+ "verdict": "revise",
299
+ "category_match": false,
300
+ "differences": ["..."],
301
+ "suggestions": ["..."],
302
+ "reasoning": "short explanation"
303
+ },
304
+ "functional": {
305
+ "tested": 0,
306
+ "passed": 0,
307
+ "failures": ["..."]
308
+ },
309
+ "structure": {
310
+ "landmark_match": false,
311
+ "missing": ["..."],
312
+ "extra": ["..."]
313
+ },
314
+ "overall_verdict": "revise",
315
+ "priority_fixes": ["..."]
316
+ }
317
+ ```
318
+
319
+ Rules:
320
+ - `visual` follows the `VisualVerdict` shape from `$visual-verdict`
321
+ - `functional.tested/passed` are counts; `failures` list specific interaction failures
322
+ - `structure.landmark_match` is `true` when all major HTML landmarks (nav, main, footer, forms) are present
323
+ - `overall_verdict`: `pass` when visual.score >= 85 AND functional.failures is empty AND structure.landmark_match is true
324
+ - `priority_fixes`: ordered by impact, drives the next iteration
325
+ </Output_Contract>
326
+
327
+ <Iteration_Thresholds>
328
+ - **Visual pass**: score >= 85
329
+ - **Functional pass**: zero failures on tested interactions
330
+ - **Structure pass**: all major landmarks present
331
+ - **Overall pass**: all three dimensions pass
332
+ - **Max iterations**: 5 (report best achieved result if threshold not met)
333
+ </Iteration_Thresholds>
334
+
335
+ <Error_Handling>
336
+ - **Playwright MCP unavailable**: Stop. Instruct user to configure it. Do not attempt to clone without browser tools.
337
+ - **Page fails to load**: Report the URL and HTTP status. Suggest the user verify the URL is accessible.
338
+ - **browser_evaluate returns empty**: The page may use heavy client-side rendering. Wait longer (`browser_wait_for` with extended timeout) and retry once.
339
+ - **Visual score stuck below threshold after 3 iterations**: Report the current state as best-effort. List the unresolved differences for the user.
340
+ - **Extraction data too large for context**: Truncate deep DOM branches (depth > 6). Focus on top-level structure and defer nested details to iteration fixes.
341
+ </Error_Handling>
342
+
343
+ <Example>
344
+ **User**: "Clone https://news.ycombinator.com"
345
+
346
+ **Pass 1**: Navigate to HN. Extract: table-based layout, orange (#ff6600) nav bar, story list with links + points + comments, footer. Screenshot saved.
347
+
348
+ **Pass 2**: Regions: nav bar (logo + links), story table (30 rows × title + meta), footer. Tokens: orange #ff6600, gray #828282, Verdana font, 10pt base. Interaction map: story links (external), comment links, "more" pagination.
349
+
350
+ **Pass 3**: Generate index.html with HN-style table layout, CSS matching extracted colors/fonts, working `<a>` tags for stories.
351
+
352
+ **Pass 4**: Visual score=78 (font size off, spacing between stories too tight). Functional 2/2 (links work). Structure match=true.
353
+
354
+ **Pass 5 iteration 1**: Fix font to Verdana 10pt, increase row padding → score=88. Functional 2/2. Structure match. → `overall_verdict: pass`. Done.
355
+ </Example>
356
+
357
+ <Final_Checklist>
358
+ - [ ] Pass 1 extraction completed and summarized (screenshot + accessibility tree + DOM styles + interactions)
359
+ - [ ] Pass 2 component plan created with file structure
360
+ - [ ] Pass 3 clone generated and files written to `output_dir`
361
+ - [ ] Clone serves locally without errors
362
+ - [ ] Pass 4 composite verdict emitted with all three dimensions
363
+ - [ ] `overall_verdict` is `pass`, or max 5 iterations reached with best-effort report
364
+ - [ ] When in ralph: visual verdict persisted to `ralph-progress.json`
365
+ - [ ] Extraction summary persisted to `web-clone-extraction.json`
366
+ </Final_Checklist>
@@ -15,22 +15,37 @@ You MUST be running with `OMX_TEAM_WORKER` set. It looks like:
15
15
 
16
16
  Example: `alpha/worker-2`
17
17
 
18
+ ## Load Worker Skill Path (Claude/Codex)
19
+
20
+ When a worker inbox tells you to load this skill, resolve the first existing path:
21
+
22
+ 1. `${CODEX_HOME:-~/.codex}/skills/worker/SKILL.md`
23
+ 2. `~/.agents/skills/worker/SKILL.md`
24
+ 3. `<leader_cwd>/.agents/skills/worker/SKILL.md`
25
+ 4. `<leader_cwd>/skills/worker/SKILL.md` (repo fallback)
26
+
18
27
  ## Startup Protocol (ACK)
19
28
 
20
29
  1. Parse `OMX_TEAM_WORKER` into:
21
30
  - `teamName` (before the `/`)
22
31
  - `workerName` (after the `/`, usually `worker-<n>`)
23
- 2. Send an ACK to the lead mailbox:
32
+ 2. Send a startup ACK to the lead mailbox **before task work**:
24
33
  - Recipient worker id: `leader-fixed`
25
- - Body: one short line including your workerName and what you’re ready to do.
34
+ - Body: one short deterministic line (recommended: `ACK: <workerName> initialized`).
26
35
  3. After ACK, proceed to your inbox instructions.
27
36
 
28
37
  The lead will see your message in:
29
38
 
30
39
  `<team_state_root>/team/<teamName>/mailbox/leader-fixed.json`
31
40
 
32
- Use the MCP tool:
33
- - `team_send_message` with `{team_name, from_worker, to_worker:"leader-fixed", body}`
41
+ Use CLI interop:
42
+ - `omx team api send-message --input <json> --json` with `{team_name, from_worker, to_worker:"leader-fixed", body}`
43
+
44
+ Copy/paste template:
45
+
46
+ ```bash
47
+ omx team api send-message --input "{\"team_name\":\"<teamName>\",\"from_worker\":\"<workerName>\",\"to_worker\":\"leader-fixed\",\"body\":\"ACK: <workerName> initialized\"}" --json
48
+ ```
34
49
 
35
50
  ## Inbox + Tasks
36
51
 
@@ -47,11 +62,12 @@ Use the MCP tool:
47
62
  5. Task id format:
48
63
  - The MCP/state API uses the numeric id (`"1"`), not `"task-1"`.
49
64
  - Never use legacy `tasks/{id}.json` wording.
50
- 6. Claim the task (do NOT start work without a claim). Use the team state APIs described in your inbox/overlay.
65
+ 6. Claim the task (do NOT start work without a claim) using claim-safe lifecycle CLI interop (`omx team api claim-task --json`).
51
66
  7. Do the work.
52
- 8. Write completion to the task file:
53
- - `{"status":"completed","result":"..."}` or `{"status":"failed","error":"..."}`
54
- 9. Update your worker status:
67
+ 8. Complete/fail the task via lifecycle transition CLI interop (`omx team api transition-task-status --json`) from `in_progress` to `completed` or `failed`.
68
+ - Do NOT directly write lifecycle fields (`status`, `owner`, `result`, `error`) in task files.
69
+ 9. Use `omx team api release-task-claim --json` only for rollback/requeue to `pending` (not for completion).
70
+ 10. Update your worker status:
55
71
  `<team_state_root>/team/<teamName>/workers/<workerName>/status.json` with `{"state":"idle", ...}`
56
72
 
57
73
  ## Mailbox
@@ -66,9 +82,24 @@ Note: leader dispatch is state-first. The durable queue lives at:
66
82
  `<team_state_root>/team/<teamName>/dispatch/requests.json`
67
83
  Hooks/watchers may nudge you after mailbox/inbox state is already written.
68
84
 
69
- Use MCP tools:
70
- - `team_mailbox_list` to read
71
- - `team_mailbox_mark_delivered` to acknowledge delivery
85
+ Use CLI interop:
86
+ - `omx team api mailbox-list --json` to read
87
+ - `omx team api mailbox-mark-delivered --json` to acknowledge delivery
88
+
89
+ Copy/paste templates:
90
+
91
+ ```bash
92
+ omx team api mailbox-list --input "{\"team_name\":\"<teamName>\",\"worker\":\"<workerName>\"}" --json
93
+ omx team api mailbox-mark-delivered --input "{\"team_name\":\"<teamName>\",\"worker\":\"<workerName>\",\"message_id\":\"<MESSAGE_ID>\"}" --json
94
+ ```
95
+
96
+ ## Dispatch Discipline (state-first)
97
+
98
+ Worker sessions should treat team state + CLI interop as the source of truth.
99
+
100
+ - Prefer inbox/mailbox/task state and `omx team api ... --json` operations.
101
+ - Do **not** rely on ad-hoc tmux keystrokes as a primary delivery channel.
102
+ - If a manual trigger arrives (for example `tmux send-keys` nudge), treat it only as a prompt to re-check state and continue through the normal claim-safe lifecycle.
72
103
 
73
104
  ## Shutdown
74
105
 
@@ -150,6 +150,7 @@ Do not ask for confirmation — just read the skill file and follow its instruct
150
150
  | "autopilot", "build me", "I want a" | `$autopilot` | Read `~/.agents/skills/autopilot/SKILL.md`, execute autonomous pipeline |
151
151
  | "ultrawork", "ulw", "parallel" | `$ultrawork` | Read `~/.agents/skills/ultrawork/SKILL.md`, execute parallel agents |
152
152
  | "plan this", "plan the", "let's plan" | `$plan` | Read `~/.agents/skills/plan/SKILL.md`, start planning workflow |
153
+ | "interview", "deep interview", "gather requirements", "interview me", "don't assume", "ouroboros" | `$deep-interview` | Read `~/.agents/skills/deep-interview/SKILL.md`, run Ouroboros-inspired Socratic ambiguity-gated interview workflow |
153
154
  | "ralplan", "consensus plan" | `$ralplan` | Read `~/.agents/skills/ralplan/SKILL.md`, start consensus planning with RALPLAN-DR structured deliberation (short by default, `--deliberate` for high-risk) |
154
155
  | "team", "swarm", "coordinated team", "coordinated swarm" | `$team` | Read `~/.agents/skills/team/SKILL.md`, start team orchestration (swarm compatibility alias) |
155
156
  | "ecomode", "eco", "budget" | `$ecomode` | Read `~/.agents/skills/ecomode/SKILL.md`, enable token-efficient mode |
@@ -158,6 +159,7 @@ Do not ask for confirmation — just read the skill file and follow its instruct
158
159
  | "fix build", "type errors" | `$build-fix` | Read `~/.agents/skills/build-fix/SKILL.md`, fix build errors |
159
160
  | "review code" | `$code-review` | Read `~/.agents/skills/code-review/SKILL.md`, run code review |
160
161
  | "security review" | `$security-review` | Read `~/.agents/skills/security-review/SKILL.md`, run security audit |
162
+ | "web-clone", "clone site", "clone website", "copy webpage" | `$web-clone` | Read `~/.agents/skills/web-clone/SKILL.md`, start website cloning pipeline |
161
163
 
162
164
  Detection rules:
163
165
  - Keywords are case-insensitive and match anywhere in the user's message
@@ -180,11 +182,14 @@ Workflow Skills:
180
182
  - `autopilot`: Full autonomous execution from idea to working code
181
183
  - `ralph`: Self-referential persistence loop with verification
182
184
  - `ultrawork`: Maximum parallelism with parallel agent orchestration
185
+ - `visual-verdict`: Structured visual QA verdict loop for screenshot/reference comparisons
186
+ - `web-clone`: URL-driven website cloning with visual + functional verification
183
187
  - `ecomode`: Token-efficient execution using lightweight models
184
188
  - `team`: N coordinated agents on shared task list
185
189
  - `swarm`: N coordinated agents on shared task list (compatibility facade over team)
186
190
  - `ultraqa`: QA cycling -- test, verify, fix, repeat
187
191
  - `plan`: Strategic planning with optional RALPLAN-DR consensus mode
192
+ - `deep-interview`: Socratic deep interview with Ouroboros-inspired mathematical ambiguity gating before execution
188
193
  - `ralplan`: Iterative consensus planning with RALPLAN-DR structured deliberation (planner + architect + critic); supports `--deliberate` for high-risk work
189
194
 
190
195
  Agent Shortcuts:
@@ -285,6 +290,10 @@ Parallelization:
285
290
  - Use background execution for installs, builds, and tests.
286
291
  - Prefer Team mode as the primary parallel execution surface. Use ad hoc parallelism only when Team overhead is disproportionate to the task.
287
292
 
293
+ Visual iteration gate:
294
+ - For visual tasks (reference image(s) + generated screenshot), run `$visual-verdict` every iteration before the next edit.
295
+ - Persist visual verdict JSON in `.omx/state/{scope}/ralph-progress.json` with both numeric (`score`, threshold pass/fail) and qualitative (`reasoning`, `differences`, `suggestions`, `next_actions`) feedback.
296
+
288
297
  Continuation:
289
298
  Before concluding, confirm: zero pending tasks, all features working, tests passing, zero errors, verification evidence collected. If any item is unchecked, continue working.
290
299
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "catalogVersion": "2026.02.20.1",
3
+ "catalogVersion": "2026.02.28.1",
4
4
  "skills": [
5
5
  {
6
6
  "name": "autopilot",
@@ -33,7 +33,7 @@
33
33
  {
34
34
  "name": "ecomode",
35
35
  "category": "execution",
36
- "status": "deprecated",
36
+ "status": "merged",
37
37
  "canonical": "ultrawork",
38
38
  "core": false,
39
39
  "internalRequired": false
@@ -69,6 +69,13 @@
69
69
  "core": true,
70
70
  "internalRequired": false
71
71
  },
72
+ {
73
+ "name": "deep-interview",
74
+ "category": "planning",
75
+ "status": "active",
76
+ "core": false,
77
+ "internalRequired": false
78
+ },
72
79
  {
73
80
  "name": "analyze",
74
81
  "category": "shortcut",
@@ -117,6 +124,22 @@
117
124
  "core": false,
118
125
  "internalRequired": false
119
126
  },
127
+ {
128
+ "name": "visual-verdict",
129
+ "category": "shortcut",
130
+ "status": "active",
131
+ "canonical": "vision",
132
+ "core": false,
133
+ "internalRequired": false
134
+ },
135
+ {
136
+ "name": "web-clone",
137
+ "category": "shortcut",
138
+ "status": "active",
139
+ "canonical": "vision",
140
+ "core": false,
141
+ "internalRequired": false
142
+ },
120
143
  {
121
144
  "name": "frontend-ui-ux",
122
145
  "category": "shortcut",
@@ -142,74 +165,72 @@
142
165
  "internalRequired": false
143
166
  },
144
167
  {
145
- "name": "cancel",
146
- "category": "utility",
168
+ "name": "ask-claude",
169
+ "category": "shortcut",
147
170
  "status": "active",
148
171
  "core": false,
149
172
  "internalRequired": false
150
173
  },
151
174
  {
152
- "name": "doctor",
153
- "category": "utility",
175
+ "name": "ask-gemini",
176
+ "category": "shortcut",
154
177
  "status": "active",
155
178
  "core": false,
156
179
  "internalRequired": false
157
180
  },
158
181
  {
159
- "name": "help",
182
+ "name": "cancel",
160
183
  "category": "utility",
161
184
  "status": "active",
162
185
  "core": false,
163
186
  "internalRequired": false
164
187
  },
165
188
  {
166
- "name": "note",
189
+ "name": "doctor",
167
190
  "category": "utility",
168
191
  "status": "active",
169
192
  "core": false,
170
193
  "internalRequired": false
171
194
  },
172
195
  {
173
- "name": "trace",
196
+ "name": "help",
174
197
  "category": "utility",
175
198
  "status": "active",
176
199
  "core": false,
177
200
  "internalRequired": false
178
201
  },
179
202
  {
180
- "name": "skill",
203
+ "name": "note",
181
204
  "category": "utility",
182
205
  "status": "active",
183
206
  "core": false,
184
207
  "internalRequired": false
185
208
  },
186
209
  {
187
- "name": "hud",
210
+ "name": "trace",
188
211
  "category": "utility",
189
212
  "status": "active",
190
213
  "core": false,
191
214
  "internalRequired": false
192
215
  },
193
216
  {
194
- "name": "omx-setup",
217
+ "name": "skill",
195
218
  "category": "utility",
196
219
  "status": "active",
197
220
  "core": false,
198
221
  "internalRequired": false
199
222
  },
200
223
  {
201
- "name": "configure-telegram",
224
+ "name": "hud",
202
225
  "category": "utility",
203
- "status": "merged",
204
- "canonical": "omx-setup",
226
+ "status": "active",
205
227
  "core": false,
206
228
  "internalRequired": false
207
229
  },
208
230
  {
209
- "name": "configure-discord",
231
+ "name": "omx-setup",
210
232
  "category": "utility",
211
- "status": "merged",
212
- "canonical": "omx-setup",
233
+ "status": "active",
213
234
  "core": false,
214
235
  "internalRequired": false
215
236
  },