oh-my-opencode 5.0.0-beta.86 → 5.0.0-beta.87

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 (233) hide show
  1. package/.agents/skills/hyperplan/SKILL.md +1 -1
  2. package/.opencode/skills/hyperplan/SKILL.md +1 -1
  3. package/dist/cli/index.js +27 -21
  4. package/dist/cli-node/index.js +27 -21
  5. package/dist/index.js +85 -87
  6. package/dist/skills/browser/ATTRIBUTION.md +26 -14
  7. package/dist/skills/browser/SKILL.md +65 -52
  8. package/dist/skills/browser/references/commands.md +81 -66
  9. package/dist/skills/browser/references/install.md +31 -34
  10. package/dist/skills/browser/references/owned-engine/README.md +41 -21
  11. package/dist/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
  12. package/dist/skills/browser/references/owned-engine/ladder.md +24 -22
  13. package/dist/skills/browser/references/owned-engine/network.md +35 -15
  14. package/dist/skills/browser/references/recipes/1password.md +13 -11
  15. package/dist/skills/browser/references/remote.md +5 -4
  16. package/dist/skills/browser/runtime/omowright/index.js +1534 -0
  17. package/dist/skills/browser/runtime/omowright/manifest.json +9 -0
  18. package/dist/skills/browser/runtime/omowright/page-bundle.js +1395 -0
  19. package/dist/skills/browser/scripts/browser-doctor.mjs +37 -32
  20. package/dist/skills/browser/scripts/browser-install.mjs +31 -44
  21. package/dist/skills/browser/scripts/omowright.mjs +25 -0
  22. package/dist/skills/debugging/SKILL.md +2 -2
  23. package/dist/skills/debugging/references/methodology/06-fix.md +3 -3
  24. package/dist/skills/debugging/references/methodology/08-qa.md +1 -1
  25. package/dist/skills/debugging/references/tools/browser-qa.md +104 -0
  26. package/dist/skills/frontend/SKILL.md +1 -1
  27. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  28. package/dist/skills/programming/SKILL.md +12 -18
  29. package/dist/skills/programming/references/rust/README.md +43 -15
  30. package/dist/skills/programming/references/rust/api-design.md +81 -0
  31. package/dist/skills/programming/references/rust/async-tokio.md +60 -28
  32. package/dist/skills/programming/references/rust/axum-stack.md +1 -13
  33. package/dist/skills/programming/references/rust/cargo-strict.md +44 -8
  34. package/dist/skills/programming/references/rust/clap-stack.md +8 -3
  35. package/dist/skills/programming/references/rust/concurrency.md +66 -52
  36. package/dist/skills/programming/references/rust/libraries.md +35 -25
  37. package/dist/skills/programming/references/rust/macros.md +63 -0
  38. package/dist/skills/programming/references/rust/one-liners.md +5 -3
  39. package/dist/skills/programming/references/rust/proptest-insta.md +8 -0
  40. package/dist/skills/programming/references/rust/type-state.md +50 -12
  41. package/dist/skills/programming/references/rust/unsafe-discipline.md +34 -6
  42. package/dist/skills/programming/references/rust/zero-cost-safety.md +62 -52
  43. package/dist/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
  44. package/dist/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
  45. package/dist/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
  46. package/dist/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
  47. package/dist/skills/programming/scripts/rust/new-project.py +31 -28
  48. package/dist/skills/review-work/SKILL.md +1 -1
  49. package/dist/skills/ultimate-browsing/SKILL.md +27 -20
  50. package/dist/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  51. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
  52. package/dist/skills/ultimate-browsing/references/insane-search/README.md +5 -11
  53. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
  54. package/dist/skills/ulw-execute/SKILL.md +4 -4
  55. package/dist/skills/visual-qa/SKILL.md +1 -1
  56. package/dist/skills/visual-qa/references/browser-setup.md +46 -46
  57. package/dist/tui.js +6 -3
  58. package/package.json +15 -14
  59. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  60. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
  61. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  62. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  63. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  66. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  67. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  68. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  69. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  70. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  71. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  72. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
  73. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  74. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  75. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  76. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  77. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  78. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  79. package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
  80. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
  81. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +63 -89
  82. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  83. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  84. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  85. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +2 -2
  86. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  87. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  88. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +63 -89
  89. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  90. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  91. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +2 -3
  92. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
  93. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  96. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  114. package/packages/omo-codex/plugin/package-lock.json +12 -12
  115. package/packages/omo-codex/plugin/package.json +1 -1
  116. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +8 -2
  117. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -2
  118. package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +26 -14
  119. package/packages/omo-codex/plugin/skills/browser/SKILL.md +65 -52
  120. package/packages/omo-codex/plugin/skills/browser/references/commands.md +81 -66
  121. package/packages/omo-codex/plugin/skills/browser/references/install.md +31 -34
  122. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +41 -21
  123. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
  124. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +24 -22
  125. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +35 -15
  126. package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +13 -11
  127. package/packages/omo-codex/plugin/skills/browser/references/remote.md +5 -4
  128. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +1534 -0
  129. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +9 -0
  130. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/page-bundle.js +1395 -0
  131. package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +37 -32
  132. package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +31 -44
  133. package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +25 -0
  134. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -2
  135. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +3 -3
  136. package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +1 -1
  137. package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +104 -0
  138. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  139. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  140. package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -18
  141. package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +43 -15
  142. package/packages/omo-codex/plugin/skills/programming/references/rust/api-design.md +81 -0
  143. package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +60 -28
  144. package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +1 -13
  145. package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +44 -8
  146. package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +8 -3
  147. package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +66 -52
  148. package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +35 -25
  149. package/packages/omo-codex/plugin/skills/programming/references/rust/macros.md +63 -0
  150. package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +5 -3
  151. package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +8 -0
  152. package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +50 -12
  153. package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +34 -6
  154. package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +62 -52
  155. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
  156. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
  157. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
  158. package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +31 -28
  159. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
  160. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +27 -20
  161. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  162. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
  163. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +5 -11
  164. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
  165. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +63 -89
  166. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +4 -4
  167. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +2 -3
  168. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
  169. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
  170. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +46 -46
  171. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -2
  172. package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
  173. package/packages/prompts-core/prompts/ultrawork/codex.md +63 -89
  174. package/packages/shared-skills/skills/browser/ATTRIBUTION.md +26 -14
  175. package/packages/shared-skills/skills/browser/SKILL.md +65 -52
  176. package/packages/shared-skills/skills/browser/references/commands.md +81 -66
  177. package/packages/shared-skills/skills/browser/references/install.md +31 -34
  178. package/packages/shared-skills/skills/browser/references/owned-engine/README.md +41 -21
  179. package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
  180. package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +24 -22
  181. package/packages/shared-skills/skills/browser/references/owned-engine/network.md +35 -15
  182. package/packages/shared-skills/skills/browser/references/recipes/1password.md +13 -11
  183. package/packages/shared-skills/skills/browser/references/remote.md +5 -4
  184. package/packages/shared-skills/skills/browser/runtime/omowright/index.js +1534 -0
  185. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +9 -0
  186. package/packages/shared-skills/skills/browser/runtime/omowright/page-bundle.js +1395 -0
  187. package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +37 -32
  188. package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +31 -44
  189. package/packages/shared-skills/skills/browser/scripts/omowright.mjs +25 -0
  190. package/packages/shared-skills/skills/debugging/SKILL.md +2 -2
  191. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +3 -3
  192. package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +1 -1
  193. package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +104 -0
  194. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  195. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  196. package/packages/shared-skills/skills/programming/SKILL.md +12 -18
  197. package/packages/shared-skills/skills/programming/references/rust/README.md +43 -15
  198. package/packages/shared-skills/skills/programming/references/rust/api-design.md +81 -0
  199. package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +60 -28
  200. package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +1 -13
  201. package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +44 -8
  202. package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +8 -3
  203. package/packages/shared-skills/skills/programming/references/rust/concurrency.md +66 -52
  204. package/packages/shared-skills/skills/programming/references/rust/libraries.md +35 -25
  205. package/packages/shared-skills/skills/programming/references/rust/macros.md +63 -0
  206. package/packages/shared-skills/skills/programming/references/rust/one-liners.md +5 -3
  207. package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +8 -0
  208. package/packages/shared-skills/skills/programming/references/rust/type-state.md +50 -12
  209. package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +34 -6
  210. package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +62 -52
  211. package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
  212. package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
  213. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
  214. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
  215. package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +31 -28
  216. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  217. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +27 -20
  218. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  219. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
  220. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +5 -11
  221. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
  222. package/packages/shared-skills/skills/ulw-execute/SKILL.md +4 -4
  223. package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
  224. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +46 -46
  225. package/dist/skills/browser/scripts/browser-env.mjs +0 -41
  226. package/dist/skills/debugging/references/tools/playwright-cli.md +0 -112
  227. package/dist/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
  228. package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +0 -41
  229. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +0 -112
  230. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
  231. package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +0 -41
  232. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +0 -112
  233. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
