oh-my-opencode 5.0.0-beta.62 → 5.0.0-beta.64

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 (249) hide show
  1. package/THIRD-PARTY-NOTICES.md +8 -6
  2. package/dist/cli/doctor/checks/browser-provider.d.ts +2 -0
  3. package/dist/cli/index.js +70 -41
  4. package/dist/cli-node/index.js +70 -41
  5. package/dist/config/schema/agent-names.d.ts +0 -1
  6. package/dist/config/schema/browser-automation.d.ts +0 -2
  7. package/dist/config/schema/oh-my-opencode-config.d.ts +0 -1
  8. package/dist/hooks/comment-checker/__fixtures__/download-probe.fixture.d.ts +1 -0
  9. package/dist/index.js +89 -588
  10. package/dist/oh-my-opencode.schema.json +4 -5
  11. package/dist/skills/ast-grep/SKILL.md +12 -0
  12. package/dist/skills/debugging/references/tools/playwright-cli.md +79 -161
  13. package/dist/skills/frontend/SKILL.md +1 -1
  14. package/dist/skills/frontend/references/design/aside.md +1 -1
  15. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  16. package/dist/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  17. package/dist/skills/review-work/SKILL.md +1 -1
  18. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
  19. package/dist/skills/ultimate-browsing/SKILL.md +17 -29
  20. package/dist/skills/ultimate-browsing/engine/AGENTS.md +2 -1
  21. package/dist/skills/ultimate-browsing/engine/templates/package.json +2 -2
  22. package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  23. package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  24. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  25. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  26. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +86 -100
  27. package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -3
  28. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  29. package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  30. package/dist/skills/ulw-execute/SKILL.md +1 -1
  31. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  32. package/dist/skills/ulw-research/SKILL.md +3 -3
  33. package/dist/skills/visual-qa/AGENTS.md +1 -1
  34. package/dist/skills/visual-qa/SKILL.md +1 -1
  35. package/dist/skills/visual-qa/references/browser-setup.md +75 -0
  36. package/dist/tui.js +18 -11
  37. package/package.json +16 -23
  38. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  39. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +4 -2
  40. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  45. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  47. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  49. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  50. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  52. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  56. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  57. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
  58. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +5 -4
  59. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  60. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  61. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  62. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
  63. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +13 -0
  66. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +5 -4
  67. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +7 -5
  68. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +7 -2
  69. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +7 -4
  70. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +931 -442
  71. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +6 -0
  72. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +20 -12
  73. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +8 -0
  74. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.d.ts +4 -0
  75. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.js +18 -0
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.d.ts +1 -0
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.js +37 -0
  78. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +1 -0
  79. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +24 -12
  80. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
  81. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +34 -0
  82. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +1 -0
  83. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +6 -0
  84. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
  85. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +107 -0
  86. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +6 -2
  87. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +54 -25
  88. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.d.ts +10 -3
  89. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.js +38 -31
  90. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +9 -7
  91. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +105 -114
  92. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +15 -0
  93. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +86 -0
  94. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +5 -1
  95. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +15 -3
  96. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +11 -8
  97. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +28 -12
  98. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +335 -0
  99. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +109 -10
  100. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +3 -0
  101. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
  102. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
  103. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +8 -62
  104. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +11 -1
  105. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +120 -88
  106. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +3 -2
  107. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +18 -10
  108. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
  109. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +3 -2
  110. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +4 -4
  111. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +9 -1
  112. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +3 -2
  113. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +11 -11
  114. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +8 -17
  115. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.d.ts +9 -0
  116. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.js +41 -0
  117. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  118. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  119. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
  120. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +15 -3
  121. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +7 -4
  122. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +26 -14
  123. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +8 -0
  124. package/packages/omo-codex/plugin/components/ulw-loop/src/driver-objective-ack.ts +20 -0
  125. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence-artifacts.ts +45 -0
  126. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +23 -16
  127. package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +33 -0
  128. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +7 -0
  129. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +124 -0
  130. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +67 -54
  131. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts +63 -31
  132. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +126 -140
  133. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +84 -0
  134. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +26 -3
  135. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +11 -7
  136. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +47 -12
  137. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +124 -10
  138. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +3 -0
  139. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
  140. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +8 -59
  141. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +129 -111
  142. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +19 -10
  143. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
  144. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +5 -4
  145. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +13 -1
  146. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +12 -10
  147. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +8 -16
  148. package/packages/omo-codex/plugin/components/ulw-loop/src/success-criteria-input.ts +56 -0
  149. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +37 -1
  150. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
  151. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
  152. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
  153. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
  154. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
  155. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
  156. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
  157. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
  158. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
  159. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +50 -35
  160. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -0
  161. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
  162. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +33 -4
  163. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-dx.test.ts +219 -0
  164. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +21 -0
  165. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +92 -0
  166. package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
  167. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
  168. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +4 -1
  169. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  170. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  171. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  172. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  173. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  174. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  175. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  176. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  177. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  178. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  179. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  180. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  181. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  182. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  183. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  184. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  185. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  186. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  187. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  188. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  189. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  190. package/packages/omo-codex/plugin/package-lock.json +12 -12
  191. package/packages/omo-codex/plugin/package.json +1 -1
  192. package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
  193. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +15 -7
  194. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +12 -0
  195. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +79 -161
  196. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  197. package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
  198. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  199. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  200. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
  201. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
  202. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +17 -29
  203. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +2 -1
  204. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
  205. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  206. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  207. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  208. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  209. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +86 -100
  210. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -3
  211. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  212. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  213. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +5 -4
  214. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +1 -1
  215. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
  216. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -3
  217. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +1 -1
  218. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
  219. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +75 -0
  220. package/packages/omo-codex/scripts/install-dist/install-local.mjs +6 -4
  221. package/packages/prompts-core/prompts/ultrawork/codex.md +5 -4
  222. package/packages/shared-skills/skills/ast-grep/SKILL.md +12 -0
  223. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +79 -161
  224. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  225. package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
  226. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  227. package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  228. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  229. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
  230. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +17 -29
  231. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +2 -1
  232. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
  233. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  234. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  235. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  236. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  237. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -100
  238. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -3
  239. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  240. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  241. package/packages/shared-skills/skills/ulw-execute/SKILL.md +1 -1
  242. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  243. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
  244. package/packages/shared-skills/skills/visual-qa/AGENTS.md +1 -1
  245. package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
  246. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
  247. package/dist/skills/visual-qa/references/agent-browser-setup.md +0 -45
  248. package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
  249. package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
