oh-my-codex 0.7.5 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/README.de.md +314 -0
  2. package/README.es.md +295 -17
  3. package/README.fr.md +314 -0
  4. package/README.it.md +314 -0
  5. package/README.ja.md +296 -18
  6. package/README.ko.md +295 -17
  7. package/README.md +68 -3
  8. package/README.pt.md +295 -17
  9. package/README.ru.md +295 -17
  10. package/README.tr.md +314 -0
  11. package/README.vi.md +296 -18
  12. package/README.zh.md +292 -17
  13. package/dist/catalog/__tests__/generator.test.js +2 -0
  14. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  15. package/dist/catalog/__tests__/schema.test.js +7 -0
  16. package/dist/catalog/__tests__/schema.test.js.map +1 -1
  17. package/dist/cli/__tests__/ask.test.d.ts +2 -0
  18. package/dist/cli/__tests__/ask.test.d.ts.map +1 -0
  19. package/dist/cli/__tests__/ask.test.js +236 -0
  20. package/dist/cli/__tests__/ask.test.js.map +1 -0
  21. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts +2 -0
  22. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts.map +1 -0
  23. package/dist/cli/__tests__/doctor-warning-copy.test.js +45 -0
  24. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -0
  25. package/dist/cli/__tests__/index.test.js +43 -1
  26. package/dist/cli/__tests__/index.test.js.map +1 -1
  27. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts +2 -0
  28. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts.map +1 -0
  29. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +15 -0
  30. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -0
  31. package/dist/cli/__tests__/ralph.test.d.ts +2 -0
  32. package/dist/cli/__tests__/ralph.test.d.ts.map +1 -0
  33. package/dist/cli/__tests__/ralph.test.js +40 -0
  34. package/dist/cli/__tests__/ralph.test.js.map +1 -0
  35. package/dist/cli/__tests__/setup-scope.test.js +2 -0
  36. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  37. package/dist/cli/__tests__/team-decompose.test.d.ts +2 -0
  38. package/dist/cli/__tests__/team-decompose.test.d.ts.map +1 -0
  39. package/dist/cli/__tests__/team-decompose.test.js +67 -0
  40. package/dist/cli/__tests__/team-decompose.test.js.map +1 -0
  41. package/dist/cli/__tests__/version.test.d.ts +2 -0
  42. package/dist/cli/__tests__/version.test.d.ts.map +1 -0
  43. package/dist/cli/__tests__/version.test.js +21 -0
  44. package/dist/cli/__tests__/version.test.js.map +1 -0
  45. package/dist/cli/ask.d.ts +13 -0
  46. package/dist/cli/ask.d.ts.map +1 -0
  47. package/dist/cli/ask.js +174 -0
  48. package/dist/cli/ask.js.map +1 -0
  49. package/dist/cli/constants.d.ts +10 -0
  50. package/dist/cli/constants.d.ts.map +1 -0
  51. package/dist/cli/constants.js +10 -0
  52. package/dist/cli/constants.js.map +1 -0
  53. package/dist/cli/doctor.js +16 -5
  54. package/dist/cli/doctor.js.map +1 -1
  55. package/dist/cli/index.d.ts +7 -1
  56. package/dist/cli/index.d.ts.map +1 -1
  57. package/dist/cli/index.js +117 -43
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/ralph.d.ts +4 -0
  60. package/dist/cli/ralph.d.ts.map +1 -1
  61. package/dist/cli/ralph.js +89 -13
  62. package/dist/cli/ralph.js.map +1 -1
  63. package/dist/cli/setup.js +1 -1
  64. package/dist/cli/setup.js.map +1 -1
  65. package/dist/cli/team.d.ts +18 -0
  66. package/dist/cli/team.d.ts.map +1 -1
  67. package/dist/cli/team.js +108 -16
  68. package/dist/cli/team.js.map +1 -1
  69. package/dist/config/generator.d.ts.map +1 -1
  70. package/dist/config/generator.js +8 -0
  71. package/dist/config/generator.js.map +1 -1
  72. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts +2 -0
  73. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts.map +1 -0
  74. package/dist/hooks/__tests__/deep-interview-contract.test.js +55 -0
  75. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -0
  76. package/dist/hooks/__tests__/emulator.test.js +6 -0
  77. package/dist/hooks/__tests__/emulator.test.js.map +1 -1
  78. package/dist/hooks/__tests__/keyword-detector.test.js +44 -22
  79. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  80. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +59 -0
  81. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  82. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +88 -0
  83. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  84. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +199 -0
  85. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  86. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.d.ts +11 -0
  87. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.d.ts.map +1 -0
  88. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js +266 -0
  89. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js.map +1 -0
  90. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts +2 -0
  91. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts.map +1 -0
  92. package/dist/hooks/__tests__/openclaw-setup-contract.test.js +51 -0
  93. package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -0
  94. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts +2 -0
  95. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts.map +1 -0
  96. package/dist/hooks/__tests__/pre-context-gate-skills.test.js +34 -0
  97. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -0
  98. package/dist/hooks/__tests__/tmux-hook-engine.test.js +36 -1
  99. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
  100. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts +2 -0
  101. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts.map +1 -0
  102. package/dist/hooks/__tests__/visual-verdict-loop.test.js +35 -0
  103. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -0
  104. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  105. package/dist/hooks/agents-overlay.js +18 -16
  106. package/dist/hooks/agents-overlay.js.map +1 -1
  107. package/dist/hooks/codebase-map.d.ts.map +1 -1
  108. package/dist/hooks/codebase-map.js +6 -2
  109. package/dist/hooks/codebase-map.js.map +1 -1
  110. package/dist/hooks/emulator.d.ts.map +1 -1
  111. package/dist/hooks/emulator.js +2 -0
  112. package/dist/hooks/emulator.js.map +1 -1
  113. package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
  114. package/dist/hooks/extensibility/sdk.js +2 -1
  115. package/dist/hooks/extensibility/sdk.js.map +1 -1
  116. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  117. package/dist/hooks/keyword-registry.js +6 -0
  118. package/dist/hooks/keyword-registry.js.map +1 -1
  119. package/dist/hud/index.d.ts.map +1 -1
  120. package/dist/hud/index.js +2 -24
  121. package/dist/hud/index.js.map +1 -1
  122. package/dist/mcp/__tests__/team-server-cleanup.test.d.ts +2 -0
  123. package/dist/mcp/__tests__/team-server-cleanup.test.d.ts.map +1 -0
  124. package/dist/mcp/__tests__/team-server-cleanup.test.js +219 -0
  125. package/dist/mcp/__tests__/team-server-cleanup.test.js.map +1 -0
  126. package/dist/mcp/bootstrap.d.ts +1 -1
  127. package/dist/mcp/bootstrap.d.ts.map +1 -1
  128. package/dist/mcp/bootstrap.js +1 -0
  129. package/dist/mcp/bootstrap.js.map +1 -1
  130. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  131. package/dist/mcp/code-intel-server.js +18 -8
  132. package/dist/mcp/code-intel-server.js.map +1 -1
  133. package/dist/mcp/memory-server.js +72 -11
  134. package/dist/mcp/memory-server.js.map +1 -1
  135. package/dist/mcp/state-paths.d.ts.map +1 -1
  136. package/dist/mcp/state-paths.js +4 -1
  137. package/dist/mcp/state-paths.js.map +1 -1
  138. package/dist/mcp/state-server.d.ts.map +1 -1
  139. package/dist/mcp/state-server.js +18 -5
  140. package/dist/mcp/state-server.js.map +1 -1
  141. package/dist/mcp/team-server.d.ts +24 -0
  142. package/dist/mcp/team-server.d.ts.map +1 -0
  143. package/dist/mcp/team-server.js +425 -0
  144. package/dist/mcp/team-server.js.map +1 -0
  145. package/dist/mcp/trace-server.d.ts.map +1 -1
  146. package/dist/mcp/trace-server.js +8 -3
  147. package/dist/mcp/trace-server.js.map +1 -1
  148. package/dist/notifications/__tests__/verbosity.test.js +35 -0
  149. package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
  150. package/dist/notifications/config.d.ts.map +1 -1
  151. package/dist/notifications/config.js +12 -3
  152. package/dist/notifications/config.js.map +1 -1
  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/reply-listener.d.ts.map +1 -1
  157. package/dist/notifications/reply-listener.js +6 -2
  158. package/dist/notifications/reply-listener.js.map +1 -1
  159. package/dist/notifications/session-registry.d.ts.map +1 -1
  160. package/dist/notifications/session-registry.js +2 -2
  161. package/dist/notifications/session-registry.js.map +1 -1
  162. package/dist/notifications/tmux.d.ts.map +1 -1
  163. package/dist/notifications/tmux.js +13 -4
  164. package/dist/notifications/tmux.js.map +1 -1
  165. package/dist/notifications/types.d.ts +4 -0
  166. package/dist/notifications/types.d.ts.map +1 -1
  167. package/dist/openclaw/__tests__/index.test.js +40 -0
  168. package/dist/openclaw/__tests__/index.test.js.map +1 -1
  169. package/dist/openclaw/dispatcher.d.ts.map +1 -1
  170. package/dist/openclaw/dispatcher.js +5 -2
  171. package/dist/openclaw/dispatcher.js.map +1 -1
  172. package/dist/openclaw/index.d.ts.map +1 -1
  173. package/dist/openclaw/index.js +1 -0
  174. package/dist/openclaw/index.js.map +1 -1
  175. package/dist/openclaw/types.d.ts +2 -0
  176. package/dist/openclaw/types.d.ts.map +1 -1
  177. package/dist/ralph/__tests__/persistence.test.js +28 -1
  178. package/dist/ralph/__tests__/persistence.test.js.map +1 -1
  179. package/dist/ralph/persistence.d.ts +21 -0
  180. package/dist/ralph/persistence.d.ts.map +1 -1
  181. package/dist/ralph/persistence.js +85 -2
  182. package/dist/ralph/persistence.js.map +1 -1
  183. package/dist/state/paths.d.ts +3 -0
  184. package/dist/state/paths.d.ts.map +1 -0
  185. package/dist/state/paths.js +2 -0
  186. package/dist/state/paths.js.map +1 -0
  187. package/dist/team/__tests__/idle-nudge.test.d.ts +2 -0
  188. package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
  189. package/dist/team/__tests__/idle-nudge.test.js +225 -0
  190. package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
  191. package/dist/team/__tests__/role-router.test.d.ts +2 -0
  192. package/dist/team/__tests__/role-router.test.d.ts.map +1 -0
  193. package/dist/team/__tests__/role-router.test.js +204 -0
  194. package/dist/team/__tests__/role-router.test.js.map +1 -0
  195. package/dist/team/__tests__/runtime-cli.test.d.ts +2 -0
  196. package/dist/team/__tests__/runtime-cli.test.d.ts.map +1 -0
  197. package/dist/team/__tests__/runtime-cli.test.js +72 -0
  198. package/dist/team/__tests__/runtime-cli.test.js.map +1 -0
  199. package/dist/team/__tests__/runtime.test.js +195 -9
  200. package/dist/team/__tests__/runtime.test.js.map +1 -1
  201. package/dist/team/__tests__/scaling.test.js +132 -2
  202. package/dist/team/__tests__/scaling.test.js.map +1 -1
  203. package/dist/team/__tests__/state-root.test.d.ts +2 -0
  204. package/dist/team/__tests__/state-root.test.d.ts.map +1 -0
  205. package/dist/team/__tests__/state-root.test.js +9 -0
  206. package/dist/team/__tests__/state-root.test.js.map +1 -0
  207. package/dist/team/__tests__/state.test.js +52 -17
  208. package/dist/team/__tests__/state.test.js.map +1 -1
  209. package/dist/team/__tests__/team-ops-contract.test.d.ts +2 -0
  210. package/dist/team/__tests__/team-ops-contract.test.d.ts.map +1 -0
  211. package/dist/team/__tests__/team-ops-contract.test.js +90 -0
  212. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -0
  213. package/dist/team/__tests__/tmux-session.test.js +94 -7
  214. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  215. package/dist/team/__tests__/worker-bootstrap.test.js +59 -0
  216. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  217. package/dist/team/__tests__/worktree.test.js +81 -2
  218. package/dist/team/__tests__/worktree.test.js.map +1 -1
  219. package/dist/team/idle-nudge.d.ts +53 -0
  220. package/dist/team/idle-nudge.d.ts.map +1 -0
  221. package/dist/team/idle-nudge.js +140 -0
  222. package/dist/team/idle-nudge.js.map +1 -0
  223. package/dist/team/mcp-comm.d.ts +1 -1
  224. package/dist/team/mcp-comm.d.ts.map +1 -1
  225. package/dist/team/mcp-comm.js +6 -2
  226. package/dist/team/mcp-comm.js.map +1 -1
  227. package/dist/team/orchestrator.d.ts +1 -10
  228. package/dist/team/orchestrator.d.ts.map +1 -1
  229. package/dist/team/orchestrator.js +8 -0
  230. package/dist/team/orchestrator.js.map +1 -1
  231. package/dist/team/role-router.d.ts +32 -0
  232. package/dist/team/role-router.d.ts.map +1 -0
  233. package/dist/team/role-router.js +137 -0
  234. package/dist/team/role-router.js.map +1 -0
  235. package/dist/team/runtime-cli.d.ts +18 -0
  236. package/dist/team/runtime-cli.d.ts.map +1 -0
  237. package/dist/team/runtime-cli.js +244 -0
  238. package/dist/team/runtime-cli.js.map +1 -0
  239. package/dist/team/runtime.d.ts +6 -1
  240. package/dist/team/runtime.d.ts.map +1 -1
  241. package/dist/team/runtime.js +148 -60
  242. package/dist/team/runtime.js.map +1 -1
  243. package/dist/team/scaling.d.ts +1 -0
  244. package/dist/team/scaling.d.ts.map +1 -1
  245. package/dist/team/scaling.js +74 -32
  246. package/dist/team/scaling.js.map +1 -1
  247. package/dist/team/state/approvals.d.ts +25 -0
  248. package/dist/team/state/approvals.d.ts.map +1 -0
  249. package/dist/team/state/approvals.js +31 -0
  250. package/dist/team/state/approvals.js.map +1 -0
  251. package/dist/team/state/config.d.ts +2 -0
  252. package/dist/team/state/config.d.ts.map +1 -0
  253. package/dist/team/state/config.js +2 -0
  254. package/dist/team/state/config.js.map +1 -0
  255. package/dist/team/state/dispatch-lock.d.ts +3 -0
  256. package/dist/team/state/dispatch-lock.d.ts.map +1 -0
  257. package/dist/team/state/dispatch-lock.js +81 -0
  258. package/dist/team/state/dispatch-lock.js.map +1 -0
  259. package/dist/team/state/dispatch.d.ts +61 -0
  260. package/dist/team/state/dispatch.d.ts.map +1 -0
  261. package/dist/team/state/dispatch.js +158 -0
  262. package/dist/team/state/dispatch.js.map +1 -0
  263. package/dist/team/state/events.d.ts +2 -0
  264. package/dist/team/state/events.d.ts.map +1 -0
  265. package/dist/team/state/events.js +2 -0
  266. package/dist/team/state/events.js.map +1 -0
  267. package/dist/team/state/index.d.ts +11 -0
  268. package/dist/team/state/index.d.ts.map +1 -0
  269. package/dist/team/state/index.js +11 -0
  270. package/dist/team/state/index.js.map +1 -0
  271. package/dist/team/state/io.d.ts +2 -0
  272. package/dist/team/state/io.d.ts.map +1 -0
  273. package/dist/team/state/io.js +2 -0
  274. package/dist/team/state/io.js.map +1 -0
  275. package/dist/team/state/locks.d.ts +16 -0
  276. package/dist/team/state/locks.d.ts.map +1 -0
  277. package/dist/team/state/locks.js +201 -0
  278. package/dist/team/state/locks.js.map +1 -0
  279. package/dist/team/state/mailbox.d.ts +39 -0
  280. package/dist/team/state/mailbox.d.ts.map +1 -0
  281. package/dist/team/state/mailbox.js +58 -0
  282. package/dist/team/state/mailbox.js.map +1 -0
  283. package/dist/team/state/monitor.d.ts +96 -0
  284. package/dist/team/state/monitor.d.ts.map +1 -0
  285. package/dist/team/state/monitor.js +163 -0
  286. package/dist/team/state/monitor.js.map +1 -0
  287. package/dist/team/state/shutdown.d.ts +2 -0
  288. package/dist/team/state/shutdown.d.ts.map +1 -0
  289. package/dist/team/state/shutdown.js +2 -0
  290. package/dist/team/state/shutdown.js.map +1 -0
  291. package/dist/team/state/summary.d.ts +2 -0
  292. package/dist/team/state/summary.d.ts.map +1 -0
  293. package/dist/team/state/summary.js +2 -0
  294. package/dist/team/state/summary.js.map +1 -0
  295. package/dist/team/state/tasks.d.ts +49 -0
  296. package/dist/team/state/tasks.d.ts.map +1 -0
  297. package/dist/team/state/tasks.js +182 -0
  298. package/dist/team/state/tasks.js.map +1 -0
  299. package/dist/team/state/types.d.ts +281 -0
  300. package/dist/team/state/types.d.ts.map +1 -0
  301. package/dist/team/state/types.js +3 -0
  302. package/dist/team/state/types.js.map +1 -0
  303. package/dist/team/state/workers.d.ts +2 -0
  304. package/dist/team/state/workers.d.ts.map +1 -0
  305. package/dist/team/state/workers.js +2 -0
  306. package/dist/team/state/workers.js.map +1 -0
  307. package/dist/team/state-root.d.ts +5 -0
  308. package/dist/team/state-root.d.ts.map +1 -0
  309. package/dist/team/state-root.js +8 -0
  310. package/dist/team/state-root.js.map +1 -0
  311. package/dist/team/state.d.ts +6 -2
  312. package/dist/team/state.d.ts.map +1 -1
  313. package/dist/team/state.js +200 -881
  314. package/dist/team/state.js.map +1 -1
  315. package/dist/team/tmux-session.d.ts +42 -2
  316. package/dist/team/tmux-session.d.ts.map +1 -1
  317. package/dist/team/tmux-session.js +229 -74
  318. package/dist/team/tmux-session.js.map +1 -1
  319. package/dist/team/worker-bootstrap.d.ts +2 -0
  320. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  321. package/dist/team/worker-bootstrap.js +47 -20
  322. package/dist/team/worker-bootstrap.js.map +1 -1
  323. package/dist/team/worktree.d.ts +5 -1
  324. package/dist/team/worktree.d.ts.map +1 -1
  325. package/dist/team/worktree.js +71 -17
  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/fixtures/ask-advisor-stub.js +12 -0
  351. package/scripts/notify-hook/log.js +5 -0
  352. package/scripts/notify-hook/team-dispatch.js +56 -1
  353. package/scripts/notify-hook/tmux-injection.js +45 -4
  354. package/scripts/notify-hook/visual-verdict.js +158 -0
  355. package/scripts/notify-hook.js +27 -0
  356. package/scripts/run-provider-advisor.js +179 -0
  357. package/scripts/tmux-hook-engine.js +24 -0
  358. package/skills/ask-claude/SKILL.md +61 -0
  359. package/skills/ask-gemini/SKILL.md +61 -0
  360. package/skills/autopilot/SKILL.md +34 -4
  361. package/skills/configure-notifications/SKILL.md +1 -1
  362. package/skills/configure-openclaw/SKILL.md +154 -157
  363. package/skills/deep-interview/SKILL.md +247 -0
  364. package/skills/doctor/SKILL.md +1 -1
  365. package/skills/help/SKILL.md +3 -3
  366. package/skills/ralph/SKILL.md +42 -11
  367. package/skills/ralplan/SKILL.md +17 -0
  368. package/skills/skill/SKILL.md +32 -32
  369. package/skills/team/SKILL.md +60 -0
  370. package/skills/visual-verdict/SKILL.md +76 -0
  371. package/skills/web-clone/SKILL.md +366 -0
  372. package/skills/worker/SKILL.md +5 -4
  373. package/templates/AGENTS.md +9 -0
  374. package/templates/catalog-manifest.json +39 -2