@@ -5,12 +5,12 @@ defect.** The failure itself selects the next rung; never pause to ask which.
5
5
 
6
6
  | Rung | Use | Climb when |
7
7
  |---|---|---|
8
- | 1. snapshot + locator(ref) | anything with a usable ref | the ref is absent, stale, obscured, or the click lands on the wrong node twice |
9
- | 1b. layer description | a blocking overlay explains two identical misses | no overlay is reported, or it is gone and the click still misses |
10
- | 2. coordinates | canvas, extension popups, custom controls, drag surfaces | the click misses, or the screenshot and the coordinates disagree |
11
- | 3. pin the viewport, redo rung 2 | coordinate drift after a resize, a DPI change, or a foreign tab | coordinates land correctly but the widget still refuses input |
12
- | 4. the challenge widget | a challenge is the blocker | it clears and the flow still stalls |
13
- | 5. read the browser log | a browser-level failure | the log names a cause outside the page |
8
+ | 1. `page.snapshot()` + `page.locator(ref)` | anything with a usable ref | the ref is absent, stale, obscured, or the click lands on the wrong node twice |
9
+ | 1b. `snapshotWithLayers(page)` / `describeLayers(page)` | a blocking overlay explains two identical misses | `@layers none`, or the overlay is gone and the click still misses |
10
+ | 2. `createCua(page)` coordinates | canvas, extension popups, custom controls, drag surfaces | the click misses, or the screenshot and the coordinates disagree |
11
+ | 3. pin the viewport (`emulate(page, "desktop-1440")` / `repinViewport`), redo rung 2 | coordinate drift after a resize, a DPI change, or a foreign tab | coordinates land correctly but the widget still refuses input |
12
+ | 4. `createCaptcha(page)` | a challenge is the blocker | it clears and the flow still stalls |
13
+ | 5. read the browser log (`browser.close()` surfaces the stdio tail) | a browser-level failure | the log names a cause outside the page |
14
14
 