@@ -15,7 +15,12 @@ export type UlwLoopOperation = (typeof ULW_LOOP_OPERATIONS)[number];
15
15
 
16
16
  export interface ToolkitOperationManifest {
17
17
  readonly name: UlwLoopOperation;
18
+ /** The camelCase method that runs this operation on every SDK surface. */
19
+ readonly method: string;
18
20
  readonly mutating: boolean;
21
+ readonly description: string;
22
+ /** Argument field -> type notation; a trailing `?` marks an optional field. */
23
+ readonly args: Readonly<Record<string, string>>;
19
24
  }
20
25
 
21
26
  export interface ToolkitManifest {
@@ -24,19 +29,128 @@ export interface ToolkitManifest {
24
29
  readonly operations: readonly ToolkitOperationManifest[];
25
30
  }
26
31
 
32
+ const CRITERION_INPUT =
33
+ '{ scenario: string, expectedEvidence: string, userModel?: "happy" | "edge" | "regression" | "adversarial", essential?: boolean }';
34
+ const STEER_KINDS =
35
+ '"add_subgoal" | "split_subgoal" | "reorder_pending" | "revise_pending_wording" | "revise_criterion" | "annotate_ledger" | "mark_blocked_superseded"';
36
+
27
37
  export const ULW_LOOP_MANIFEST = {
28
38
  version: 1,
29
39
  name: "ulw-loop",
30
40
  operations: [
31
- { name: "help", mutating: false },
32
- { name: "create-goals", mutating: true },
33
- { name: "status", mutating: false },
34
- { name: "complete-goals", mutating: true },
35
- { name: "checkpoint", mutating: true },
36
- { name: "steer", mutating: true },
37
- { name: "add-goal", mutating: true },
38
- { name: "criteria", mutating: false },
39
- { name: "record-evidence", mutating: true },
40
- { name: "record-review-blockers", mutating: true },
41
+ {
42
+ name: "help",
43
+ method: "help",
44
+ mutating: false,
45
+ description: "Return this manifest: every operation with its method name, argument fields, and what it does.",
46
+ args: {},
47
+ },
48
+ {
49
+ name: "create-goals",
50
+ method: "createGoals",
51
+ mutating: true,
52
+ description:
53
+ "Create the session plan from a brief; one goal per bullet, each seeded with placeholder criteria until revised.",
54
+ args: {
55
+ brief: "string",
56
+ codexGoalMode: '"aggregate" | "per_story"?',
57
+ force: "boolean?",
58
+ validationBatchesJson: "string?",
59
+ },
60
+ },
61
+ {
62
+ name: "status",
63
+ method: "status",
64
+ mutating: false,
65
+ description:
66
+ "Read the plan, its summary, structured nextActions, the stable evidenceRoot, and the active goal's currentAttemptDir.",
67
+ args: {},
68
+ },
69
+ {
70
+ name: "complete-goals",
71
+ method: "completeGoals",
72
+ mutating: true,
73
+ description:
74
+ "Acquire the next eligible goal or resume the in-progress one; returns { done: true } once the aggregate is complete.",
75
+ args: { retryFailed: "boolean?" },
76
+ },
77
+ {
78
+ name: "checkpoint",
79
+ method: "checkpoint",
80
+ mutating: true,
81
+ description:
82
+ "Close the goal as complete, failed, or blocked with evidence; the final goal also needs the quality gate. printTemplate returns that gate's template instead.",
83
+ args: {
84
+ goalId: "string",
85
+ status: '"complete" | "failed" | "blocked"',
86
+ evidence: "string",
87
+ codexGoalJson: "string?",
88
+ qualityGateJson: "string?",
89
+ printTemplate: "true? (with goalId? only)",
90
+ },
91
+ },
92
+ {
93
+ name: "steer",
94
+ method: "steer",
95
+ mutating: true,
96
+ description:
97
+ "Propose an evidence-backed plan mutation; revise_criterion replaces a criterion's scenario, expectedEvidence, or userModel.",
98
+ args: {
99
+ kind: STEER_KINDS,
100
+ source: '"finding" | "user_prompt_submit" | "cli"',
101
+ evidence: "string",
102
+ rationale: "string",
103
+ goalId: "string?",
104
+ criterionId: "string? (revise_criterion)",
105
+ scenario: "string? (revise_criterion)",
106
+ expectedEvidence: "string? (revise_criterion)",
107
+ userModel: '"happy" | "edge" | "regression" | "adversarial"? (revise_criterion)',
108
+ title: "string? (add_subgoal)",
109
+ objective: "string? (add_subgoal)",
110
+ childGoals: "{ title: string, objective: string }[]? (split_subgoal)",
111
+ revisedTitle: "string? (revise_pending_wording)",
112
+ revisedObjective: "string? (revise_pending_wording)",
113
+ pendingOrder: "string[]? (reorder_pending)",
114
+ blockedReason: "string? (mark_blocked_superseded)",
115
+ idempotencyKey: "string?",
116
+ },
117
+ },
118
+ {
119
+ name: "add-goal",
120
+ method: "addGoal",
121
+ mutating: true,
122
+ description:
123
+ "Append a goal; pass successCriteria to define its criteria in the same call, otherwise placeholders name the revise call.",
124
+ args: { title: "string", objective: "string", successCriteria: `${CRITERION_INPUT}[]?` },
125
+ },
126
+ {
127
+ name: "criteria",
128
+ method: "criteria",
129
+ mutating: false,
130
+ description: "List one goal's success criteria with their status and captured evidence.",
131
+ args: { goalId: "string" },
132
+ },
133
+ {
134
+ name: "record-evidence",
135
+ method: "recordEvidence",
136
+ mutating: true,
137
+ description:
138
+ "Record a criterion's pass, fail, or blocked evidence; artifacts must exist (resolved against the session cwd) and are stored with the criterion and the ledger entry.",
139
+ args: {
140
+ goalId: "string",
141
+ criterionId: "string",
142
+ status: '"pass" | "fail" | "blocked"',
143
+ evidence: "string",
144
+ notes: "string?",
145
+ artifacts: "string[]?",
146
+ },
147
+ },
148
+ {
149
+ name: "record-review-blockers",
150
+ method: "recordReviewBlockers",
151
+ mutating: true,
152
+ description: "Mark the final goal review_blocked and append the blocker goal the reviewer verdict names.",
153
+ args: { goalId: "string", title: "string", objective: "string", evidence: "string", codexGoalJson: "string?" },
154
+ },
41
155
  ] satisfies readonly ToolkitOperationManifest[],
42
156
  } satisfies ToolkitManifest;
@@ -63,12 +63,15 @@ export interface ToolkitFailure<Operation extends string = string> {
63
63
  readonly ok: false;
64
64
  readonly operation: Operation;
65
65
  readonly error: ToolkitError;
66
+ readonly warnings?: readonly string[];
66
67
  }
67
68
 
68
69
  type StatusResult = {
69
70
  readonly plan: UlwLoopPlan;
70
71
  readonly summary: ReturnType<typeof summarizeUlwLoopPlan>;
71
72
  readonly nextActions: readonly string[];
73
+ /** Plan-level evidence directory, stable for the whole run (relative to the session cwd). */
74
+ readonly evidenceRoot: string;
72
75
  readonly currentAttemptDir?: string;
73
76
  };
74
77
 
@@ -0,0 +1,59 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { existsSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+
5
+ export function readAdmissionBreaker(sessionId: string): string | null {
6
+ const dataDir = process.env["PLUGIN_DATA"];
7
+ if (typeof dataDir !== "string") return null;
8
+ try {
9
+ const value: unknown = JSON.parse(readFileSync(join(dataDir, "spawn-breaker", `${sessionId}.json`), "utf8"));
10
+ return typeof value === "object" && value !== null && "reason" in value && typeof value.reason === "string"
11
+ ? value.reason
12
+ : "capacity limit";
13
+ } catch {
14
+ return null;
15
+ }
16
+ }
17
+
18
+ // These hook budget files are not plan/audit state and remain outside the log.
19
+ export function atomicWriteJson(targetPath: string, data: unknown): void {
20
+ const tmp = join(dirname(targetPath), `.tmp-${randomBytes(6).toString("hex")}`);
21
+ writeFileSync(tmp, JSON.stringify(data));
22
+ renameSync(tmp, targetPath);
23
+ }
24
+ export function isNonEmptyFile(path: string): boolean {
25
+ try {
26
+ return existsSync(path) && statSync(path).size > 0;
27
+ } catch (error) {
28
+ if (error instanceof Error) return false;
29
+ throw error;
30
+ }
31
+ }
32
+ export function readCount(counterPath: string): number {
33
+ try {
34
+ const parsed: unknown = JSON.parse(readFileSync(counterPath, "utf8"));
35
+ return typeof parsed === "object" &&
36
+ parsed !== null &&
37
+ "count" in parsed &&
38
+ typeof parsed.count === "number" &&
39
+ parsed.count >= 0
40
+ ? parsed.count
41
+ : 0;
42
+ } catch (error) {
43
+ if (error instanceof Error) return 0;
44
+ throw error;
45
+ }
46
+ }
47
+ export function readCounts(counterPath: string): Record<string, number> {
48
+ try {
49
+ const parsed: unknown = JSON.parse(readFileSync(counterPath, "utf8"));
50
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {};
51
+ const counts: Record<string, number> = {};
52
+ for (const [key, value] of Object.entries(parsed))
53
+ if (typeof value === "number" && value >= 0) counts[key] = value;
54
+ return counts;
55
+ } catch (error) {
56
+ if (error instanceof Error) return {};
57
+ throw error;
58
+ }
59
+ }
@@ -1,11 +1,12 @@
1
- import { randomBytes } from "node:crypto";
2
- import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
3
- import { dirname, join } from "node:path";
1
+ import { mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
4
3
 
5
4
  import type { PreToolUsePayload } from "./codex-hook.js";
6
5
  import { parsePreToolUsePayload } from "./codex-hook.js";
7
6
  import { isFinalRunCompletionCandidate } from "./goal-status.js";
8
7
  import { ulwLoopAttemptEvidenceDir, ulwLoopDir, ulwLoopStateLockPath } from "./paths.js";
8
+ import { readUlwLoopPlanSync } from "./plan-io.js";
9
+ import { atomicWriteJson, isNonEmptyFile, readAdmissionBreaker, readCount, readCounts } from "./spawn-budget-io.js";
9
10
  import { spawnRoleDenial } from "./spawn-role-guard.js";
10
11
  import { isStateLockTimeout, type StateLockOptions, withStateLockSync } from "./state-lock.js";
11
12
  import {
@@ -57,7 +58,7 @@ export function applySpawnBudgetGuards(payload: PreToolUsePayload, options: Spaw
57
58
  );
58
59
  const scope = { sessionId: payload.session_id } as const;
59
60
  const stateDir = ulwLoopDir(payload.cwd, scope);
60
- const plan = readPlan(join(stateDir, "goals.json"));
61
+ const plan = readPlan(payload.cwd, payload.session_id);
61
62
  if (plan === null) return "";
62
63
  const lockOptions: StateLockOptions =
63
64
  options.lockTimeoutMs === undefined ? {} : { timeoutMs: options.lockTimeoutMs };
@@ -148,6 +149,7 @@ function peekFanOutBudget(stateDir: string): string | null {
148
149
  return `ulw-loop spawn fan-out cap reached (${count}/${limit}). Consolidate work into the agents already running, or raise OMO_SPAWN_FANOUT_LIMIT if this volume is intentional.`;
149
150
  }
150
151
 
152
+ // Hook budget counters are exempt from plan/audit commits.
151
153
  // Per-session spawn counter; depth/lineage tracking is descoped — this is a
152
154
  // total-volume backstop against fan-out explosions, not a recursion tracker.
153
155
  function consumeFanOutBudget(stateDir: string): string | null {
@@ -245,12 +247,6 @@ function activeSurfaceReviewerAlias(reviewer: string): string {
245
247
  return reviewer;
246
248
  }
247
249
 
248
- function atomicWriteJson(targetPath: string, data: unknown): void {
249
- const tmp = join(dirname(targetPath), `.tmp-${randomBytes(6).toString("hex")}`);
250
- writeFileSync(tmp, JSON.stringify(data));
251
- renameSync(tmp, targetPath);
252
- }
253
-
254
250
  function deny(reason: string): string {
255
251
  return `${JSON.stringify({
256
252
  hookSpecificOutput: {
@@ -262,19 +258,6 @@ function deny(reason: string): string {
262
258
  })}\n`;
263
259
  }
264
260
 
265
- function readAdmissionBreaker(sessionId: string): string | null {
266
- const dataDir = process.env["PLUGIN_DATA"];
267
- if (typeof dataDir !== "string") return null;
268
- try {
269
- const value = JSON.parse(readFileSync(join(dataDir, "spawn-breaker", `${sessionId}.json`), "utf8")) as {
270
- reason?: unknown;
271
- };
272
- return typeof value.reason === "string" ? value.reason : "capacity limit";
273
- } catch {
274
- return null;
275
- }
276
- }
277
-
278
261
  function fanOutLimit(): number {
279
262
  const raw = process.env["OMO_SPAWN_FANOUT_LIMIT"];
280
263
  if (raw === undefined) return DEFAULT_FANOUT_LIMIT;
@@ -289,43 +272,9 @@ function reviewSpawnLimit(): number {
289
272
  return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_REVIEW_SPAWN_LIMIT;
290
273
  }
291
274
 
292
- function isNonEmptyFile(path: string): boolean {
293
- try {
294
- return existsSync(path) && statSync(path).size > 0;
295
- } catch (error) {
296
- if (error instanceof Error) return false;
297
- throw error;
298
- }
299
- }
300
-
301
- function readCount(counterPath: string): number {
302
- try {
303
- const parsed = JSON.parse(readFileSync(counterPath, "utf8")) as Record<string, unknown>;
304
- return typeof parsed["count"] === "number" && parsed["count"] >= 0 ? parsed["count"] : 0;
305
- } catch (error) {
306
- if (error instanceof Error) return 0;
307
- throw error;
308
- }
309
- }
310
-
311
- function readCounts(counterPath: string): Record<string, number> {
312
- try {
313
- const parsed: unknown = JSON.parse(readFileSync(counterPath, "utf8"));
314
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {};
315
- const counts: Record<string, number> = {};
316
- for (const [key, value] of Object.entries(parsed)) {
317
- if (typeof value === "number" && value >= 0) counts[key] = value;
318
- }
319
- return counts;
320
- } catch (error) {
321
- if (error instanceof Error) return {};
322
- throw error;
323
- }
324
- }
325
-
326
- function readPlan(goalsPath: string): UlwLoopPlan | null {
275
+ function readPlan(repoRoot: string, sessionId: string): UlwLoopPlan | null {
327
276
  try {
328
- return JSON.parse(readFileSync(goalsPath, "utf8")) as UlwLoopPlan;
277
+ return readUlwLoopPlanSync(repoRoot, { sessionId });
329
278
  } catch (error) {
330
279
  if (error instanceof Error) return null;
331
280
  throw error;