@@ -21,6 +21,94 @@ async function readJson(path) {
21
21
  return JSON.parse(await readFile(path, 'utf-8'));
22
22
  }
23
23
  describe('notify-hook tmux target healing', () => {
24
+ it('falls back to global mode state when scoped session has no allowed active mode', async () => {
25
+ await withTempWorkingDir(async (cwd) => {
26
+ const omxDir = join(cwd, '.omx');
27
+ const stateDir = join(omxDir, 'state');
28
+ const logsDir = join(omxDir, 'logs');
29
+ const sessionId = 'omx-abc123';
30
+ const sessionStateDir = join(stateDir, 'sessions', sessionId);
31
+ const fakeBinDir = join(cwd, 'fake-bin');
32
+ const fakeTmuxPath = join(fakeBinDir, 'tmux');
33
+ const configPath = join(omxDir, 'tmux-hook.json');
34
+ const hookStatePath = join(stateDir, 'tmux-hook-state.json');
35
+ await mkdir(sessionStateDir, { recursive: true });
36
+ await mkdir(logsDir, { recursive: true });
37
+ await mkdir(fakeBinDir, { recursive: true });
38
+ await writeJson(join(stateDir, 'session.json'), { session_id: sessionId });
39
+ await writeJson(join(sessionStateDir, 'team-state.json'), { active: true, current_phase: 'team-exec' });
40
+ await writeJson(join(stateDir, 'ralph-state.json'), { active: true, iteration: 0 });
41
+ await writeJson(configPath, {
42
+ enabled: true,
43
+ target: { type: 'pane', value: '%42' },
44
+ allowed_modes: ['ralph'],
45
+ cooldown_ms: 0,
46
+ max_injections_per_session: 10,
47
+ prompt_template: 'Continue [OMX_TMUX_INJECT]',
48
+ marker: '[OMX_TMUX_INJECT]',
49
+ dry_run: false,
50
+ log_level: 'debug',
51
+ });
52
+ const fakeTmux = `#!/usr/bin/env bash
53
+ set -eu
54
+ cmd="$1"
55
+ shift || true
56
+ if [[ "$cmd" == "display-message" ]]; then
57
+ target=""
58
+ format=""
59
+ while (($#)); do
60
+ case "$1" in
61
+ -p) shift ;;
62
+ -t) target="$2"; shift 2 ;;
63
+ *) format="$1"; shift ;;
64
+ esac
65
+ done
66
+ if [[ "$format" == "#{pane_id}" && "$target" == "%42" ]]; then
67
+ echo "%42"
68
+ exit 0
69
+ fi
70
+ if [[ "$format" == "#{pane_current_command}" && "$target" == "%42" ]]; then
71
+ echo "codex"
72
+ exit 0
73
+ fi
74
+ if [[ "$format" == "#{pane_in_mode}" && "$target" == "%42" ]]; then
75
+ echo "0"
76
+ exit 0
77
+ fi
78
+ echo "bad display target: $target / $format" >&2
79
+ exit 1
80
+ fi
81
+ if [[ "$cmd" == "send-keys" ]]; then
82
+ exit 0
83
+ fi
84
+ echo "unsupported cmd: $cmd" >&2
85
+ exit 1
86
+ `;
87
+ await writeFile(fakeTmuxPath, fakeTmux);
88
+ await chmod(fakeTmuxPath, 0o755);
89
+ const payload = {
90
+ cwd,
91
+ type: 'agent-turn-complete',
92
+ session_id: sessionId,
93
+ 'thread-id': 'thread-test-global-fallback',
94
+ 'turn-id': 'turn-test-global-fallback',
95
+ 'input-messages': ['no marker here'],
96
+ 'last-assistant-message': 'output',
97
+ };
98
+ const result = spawnSync(process.execPath, [NOTIFY_HOOK_SCRIPT.pathname, JSON.stringify(payload)], {
99
+ encoding: 'utf8',
100
+ env: {
101
+ ...process.env,
102
+ PATH: `${fakeBinDir}:${process.env.PATH || ''}`,
103
+ OMX_TEAM_WORKER: '',
104
+ },
105
+ });
106
+ assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
107
+ const hookState = await readJson(hookStatePath);
108
+ assert.equal(hookState.last_reason, 'injection_sent');
109
+ assert.equal(hookState.total_injections, 1);
110
+ });
111
+ });
24
112
  it('falls back to current tmux pane and heals stale session target', async () => {
25
113
  await withTempWorkingDir(async (cwd) => {
26
114
  const omxDir = join(cwd, '.omx');
@@ -436,5 +524,116 @@ exit 1
436
524
  assert.equal(healedConfig.target.value, '%99');
437
525
  });
438
526
  });
527
+ it('prefers scoped active mode state over global mode state for tmux pane selection', async () => {
528
+ await withTempWorkingDir(async (cwd) => {
529
+ const omxDir = join(cwd, '.omx');
530
+ const stateDir = join(omxDir, 'state');
531
+ const logsDir = join(omxDir, 'logs');
532
+ const sessionId = 'omx-abc123';
533
+ const sessionStateDir = join(stateDir, 'sessions', sessionId);
534
+ const fakeBinDir = join(cwd, 'fake-bin');
535
+ const fakeTmuxPath = join(fakeBinDir, 'tmux');
536
+ const configPath = join(omxDir, 'tmux-hook.json');
537
+ const hookStatePath = join(stateDir, 'tmux-hook-state.json');
538
+ await mkdir(sessionStateDir, { recursive: true });
539
+ await mkdir(logsDir, { recursive: true });
540
+ await mkdir(fakeBinDir, { recursive: true });
541
+ await writeJson(join(stateDir, 'session.json'), { session_id: sessionId });
542
+ await writeJson(join(sessionStateDir, 'ralph-state.json'), {
543
+ active: true,
544
+ iteration: 0,
545
+ tmux_pane_id: '%99',
546
+ });
547
+ await writeJson(join(stateDir, 'ralph-state.json'), {
548
+ active: true,
549
+ iteration: 100,
550
+ tmux_pane_id: '%55',
551
+ });
552
+ await writeJson(configPath, {
553
+ enabled: true,
554
+ target: { type: 'session', value: 'nonexistent-session' },
555
+ allowed_modes: ['ralph'],
556
+ cooldown_ms: 0,
557
+ max_injections_per_session: 10,
558
+ prompt_template: 'Continue [OMX_TMUX_INJECT]',
559
+ marker: '[OMX_TMUX_INJECT]',
560
+ dry_run: false,
561
+ log_level: 'debug',
562
+ });
563
+ const fakeTmux = `#!/usr/bin/env bash
564
+ set -eu
565
+ cmd="$1"
566
+ shift || true
567
+ if [[ "$cmd" == "display-message" ]]; then
568
+ target=""
569
+ format=""
570
+ while (($#)); do
571
+ case "$1" in
572
+ -p) shift ;;
573
+ -t) target="$2"; shift 2 ;;
574
+ *) format="$1"; shift ;;
575
+ esac
576
+ done
577
+ if [[ "$format" == "#{pane_id}" && "$target" == "%99" ]]; then
578
+ echo "%99"
579
+ exit 0
580
+ fi
581
+ if [[ "$format" == "#{pane_current_path}" && "$target" == "%99" ]]; then
582
+ echo "${cwd}"
583
+ exit 0
584
+ fi
585
+ if [[ "$format" == "#S" && "$target" == "%99" ]]; then
586
+ echo "devsess"
587
+ exit 0
588
+ fi
589
+ if [[ "$format" == "#{pane_current_command}" && "$target" == "%99" ]]; then
590
+ echo "codex"
591
+ exit 0
592
+ fi
593
+ if [[ "$format" == "#{pane_in_mode}" && "$target" == "%99" ]]; then
594
+ echo "0"
595
+ exit 0
596
+ fi
597
+ echo "bad display target: $target / $format" >&2
598
+ exit 1
599
+ fi
600
+ if [[ "$cmd" == "list-panes" ]]; then
601
+ echo "can't find session" >&2
602
+ exit 1
603
+ fi
604
+ if [[ "$cmd" == "send-keys" ]]; then
605
+ exit 0
606
+ fi
607
+ echo "unsupported cmd: $cmd" >&2
608
+ exit 1
609
+ `;
610
+ await writeFile(fakeTmuxPath, fakeTmux);
611
+ await chmod(fakeTmuxPath, 0o755);
612
+ const payload = {
613
+ cwd,
614
+ type: 'agent-turn-complete',
615
+ session_id: sessionId,
616
+ 'thread-id': 'thread-test-scoped-pane-precedence',
617
+ 'turn-id': 'turn-test-scoped-pane-precedence',
618
+ 'input-messages': ['no marker here'],
619
+ 'last-assistant-message': 'output',
620
+ };
621
+ const result = spawnSync(process.execPath, [NOTIFY_HOOK_SCRIPT.pathname, JSON.stringify(payload)], {
622
+ encoding: 'utf8',
623
+ env: {
624
+ ...process.env,
625
+ PATH: `${fakeBinDir}:${process.env.PATH || ''}`,
626
+ OMX_TEAM_WORKER: '',
627
+ },
628
+ });
629
+ assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
630
+ const hookState = await readJson(hookStatePath);
631
+ assert.equal(hookState.last_reason, 'injection_sent');
632
+ assert.equal(hookState.total_injections, 1);
633
+ const healedConfig = await readJson(configPath);
634
+ assert.equal(healedConfig.target.type, 'pane');
635
+ assert.equal(healedConfig.target.value, '%99');
636
+ });
637
+ });
439
638
  });