15
15
  **Rung 5 ends in a written diagnosis, never a speculative code change.** A missing entitlement, a
16
16
  dead extension service worker, an unavailable authenticator — none of those is fixed by editing
@@ -18,38 +18,40 @@ automation code.
18
18
 
19
19
  ## Pin the viewport before trusting any coordinate
20
20
 
21
- Coordinate input acts in viewport pixels. When the render surface and the coordinate space
21
+ `createCua(page)` acts in viewport pixels. When the render surface and the coordinate space
22
22
  disagree, every coordinate is off by the same constant and retrying just repeats the miss. Set the
23
- device metrics explicitly (width, height, `deviceScaleFactor`, and a matching viewport), re-read
24
- the page's viewport size, then take a **fresh** screenshot. Coordinates read off an unpinned
25
- screenshot are stale. Pin every page you act on, including tabs you did not open.
23
+ device metrics explicitly (`emulate` applies width, height, `deviceScaleFactor` and touch
24
+ together), re-read the page's viewport size, then take a **fresh** `cua.getVisibleScreenshot()`.
25
+ Coordinates read off an unpinned screenshot are stale. Pin every page you act on, including tabs
26
+ you did not open (`createAgentTabs` re-pins on create).
26
27
 
27
28
  ## Refs
28
29
 
29
30
  - Refs die on every new snapshot. Pass a ref straight from the latest snapshot; never reuse one
30
31
  across snapshots and never put one in a CSS selector.
31
- - Refs stay page-level. A child-frame ref still resolves through the page, so you never fetch a
32
- frame handle to click inside an iframe.
33
- - Always compact a snapshot before sending it to a model.
32
+ - Refs stay page-level. A child-frame ref (`f1e3`) still resolves through `page.locator`, so you
33
+ never fetch a frame handle to click inside an iframe.
34
+ - Always `compactSnapshot()` before sending a snapshot to a model.
34
35
 
35
36
  ## Challenge widgets
36
37
 
37
38
  A challenge is an obstacle on the path, not a stop sign: clear it, confirm it cleared, continue.
38
- Three shapes, three techniques:
39
+ `createCaptcha(page)` gives three techniques:
39
40
 
40
- - **Checkbox** (the common embedded widgets): the control lives in a nested frame, so address it
41
- by viewport coordinates.
42
- - **Slider / puzzle**: drag along a path with enough intermediate steps that the motion reads as
43
- human. Raise the step count before you change the endpoints.
44
- - **Text or number**: OCR the region. On macOS the system vision framework is the cheapest
45
- accurate option; elsewhere pass your own OCR function or a vision model.
46
- - **Image grid**: annotate a screenshot, then click per cell.
41
+ - **Checkbox** (the common embedded widgets): the control lives in a nested frame, so
42
+ `captcha.click(bounds)` addresses it by viewport coordinates.
43
+ - **Slider / puzzle**: `captcha.drag(from, to, { steps })` with enough intermediate steps that the
44
+ motion reads as human. Raise the step count before you change the endpoints.
45
+ - **Text or number**: `captcha.readText(bounds)` OCRs the region — the macOS Vision framework by
46
+ default, or pass your own `ocr` function or a vision model.
47
+ - **Image grid**: annotate a screenshot, then click per cell with `createCua`.
47
48
 
