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
package/dist/index.js CHANGED
@@ -12080,11 +12080,12 @@ function buildOwnerContent(ownerTag) {
12080
12080
  return `${ownerTag}
12081
12081
  ${process.pid}
12082
12082
  ${Date.now()}
12083
+ ${lockOwnerInstanceId}
12083
12084
  `;
12084
12085
  }
12085
12086
  function parseOwnerContent(content) {
12086
12087
  const lines = content.split(/\r?\n/).filter((line) => line.length > 0);
12087
- if (lines.length !== 3)
12088
+ if (lines.length !== 3 && lines.length !== 4)
12088
12089
  return null;
12089
12090
  const ownerPid = Number.parseInt(lines[1] ?? "", 10);
12090
12091
  const acquiredAtEpochMs = Number.parseInt(lines[2] ?? "", 10);
@@ -12092,7 +12093,11 @@ function parseOwnerContent(content) {
12092
12093
  return null;
12093
12094
  if (!Number.isInteger(acquiredAtEpochMs) || acquiredAtEpochMs <= 0)
12094
12095
  return null;
12095
- return { ownerPid, acquiredAtEpochMs };
12096
+ return {
12097
+ ownerPid,
12098
+ acquiredAtEpochMs,
12099
+ instanceId: lines.length === 4 ? lines[3] ?? null : null
12100
+ };
12096
12101
  }
12097
12102
  function errorCode(error) {
12098
12103
  if (!(error instanceof Error) || !("code" in error))
@@ -12182,8 +12187,13 @@ async function detectStaleLock(lockPath, staleAfterMs) {
12182
12187
  const parsed = parseOwnerContent(content);
12183
12188
  if (parsed === null)
12184
12189
  return false;
12190
+ if (parsed.instanceId !== null && parsed.instanceId !== lockOwnerInstanceId && parsed.ownerPid === process.pid) {
12191
+ return true;
12192
+ }
12185
12193
  if (isPidAlive(parsed.ownerPid))
12186
12194
  return false;
12195
+ if (parsed.instanceId !== null)
12196
+ return true;
12187
12197
  return Date.now() - parsed.acquiredAtEpochMs > staleAfterMs;
12188
12198
  } catch (error) {
12189
12199
  if (!(error instanceof Error)) {
@@ -12229,9 +12239,10 @@ async function atomicWrite(filePath, content, deps = {}) {
12229
12239
  throw error;
12230
12240
  }
12231
12241
  }
12232
- var LOCK_RETRY_MS = 50, LOCK_WAIT_TIMEOUT_MS = 15000, LOCK_RELEASE_RETRY_ATTEMPTS = 3, LOCK_RELEASE_RETRY_MS = 25;
12242
+ var LOCK_RETRY_MS = 50, LOCK_WAIT_TIMEOUT_MS = 15000, LOCK_RELEASE_RETRY_ATTEMPTS = 3, LOCK_RELEASE_RETRY_MS = 25, lockOwnerInstanceId;
12233
12243
  var init_locks = __esm(() => {
12234
12244
  init_tolerant_fsync();
12245
+ lockOwnerInstanceId = randomUUID6();
12235
12246
  });
12236
12247
 
12237
12248
  // packages/team-core/src/team-state-store/store.ts
@@ -12411,7 +12422,6 @@ async function listActiveTeams(config) {
12411
12422
  }
12412
12423
  var STATE_FILE_NAME = "state.json", STALE_DELETING_TTL_MS = 60000, ALLOWED_RUNTIME_TRANSITIONS, RuntimeStateError, InvalidTransitionError;
12413
12424
  var init_store = __esm(() => {
12414
- init_src();
12415
12425
  init_types2();
12416
12426
  init_paths();
12417
12427
  init_locks();
@@ -19632,15 +19642,20 @@ var AGENT_MODEL_REQUIREMENTS = {
19632
19642
  },
19633
19643
  metis: {
19634
19644
  fallbackChain: [
19645
+ {
19646
+ providers: ["anthropic", "github-copilot", "opencode"],
19647
+ model: "claude-fable-5-1",
19648
+ variant: "max"
19649
+ },
19635
19650
  {
19636
19651
  providers: ["anthropic", "github-copilot", "opencode"],
19637
19652
  model: "claude-opus-5",
19638
- variant: "high"
19653
+ variant: "max"
19639
19654
  },
19640
19655
  {
19641
19656
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode"],
19642
19657
  model: "kimi-k3",
19643
- variant: "low"
19658
+ variant: "max"
19644
19659
  }
19645
19660
  ]
19646
19661
  },
@@ -22687,8 +22702,8 @@ var OmoGitMasterSettingsShape = {
22687
22702
  };
22688
22703
  var OmoGitMasterSettingsLayerSchema = z5.object(OmoGitMasterSettingsShape).partial().strict();
22689
22704
  var OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
22690
- commit_footer: z5.union([z5.boolean(), z5.string()]).default(true),
22691
- include_co_authored_by: z5.boolean().default(true)
22705
+ commit_footer: z5.union([z5.boolean(), z5.string()]).default(false),
22706
+ include_co_authored_by: z5.boolean().default(false)
22692
22707
  }).strict();
22693
22708
 
22694
22709
  // packages/omo-config-core/src/schema/harness.ts
@@ -22959,6 +22974,7 @@ var OmoTaskSettingsSchema = z10.object({
22959
22974
  model_concurrency: z10.record(z10.string(), z10.number().int().nonnegative()).optional(),
22960
22975
  max_depth: z10.number().int().nonnegative().default(1),
22961
22976
  residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
22977
+ resident_idle_timeout_ms: z10.number().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
22962
22978
  ttl_ms: z10.number().int().positive().default(86400000),
22963
22979
  state_dir: z10.string().optional(),
22964
22980
  reattach_on_reconcile: z10.boolean().optional(),
@@ -23003,6 +23019,7 @@ var OmoTaskSettingsLayerSchema = z10.object({
23003
23019
  model_concurrency: z10.record(z10.string(), z10.number().int().nonnegative()).optional(),
23004
23020
  max_depth: z10.number().int().nonnegative().optional(),
23005
23021
  residency_max_children: ResidencyMaxChildrenInputSchema.optional(),
23022
+ resident_idle_timeout_ms: z10.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
23006
23023
  ttl_ms: z10.number().int().positive().optional(),
23007
23024
  state_dir: z10.string().optional(),
23008
23025
  reattach_on_reconcile: z10.boolean().optional(),
@@ -24875,7 +24892,6 @@ var BuiltinAgentNameSchema = z15.enum([
24875
24892
  ]);
24876
24893
  var BuiltinSkillNameSchema = z15.enum([
24877
24894
  "playwright",
24878
- "agent-browser",
24879
24895
  "dev-browser",
24880
24896
  "frontend",
24881
24897
  "git-master",
@@ -25036,10 +25052,11 @@ var BackgroundTaskConfigSchema = z20.object({
25036
25052
  import { z as z21 } from "zod";
25037
25053
  var BrowserAutomationProviderSchema = z21.enum([
25038
25054
  "playwright",
25039
- "agent-browser",
25040
25055
  "dev-browser",
25041
25056
  "playwright-cli"
25042
- ]);
25057
+ ], {
25058
+ error: (issue) => `Browser provider ${JSON.stringify(issue.input)} is no longer supported; use the built-in browser path: Bun.WebView / playwright-core scripts`
25059
+ });
25043
25060
  var BrowserAutomationConfigSchema = z21.object({
25044
25061
  provider: BrowserAutomationProviderSchema.default("playwright"),
25045
25062
  playwright_mcp_args: z21.array(z21.string()).optional()
@@ -25192,8 +25209,8 @@ var GitEnvPrefixSchema = z30.string().refine(isValidGitEnvPrefix, { message: GIT
25192
25209
  // packages/omo-opencode/src/config/schema/git-master.ts
25193
25210
  import { z as z31 } from "zod";
25194
25211
  var GitMasterConfigSchema = z31.object({
25195
- commit_footer: z31.union([z31.boolean(), z31.string()]).default(true),
25196
- include_co_authored_by: z31.boolean().default(true),
25212
+ commit_footer: z31.union([z31.boolean(), z31.string()]).default(false),
25213
+ include_co_authored_by: z31.boolean().default(false),
25197
25214
  git_env_prefix: GitEnvPrefixSchema
25198
25215
  });
25199
25216
  // packages/omo-opencode/src/config/schema/hooks.ts
@@ -25500,8 +25517,8 @@ var OhMyOpenCodeConfigSchema = z50.object({
25500
25517
  keyword_detector: KeywordDetectorConfigSchema.optional(),
25501
25518
  babysitting: BabysittingConfigSchema.optional(),
25502
25519
  git_master: GitMasterConfigSchema.default({
25503
- commit_footer: true,
25504
- include_co_authored_by: true,
25520
+ commit_footer: false,
25521
+ include_co_authored_by: false,
25505
25522
  git_env_prefix: "GIT_MASTER=1"
25506
25523
  }),
25507
25524
  browser_automation_engine: BrowserAutomationConfigSchema.optional(),
@@ -88991,7 +89008,7 @@ function resolveCommentCheckerBinary(input) {
88991
89008
  const binaryPath = join42(dirname13(packageJsonPath), "bin", input.binaryName);
88992
89009
  return input.existsSync(binaryPath) ? binaryPath : null;
88993
89010
  } catch (error) {
88994
- if (error instanceof Error) {
89011
+ if (error instanceof Error || typeof error === "object" && error !== null && "name" in error && error.name === "ResolveMessage") {
88995
89012
  return null;
88996
89013
  }
88997
89014
  throw error;
@@ -89058,7 +89075,6 @@ async function runCommentChecker(input, options) {
89058
89075
  import { existsSync as existsSync34, appendFileSync as appendFileSync2 } from "fs";
89059
89076
  import { join as join43 } from "path";
89060
89077
  import { homedir as homedir10, tmpdir as tmpdir3 } from "os";
89061
- import { createRequire as createRequire2 } from "module";
89062
89078
  init_logger2();
89063
89079
  init_plugin_identity();
89064
89080
  var DEBUG = process.env.COMMENT_CHECKER_DEBUG === "1";
@@ -89071,6 +89087,7 @@ function debugLog(...args) {
89071
89087
  }
89072
89088
  }
89073
89089
  var REPO = "code-yeongyu/go-claude-code-comment-checker";
89090
+ var COMMENT_CHECKER_VERSION = "0.8.0";
89074
89091
  var PLATFORM_MAP = {
89075
89092
  "darwin-arm64": { os: "darwin", arch: "arm64", ext: "tar.gz" },
89076
89093
  "darwin-x64": { os: "darwin", arch: "amd64", ext: "tar.gz" },
@@ -89094,16 +89111,6 @@ function getBinaryName() {
89094
89111
  function getCachedBinaryPath2() {
89095
89112
  return getCachedBinaryPath(getCacheDir2(), getBinaryName());
89096
89113
  }
89097
- function getPackageVersion() {
89098
- try {
89099
- const require2 = createRequire2(import.meta.url);
89100
- const pkg = require2("@code-yeongyu/comment-checker/package.json");
89101
- return pkg.version;
89102
- } catch (error) {
89103
- error instanceof Error;
89104
- return "0.4.1";
89105
- }
89106
- }
89107
89114
  async function downloadCommentChecker() {
89108
89115
  const platformKey = `${process.platform}-${process.arch}`;
89109
89116
  const platformInfo = PLATFORM_MAP[platformKey];
@@ -89118,7 +89125,7 @@ async function downloadCommentChecker() {
89118
89125
  debugLog("Binary already cached at:", binaryPath);
89119
89126
  return binaryPath;
89120
89127
  }
89121
- const version = getPackageVersion();
89128
+ const version = COMMENT_CHECKER_VERSION;
89122
89129
  const { os, arch, ext } = platformInfo;
89123
89130
  const assetName = `comment-checker_v${version}_${os}_${arch}.${ext}`;
89124
89131
  const downloadUrl = `https://github.com/${REPO}/releases/download/v${version}/${assetName}`;
@@ -96503,7 +96510,7 @@ function getCachedVersion(options = {}) {
96503
96510
  // package.json
96504
96511
  var package_default = {
96505
96512
  name: "oh-my-opencode",
96506
- version: "5.0.0-beta.62",
96513
+ version: "5.0.0-beta.64",
96507
96514
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
96508
96515
  main: "./dist/index.js",
96509
96516
  types: "dist/index.d.ts",
@@ -96535,8 +96542,6 @@ var package_default = {
96535
96542
  "packages/omo-codex",
96536
96543
  "packages/omo-senpi",
96537
96544
  "packages/senpi-task",
96538
- "packages/pi-goal",
96539
- "packages/pi-webfetch",
96540
96545
  "packages/omo-opencode",
96541
96546
  "packages/omo-native"
96542
96547
  ],
@@ -96638,7 +96643,7 @@ var package_default = {
96638
96643
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
96639
96644
  "test:model-capabilities": "bun test --timeout 20000 packages/model-core/src/model-capability-aliases.test.ts packages/model-core/src/model-capability-guardrails.test.ts packages/model-core/src/model-capabilities.test.ts packages/omo-opencode/src/cli/doctor/checks/model-resolution.test.ts --bail",
96640
96645
  typecheck: "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
96641
- "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/pi-goal/tsconfig.json && tsgo --noEmit -p packages/pi-webfetch/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json",
96646
+ "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json",
96642
96647
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
96643
96648
  test: "bun test --timeout 20000",
96644
96649
  "changelog:section": "bun script/changelog-section.ts",
@@ -96670,7 +96675,6 @@ var package_default = {
96670
96675
  homepage: "https://github.com/code-yeongyu/oh-my-openagent#readme",
96671
96676
  dependencies: {
96672
96677
  "@clack/prompts": "^1.7.0",
96673
- "@code-yeongyu/comment-checker": "^0.8.0",
96674
96678
  "@modelcontextprotocol/sdk": "^1.30.0",
96675
96679
  "@opencode-ai/plugin": "1.18.22",
96676
96680
  "@opencode-ai/sdk": "1.18.22",
@@ -96688,7 +96692,7 @@ var package_default = {
96688
96692
  zod: "^4.4.3"
96689
96693
  },
96690
96694
  devDependencies: {
96691
- "@code-yeongyu/senpi": "2026.9.13",
96695
+ "@code-yeongyu/senpi": "2026.9.16",
96692
96696
  "@oh-my-opencode/agents-md-core": "workspace:*",
96693
96697
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
96694
96698
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -96707,8 +96711,6 @@ var package_default = {
96707
96711
  "@oh-my-opencode/omo-opencode": "workspace:*",
96708
96712
  "@oh-my-opencode/omo-senpi": "workspace:*",
96709
96713
  "@oh-my-opencode/openclaw-core": "workspace:*",
96710
- "@oh-my-opencode/pi-goal": "workspace:*",
96711
- "@oh-my-opencode/pi-webfetch": "workspace:*",
96712
96714
  "@oh-my-opencode/prompts-core": "workspace:*",
96713
96715
  "@oh-my-opencode/rules-engine": "workspace:*",
96714
96716
  "@oh-my-opencode/senpi-task": "workspace:*",
@@ -96729,18 +96731,18 @@ var package_default = {
96729
96731
  typescript: "^7.0.2"
96730
96732
  },
96731
96733
  optionalDependencies: {
96732
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.62",
96733
- "oh-my-opencode-darwin-x64": "5.0.0-beta.62",
96734
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.62",
96735
- "oh-my-opencode-linux-arm64": "5.0.0-beta.62",
96736
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.62",
96737
- "oh-my-opencode-linux-x64": "5.0.0-beta.62",
96738
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.62",
96739
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.62",
96740
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.62",
96741
- "oh-my-opencode-windows-arm64": "5.0.0-beta.62",
96742
- "oh-my-opencode-windows-x64": "5.0.0-beta.62",
96743
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.62"
96734
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.64",
96735
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.64",
96736
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.64",
96737
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.64",
96738
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.64",
96739
+ "oh-my-opencode-linux-x64": "5.0.0-beta.64",
96740
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.64",
96741
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.64",
96742
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.64",
96743
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.64",
96744
+ "oh-my-opencode-windows-x64": "5.0.0-beta.64",
96745
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.64"
96744
96746
  },
96745
96747
  overrides: {
96746
96748
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -96754,9 +96756,7 @@ var package_default = {
96754
96756
  "path-to-regexp": "^8.4.2",
96755
96757
  "@types/node": "26.2.0"
96756
96758
  },
96757
- trustedDependencies: [
96758
- "@code-yeongyu/comment-checker"
96759
- ]
96759
+ trustedDependencies: []
96760
96760
  };
96761
96761
 
96762
96762
  // packages/omo-opencode/src/hooks/auto-update-checker/checker/bundled-version.ts
@@ -102544,7 +102544,7 @@ The real-surface artifact is always required. A test is required only where a co
102544
102544
  | Adds/modifies a CLI command | Run the command with Bash. Show the output. |
102545
102545
  | Changes build output | Run the build. Verify the output files exist and are correct. |
102546
102546
  | Modifies API behavior | Call the endpoint. Show the response. |
102547
- | Changes UI rendering | Use Chrome to drive the REAL page; if Chrome is not available, download and use agent-browser (https://github.com/vercel-labs/agent-browser). Capture screenshot + action log. NEVER clear cookies, cache, or site data (\`Network.clearBrowserCookies\`, \`Storage.clearCookies\`, \`chrome.browsingData.remove\`, "clear browsing data") on the user's real/main browser profile \u2014 it wipes their logged-in state. If you need that profile's login state, clone it first (\`rsync -a <profile>/ <tmp-clone>/\`) and launch Chrome / agent-browser against the clone as the user-data-dir; run any clearing there only. |
102547
+ | Changes UI rendering | Drive the REAL page from js eval: (1) \`new Bun.WebView()\` on Bun >= 1.4 (macOS default; Linux/Windows need installed Chrome/Chromium/Edge). (2) Otherwise, or for Chrome semantics, stealth, trace, or auth, WRITE a \`playwright-core\` script and run it from the kernel against local Chrome (\`chromium.launch({ channel: "chrome" })\` / \`launchPersistentContext\`). Capture screenshot + action log. NEVER clear cookies, cache, or site data on the user's live profile. For login state, CLONE the profile first (\`rsync -a <profile>/ <tmp-clone>/\`) and use only the clone as the persistent user-data-dir; clear data only there. |
102548
102548
  | Changes UI rendering or a TUI/terminal layout (incl. CJK/Korean/Japanese/Chinese text) | Load the visual-qa skill: capture reference + actual screenshots (web) or the xterm.js web terminal render (TUI; NEVER \`tmux capture-pane\` - it degrades color and CJK width), run its bundled pixel-diff / column-width script, and get the dual read-only verdict (design-system + functional integrity, and visual fidelity + CJK precision). Record the diff/score artifact. |
102549
102549
  | Changes a desktop/GUI (non-page) surface | Computer use: OS-level GUI automation against the running app. Capture action log + screenshot. |
102550
102550
  | Adds a new tool/hook/feature | Test it end-to-end in a real scenario. |
@@ -102561,7 +102561,7 @@ The real-surface artifact is always required. A test is required only where a co
102561
102561
 
102562
102562
  **NAME THE EXACT TOOL + EXACT INVOCATION** for every scenario \u2014 the literal \`curl ...\`, \`tmux send-keys ...\`, \`page.click(...)\` with concrete inputs and the binary observable. "run it" / "open the page" is not a scenario.
102563
102563
 
102564
- **CLEANUP IS PART OF QA \u2014 TRACK IT AS TODOS.** The moment a QA scenario spawns any resource, add a teardown todo for it (QA scripts, tmux assets, browser / agent-browser sessions, PIDs, ports, containers, temp dirs). Execute every teardown todo and capture the receipt before declaring done. A leftover process / tmux session / browser context / bound port / temp dir = NOT done.
102564
+ **CLEANUP IS PART OF QA \u2014 TRACK IT AS TODOS.** The moment a QA scenario spawns any resource, add a teardown todo for it (QA scripts, tmux assets, browser contexts, PIDs, ports, containers, temp dirs). Execute every teardown todo and capture the receipt before declaring done. A leftover process / tmux session / browser context / bound port / temp dir = NOT done.
102565
102565
  </MANUAL_QA_MANDATE>
102566
102566
 
102567
102567
  ### TDD Workflow (MANDATORY on every production code change with a test seam)
@@ -102916,13 +102916,13 @@ Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", o
102916
102916
  | Adds/modifies a CLI command | Run the command with Bash. Show the output. |
102917
102917
  | Changes build output | Run the build. Verify output files exist and are correct. |
102918
102918
  | Modifies API behavior | Call the endpoint. Show the response. |
102919
- | Renders/changes a page | Use Chrome to drive the REAL page; if Chrome is not available, download and use agent-browser (https://github.com/vercel-labs/agent-browser). Capture screenshot + action log. NEVER clear cookies, cache, or site data (\`Network.clearBrowserCookies\`, \`Storage.clearCookies\`, \`chrome.browsingData.remove\`, "clear browsing data") on the user's real/main browser profile \u2014 it wipes their logged-in state. If you need that profile's login state, clone it first (\`rsync -a <profile>/ <tmp-clone>/\`) and launch Chrome / agent-browser against the clone as the user-data-dir; run any clearing there only. |
102919
+ | Renders/changes a page | Drive the REAL page from js eval: (1) \`new Bun.WebView()\` on Bun >= 1.4 (macOS default; Linux/Windows need installed Chrome/Chromium/Edge). (2) Otherwise, or for Chrome semantics, stealth, trace, or auth, WRITE a \`playwright-core\` script and run it from the kernel against local Chrome (\`chromium.launch({ channel: "chrome" })\` / \`launchPersistentContext\`). Capture screenshot + action log. NEVER clear cookies, cache, or site data on the user's live profile. For login state, CLONE it first (\`rsync -a <profile>/ <tmp-clone>/\`) and use only the clone as the persistent user-data-dir; clear data only there. |
102920
102920
  | Changes UI rendering or a TUI/terminal layout (incl. CJK/Korean/Japanese/Chinese text) | Load the visual-qa skill: capture reference + actual screenshots (web) or the xterm.js web terminal render (TUI; NEVER \`tmux capture-pane\` - it degrades color and CJK width), run its bundled pixel-diff / column-width script, and get the dual read-only verdict (design-system + functional integrity, and visual fidelity + CJK precision). Record the diff/score artifact. |
102921
102921
  | Drives a desktop/GUI (non-page) surface | Computer use: OS-level GUI automation against the running app. Capture action log + screenshot. |
102922
102922
  | Adds a new tool/hook/feature | Test it end-to-end in a real scenario. |
102923
102923
  | Modifies config handling | Load the config. Verify it parses correctly. |
102924
102924
 
102925
- **NAME THE EXACT TOOL + EXACT INVOCATION** per scenario \u2014 the literal \`curl\` / \`send-keys\` / \`page.click\` with inputs and the binary observable. **REGISTER EVERY QA-SPAWNED RESOURCE TEARDOWN AS ITS OWN TODO** (scripts, tmux assets, browser / agent-browser sessions, PIDs, ports, temp dirs), execute it, capture the receipt. A leftover process / tmux session / browser context = NOT done.
102925
+ **NAME THE EXACT TOOL + EXACT INVOCATION** per scenario \u2014 the literal \`curl\` / \`send-keys\` / \`page.click\` with inputs and the binary observable. **REGISTER EVERY QA-SPAWNED RESOURCE TEARDOWN AS ITS OWN TODO** (scripts, tmux assets, browser contexts, PIDs, ports, temp dirs), execute it, capture the receipt. A leftover process / tmux session / browser context = NOT done.
102926
102926
 
102927
102927
  **UNACCEPTABLE (WILL BE REJECTED):**
102928
102928
  - "This should work" - DID YOU RUN IT? NO? THEN RUN IT.
@@ -103355,13 +103355,13 @@ lsp_diagnostics catches type errors only. Logic bugs, missing behavior, broken f
103355
103355
  | Adds/modifies a CLI command | Run it with Bash. Show output. |
103356
103356
  | Changes build output | Run build. Verify output files. |
103357
103357
  | Modifies API behavior | Call the endpoint. Show response. |
103358
- | Renders/changes a page | Use Chrome to drive the page; if Chrome is not available, download and use agent-browser (https://github.com/vercel-labs/agent-browser). Screenshot + action log. NEVER clear cookies, cache, or site data (\`Network.clearBrowserCookies\`, \`Storage.clearCookies\`, \`chrome.browsingData.remove\`, "clear browsing data") on the user's real/main browser profile \u2014 it wipes their logged-in state. If you need that profile's login state, clone it first (\`rsync -a <profile>/ <tmp-clone>/\`) and launch Chrome / agent-browser against the clone as the user-data-dir; run any clearing there only. |
103358
+ | Renders/changes a page | Drive the page from js eval: (1) \`new Bun.WebView()\` on Bun >= 1.4 (macOS default; Linux/Windows need installed Chrome/Chromium/Edge). (2) Otherwise, or for Chrome semantics, stealth, trace, or auth, WRITE a \`playwright-core\` script and run it from the kernel against local Chrome (\`chromium.launch({ channel: "chrome" })\` / \`launchPersistentContext\`). Screenshot + action log. NEVER clear cookies, cache, or site data on the user's live profile. For login state, CLONE it first (\`rsync -a <profile>/ <tmp-clone>/\`) and use only the clone as the persistent user-data-dir; clear data only there. |
103359
103359
  | Changes UI rendering or a TUI/terminal layout (incl. CJK/Korean/Japanese/Chinese text) | Load the visual-qa skill: capture reference + actual screenshots (web) or the xterm.js web terminal render (TUI; NEVER \`tmux capture-pane\` - it degrades color and CJK width), run its bundled pixel-diff / column-width script, and get the dual read-only verdict (design-system + functional integrity, and visual fidelity + CJK precision). Record the diff/score artifact. |
103360
103360
  | Drives a desktop GUI | Computer use: OS-level GUI automation against the running app. Action log + screenshot. |
103361
103361
  | Adds tool/hook/feature | Test end-to-end in a real scenario. |
103362
103362
  | Modifies config handling | Load config. Verify parsed shape. |
103363
103363
 
103364
- Name the exact tool + exact invocation per scenario (literal \`curl\` / \`send-keys\` / \`page.click\` + inputs + binary observable). Register every QA-spawned resource teardown as its own todo (scripts, tmux, browser / agent-browser, PIDs, ports, temp dirs), execute it, capture the receipt. "This should work" / "tests pass" / "lsp clean" / a leftover process are NOT done \u2014 the surface artifact + clean teardown are.
103364
+ Name the exact tool + exact invocation per scenario (literal \`curl\` / \`send-keys\` / \`page.click\` + inputs + binary observable). Register every QA-spawned resource teardown as its own todo (scripts, tmux, browser contexts, PIDs, ports, temp dirs), execute it, capture the receipt. "This should work" / "tests pass" / "lsp clean" / a leftover process are NOT done \u2014 the surface artifact + clean teardown are.
103365
103365
  </MANUAL_QA_MANDATE>
103366
103366
 
103367
103367
  ## REVIEWER GATE (triggered)
@@ -106727,476 +106727,6 @@ var SCOPE_PRIORITY2 = {
106727
106727
  "opencode-project": 6
106728
106728
  };
106729
106729
 
106730
- // packages/skills-loader-core/src/features/builtin-skills/agent-browser/SKILL.md
106731
- var SKILL_default = `---
106732
- name: agent-browser
106733
- description: Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with web pages, fill forms, take screenshots, test web applications, or extract information from web pages.
106734
- ---
106735
-
106736
- # Browser Automation with agent-browser
106737
-
106738
- ## Quick start
106739
-
106740
- \`\`\`bash
106741
- agent-browser open <url> # Navigate to page
106742
- agent-browser snapshot -i # Get interactive elements with refs
106743
- agent-browser click @e1 # Click element by ref
106744
- agent-browser fill @e2 "text" # Fill input by ref
106745
- agent-browser close # Close browser
106746
- \`\`\`
106747
-
106748
- ## Core workflow
106749
-
106750
- 1. Navigate: \`agent-browser open <url>\`
106751
- 2. Snapshot: \`agent-browser snapshot -i\` (returns elements with refs like \`@e1\`, \`@e2\`)
106752
- 3. Interact using refs from the snapshot
106753
- 4. Re-snapshot after navigation or significant DOM changes
106754
-
106755
- ## Commands
106756
-
106757
- ### Navigation
106758
- \`\`\`bash
106759
- agent-browser open <url> # Navigate to URL (aliases: goto, navigate)
106760
- agent-browser back # Go back
106761
- agent-browser forward # Go forward
106762
- agent-browser reload # Reload page
106763
- agent-browser close # Close browser (aliases: quit, exit)
106764
- \`\`\`
106765
-
106766
- ### Snapshot (page analysis)
106767
- \`\`\`bash
106768
- agent-browser snapshot # Full accessibility tree
106769
- agent-browser snapshot -i # Interactive elements only (recommended)
106770
- agent-browser snapshot -i -C # Include cursor-interactive elements (divs with onclick, etc.)
106771
- agent-browser snapshot -c # Compact (remove empty structural elements)
106772
- agent-browser snapshot -d 3 # Limit depth to 3
106773
- agent-browser snapshot -s "#main" # Scope to CSS selector
106774
- agent-browser snapshot -i -c -d 5 # Combine options
106775
- \`\`\`
106776
-
106777
- The \`-C\` flag is useful for modern web apps that use custom clickable elements (divs, spans) instead of standard buttons/links.
106778
-
106779
- ### Interactions (use @refs from snapshot)
106780
- \`\`\`bash
106781
- agent-browser click @e1 # Click (--new-tab to open in new tab)
106782
- agent-browser dblclick @e1 # Double-click
106783
- agent-browser focus @e1 # Focus element
106784
- agent-browser fill @e2 "text" # Clear and type
106785
- agent-browser type @e2 "text" # Type without clearing
106786
- agent-browser keyboard type "text" # Type with real keystrokes (no selector, current focus)
106787
- agent-browser keyboard inserttext "text" # Insert text without key events (no selector)
106788
- agent-browser press Enter # Press key
106789
- agent-browser press Control+a # Key combination
106790
- agent-browser keydown Shift # Hold key down
106791
- agent-browser keyup Shift # Release key
106792
- agent-browser hover @e1 # Hover
106793
- agent-browser check @e1 # Check checkbox
106794
- agent-browser uncheck @e1 # Uncheck checkbox
106795
- agent-browser select @e1 "value" # Select dropdown
106796
- agent-browser scroll down 500 # Scroll page (--selector <sel> for container)
106797
- agent-browser scrollintoview @e1 # Scroll element into view (alias: scrollinto)
106798
- agent-browser drag @e1 @e2 # Drag and drop
106799
- agent-browser upload @e1 file.pdf # Upload files
106800
- \`\`\`
106801
-
106802
- ### Get information
106803
- \`\`\`bash
106804
- agent-browser get text @e1 # Get element text
106805
- agent-browser get html @e1 # Get innerHTML
106806
- agent-browser get value @e1 # Get input value
106807
- agent-browser get attr @e1 href # Get attribute
106808
- agent-browser get title # Get page title
106809
- agent-browser get url # Get current URL
106810
- agent-browser get count ".item" # Count matching elements
106811
- agent-browser get box @e1 # Get bounding box
106812
- agent-browser get styles @e1 # Get computed styles
106813
- \`\`\`
106814
-
106815
- ### Check state
106816
- \`\`\`bash
106817
- agent-browser is visible @e1 # Check if visible
106818
- agent-browser is enabled @e1 # Check if enabled
106819
- agent-browser is checked @e1 # Check if checked
106820
- \`\`\`
106821
-
106822
- ### Screenshots & PDF
106823
- \`\`\`bash
106824
- agent-browser screenshot # Screenshot (saves to temp dir if no path)
106825
- agent-browser screenshot path.png # Save to file
106826
- agent-browser screenshot --full # Full page
106827
- agent-browser screenshot --annotate # Annotated screenshot with numbered element labels
106828
- agent-browser pdf output.pdf # Save as PDF
106829
- \`\`\`
106830
-
106831
- Annotated screenshots overlay numbered labels \`[N]\` on interactive elements. Each label corresponds to ref \`@eN\`, so refs work for both visual and text workflows:
106832
- \`\`\`bash
106833
- agent-browser screenshot --annotate ./page.png
106834
- # Output: [1] @e1 button "Submit", [2] @e2 link "Home", [3] @e3 textbox "Email"
106835
- agent-browser click @e2 # Click the "Home" link labeled [2]
106836
- \`\`\`
106837
-
106838
- ### Video recording
106839
- \`\`\`bash
106840
- agent-browser record start ./demo.webm # Start recording (uses current URL + state)
106841
- agent-browser click @e1 # Perform actions
106842
- agent-browser record stop # Stop and save video
106843
- agent-browser record restart ./take2.webm # Stop current + start new recording
106844
- \`\`\`
106845
- Recording creates a fresh context but preserves cookies/storage from your session.
106846
-
106847
- ### Wait
106848
- \`\`\`bash
106849
- agent-browser wait @e1 # Wait for element
106850
- agent-browser wait 2000 # Wait milliseconds
106851
- agent-browser wait --text "Success" # Wait for text
106852
- agent-browser wait --url "**/dashboard" # Wait for URL pattern
106853
- agent-browser wait --load networkidle # Wait for network idle
106854
- agent-browser wait --fn "window.ready" # Wait for JS condition
106855
- \`\`\`
106856
-
106857
- Load states: \`load\`, \`domcontentloaded\`, \`networkidle\`
106858
-
106859
- ### Mouse control
106860
- \`\`\`bash
106861
- agent-browser mouse move 100 200 # Move mouse
106862
- agent-browser mouse down left # Press button (left/right/middle)
106863
- agent-browser mouse up left # Release button
106864
- agent-browser mouse wheel 100 # Scroll wheel
106865
- \`\`\`
106866
-
106867
- ### Semantic locators (alternative to refs)
106868
- \`\`\`bash
106869
- agent-browser find role button click --name "Submit"
106870
- agent-browser find text "Sign In" click
106871
- agent-browser find label "Email" fill "user@test.com"
106872
- agent-browser find placeholder "Search..." fill "query"
106873
- agent-browser find alt "Logo" click
106874
- agent-browser find title "Close" click
106875
- agent-browser find testid "submit-btn" click
106876
- agent-browser find first ".item" click
106877
- agent-browser find last ".item" click
106878
- agent-browser find nth 2 "a" text
106879
- \`\`\`
106880
-
106881
- Actions: \`click\`, \`fill\`, \`type\`, \`hover\`, \`focus\`, \`check\`, \`uncheck\`, \`text\`
106882
- Options: \`--name <name>\` (filter role by accessible name), \`--exact\` (require exact text match)
106883
-
106884
- ### Browser settings
106885
- \`\`\`bash
106886
- agent-browser set viewport 1920 1080 # Set viewport size
106887
- agent-browser set device "iPhone 14" # Emulate device
106888
- agent-browser set geo 37.7749 -122.4194 # Set geolocation
106889
- agent-browser set offline on # Toggle offline mode
106890
- agent-browser set headers '{"X-Key":"v"}' # Extra HTTP headers
106891
- agent-browser set credentials user pass # HTTP basic auth
106892
- agent-browser set media dark # Emulate color scheme
106893
- \`\`\`
106894
-
106895
- ### Cookies & Storage
106896
- \`\`\`bash
106897
- agent-browser cookies # Get all cookies
106898
- agent-browser cookies set name value # Set cookie
106899
- agent-browser cookies clear # Clear cookies
106900
-
106901
- agent-browser storage local # Get all localStorage
106902
- agent-browser storage local key # Get specific key
106903
- agent-browser storage local set k v # Set value
106904
- agent-browser storage local clear # Clear all
106905
-
106906
- agent-browser storage session # Same for sessionStorage
106907
- \`\`\`
106908
-
106909
- ### Network
106910
- \`\`\`bash
106911
- agent-browser network route <url> # Intercept requests
106912
- agent-browser network route <url> --abort # Block requests
106913
- agent-browser network route <url> --body '{}' # Mock response
106914
- agent-browser network unroute [url] # Remove routes
106915
- agent-browser network requests # View tracked requests
106916
- agent-browser network requests --filter api # Filter requests
106917
- \`\`\`
106918
-
106919
- ### Tabs & Windows
106920
- \`\`\`bash
106921
- agent-browser tab # List tabs
106922
- agent-browser tab new [url] # New tab
106923
- agent-browser tab 2 # Switch to tab
106924
- agent-browser tab close # Close tab
106925
- agent-browser window new # New window
106926
- \`\`\`
106927
-
106928
- ### Frames
106929
- \`\`\`bash
106930
- agent-browser frame "#iframe" # Switch to iframe
106931
- agent-browser frame main # Back to main frame
106932
- \`\`\`
106933
-
106934
- ### Dialogs
106935
- \`\`\`bash
106936
- agent-browser dialog accept [text] # Accept dialog (with optional prompt text)
106937
- agent-browser dialog dismiss # Dismiss dialog
106938
- \`\`\`
106939
-
106940
- ### Diff (compare snapshots, screenshots, URLs)
106941
- \`\`\`bash
106942
- agent-browser diff snapshot # Compare current vs last snapshot
106943
- agent-browser diff snapshot --baseline before.txt # Compare current vs saved snapshot file
106944
- agent-browser diff snapshot --selector "#main" --compact # Scoped snapshot diff
106945
- agent-browser diff screenshot --baseline before.png # Visual pixel diff against baseline
106946
- agent-browser diff screenshot --baseline b.png -o d.png # Save diff image to custom path
106947
- agent-browser diff screenshot --baseline b.png -t 0.2 # Adjust color threshold (0-1)
106948
- agent-browser diff url https://v1.com https://v2.com # Compare two URLs (snapshot diff)
106949
- agent-browser diff url https://v1.com https://v2.com --screenshot # Also visual diff
106950
- agent-browser diff url https://v1.com https://v2.com --selector "#main" # Scope to element
106951
- \`\`\`
106952
-
106953
- ### JavaScript
106954
- \`\`\`bash
106955
- agent-browser eval "document.title" # Run JavaScript
106956
- agent-browser eval -b "base64code" # Run base64-encoded JS
106957
- agent-browser eval --stdin # Read JS from stdin
106958
- \`\`\`
106959
-
106960
- ### Debug & Profiling
106961
- \`\`\`bash
106962
- agent-browser console # View console messages
106963
- agent-browser console --clear # Clear console
106964
- agent-browser errors # View page errors
106965
- agent-browser errors --clear # Clear errors
106966
- agent-browser highlight @e1 # Highlight element
106967
- agent-browser trace start # Start recording trace
106968
- agent-browser trace stop trace.zip # Stop and save trace
106969
- agent-browser profiler start # Start Chrome DevTools profiling
106970
- agent-browser profiler stop profile.json # Stop and save profile
106971
- \`\`\`
106972
-
106973
- ### State management
106974
- \`\`\`bash
106975
- agent-browser state save auth.json # Save auth state
106976
- agent-browser state load auth.json # Load auth state
106977
- agent-browser state list # List saved state files
106978
- agent-browser state show <file> # Show state summary
106979
- agent-browser state rename <old> <new> # Rename state file
106980
- agent-browser state clear [name] # Clear states for session
106981
- agent-browser state clear --all # Clear all saved states
106982
- agent-browser state clean --older-than <days> # Delete old states
106983
- \`\`\`
106984
-
106985
- ### Setup
106986
- \`\`\`bash
106987
- agent-browser install # Download Chromium browser
106988
- agent-browser install --with-deps # Also install system deps (Linux)
106989
- \`\`\`
106990
-
106991
- ## Global Options
106992
-
106993
- | Option | Description |
106994
- |--------|-------------|
106995
- | \`--session <name>\` | Isolated browser session (\`AGENT_BROWSER_SESSION\` env) |
106996
- | \`--session-name <name>\` | Auto-save/restore session state (\`AGENT_BROWSER_SESSION_NAME\` env) |
106997
- | \`--profile <path>\` | Persistent browser profile (\`AGENT_BROWSER_PROFILE\` env) |
106998
- | \`--state <path>\` | Load storage state from JSON file (\`AGENT_BROWSER_STATE\` env) |
106999
- | \`--headers <json>\` | HTTP headers scoped to URL's origin |
107000
- | \`--executable-path <path>\` | Custom browser binary (\`AGENT_BROWSER_EXECUTABLE_PATH\` env) |
107001
- | \`--extension <path>\` | Load browser extension (repeatable; \`AGENT_BROWSER_EXTENSIONS\` env) |
107002
- | \`--args <args>\` | Browser launch args (\`AGENT_BROWSER_ARGS\` env) |
107003
- | \`--user-agent <ua>\` | Custom User-Agent (\`AGENT_BROWSER_USER_AGENT\` env) |
107004
- | \`--proxy <url>\` | Proxy server (\`AGENT_BROWSER_PROXY\` env) |
107005
- | \`--proxy-bypass <hosts>\` | Hosts to bypass proxy (\`AGENT_BROWSER_PROXY_BYPASS\` env) |
107006
- | \`--ignore-https-errors\` | Ignore HTTPS certificate errors |
107007
- | \`--allow-file-access\` | Allow file:// URLs to access local files |
107008
- | \`-p, --provider <name>\` | Cloud browser provider (\`AGENT_BROWSER_PROVIDER\` env) |
107009
- | \`--device <name>\` | iOS device name (\`AGENT_BROWSER_IOS_DEVICE\` env) |
107010
- | \`--json\` | Machine-readable JSON output |
107011
- | \`--full, -f\` | Full page screenshot |
107012
- | \`--annotate\` | Annotated screenshot with numbered labels (\`AGENT_BROWSER_ANNOTATE\` env) |
107013
- | \`--headed\` | Show browser window (\`AGENT_BROWSER_HEADED\` env) |
107014
- | \`--cdp <port\\|wss://url>\` | Connect via Chrome DevTools Protocol |
107015
- | \`--auto-connect\` | Auto-discover running Chrome (\`AGENT_BROWSER_AUTO_CONNECT\` env) |
107016
- | \`--color-scheme <scheme>\` | Color scheme: dark, light, no-preference (\`AGENT_BROWSER_COLOR_SCHEME\` env) |
107017
- | \`--download-path <path>\` | Default download directory (\`AGENT_BROWSER_DOWNLOAD_PATH\` env) |
107018
- | \`--native\` | [Experimental] Use native Rust daemon (\`AGENT_BROWSER_NATIVE\` env) |
107019
- | \`--config <path>\` | Custom config file (\`AGENT_BROWSER_CONFIG\` env) |
107020
- | \`--debug\` | Debug output |
107021
-
107022
- ### Security options
107023
- | Option | Description |
107024
- |--------|-------------|
107025
- | \`--content-boundaries\` | Wrap page output in boundary markers (\`AGENT_BROWSER_CONTENT_BOUNDARIES\` env) |
107026
- | \`--max-output <chars>\` | Truncate page output to N characters (\`AGENT_BROWSER_MAX_OUTPUT\` env) |
107027
- | \`--allowed-domains <list>\` | Comma-separated allowed domain patterns (\`AGENT_BROWSER_ALLOWED_DOMAINS\` env) |
107028
- | \`--action-policy <path>\` | Path to action policy JSON file (\`AGENT_BROWSER_ACTION_POLICY\` env) |
107029
- | \`--confirm-actions <list>\` | Action categories requiring confirmation (\`AGENT_BROWSER_CONFIRM_ACTIONS\` env) |
107030
-
107031
- ## Configuration file
107032
-
107033
- Create \`agent-browser.json\` for persistent defaults (no need to repeat flags):
107034
-
107035
- **Locations (lowest to highest priority):**
107036
- 1. \`~/.agent-browser/config.json\` \u2014 user-level defaults
107037
- 2. \`./agent-browser.json\` \u2014 project-level overrides
107038
- 3. \`AGENT_BROWSER_*\` environment variables
107039
- 4. CLI flags override everything
107040
-
107041
- \`\`\`json
107042
- {
107043
- "headed": true,
107044
- "proxy": "http://localhost:8080",
107045
- "profile": "./browser-data",
107046
- "native": true
107047
- }
107048
- \`\`\`
107049
-
107050
- ## Example: Form submission
107051
-
107052
- \`\`\`bash
107053
- agent-browser open https://example.com/form
107054
- agent-browser snapshot -i
107055
- # Output shows: textbox "Email" [ref=e1], textbox "Password" [ref=e2], button "Submit" [ref=e3]
107056
-
107057
- agent-browser fill @e1 "user@example.com"
107058
- agent-browser fill @e2 "password123"
107059
- agent-browser click @e3
107060
- agent-browser wait --load networkidle
107061
- agent-browser snapshot -i # Check result
107062
- \`\`\`
107063
-
107064
- ## Example: Authentication with saved state
107065
-
107066
- \`\`\`bash
107067
- # Login once
107068
- agent-browser open https://app.example.com/login
107069
- agent-browser snapshot -i
107070
- agent-browser fill @e1 "username"
107071
- agent-browser fill @e2 "password"
107072
- agent-browser click @e3
107073
- agent-browser wait --url "**/dashboard"
107074
- agent-browser state save auth.json
107075
-
107076
- # Later sessions: load saved state
107077
- agent-browser state load auth.json
107078
- agent-browser open https://app.example.com/dashboard
107079
- \`\`\`
107080
-
107081
- ### Header-based Auth (Skip login flows)
107082
- \`\`\`bash
107083
- # Headers scoped to api.example.com only
107084
- agent-browser open api.example.com --headers '{"Authorization": "Bearer <token>"}'
107085
- # Navigate to another domain - headers NOT sent (safe)
107086
- agent-browser open other-site.com
107087
- # Global headers (all domains)
107088
- agent-browser set headers '{"X-Custom-Header": "value"}'
107089
- \`\`\`
107090
-
107091
- ### Authentication Vault
107092
- \`\`\`bash
107093
- # Store credentials locally (encrypted). The LLM never sees passwords.
107094
- echo "pass" | agent-browser auth save github --url https://github.com/login --username user --password-stdin
107095
- agent-browser auth login github
107096
- \`\`\`
107097
-
107098
- ## Sessions & Persistent Profiles
107099
-
107100
- ### Sessions (parallel browsers)
107101
- \`\`\`bash
107102
- agent-browser --session test1 open site-a.com
107103
- agent-browser --session test2 open site-b.com
107104
- agent-browser session list
107105
- \`\`\`
107106
-
107107
- ### Session persistence (auto-save/restore)
107108
- \`\`\`bash
107109
- agent-browser --session-name twitter open twitter.com
107110
- # Login once, state persists automatically across restarts
107111
- # State files stored in ~/.agent-browser/sessions/
107112
- \`\`\`
107113
-
107114
- ### Persistent Profiles
107115
- Persists cookies, localStorage, IndexedDB, service workers, cache, login sessions across browser restarts.
107116
- NEVER point \`--profile\` or \`AGENT_BROWSER_PROFILE\` at the user's real/main browser profile when any cookie, cache, or site-data clear or reset might happen (\`Network.clearBrowserCookies\`, \`Storage.clearCookies\`, \`chrome.browsingData.remove\`, \`cookies clear\`, "clear browsing data") \u2014 that wipes their logged-in state everywhere. If the task needs the main profile's login state, clone the profile directory first (\`rsync -a <profile>/ <tmp-clone>/\`) and pass the clone as \`--profile\`; run any clearing on the clone only.
107117
- \`\`\`bash
107118
- agent-browser --profile ~/.myapp-profile open myapp.com
107119
- # Or via env var
107120
- AGENT_BROWSER_PROFILE=~/.myapp-profile agent-browser open myapp.com
107121
- \`\`\`
107122
-
107123
- ## JSON output (for parsing)
107124
-
107125
- Add \`--json\` for machine-readable output:
107126
- \`\`\`bash
107127
- agent-browser snapshot -i --json
107128
- agent-browser get text @e1 --json
107129
- \`\`\`
107130
-
107131
- ## Local files
107132
-
107133
- \`\`\`bash
107134
- agent-browser --allow-file-access open file:///path/to/document.pdf
107135
- agent-browser --allow-file-access open file:///path/to/page.html
107136
- \`\`\`
107137
-
107138
- ## CDP Mode
107139
-
107140
- \`\`\`bash
107141
- agent-browser connect 9222 # Local CDP port
107142
- agent-browser --cdp 9222 snapshot # Direct CDP on each command
107143
- agent-browser --cdp "wss://browser-service.com/cdp?token=..." snapshot # Remote via WebSocket
107144
- agent-browser --auto-connect snapshot # Auto-discover running Chrome
107145
- \`\`\`
107146
-
107147
- ## Cloud providers
107148
-
107149
- \`\`\`bash
107150
- # Browserbase
107151
- BROWSERBASE_API_KEY="key" BROWSERBASE_PROJECT_ID="id" agent-browser -p browserbase open example.com
107152
-
107153
- # Browser Use
107154
- BROWSER_USE_API_KEY="key" agent-browser -p browseruse open example.com
107155
-
107156
- # Kernel
107157
- KERNEL_API_KEY="key" agent-browser -p kernel open example.com
107158
- \`\`\`
107159
-
107160
- ## iOS Simulator
107161
-
107162
- \`\`\`bash
107163
- agent-browser device list # List available simulators
107164
- agent-browser -p ios --device "iPhone 16 Pro" open example.com # Launch Safari
107165
- agent-browser -p ios snapshot -i # Same commands as desktop
107166
- agent-browser -p ios tap @e1 # Tap
107167
- agent-browser -p ios swipe up # Mobile-specific
107168
- agent-browser -p ios close # Close session
107169
- \`\`\`
107170
-
107171
- ## Native Mode (Experimental)
107172
-
107173
- Pure Rust daemon using direct CDP \u2014 no Node.js/Playwright required:
107174
- \`\`\`bash
107175
- agent-browser --native open example.com
107176
- # Or: export AGENT_BROWSER_NATIVE=1
107177
- # Or: {"native": true} in agent-browser.json
107178
- \`\`\`
107179
-
107180
- ---
107181
- Install: \`bun add -g agent-browser && agent-browser install\`. Run \`agent-browser --help\` for all commands. Repo: https://github.com/vercel-labs/agent-browser
107182
- `;
107183
-
107184
- // packages/skills-loader-core/src/features/builtin-skills/skills/agent-browser-template.ts
107185
- init_src();
107186
- var EM_DASH = "\u2014";
107187
- function createAgentBrowserTemplate(markdown) {
107188
- const { body } = parseFrontmatter(markdown);
107189
- return body.trim().replaceAll(` ${EM_DASH} `, " - ");
107190
- }
107191
- var agentBrowserTemplate = createAgentBrowserTemplate(SKILL_default);
107192
-
107193
- // packages/skills-loader-core/src/features/builtin-skills/skills/agent-browser-skill.ts
107194
- var agentBrowserSkill = {
107195
- name: "agent-browser",
107196
- description: "MUST USE for any browser-related tasks. Browser automation via agent-browser CLI - verification, browsing, information gathering, web scraping, testing, screenshots, and all browser interactions.",
107197
- template: agentBrowserTemplate,
107198
- allowedTools: ["Bash(agent-browser:*)"]
107199
- };
107200
106730
  // packages/skills-loader-core/src/features/builtin-skills/skills/playwright-mcp-skill.ts
107201
106731
  var BASE_MCP_ARGS = ["@playwright/mcp@latest"];
107202
106732
  function createPlaywrightSkill(options = {}) {
@@ -108871,7 +108401,7 @@ var debuggingSkill = {
108871
108401
  template: loadSharedSkillTemplate("debugging")
108872
108402
  };
108873
108403
  // packages/skills-loader-core/src/features/builtin-skills/security-research/SKILL.md
108874
- var SKILL_default2 = `# Security Research - Team Mode Vulnerability Audit
108404
+ var SKILL_default = `# Security Research - Team Mode Vulnerability Audit
108875
108405
 
108876
108406
  Use this skill to run a parallel security audit that separates real exploitability from generic concern. The team has 3 vulnerability hunters and 2 PoC engineers.
108877
108407
 
@@ -109075,7 +108605,7 @@ For each finding:
109075
108605
  var securityResearchSkill = {
109076
108606
  name: "security-research",
109077
108607
  description: "Team Mode security research skill. Orchestrates 3 vulnerability hunters and 2 PoC engineers to audit a codebase in parallel, prove exploitability, classify root causes, and calibrate severity by actual exploitability. Use for security review, vulnerability research, exploitability audit, pre-release security check, threat model validation, and `/security-research`. Triggers: 'security-research', 'security research', 'security review', 'vulnerability audit', 'exploitability audit', '\uBCF4\uC548 \uB9AC\uBDF0', '\uCDE8\uC57D\uC810 \uAC10\uC0AC'.",
109078
- template: SKILL_default2
108608
+ template: SKILL_default
109079
108609
  };
109080
108610
  // packages/skills-loader-core/src/features/builtin-skills/skills/security-review.ts
109081
108611
  var securityReviewSkill = {
@@ -109299,18 +108829,13 @@ function createBuiltinSkills(options = {}) {
109299
108829
  teamModeEnabled = false,
109300
108830
  playwrightMcpArgs
109301
108831
  } = options;
109302
- let browserSkill;
109303
- if (browserProvider === "agent-browser") {
109304
- browserSkill = agentBrowserSkill;
109305
- } else if (browserProvider === "dev-browser") {
109306
- browserSkill = devBrowserSkill;
109307
- } else if (browserProvider === "playwright-cli") {
109308
- browserSkill = playwrightCliSkill;
109309
- } else {
109310
- browserSkill = playwrightMcpArgs?.length ? createPlaywrightSkill({ mcp_args: playwrightMcpArgs }) : playwrightSkill;
109311
- }
108832
+ const browserSkills = {
108833
+ "dev-browser": devBrowserSkill,
108834
+ "playwright-cli": playwrightCliSkill,
108835
+ playwright: playwrightMcpArgs?.length ? createPlaywrightSkill({ mcp_args: playwrightMcpArgs }) : playwrightSkill
108836
+ };
109312
108837
  const skills = [
109313
- browserSkill,
108838
+ browserSkills[browserProvider],
109314
108839
  frontendSkill,
109315
108840
  gitMasterSkill,
109316
108841
  reviewWorkSkill,
@@ -109392,7 +108917,7 @@ async function getAllSkills(options) {
109392
108917
  allowedTools: skill.allowedTools,
109393
108918
  mcpConfig: skill.mcpConfig
109394
108919
  }));
109395
- const providerGatedSkillNames = new Set(["agent-browser", "playwright"]);
108920
+ const providerGatedSkillNames = new Set(["playwright"]);
109396
108921
  const filteredDiscoveredSkills = discoveredSkills.filter((skill) => {
109397
108922
  if (!providerGatedSkillNames.has(skill.name)) {
109398
108923
  return true;
@@ -109617,16 +109142,15 @@ function buildShellAwareGitPrefix(bashPrefix, shellType) {
109617
109142
  return buildEnvPrefix2(envRecord, resolvedShellType);
109618
109143
  }
109619
109144
  function injectGitMasterConfig(template, config) {
109620
- const commitFooter = config?.commit_footer ?? true;
109621
- const includeCoAuthoredBy = config?.include_co_authored_by ?? true;
109145
+ const commitFooter = config?.commit_footer ?? false;
109622
109146
  const gitEnvPrefix = assertValidGitEnvPrefix(config?.git_env_prefix ?? "GIT_MASTER=1");
109623
109147
  const shellType = detectShellType2();
109624
109148
  const shellPrefix = gitEnvPrefix ? buildShellAwareGitPrefix(gitEnvPrefix, shellType) : "";
109625
109149
  const codeBlockLang = shellType === "powershell" ? "pwsh" : shellType === "csh" ? "csh" : "bash";
109626
109150
  const skipBashBlockPrefixing = shellType === "powershell" || shellType === "cmd" || shellType === "csh";
109627
109151
  let result = gitEnvPrefix ? injectGitEnvPrefix(template, shellPrefix, codeBlockLang) : template;
109628
- if (commitFooter || includeCoAuthoredBy) {
109629
- const injection = buildCommitFooterInjection(commitFooter, includeCoAuthoredBy, shellPrefix);
109152
+ if (commitFooter) {
109153
+ const injection = buildCommitFooterInjection(commitFooter, shellPrefix);
109630
109154
  const insertionPoint = result.indexOf("```\n</execution>");
109631
109155
  result = insertionPoint !== -1 ? result.slice(0, insertionPoint) + "```\n\n" + injection + `
109632
109156
  </execution>` + result.slice(insertionPoint + "```\n</execution>".length) : result + `
@@ -109690,47 +109214,26 @@ function prefixGitCommandsInCodeBlock(codeBlock, prefix) {
109690
109214
  }).join(`
109691
109215
  `);
109692
109216
  }
109693
- function buildCommitFooterInjection(commitFooter, includeCoAuthoredBy, gitEnvPrefix) {
109694
- const sections = [];
109217
+ function buildCommitFooterInjection(commitFooter, gitEnvPrefix) {
109695
109218
  const cmdPrefix = gitEnvPrefix ? `${gitEnvPrefix} ` : "";
109696
- sections.push("### 5.5 Commit Footer & Co-Author");
109697
- sections.push("");
109698
- sections.push("Add Sisyphus attribution to EVERY commit:");
109699
- sections.push("");
109700
- if (commitFooter) {
109701
- const footerText = typeof commitFooter === "string" ? commitFooter : "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)";
109702
- sections.push("1. **Footer in commit body:**");
109703
- sections.push("```");
109704
- sections.push(footerText);
109705
- sections.push("```");
109706
- sections.push("");
109707
- }
109708
- if (includeCoAuthoredBy) {
109709
- sections.push(`${commitFooter ? "2" : "1"}. **Co-authored-by trailer:**`);
109710
- sections.push("```");
109711
- sections.push("Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>");
109712
- sections.push("```");
109713
- sections.push("");
109714
- }
109715
- if (commitFooter && includeCoAuthoredBy) {
109716
- const footerText = typeof commitFooter === "string" ? commitFooter : "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)";
109717
- sections.push("**Example (both enabled):**");
109718
- sections.push("```bash");
109719
- sections.push(`${cmdPrefix}git commit -m "{Commit Message}" -m "${footerText}" -m "Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>"`);
109720
- sections.push("```");
109721
- } else if (commitFooter) {
109722
- const footerText = typeof commitFooter === "string" ? commitFooter : "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)";
109723
- sections.push("**Example:**");
109724
- sections.push("```bash");
109725
- sections.push(`${cmdPrefix}git commit -m "{Commit Message}" -m "${footerText}"`);
109726
- sections.push("```");
109727
- } else if (includeCoAuthoredBy) {
109728
- sections.push("**Example:**");
109729
- sections.push("```bash");
109730
- sections.push(`${cmdPrefix}git commit -m "{Commit Message}" -m "Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>"`);
109731
- sections.push("```");
109732
- }
109733
- return sections.join(`
109219
+ const footerText = typeof commitFooter === "string" ? commitFooter : "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)";
109220
+ return [
109221
+ "### 5.5 Commit Footer",
109222
+ "",
109223
+ "Add Sisyphus attribution to EVERY commit:",
109224
+ "",
109225
+ "1. **Footer in commit body:**",
109226
+ "```",
109227
+ footerText,
109228
+ "```",
109229
+ "",
109230
+ "Do NOT add a Co-authored-by trailer.",
109231
+ "",
109232
+ "**Example:**",
109233
+ "```bash",
109234
+ `${cmdPrefix}git commit -m "{Commit Message}" -m "${footerText}"`,
109235
+ "```"
109236
+ ].join(`
109734
109237
  `);
109735
109238
  }
109736
109239
  // packages/skills-loader-core/src/features/opencode-skill-loader/skill-template-resolver.ts
@@ -162620,7 +162123,7 @@ function adaptHostSkillConfig(value) {
162620
162123
  }
162621
162124
 
162622
162125
  // packages/omo-opencode/src/plugin/skill-context.ts
162623
- var PROVIDER_GATED_SKILL_NAMES = new Set(["agent-browser", "dev-browser", "playwright"]);
162126
+ var PROVIDER_GATED_SKILL_NAMES = new Set(["dev-browser", "playwright"]);
162624
162127
  function mapScopeToLocation2(scope) {
162625
162128
  if (scope === "user" || scope === "opencode")
162626
162129
  return "user";
@@ -172850,9 +172353,7 @@ async function ackMessages(teamRunId, memberName, messageIds, config) {
172850
172353
  }
172851
172354
  // packages/omo-opencode/src/hooks/team-session-events/team-idle-wake-hint.ts
172852
172355
  init_store2();
172853
-
172854
172356
  // packages/team-core/src/team-mailbox/pending-delivery-recovery.ts
172855
- init_src();
172856
172357
  function getMessagesData2(response) {
172857
172358
  if (isRecord(response) && Array.isArray(response.data)) {
172858
172359
  return response.data;