440
639
  //# sourceMappingURL=notify-hook-tmux-heal.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notify-hook-tmux-heal.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-tmux-heal.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify-hook-tmux-heal.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-tmux-heal.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Unit tests for visual verdict extraction and persistence (issue #421).
3
+ *
4
+ * Covers:
5
+ * - parseVisualVerdict: structured verdict extraction (pure function)
6
+ * - maybePersistVisualVerdict: happy-path persistence, debug-level parse logging
7
+ * - Write failure: structured warn-level logging when stateDir is unwritable
8
+ * - Import failure: structured warn-level logging when module cannot load
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=notify-hook-visual-verdict.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-hook-visual-verdict.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-visual-verdict.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Unit tests for visual verdict extraction and persistence (issue #421).
3
+ *
4
+ * Covers:
5
+ * - parseVisualVerdict: structured verdict extraction (pure function)
6
+ * - maybePersistVisualVerdict: happy-path persistence, debug-level parse logging
7
+ * - Write failure: structured warn-level logging when stateDir is unwritable
8
+ * - Import failure: structured warn-level logging when module cannot load
9
+ */
10
+ import { describe, it } from 'node:test';
11
+ import assert from 'node:assert/strict';
12
+ import { join, dirname } from 'node:path';
13
+ import { fileURLToPath, pathToFileURL } from 'node:url';
14
+ import { mkdtemp, readFile, readdir, writeFile, rm, mkdir } from 'fs/promises';
15
+ import { tmpdir } from 'os';
16
+ import { appendFile } from 'fs/promises';
17
+ const __dirname = dirname(fileURLToPath(import.meta.url));
18
+ const SCRIPTS_DIR = join(__dirname, '..', '..', '..', 'scripts');
19
+ async function loadModule(rel) {
20
+ return import(pathToFileURL(join(SCRIPTS_DIR, rel)).href);
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // parseVisualVerdict – pure extraction logic
24
+ // ---------------------------------------------------------------------------
25
+ describe('visual-verdict – parseVisualVerdict', () => {
26
+ it('extracts PASS from **Status**: PASS', async () => {
27
+ const { parseVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
28
+ const result = parseVisualVerdict('## Summary\n**Status**: PASS\n**Confidence**: High');
29
+ assert.deepEqual(result, { verdict: 'PASS', raw: '**Status**: PASS' });
30
+ });
31
+ it('extracts FAIL from Verdict: FAIL', async () => {
32
+ const { parseVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
33
+ const result = parseVisualVerdict('Overall result. Verdict: FAIL due to missing tests.');
34
+ assert.deepEqual(result, { verdict: 'FAIL', raw: 'Verdict: FAIL' });
35
+ });
36
+ it('extracts INCOMPLETE case-insensitively', async () => {
37
+ const { parseVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
38
+ const result = parseVisualVerdict('**Status**: incomplete');
39
+ assert.deepEqual(result, { verdict: 'INCOMPLETE', raw: '**Status**: incomplete' });
40
+ });
41
+ it('prefers **Status** pattern over Verdict: when both present', async () => {
42
+ const { parseVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
43
+ const text = '**Status**: PASS\nVerdict: FAIL';
44
+ const result = parseVisualVerdict(text);
45
+ assert.equal(result.verdict, 'PASS');
46
+ });
47
+ it('returns null for text without verdict markers', async () => {
48
+ const { parseVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
49
+ assert.equal(parseVisualVerdict('All tests completed successfully.'), null);
50
+ assert.equal(parseVisualVerdict('The word PASS appears here.'), null);
51
+ });
52
+ it('returns null for null/undefined/non-string', async () => {
53
+ const { parseVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
54
+ assert.equal(parseVisualVerdict(null), null);
55
+ assert.equal(parseVisualVerdict(undefined), null);
56
+ assert.equal(parseVisualVerdict(42), null);
57
+ assert.equal(parseVisualVerdict(''), null);
58
+ });
59
+ });
60
+ // ---------------------------------------------------------------------------
61
+ // maybePersistVisualVerdict – happy path
62
+ // ---------------------------------------------------------------------------
63
+ describe('visual-verdict – maybePersistVisualVerdict (persist)', () => {
64
+ it('writes latest-verdict.json for a matched verdict', async () => {
65
+ const { maybePersistVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
66
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
67
+ const stateDir = join(tmpDir, 'state');
68
+ const logsDir = join(tmpDir, 'logs');
69
+ try {
70
+ await maybePersistVisualVerdict({
71
+ payload: { 'last-assistant-message': '## Verification Report\n**Status**: PASS\nAll good.' },
72
+ stateDir,
73
+ logsDir,
74
+ sessionId: 'sess-1',
75
+ turnId: 'turn-1',
76
+ });
77
+ const verdictPath = join(stateDir, 'verdicts', 'latest-verdict.json');
78
+ const verdict = JSON.parse(await readFile(verdictPath, 'utf-8'));
79
+ assert.equal(verdict.verdict, 'PASS');
80
+ assert.equal(verdict.session_id, 'sess-1');
81
+ assert.equal(verdict.turn_id, 'turn-1');
82
+ assert.ok(verdict.timestamp);
83
+ assert.equal(verdict.raw_match, '**Status**: PASS');
84
+ }
85
+ finally {
86
+ await rm(tmpDir, { recursive: true, force: true });
87
+ }
88
+ });
89
+ it('emits info-level log entry on successful persist', async () => {
90
+ const { maybePersistVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
91
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
92
+ const stateDir = join(tmpDir, 'state');
93
+ const logsDir = join(tmpDir, 'logs');
94
+ await mkdir(logsDir, { recursive: true });
95
+ try {
96
+ await maybePersistVisualVerdict({
97
+ payload: { last_assistant_message: 'Verdict: FAIL\nMissing coverage.' },
98
+ stateDir,
99
+ logsDir,
100
+ sessionId: 'sess-info',
101
+ turnId: 'turn-info',
102
+ });
103
+ const logFiles = await readdir(logsDir);
104
+ assert.ok(logFiles.some(f => f.startsWith('notify-hook-')), 'Expected notify-hook log file');
105
+ const logContent = await readFile(join(logsDir, logFiles.find(f => f.startsWith('notify-hook-'))), 'utf-8');
106
+ assert.match(logContent, /visual_verdict_persisted/);
107
+ assert.match(logContent, /"level":"info"/);
108
+ }
109
+ finally {
110
+ await rm(tmpDir, { recursive: true, force: true });
111
+ }
112
+ });
113
+ it('does nothing when payload has no output', async () => {
114
+ const { maybePersistVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
115
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
116
+ const stateDir = join(tmpDir, 'state');
117
+ const logsDir = join(tmpDir, 'logs');
118
+ try {
119
+ await maybePersistVisualVerdict({
120
+ payload: {},
121
+ stateDir,
122
+ logsDir,
123
+ sessionId: 'sess-empty',
124
+ turnId: 'turn-empty',
125
+ });
126
+ // No verdict dir created, no logs
127
+ const stateDirEntries = await readdir(stateDir).catch(() => []);
128
+ assert.equal(stateDirEntries.length, 0);
129
+ }
130
+ finally {
131
+ await rm(tmpDir, { recursive: true, force: true });
132
+ }
133
+ });
134
+ });
135
+ // ---------------------------------------------------------------------------
136
+ // maybePersistVisualVerdict – candidate parse failure (debug)
137
+ // ---------------------------------------------------------------------------
138
+ describe('visual-verdict – candidate parse debug logging', () => {
139
+ it('logs debug when verdict-like markers present but no structured match', async () => {
140
+ const { maybePersistVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
141
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
142
+ const stateDir = join(tmpDir, 'state');
143
+ const logsDir = join(tmpDir, 'logs');
144
+ await mkdir(logsDir, { recursive: true });
145
+ try {
146
+ // Contains "Verdict:" but not followed by PASS/FAIL/INCOMPLETE
147
+ await maybePersistVisualVerdict({
148
+ payload: { 'last-assistant-message': 'Verdict: PENDING more analysis needed.' },
149
+ stateDir,
150
+ logsDir,
151
+ sessionId: 'sess-debug',
152
+ turnId: 'turn-debug',
153
+ });
154
+ const logFiles = await readdir(logsDir);
155
+ assert.ok(logFiles.length > 0, 'Expected log file to be created');
156
+ const logContent = await readFile(join(logsDir, logFiles[0]), 'utf-8');
157
+ assert.match(logContent, /visual_verdict_parse_no_match/);
158
+ assert.match(logContent, /"level":"debug"/);
159
+ assert.match(logContent, /sess-debug/);
160
+ }
161
+ finally {
162
+ await rm(tmpDir, { recursive: true, force: true });
163
+ }
164
+ });
165
+ it('does not log debug when no verdict markers present at all', async () => {
166
+ const { maybePersistVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
167
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
168
+ const stateDir = join(tmpDir, 'state');
169
+ const logsDir = join(tmpDir, 'logs');
170
+ try {
171
+ await maybePersistVisualVerdict({
172
+ payload: { 'last-assistant-message': 'Refactoring complete. All tests pass.' },
173
+ stateDir,
174
+ logsDir,
175
+ sessionId: 'sess-quiet',
176
+ turnId: 'turn-quiet',
177
+ });
178
+ const logFiles = await readdir(logsDir).catch(() => []);
179
+ if (logFiles.length > 0) {
180
+ const logContent = await readFile(join(logsDir, logFiles[0]), 'utf-8');
181
+ assert.equal(logContent.includes('visual_verdict'), false, 'No verdict log expected');
182
+ }
183
+ }
184
+ finally {
185
+ await rm(tmpDir, { recursive: true, force: true });
186
+ }
187
+ });
188
+ });
189
+ // ---------------------------------------------------------------------------
190
+ // Write failure – structured warn logging
191
+ // ---------------------------------------------------------------------------
192
+ describe('visual-verdict – write failure logging', () => {
193
+ it('logs warn-level event on persistence write failure', async () => {
194
+ const { maybePersistVisualVerdict } = await loadModule('notify-hook/visual-verdict.js');
195
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
196
+ const logsDir = join(tmpDir, 'logs');
197
+ await mkdir(logsDir, { recursive: true });
198
+ // Create a regular file where stateDir should be a directory.
199
+ // mkdir(stateDir + '/verdicts') will fail with ENOTDIR.
200
+ const stateDir = join(tmpDir, 'state');
201
+ await writeFile(stateDir, 'not-a-directory');
202
+ try {
203
+ await maybePersistVisualVerdict({
204
+ payload: { 'last-assistant-message': '**Status**: FAIL\nTests failed.' },
205
+ stateDir,
206
+ logsDir,
207
+ sessionId: 'sess-wf',
208
+ turnId: 'turn-wf',
209
+ });
210
+ const logFiles = await readdir(logsDir);
211
+ assert.ok(logFiles.length > 0, 'Expected log file to be created');
212
+ const logContent = await readFile(join(logsDir, logFiles[0]), 'utf-8');
213
+ const parsed = JSON.parse(logContent.trim());
214
+ assert.equal(parsed.level, 'warn');
215
+ assert.equal(parsed.type, 'visual_verdict_write_failure');
216
+ assert.ok(parsed.error, 'Expected error message');
217
+ assert.equal(parsed.session_id, 'sess-wf');
218
+ assert.equal(parsed.turn_id, 'turn-wf');
219
+ }
220
+ finally {
221
+ await rm(tmpDir, { recursive: true, force: true });
222
+ }
223
+ });
224
+ });
225
+ // ---------------------------------------------------------------------------
226
+ // Import failure – structured warn logging (simulates notify-hook.js catch)
227
+ // ---------------------------------------------------------------------------
228
+ describe('visual-verdict – import failure logging', () => {
229
+ it('logs structured warn when module import fails', async () => {
230
+ const tmpDir = await mkdtemp(join(tmpdir(), 'vv-test-'));
231
+ const logsDir = join(tmpDir, 'logs');
232
+ await mkdir(logsDir, { recursive: true });
233
+ try {
234
+ // Simulate the import-failure catch block from notify-hook.js
235
+ try {
236
+ await import(pathToFileURL(join(SCRIPTS_DIR, 'notify-hook/non-existent-visual-verdict.js')).href);
237
+ assert.fail('Expected import to throw');
238
+ }
239
+ catch (err) {
240
+ const warnEntry = JSON.stringify({
241
+ timestamp: new Date().toISOString(),
242
+ level: 'warn',
243
+ type: 'visual_verdict_import_failure',
244
+ error: err?.message || String(err),
245
+ session_id: 'sess-imp',
246
+ turn_id: 'turn-imp',
247
+ });
248
+ const warnFile = join(logsDir, `notify-hook-${new Date().toISOString().split('T')[0]}.jsonl`);
249
+ await appendFile(warnFile, warnEntry + '\n');
250
+ }
251
+ const logFiles = await readdir(logsDir);
252
+ assert.ok(logFiles.length > 0, 'Expected log file');
253
+ const logContent = await readFile(join(logsDir, logFiles[0]), 'utf-8');
254
+ const parsed = JSON.parse(logContent.trim());
255
+ assert.equal(parsed.level, 'warn');
256
+ assert.equal(parsed.type, 'visual_verdict_import_failure');
257
+ assert.ok(parsed.error, 'Expected error message');
258
+ assert.equal(parsed.session_id, 'sess-imp');
259
+ assert.equal(parsed.turn_id, 'turn-imp');
260
+ }
261
+ finally {
262
+ await rm(tmpDir, { recursive: true, force: true });
263
+ }
264
+ });
265
+ });
266
+ //# sourceMappingURL=notify-hook-visual-verdict.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-hook-visual-verdict.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-visual-verdict.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAEjE,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAC9E,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,kBAAkB,CAAC,oDAAoD,CAAC,CAAC;QACxF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,kBAAkB,CAAC,qDAAqD,CAAC,CAAC;QACzF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,iCAAiC,CAAC;QAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,mCAAmC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAC9E,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC;gBAC9B,OAAO,EAAE,EAAE,wBAAwB,EAAE,qDAAqD,EAAE;gBAC5F,QAAQ;gBACR,OAAO;gBACP,SAAS,EAAE,QAAQ;gBACnB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC;gBAC9B,OAAO,EAAE,EAAE,sBAAsB,EAAE,kCAAkC,EAAE;gBACvE,QAAQ;gBACR,OAAO;gBACP,SAAS,EAAE,WAAW;gBACtB,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC;YAC7F,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7G,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC;gBAC9B,OAAO,EAAE,EAAE;gBACX,QAAQ;gBACR,OAAO;gBACP,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,kCAAkC;YAClC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAC9E,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,yBAAyB,CAAC;gBAC9B,OAAO,EAAE,EAAE,wBAAwB,EAAE,wCAAwC,EAAE;gBAC/E,QAAQ;gBACR,OAAO;gBACP,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC;gBAC9B,OAAO,EAAE,EAAE,wBAAwB,EAAE,uCAAuC,EAAE;gBAC9E,QAAQ;gBACR,OAAO;gBACP,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACvE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,0CAA0C;AAC1C,8EAA8E;AAC9E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,8DAA8D;QAC9D,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC;gBAC9B,OAAO,EAAE,EAAE,wBAAwB,EAAE,iCAAiC,EAAE;gBACxE,QAAQ;gBACR,OAAO;gBACP,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;YAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,8DAA8D;YAC9D,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,4CAA4C,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClG,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE,+BAA+B;oBACrC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;oBAClC,UAAU,EAAE,UAAU;oBACtB,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC9F,MAAM,UAAU,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAC3D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openclaw-setup-contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-setup-contract.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/openclaw-setup-contract.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const configureOpenClawSkill = readFileSync(join(__dirname, "../../../skills/configure-openclaw/SKILL.md"), "utf-8");
8
+ const openclawIntegrationDoc = readFileSync(join(__dirname, "../../../docs/openclaw-integration.md"), "utf-8");
9
+ const configureNotificationsSkill = readFileSync(join(__dirname, "../../../skills/configure-notifications/SKILL.md"), "utf-8");
10
+ function extractJsonFenceContaining(content, needle) {
11
+ const matches = [...content.matchAll(/```json\n([\s\S]*?)\n```/g)];
12
+ const found = matches.map((m) => m[1]).find((block) => block.includes(needle));
13
+ assert.ok(found, `Expected a JSON code fence containing ${needle}`);
14
+ return found;
15
+ }
16
+ describe("OpenClaw setup workflow contracts", () => {
17
+ it("documents explicit /hooks/agent delivery verification path", () => {
18
+ assert.ok(configureOpenClawSkill.includes("/hooks/agent"), "configure-openclaw skill should include /hooks/agent");
19
+ assert.ok(openclawIntegrationDoc.includes("/hooks/agent"), "openclaw integration doc should include /hooks/agent");
20
+ assert.ok(/Delivery verification \(`\/hooks\/agent`\)/.test(configureOpenClawSkill), "configure-openclaw skill should include a delivery verification section");
21
+ });
22
+ it("keeps wake smoke test guidance alongside delivery verification", () => {
23
+ assert.ok(configureOpenClawSkill.includes("Wake smoke test (`/hooks/wake`)"), "configure-openclaw skill should include /hooks/wake smoke test");
24
+ assert.ok(openclawIntegrationDoc.includes("Wake smoke test (`/hooks/wake`)"), "openclaw integration doc should include /hooks/wake smoke test");
25
+ });
26
+ it("includes pass/fail diagnostics guidance", () => {
27
+ assert.ok(/Pass\/Fail Diagnostics Guidance/.test(configureOpenClawSkill), "configure-openclaw skill should include pass/fail diagnostics");
28
+ assert.ok(/Pass\/Fail Diagnostics/.test(openclawIntegrationDoc), "openclaw integration doc should include pass/fail diagnostics");
29
+ });
30
+ it("includes token check, URL reachability check, and command dual env gate guidance", () => {
31
+ assert.ok(configureOpenClawSkill.includes("Hook token present"), "configure-openclaw skill should require hook token validation");
32
+ assert.ok(configureOpenClawSkill.includes("Gateway URL format and reachability"), "configure-openclaw skill should require URL reachability validation");
33
+ assert.ok(configureOpenClawSkill.includes("OMX_OPENCLAW_COMMAND=1"), "configure-openclaw skill should mention command dual gate");
34
+ assert.ok(openclawIntegrationDoc.includes("OMX_OPENCLAW_COMMAND=1"), "openclaw integration doc should mention command dual gate");
35
+ assert.ok(openclawIntegrationDoc.includes("token present"), "openclaw integration doc should include token preflight check");
36
+ assert.ok(openclawIntegrationDoc.includes("reachability"), "openclaw integration doc should include URL reachability checks");
37
+ });
38
+ it("uses runtime schema examples with notifications.openclaw.gateways + hooks", () => {
39
+ assert.ok(configureOpenClawSkill.includes("notifications.openclaw.gateways"), "configure-openclaw skill should reference notifications.openclaw.gateways");
40
+ assert.ok(configureOpenClawSkill.includes("notifications.openclaw.hooks"), "configure-openclaw skill should reference notifications.openclaw.hooks");
41
+ const configJson = extractJsonFenceContaining(openclawIntegrationDoc, "\"notifications\"");
42
+ const parsed = JSON.parse(configJson);
43
+ assert.ok(parsed.notifications?.openclaw, "Doc example should include notifications.openclaw");
44
+ assert.ok(parsed.notifications?.openclaw?.gateways, "Doc example should include openclaw.gateways");
45
+ assert.ok(parsed.notifications?.openclaw?.hooks, "Doc example should include openclaw.hooks");
46
+ });
47
+ it("keeps configure-notifications handoff aligned to gateways + hooks language", () => {
48
+ assert.ok(configureNotificationsSkill.includes("notifications.openclaw.gateways + hooks"), "configure-notifications skill should describe schema-aligned OpenClaw setup");
49
+ });
50
+ });
51
+ //# sourceMappingURL=openclaw-setup-contract.test.js.map