48
49
  **Bounds measured against an unpinned viewport are wrong by a constant offset.** If clicks have
49
50
  been landing wrong, drop to rung 3 first, then re-read the bounds.
50
51
 
51
52
  Verify with a fresh snapshot that the challenge is gone. Verification is part of the action, not a
52
- separate optimistic assumption.
53
+ separate optimistic assumption. When every technique fails on a page a real browser passes, the
54
+ engine is the variable: relaunch through `connectCloakProfile()`.
53
55
 
54
56
  ## Delegating the pixel loop
55
57
 
@@ -6,37 +6,57 @@ next week. Watching traffic costs nothing on a target you own, and the page cann
6
6
 
7
7
  **Snoop before you scrape.** Scroll-and-parse is the fallback, not the default.
8
8
 
9
+ ```js
10
+ const snoop = omowright.createNetworkSnoop(page, { maxBodyBytes: 512 * 1024 })
11
+ await page.goto(url)
12
+ const hit = await snoop.waitFor({ url: /\/api\/search/, mimeType: "application/json" }, { timeoutMs: 10_000 })
13
+ const rows = snoop.popJson() // every buffered JSON body, drained
14
+ console.log(snoop.summary({ max: 20 })) // one line per request: method status mime size url
15
+ snoop.dispose()
16
+ ```
17
+
9
18
  ## Wait for a request, never for a clock
10
19
 
11
- A fixed sleep is a guess that fails on a slower machine and wastes time on a faster one. Subscribe
12
- to the response you expect **before** triggering the action, then await that signal with a bounded
13
- timeout. This is the same rule that governs test code, for the same reason.
20
+ A fixed sleep is a guess that fails on a slower machine and wastes time on a faster one.
21
+ `snoop.waitFor(match)` subscribes to the response you expect **before** you trigger the action,
22
+ then awaits it with a bounded timeout. This is the same rule that governs test code, for the same
23
+ reason.
14
24
 
15
25
  ## Collecting through infinite scroll
16
26
 
17
- Drive scroll and extraction as a generator: scroll, collect what is new, stop on a target count or
18
- a scroll ceiling. Bound both, so a page that keeps producing cannot run forever.
27
+ ```js
28
+ for await (const batch of omowright.collectWhileScrolling(page, snoop, { minItems: 200, maxScrolls: 10, extract: (json) => json.items })) {
29
+ items.push(...batch)
30
+ }
31
+ ```
32
+
33
+ Scroll, collect what is new, stop on a target count or a scroll ceiling. Bound both, so a page
34
+ that keeps producing cannot run forever.
19
35
 
20
36
  ## Flight traces
21
37
 
22
- For QA evidence, record a trace: one entry per step with before/after screenshots, the network
23
- log, and console output, written as a line-delimited log plus an HAR. That triple is what makes a
24
- failure reconstructable afterwards instead of re-runnable-in-theory.
38
+ For QA evidence, `createTrace(page, { dir })` records one entry per `trace.step(name, fn)` with
39
+ before/after screenshots, the network log and console output, written as `trace.jsonl` plus
40
+ `trace.har` (`toHar` builds the HAR from snoop entries). That triple is what makes a failure
41
+ reconstructable afterwards instead of re-runnable-in-theory. Call `trace.stop()` in `finally`.
25
42
 
26
43
  Cap recorded body sizes. An untrimmed trace of a media-heavy page is mostly bytes nobody reads.
27
44
 
28
45
  ## Request interception
29
46
 
30
- Route matching by glob, regular expression, or predicate lets you stub an endpoint, fail one
31
- request to test an error path, or block third-party noise. Enable interception on the first route
32
- and disable it on dispose — leaving it on slows every later navigation.
47
+ `createRoutes(page)` matches by glob, regular expression, or predicate and lets a handler
48
+ `continue`, `fulfill({ status, body })` or `abort()`: stub an endpoint, fail one request to test an
49
+ error path, block third-party noise. Interception is enabled on the first route and disabled on
50
+ `dispose()` — leaving it on slows every later navigation and changes the timing fingerprint, so
51
+ prefer passive snooping on bot-scored targets.
33
52
 
34
53
  ## Cookies
35
54
 
36
- Injecting a cookie export into your own profile is legitimate for ordinary sessions and useless
37
- for the ones you most want: accounts whose risk engines bind a session to a device will invalidate
38
- it, and a password manager's session is tab-bound and never portable. Sanitize what you do inject
39
- (drop expired entries, keep host-prefixed cookies secure and root-scoped).
55
+ `injectCookies(page, cookies)` sanitizes what it injects (drops expired entries, keeps
56
+ host-prefixed cookies secure and root-scoped). Injecting an export into your own profile is
57
+ legitimate for ordinary sessions and useless for the ones you most want: accounts whose risk
58
+ engines bind a session to a device will invalidate it, and a password manager's session is
59
+ tab-bound and never portable.
40
60
 
41
61
  **Never copy a session out of the user's real browser profile.** If you need their login, that is
42
62
  the attached engine's job.
@@ -16,25 +16,27 @@ not in a cookie. So:
16
16
  Therefore: borrow the existing tab, read, return it. Do not open, do not navigate away, do not
17
17
  "refresh to fix" anything.
18
18
 
19
- ```bash
20
- bsk tab list --scope user # find the already-signed-in tab
21
- bsk tab borrow <tab-id>
22
- # ... read ...
23
- bsk tab return <tab-id>
19
+ ```js
20
+ const { tabs } = await session.tabList({ scope: "user" }) // find the already-signed-in tab by URL
21
+ const vault = tabs.find((t) => /my\.1password\.com\/(?:vaults|app)/.test(t.url))
22
+ await session.tabBorrow(vault.tab_id) // the user confirms
23
+ // ... read ...
24
+ await session.tabReturn(vault.tab_id)
24
25
  ```
25
26
 
26
27
  ## Check liveness by URL, never by title
27
28
 
28
29
  The app mutates its URL hash without updating the document title, so a signed-in vault can still
29
30
  report a sign-in title. A live session's `location.href` contains the app path and never the
30
- sign-in path. Read the URL.
31
+ sign-in path. Read the URL from `tabList`, or `session.evaluate("location.href")`.
31
32
 
32
33
  ## The browser may be shared
33
34
 
34
35
  Other automation may be driving the same window.
35
36
 
36
- - **Clear the search box before typing.** It often holds someone else's query, and typing alone
37
- appends to it, returning confident results for the wrong search.
37
+ - **Clear the search box before typing** (`fill(target, value, { clearBefore: true })`). It often
38
+ holds someone else's query, and typing alone appends to it, returning confident results for the
39
+ wrong search.
38
40
  - **Read the autocomplete listbox, not the results grid.** The grid holds whatever query was last
39
41
  committed, possibly by another actor. Scraping every option on the page silently merges two
40
42
  different searches.
@@ -42,11 +44,11 @@ Other automation may be driving the same window.
42
44
 
43
45
  ## If it is locked
44
46
 
45
- ```bash
46
- bsk request-help --session <id> --prompt "Please unlock 1Password in this tab, then continue."
47
+ ```js
48
+ await session.requestHelp({ prompt: "Please unlock 1Password in this tab, then continue." })
47
49
  ```
48
50
 
49
- Then observe again.
51
+ Then read the page again.
50
52
 
51
53
  ## Not in scope
52
54
 
@@ -6,18 +6,19 @@ nothing in this package needs to bridge it.
6
6
  Shape:
7
7
 
8
8
  - The **browser machine** needs only the extension.
9
- - The **agent machine** runs the `bsk` CLI and this skill.
9
+ - The **agent machine** runs the `bsk` daemon, omowright and this skill.
10
10
  - They are joined by a daemon in server mode plus a pairing link.
11
11
 
12
12
  ```bash
13
- bsk daemon start --mode server # on the machine the agent runs on
13
+ bsk daemon start --mode server # on the machine the agent runs on; WSS is required off loopback
14
14
  ```
15
15
 
16
16
  Then follow upstream's pairing guide, which owns the current flag surface and the TLS
17
17
  prerequisites: https://github.com/Tencent/BrowserSkill/blob/main/docs/remote-extension-connection.md
18
18
 
19
- Once paired, every command in `commands.md` behaves identically; `--out` paths still resolve on
20
- the machine that ran the command.
19
+ Once paired, `connectBrowserSkill()` and every session method behave identically; screenshot
20
+ buffers arrive on the machine that ran the call. Windows named pipes are not discovered
21
+ automatically — pass `sockPath` to `connectBrowserSkill()`.
21
22
 
22
23
  If pairing is not configured, say so and ask. Do not substitute a browser on the agent machine:
23
24
  the point of the attached engine is the sessions that live in the user's browser, and a local