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

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 (242) 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 +102 -79
  4. package/dist/cli-node/index.js +102 -79
  5. package/dist/index.js +439 -420
  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/ambience-skill.md +2 -1
  28. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  29. package/dist/skills/frontend/references/design/design-system-architecture.md +30 -7
  30. package/dist/skills/frontend/references/design/interaction-skill.md +17 -5
  31. package/dist/skills/programming/SKILL.md +12 -18
  32. package/dist/skills/programming/references/rust/README.md +43 -15
  33. package/dist/skills/programming/references/rust/api-design.md +81 -0
  34. package/dist/skills/programming/references/rust/async-tokio.md +60 -28
  35. package/dist/skills/programming/references/rust/axum-stack.md +1 -13
  36. package/dist/skills/programming/references/rust/cargo-strict.md +44 -8
  37. package/dist/skills/programming/references/rust/clap-stack.md +8 -3
  38. package/dist/skills/programming/references/rust/concurrency.md +66 -52
  39. package/dist/skills/programming/references/rust/libraries.md +35 -25
  40. package/dist/skills/programming/references/rust/macros.md +63 -0
  41. package/dist/skills/programming/references/rust/one-liners.md +5 -3
  42. package/dist/skills/programming/references/rust/proptest-insta.md +8 -0
  43. package/dist/skills/programming/references/rust/type-state.md +50 -12
  44. package/dist/skills/programming/references/rust/unsafe-discipline.md +34 -6
  45. package/dist/skills/programming/references/rust/zero-cost-safety.md +62 -52
  46. package/dist/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
  47. package/dist/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
  48. package/dist/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
  49. package/dist/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
  50. package/dist/skills/programming/scripts/rust/new-project.py +31 -28
  51. package/dist/skills/review-work/SKILL.md +1 -1
  52. package/dist/skills/ultimate-browsing/SKILL.md +27 -20
  53. package/dist/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  54. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
  55. package/dist/skills/ultimate-browsing/references/insane-search/README.md +5 -11
  56. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
  57. package/dist/skills/ulw-execute/SKILL.md +4 -4
  58. package/dist/skills/visual-qa/SKILL.md +1 -1
  59. package/dist/skills/visual-qa/references/browser-setup.md +46 -46
  60. package/dist/tui.js +6 -3
  61. package/package.json +15 -14
  62. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  63. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
  64. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  65. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  66. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  67. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  69. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  70. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  71. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  72. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  73. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  74. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  75. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
  76. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  77. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  78. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  79. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  80. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  81. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  82. package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
  83. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
  84. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +63 -89
  85. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  86. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  87. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  88. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +2 -2
  89. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  90. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  91. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +63 -89
  92. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  93. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  94. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +2 -3
  95. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
  96. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  115. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  116. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  117. package/packages/omo-codex/plugin/package-lock.json +12 -12
  118. package/packages/omo-codex/plugin/package.json +1 -1
  119. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +8 -2
  120. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -2
  121. package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +26 -14
  122. package/packages/omo-codex/plugin/skills/browser/SKILL.md +65 -52
  123. package/packages/omo-codex/plugin/skills/browser/references/commands.md +81 -66
  124. package/packages/omo-codex/plugin/skills/browser/references/install.md +31 -34
  125. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +41 -21
  126. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
  127. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +24 -22
  128. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +35 -15
  129. package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +13 -11
  130. package/packages/omo-codex/plugin/skills/browser/references/remote.md +5 -4
  131. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +1534 -0
  132. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +9 -0
  133. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/page-bundle.js +1395 -0
  134. package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +37 -32
  135. package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +31 -44
  136. package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +25 -0
  137. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -2
  138. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +3 -3
  139. package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +1 -1
  140. package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +104 -0
  141. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  142. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +2 -1
  143. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  144. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +30 -7
  145. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +17 -5
  146. package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -18
  147. package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +43 -15
  148. package/packages/omo-codex/plugin/skills/programming/references/rust/api-design.md +81 -0
  149. package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +60 -28
  150. package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +1 -13
  151. package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +44 -8
  152. package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +8 -3
  153. package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +66 -52
  154. package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +35 -25
  155. package/packages/omo-codex/plugin/skills/programming/references/rust/macros.md +63 -0
  156. package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +5 -3
  157. package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +8 -0
  158. package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +50 -12
  159. package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +34 -6
  160. package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +62 -52
  161. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
  162. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
  163. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
  164. package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +31 -28
  165. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
  166. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +27 -20
  167. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  168. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
  169. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +5 -11
  170. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
  171. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +63 -89
  172. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +4 -4
  173. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +2 -3
  174. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
  175. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
  176. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +46 -46
  177. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -2
  178. package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
  179. package/packages/prompts-core/prompts/ultrawork/codex.md +63 -89
  180. package/packages/shared-skills/skills/browser/ATTRIBUTION.md +26 -14
  181. package/packages/shared-skills/skills/browser/SKILL.md +65 -52
  182. package/packages/shared-skills/skills/browser/references/commands.md +81 -66
  183. package/packages/shared-skills/skills/browser/references/install.md +31 -34
  184. package/packages/shared-skills/skills/browser/references/owned-engine/README.md +41 -21
  185. package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
  186. package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +24 -22
  187. package/packages/shared-skills/skills/browser/references/owned-engine/network.md +35 -15
  188. package/packages/shared-skills/skills/browser/references/recipes/1password.md +13 -11
  189. package/packages/shared-skills/skills/browser/references/remote.md +5 -4
  190. package/packages/shared-skills/skills/browser/runtime/omowright/index.js +1534 -0
  191. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +9 -0
  192. package/packages/shared-skills/skills/browser/runtime/omowright/page-bundle.js +1395 -0
  193. package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +37 -32
  194. package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +31 -44
  195. package/packages/shared-skills/skills/browser/scripts/omowright.mjs +25 -0
  196. package/packages/shared-skills/skills/debugging/SKILL.md +2 -2
  197. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +3 -3
  198. package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +1 -1
  199. package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +104 -0
  200. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  201. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +2 -1
  202. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  203. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +30 -7
  204. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +17 -5
  205. package/packages/shared-skills/skills/programming/SKILL.md +12 -18
  206. package/packages/shared-skills/skills/programming/references/rust/README.md +43 -15
  207. package/packages/shared-skills/skills/programming/references/rust/api-design.md +81 -0
  208. package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +60 -28
  209. package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +1 -13
  210. package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +44 -8
  211. package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +8 -3
  212. package/packages/shared-skills/skills/programming/references/rust/concurrency.md +66 -52
  213. package/packages/shared-skills/skills/programming/references/rust/libraries.md +35 -25
  214. package/packages/shared-skills/skills/programming/references/rust/macros.md +63 -0
  215. package/packages/shared-skills/skills/programming/references/rust/one-liners.md +5 -3
  216. package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +8 -0
  217. package/packages/shared-skills/skills/programming/references/rust/type-state.md +50 -12
  218. package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +34 -6
  219. package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +62 -52
  220. package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
  221. package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
  222. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
  223. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
  224. package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +31 -28
  225. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  226. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +27 -20
  227. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  228. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
  229. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +5 -11
  230. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
  231. package/packages/shared-skills/skills/ulw-execute/SKILL.md +4 -4
  232. package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
  233. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +46 -46
  234. package/dist/skills/browser/scripts/browser-env.mjs +0 -41
  235. package/dist/skills/debugging/references/tools/playwright-cli.md +0 -112
  236. package/dist/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
  237. package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +0 -41
  238. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +0 -112
  239. package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
  240. package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +0 -41
  241. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +0 -112
  242. package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
@@ -1,25 +1,37 @@
1
1
  # ATTRIBUTION / NOTICE
2
2
 
3
- This skill (`browser`, part of `@oh-my-opencode/shared-skills`) is project-original documentation.
4
- It drives a third-party tool that it does **not** redistribute.
3
+ This skill (`browser`, part of `@oh-my-opencode/shared-skills`) is project-original documentation
4
+ plus a staged copy of one library it drives.
5
+
6
+ ## omowright — bundled
7
+
8
+ Both engines this skill documents are provided by **omowright**.
9
+
10
+ - Upstream: the `omowright` repository on GitHub, pinned by commit in the root `package.json`
11
+ devDependency.
12
+ - License: MIT
13
+ - What ships here: `runtime/omowright/index.js` (the library bundled into one ESM file, including
14
+ its `ws` and `zod` dependencies) and `runtime/omowright/page-bundle.js` (the in-page snapshot
15
+ script it reads at import time), staged at build time by
16
+ `packages/shared-skills/stage-omowright-runtime.mjs` from the pinned root devDependency, with a
17
+ `manifest.json` recording the version and file digests. The repository holds no copy; the
18
+ staged files are gitignored and packed through the sibling `.npmignore`.
19
+ - omowright's own license notice is preserved inside the bundled file.
5
20
 
6
21
  ## BrowserSkill — driven, not vendored
7
22
 
8
- The attached engine this skill documents is **BrowserSkill** by Tencent.
23
+ The attached engine reaches the user's browser through **BrowserSkill** by Tencent.
9
24
 
10
25
  - Upstream: https://github.com/Tencent/BrowserSkill
11
26
  - License: MIT
12
- - What ships here: documentation and two local helper scripts, authored by this project.
13
- - What does NOT ship here: the `bsk` CLI, the daemon, the browser extension, or any upstream
14
- source. The user installs those from upstream's own installer and from the Chrome Web Store /
15
- Edge Add-ons listings. This package never bundles a browser binary or an extension payload.
16
-
17
- MIT permits redistribution; we simply have no reason to, because upstream publishes signed
18
- per-platform releases and store builds that stay current on their own.
27
+ - What ships here: nothing of upstream's. omowright speaks the daemon's IPC protocol; the user
28
+ installs the `bsk` CLI from upstream's own installer (run by `scripts/browser-install.mjs`) and
29
+ the extension from the Chrome Web Store / Edge Add-ons listings (registered by the same script
30
+ through Chrome's external-extension mechanism). This package never bundles a browser binary or
31
+ an extension payload.
19
32
 
20
33
  ## Owned-engine references
21
34
 
22
- `references/owned-engine/` documents a *contract* for a code-driven browser — the escalation
23
- ladder, viewport pinning, reading the network instead of the DOM, overlay and cross-origin
24
- handling — not any particular package. The techniques are generic CDP practice. No third-party
25
- source is reproduced.
35
+ `references/owned-engine/` summarizes omowright's own skill and presets (escalation ladder,
36
+ network-first reading, frames, dialogs, human handoff) as routing text; the library's repository
37
+ is the authoritative treatment.
@@ -1,89 +1,102 @@
1
1
  ---
2
2
  name: browser
3
- description: "Drives a real browser: sites the user is already signed into, forms and clicks, JS-rendered pages, screenshots, web QA, extension popups, and a human handoff for login, CAPTCHA or OTP. Works through the BrowserSkill extension and its bsk CLI, inside the user's own browser, in a separate Agent Window. Use for any interactive browser task; not for a plain search or an unblocked static fetch."
3
+ description: "Drives a real browser through the omowright library from the js eval kernel: sites the user is already signed into, forms and clicks, JS-rendered pages, screenshots, web QA, extension popups, a human handoff for login, CAPTCHA or OTP, and a browser you own for scraping, bot-scored targets, network capture and QA traces. Use for any interactive browser task; not for a plain search or an unblocked static fetch."
4
4
  ---
5
5
 
6
6
  # Browser
7
7
 
8
- Two engines live behind this skill. Choose before you act:
8
+ One library, two engines. omowright ships inside this skill; choose the engine before you act:
9
9
 
10
- | You need | Engine | Where |
10
+ | You need | Engine | Entry point |
11
11
  |---|---|---|
12
- | A site the user is signed into, a form, a click-through, a screenshot, web QA, an extension popup | **attached** — the user's own browser | this file |
13
- | A throwaway profile, bot-scoring evasion, a CAPTCHA, network interception, a QA flight trace, coordinate control | **owned** — a browser your code launches | [references/owned-engine/README.md](references/owned-engine/README.md) |
12
+ | A site the user is signed into, their open tabs, a form, a click-through, a screenshot, web QA, an extension popup | **attached** — the user's own browser through BrowserSkill | `connectBrowserSkill()` |
13
+ | A throwaway profile, bot-scoring evasion, a CAPTCHA, network interception, a QA flight trace, coordinate control, headless runs | **owned** — a browser your code launches | `connectPipe()` / `connectCloakProfile()` — [references/owned-engine/README.md](references/owned-engine/README.md) |
14
14
  | Text out of a URL, a 403 bypass, a platform that blocks fetchers | neither | the `ultimate-browsing` skill |
15
15
 
16
16
  **Attached is the default,** because it is the only engine carrying the user's logins and the only
17
- one where a human is a single command away. The owned engine is an opt-in local install, not part
18
- of this package.
17
+ one where a human is a single call away. Never substitute one engine for the other silently: if
18
+ the attached engine is not set up, run the onboarding script and tell the user its one remaining
19
+ step.
19
20
 
20
- ## Step 0 — prove the stack before you drive it
21
+ ## Step 0 — load omowright and prove the stack
21
22
 
22
- ```bash
23
- node "<skill-root>/scripts/browser-doctor.mjs"
23
+ ```js
24
+ const { loadOmowright } = await import("<skill-root>/scripts/omowright.mjs")
25
+ const { omowright } = await loadOmowright() // { connectBrowserSkill, bskSnapshot, connectPipe, ... }
24
26
  ```
25
27
 
26
- It reports one of four states and what to do next:
28
+ ```bash
29
+ node "<skill-root>/scripts/browser-doctor.mjs" --json
30
+ ```
27
31
 
28
32
  | State | Meaning | Next |
29
33
  |---|---|---|
30
34
  | `ready` | CLI, daemon and a connected browser | start a session |
31
- | `no-extension` | CLI works, no browser is connected | give the user the store link the doctor printed, wait, re-run |
32
- | `no-cli` | `bsk` is not installed | `node "<skill-root>/scripts/browser-install.mjs"`, then re-run |
33
- | `no-browser-support` | the platform has no supported browser | say so and stop |
34
-
35
- **Never substitute another browser for a missing one.** A headless browser you launch yourself has
36
- none of the user's sessions, so every login turns into a ladder you should not be climbing. If the
37
- attached engine is unavailable, say which state you hit and ask the user.
38
-
39
- ## The loop
40
-
41
- ```bash
42
- bsk session start --json --no-focus --name "<task>" # keep session_id
43
- bsk navigate https://example.com --session <id> --json
44
- bsk observe --session <id> # @eN refs live here
45
- bsk click @e1 --session <id> --json
46
- bsk screenshot --session <id> --out ./shot.png --json
47
- bsk session stop <id> --json # success AND failure
35
+ | `no-cli` / `no-daemon` / `no-extension` | something is missing | `node "<skill-root>/scripts/browser-install.mjs"` prepares everything it can, then prints the **single** step only the user can do (relaunch the browser and click **Enable**); relay it verbatim, wait, re-run the doctor |
36
+ | `no-browser-support` | no Chromium-family profile on this machine | say so and stop |
37
+
38
+ **Never launch a headless browser because the attached one is missing.** It has none of the
39
+ user's sessions, so every login turns into a ladder you should not be climbing. Say which state
40
+ you hit and ask.
41
+
42
+ ## The loop (attached)
43
+
44
+ ```js
45
+ const session = await omowright.connectBrowserSkill({ name: "<task>", focused: false })
46
+ try {
47
+ await session.navigate("https://example.com/", { waitUntil: "load" })
48
+ const { tree, refs, css } = await omowright.bskSnapshot(session, { interactive: true }) // OmOWright tree + refs, no trace in the page
49
+ await session.click({ selector: css.e3 }) // css[ref] is null inside shadow roots:
50
+ const vom = await session.observe({ maxTokens: 4000 }) // then read the daemon's own tree ...
51
+ await session.click("@e7") // ... and click its @eN ref
52
+ await session.fill(css.e5, "hello")
53
+ await session.press("Enter")
54
+ await session.waitForNavigation({ waitUntil: "load" })
55
+ const shot = await session.screenshot() // { buffer, width, height, captureId }
56
+ } finally {
57
+ await session.stop() // success AND failure; returns borrowed tabs
58
+ }
48
59
  ```
49
60
 
50
- 1. **Observe before every action.** `observe` returns a semantic tree whose `@eN` refs are reissued
51
- on each call. Read a ref and use it in the same cycle; a ref from two calls ago points somewhere
52
- else now.
53
- 2. **Navigation and large DOM changes stale every ref.** Observe again rather than reusing.
61
+ 1. **Read before every action.** `bskSnapshot` refs and `observe` `@eN` refs are reissued on each
62
+ call; use a ref in the same cycle you read it.
63
+ 2. **Navigation and large DOM changes stale every ref.** Read again rather than reusing.
54
64
  3. **Two identical failures mean change approach, not retry.** A third identical attempt is a defect.
55
- 4. **Borrow a user tab explicitly** (`tab list --scope user`, `tab borrow <id>`, `tab return <id>`).
65
+ 4. **Borrow a user tab explicitly** (`tabList({ scope: "user" })`, `tabBorrow(id)`, `tabReturn(id)`).
56
66
  Borrowing prompts the user; never invent tab ids and never repeat a denied borrow.
57
- 5. **Always stop the session,** on success and on failure. Stopping also returns borrowed tabs.
67
+ 5. **Always `stop()` the session,** on success and on failure.
58
68
 
59
- Command semantics, the flags that behave differently than they read, and the failure table are in
60
- [references/commands.md](references/commands.md).
69
+ Every method, its options, and the failure codes are in [references/commands.md](references/commands.md).
61
70
 
62
71
  ## When a human is the only way through
63
72
 
64
73
  Login, CAPTCHA, OTP, a payment confirmation, a consent dialog:
65
74
 
66
- ```bash
67
- bsk request-help --session <id> --prompt "<what you need done>" [--target @eN]
75
+ ```js
76
+ const outcome = await session.requestHelp({ prompt: "<what you need done>", targets: ["@e4"], timeoutMs: 300_000 })
68
77
  ```
69
78
 
70
- Then observe again. Respect a `cancelled` or `timed_out` answer; do not work around it by changing
71
- the extension's automation settings.
79
+ Then read the page again. Respect a `cancelled` or `timed_out` outcome; do not work around it by
80
+ changing the extension's automation settings.
72
81
 
73
82
  ## Rules
74
83
 
75
- - **Never read credentials through the page.** No `evaluate` that extracts a password, token, cookie
76
- or recovery code. The value of this engine is that the browser is already signed in.
84
+ - **Never read credentials through the page.** No `evaluate` that extracts a password, token,
85
+ cookie or recovery code. The value of the attached engine is that the browser is already signed in.
77
86
  - **Never clear cookies, cache or site data.** It is the user's real profile; clearing it logs them
78
87
  out everywhere. No flow here needs it.
79
- - **`--no-focus` by default.** The browser belongs to someone who is probably using it.
88
+ - **`focused: false` by default.** The browser belongs to someone who is probably using it.
80
89
  - **One short, named session per task,** always stopped.
81
- - Do not toggle the extension's automation settings, and do not restart the browser to fix a state.
82
-
83
- ## More
84
-
85
- - [references/install.md](references/install.md) — installing the CLI and the extension, per OS
86
- - [references/commands.md](references/commands.md) — command semantics, refs, failure table
87
- - [references/remote.md](references/remote.md) — agent on one machine, browser on another
88
- - [references/recipes/1password.md](references/recipes/1password.md) — reading a vault the user has unlocked
89
- - [references/owned-engine/README.md](references/owned-engine/README.md) — the code-driven engine
90
+ - **Bot-scored or WAF targets go to the owned engine.** The attached engine's daemon enables console
91
+ capture on every tab it drives, which is a known automation signal; CloakBrowser through
92
+ `connectCloakProfile()` is the stealth path.
93
+
94
+ ## Where the rest lives
95
+
96
+ | Topic | Read |
97
+ |---|---|
98
+ | Session methods, targets, options, error codes | [references/commands.md](references/commands.md) |
99
+ | Installing: CLI, daemon, extension, the one human step, blocklisted extension | [references/install.md](references/install.md) |
100
+ | Agent on one machine, browser on another | [references/remote.md](references/remote.md) |
101
+ | Owned engine: launch, snapshot ladder, network, frames, human handoff | [references/owned-engine/README.md](references/owned-engine/README.md) |
102
+ | Reading a 1Password vault the user has unlocked | [references/recipes/1password.md](references/recipes/1password.md) |
@@ -1,90 +1,105 @@
1
- # Command semantics
1
+ # Session methods
2
2
 
3
- Everything here cost a failed attempt to learn. Read it before improvising.
3
+ `connectBrowserSkill()` returns a `BskSession`. Every method is one call on the BrowserSkill
4
+ daemon's tool surface; options are the daemon's parameter names in camelCase.
4
5
 
5
6
  ## Sessions
6
7
 
7
- ```bash
8
- bsk session start --json --no-focus --name "<task>" # keep session_id
9
- bsk session list
10
- bsk session stop <id> --json # positional id, not --session
8
+ ```js
9
+ const session = await omowright.connectBrowserSkill({ name: "<task>", focused: false, browser: "<instance id>", width: 1200, height: 800 })
10
+ session.sessionId // four letters, e.g. "ckhg"
11
+ session.browserInstanceId // which connected browser owns the Agent Window
12
+ await session.stop() // ALWAYS, on success and failure
11
13
  ```
12
14
 
13
- Every session-scoped command needs `--session <id>`. `--no-focus` keeps the Agent Window from
14
- stealing focus; drop it only when the user is watching on purpose.
15
+ `browser` is needed only when more than one browser is connected (`bskDoctor()` lists them).
16
+ `focused: false` keeps the Agent Window from stealing focus; drop it only when the user is watching
17
+ on purpose. Throws `BskRpcError` `no_browser_connected` when no extension is attached — that is a
18
+ stop, not a cue to launch something else.
15
19
 
16
- ## Reading
20
+ ## Targets
17
21
 
18
- | Command | Returns |
22
+ | Form | Meaning |
19
23
  |---|---|
20
- | `observe --session <id>` | semantic tree with `@eN` refs and perception probes — **the default read** |
21
- | `snapshot --session <id>` | static accessibility tree |
22
- | `get-html --session <id>` | exact markup, hidden metadata |
23
- | `screenshot --session <id> --out <path>` | PNG; add `--full-page` for a long capture |
24
- | `evaluate "<js>" --session <id> --json` | `{ok, value}` — **check `.ok`; exit code 0 does not mean the script succeeded** |
25
- | `console` / `network` | buffered log lines and responses |
24
+ | `"@e3"` / `"e3"` | a ref from the last `observe()` / `snapshot()` |
25
+ | `"#login > button"` | a CSS selector, resolved live |
26
+ | `{ captureId, x, y }` | a point in a screenshot, from `screenshot()` |
27
+ | `css.e3` from `bskSnapshot` | the light-DOM CSS path of an OmOWright ref (`null` inside shadow roots — use the daemon ref instead) |
26
28
 
27
- **Refs are reissued by every `observe` and `snapshot`.** Read a ref and act on it in the same
28
- cycle. A ref captured two calls ago silently addresses a different element — this is how a click
29
- lands on the neighbouring row.
29
+ ## Reading
30
30
 
31
- `observe --max-tokens <n>` bounds a large page. There is no default cap.
31
+ | Call | Returns |
32
+ |---|---|
33
+ | `bskSnapshot(session, { interactive, maxDepth })` | `{ tree, refs, css }` — the OmOWright accessibility tree with refs, computed in the page **without** leaving a global or touching the DOM |
34
+ | `session.observe({ maxTokens, cursor, probeHover })` | the daemon's semantic tree (`@vom`) with `@eN` refs, layers and hover probes — **the default read for shadow DOM and iframes** |
35
+ | `session.snapshot({ maxDepth, maxTokens })` | the daemon's plain accessibility tree |
36
+ | `session.getHtml({ ref, maxBytes })` | exact markup |
37
+ | `session.screenshot({ ref })` / `screenshot({ fullPage: true })` | `{ buffer, width, height, captureId }`; full-page captures stream back in chunks |
38
+ | `session.evaluate(expression, { awaitPromise, timeoutMs })` | `{ ok, value, error }` — **check `.ok`**; a resolved promise does not mean the script succeeded |
39
+ | `session.console({ since })` / `session.network({ since })` | buffered console entries / request metadata (no bodies) |
40
+
41
+ **Refs are reissued by every read.** Read a ref and act on it in the same cycle. A ref captured
42
+ two calls ago silently addresses a different element — this is how a click lands on the
43
+ neighbouring row.
32
44
 
33
45
  ## Acting
34
46
 
35
- | Need | Command |
47
+ | Need | Call |
36
48
  |---|---|
37
- | Click | `click @e3 --session <id>` |
38
- | Fill | `fill @e3 --value "text" --session <id>` |
39
- | Select | `select @e3 --value "<option value>" --session <id>` |
40
- | Key | `press Enter --ref @e3 --session <id>` |
41
- | Hover | `hover @e3 --session <id>` |
42
- | Scroll into view | `scroll-to @e3 --session <id>` |
43
- | Wheel | `wheel --delta-y 600 --session <id>` |
44
- | Focus / blur | `focus @e3` / `blur @e3` |
45
- | Upload / download | `upload --file <path>` / `download --out <path>` |
49
+ | Click | `session.click(target, { button, clickCount, modifiers })` |
50
+ | Fill | `session.fill(target, value, { clearBefore })` |
51
+ | Select | `session.select(target, ["<option value>"])` |
52
+ | Key | `session.press("Enter", { target, modifiers, holdMs })` |
53
+ | Hover | `session.hover(target, { settleMs })` |
54
+ | Scroll into view | `session.scrollTo(target)` |
55
+ | Wheel | `session.wheel({ deltaY: 600, target })` |
56
+ | Focus / blur | `session.focus(target)` / `session.blur(target)` |
57
+ | Navigate | `session.navigate(url, { waitUntil: "load" \| "domcontentloaded" \| "networkidle" \| "commit", timeoutMs })`, `back()`, `forward()`, `reload({ hard })`, `waitForNavigation()` |
58
+ | Window | `session.resize(width, height)`, `session.emulate({ overrides: { width, mobile } })` |
46
59
 
47
60
  Traps:
48
61
 
49
62
  - `select` takes the option's **value attribute**, not its visible label.
50
- - `fill` and `click` accept a CSS selector; **`press --ref` does not** — it answers
51
- `ref_not_found` for a selector. `press` without `--ref` goes to the focused node.
52
- - A menu that a `click` opens can be toggled shut by that same click. `focus` then
53
- `press Enter` opens it reliably.
54
- - Hover-only controls report `element not visible`: hover the trigger, observe, then act on the
55
- revealed item's fresh ref. Markers like `[has-submenu]` and `[expanded]` identify triggers;
56
- `observe --probe-hover` finds one when no marker does, at the cost of touching the live page.
57
- - The clipboard is unavailable in a window started `--no-focus` (no document focus), so read
58
- values out of the DOM instead.
59
-
60
- ## Borrowing a user tab
61
-
62
- ```bash
63
- bsk tab list --scope user
64
- bsk tab borrow <tab-id>
65
- bsk tab return <tab-id>
63
+ - `press` without `target` goes to the focused node; `press` with a CSS selector is fine, but a
64
+ daemon ref must come from the current read.
65
+ - A menu that a `click` opens can be toggled shut by that same click. `focus` then `press("Enter")`
66
+ opens it reliably.
67
+ - Hover-only controls report `element not visible`: hover the trigger, read again, then act on the
68
+ revealed item's fresh ref. `observe({ probeHover: true })` finds one when no marker does, at the
69
+ cost of touching the live page.
70
+ - The clipboard is unavailable in a window started `focused: false`, so read values out of the DOM.
71
+
72
+ ## Tabs
73
+
74
+ ```js
75
+ const { tabs } = await session.tabList({ scope: "user" }) // "user" | "agent" | "all"
76
+ await session.tabBorrow(tabId) // the user confirms in the browser (60 s)
77
+ await session.tabReturn(tabId) // stop() returns anything still borrowed
78
+ await session.tabCreate({ url }); await session.tabSelect(id); await session.tabClose(id)
79
+ ```
80
+
81
+ Never invent tab ids and never repeat a denied borrow.
82
+
83
+ ## Humans
84
+
85
+ ```js
86
+ const { outcome } = await session.requestHelp({ prompt, title, targets: ["@e4"], completionCriteria, timeoutMs })
87
+ // outcome: "completed" | "continued" | "cancelled" | "timed_out" | "navigated" | "disabled"
66
88
  ```
67
89
 
68
- Borrowing asks the user to confirm. Never invent a tab id, never repeat a denied borrow, and
69
- always return what you borrowed (`session stop` also returns them).
90
+ ## Errors
70
91
 
71
- ## Failures
92
+ Every refusal is a `BskRpcError` with the daemon's own `code`:
72
93
 
73
- | Symptom | Meaning | Response |
94
+ | `code` | Meaning | Do |
74
95
  |---|---|---|
75
- | `browsers: []` | extension not connected | ask the user to open the browser / enable the extension |
76
- | daemon missing | idle exit or reboot | none; the next call restarts it |
77
- | `cdp_failed: Cannot access a chrome-extension:// URL of different extension` | another extension injected a frame, so the debugger cannot attach to that tab | transient and page-specific; collapse the work into one `evaluate` and retry, or navigate away and back |
78
- | `permission_denied: element not visible` | hover-gated or clipped control | drive its menu instead |
79
- | `ref_not_found` | stale ref, or a selector passed to `press` | observe again; use a real ref |
80
- | version skew warning | CLI and extension disagree | `bsk update` after finishing sessions; the extension updates through its store |
81
-
82
- **Two identical failures select a different approach. A third identical attempt is a defect.**
83
-
84
- ## Sandboxed hosts
85
-
86
- If the host kills background children after each command, the daemon cannot survive between calls.
87
- Set `BSK_AUTO_START=0`, share one `BSK_HOME` across every call, and start
88
- `bsk daemon start --foreground` in the host's persistent background task. Check readiness with
89
- `bsk status --json` in a separate call before continuing. Do not loop on launches, delete runtime
90
- files, or restart a daemon another task is using.
96
+ | `no_browser_connected` | no extension attached | run the onboarding script, relay the human step, wait |
97
+ | `not_found` | stale ref or unknown session | read again; if the session is gone, start a new one |
98
+ | `invalid_params` | wrong option shape | fix the call, do not retry as-is |
99
+ | `permission_denied` | `evaluate` on a tab outside the Agent Window, or a denied borrow | stop; the user said no |
100
+ | `timeout` | the tool did not finish in its budget | read the page state before retrying once |
101
+ | `user_aborted` | the user pressed Stop in the browser | stop the task and report |
102
+ | `cdp_failed` | the page cannot be attached (restricted URL, DevTools open) | say which page and why |
103
+
104
+ Long calls can be cancelled: `const h = session.client.callWithHandle("tool.navigate", {...})`
105
+ then `await session.client.cancel(h.rpcId)`.
@@ -1,71 +1,68 @@
1
1
  # Installing the attached engine
2
2
 
3
- Three pieces. The agent can install exactly one of them.
3
+ Three pieces. The onboarding script prepares all three; a human finishes exactly one.
4
4
 
5
5
  | Piece | Channel | Automatable |
6
6
  |---|---|---|
7
7
  | `bsk` CLI + daemon | upstream installer, GitHub Releases | **yes** |
8
- | Browser extension | Chrome Web Store / Edge Add-ons | **no — a human clicks Install** |
9
- | Daemon process | auto-starts on any `bsk` call | nothing to do |
8
+ | Browser extension | registered from the Web Store listing through Chrome's external-extension mechanism | **yes, up to one click** — the browser asks the user to enable it |
9
+ | Daemon process | auto-starts on the first call | nothing to do |
10
10
 
11
11
  ## Supported
12
12
 
13
13
  | | |
14
14
  |---|---|
15
15
  | Operating systems | macOS (Apple Silicon and Intel), Linux (x64, ARM64), Windows x64 |
16
- | Browsers | Chrome, Microsoft Edge. Other Chromium browsers work where they accept store builds. |
16
+ | Browsers | Chrome, Microsoft Edge, Brave, Chromium — any profile the doctor lists under `browsersDetected` |
17
17
 
18
- ## 1. The CLI
18
+ ## One command
19
19
 
20
20
  ```bash
21
- node "<skill-root>/scripts/browser-install.mjs"
21
+ node "<skill-root>/scripts/browser-install.mjs" [--json] [--wait-ms=180000]
22
22
  ```
23
23
 
24
- That wraps upstream's official installer:
24
+ In order it: runs upstream's official `install.sh` / `install.ps1` into `~/.local/bin` (any PATH
25
+ line the installer appends to a shell rc file is reverted — the library calls the binary by
26
+ absolute path); starts the daemon with `bsk status`; and, for every Chromium-family profile it
27
+ finds, registers the Web Store listing as an external extension:
25
28
 
26
- ```bash
27
- # macOS / Linux
28
- curl -fsSL https://raw.githubusercontent.com/Tencent/BrowserSkill/main/install.sh | sh
29
- export PATH="${BSK_INSTALL_DIR:-$HOME/.local/bin}:$PATH"
30
-
31
- # Windows (PowerShell)
32
- irm https://raw.githubusercontent.com/Tencent/BrowserSkill/main/install.ps1 | iex
33
- ```
34
-
35
- The Unix installer cannot change its parent shell's `PATH`. A shell opened before the install may
36
- still miss it, so either re-export in each call or use the absolute path (`$HOME/.local/bin/bsk`,
37
- `bsk.exe` on Windows). Verify with `bsk --version`.
29
+ | Platform | Where the entry goes | The user's one step |
30
+ |---|---|---|
31
+ | macOS | `<user data dir>/External Extensions/<id>.json` | quit the browser completely, open it again, click **Enable** in the dialog |
32
+ | Windows | `HKCU\Software\<vendor>\<browser>\Extensions\<id>` (`reg add`, no admin) | click **Enable** on the toolbar badge; no restart |
33
+ | Linux (Chromium) | `<user data dir>/External Extensions/<id>.json` | relaunch; installs without a prompt |
34
+ | Linux (Chrome / Edge / Brave) | `/opt/google/chrome/extensions/<id>.json` and siblings — root only | otherwise open the store link it prints and click **Add** |
38
35
 
39
- ## 2. The extension
36
+ The script prints that step as `humanStep`. **Relay it verbatim and wait**; with `--wait-ms` it
37
+ keeps polling the daemon until the extension connects. An empty `browsersConnected` afterwards is
38
+ not a failure to work around — the browser is closed or the user has not clicked yet; say which
39
+ and ask.
40
40
 
41
- Give the user the listing for their browser and wait:
41
+ If the user removed the extension from the browser before, Chrome blocklists its id for external
42
+ installs. The script detects that (`reason: "blocklisted"`) and prints the store link instead:
42
43
 
43
44
  - Chrome: https://chromewebstore.google.com/detail/hhcmgoofomhgciiibhipgmgkgnoenaoi
44
45
  - Edge: https://microsoftedge.microsoft.com/addons/detail/browserskill/emacgiaaaiojkkpkddmmdfhmokgmnikg
45
46
 
46
- Then confirm it landed:
47
-
48
- ```bash
49
- bsk status --json # a non-empty "browsers" array means connected
50
- ```
51
-
52
- An empty `browsers` list is not a failure to work around. Either the browser is closed or the
53
- extension is not enabled; say which and ask.
47
+ Enterprise force-install policies are deliberately not used: they brand the browser "managed by
48
+ your organization" and the user cannot remove the extension.
54
49
 
55
- ## 3. Do not install upstream's skill
50
+ ## Do not install upstream's skill
56
51
 
57
52
  Upstream ships its own agent skill through `bsk install-skill`. **Do not run it here.** This
58
53
  package already provides the skill, and upstream's copy installs under a different name into the
59
54
  user skill directory, which takes precedence over a shipped skill — two descriptions of the same
60
- CLI, one of them shadowing the one that knows about this package's recipes and helper scripts.
55
+ engine, one of them shadowing the one that knows about omowright and this package's scripts.
61
56
 
62
57
  ## Diagnosing
63
58
 
64
59
  ```bash
65
- node "<skill-root>/scripts/browser-doctor.mjs" # this package's view
60
+ node "<skill-root>/scripts/browser-doctor.mjs" --json # this package's view: cli, daemon, profiles, registrations, connections
66
61
  bsk doctor # upstream's own checks
67
62
  bsk logs # daemon log
68
63
  ```
69
64
 
70
- The daemon exits about ten minutes after the last browser disconnects and is not a system service,
71
- so a reboot also stops it. Both heal on the next `bsk` call — no repair needed.
65
+ The daemon exits about ten minutes after the last browser disconnects and is not a system
66
+ service, so a reboot also stops it. Both heal on the next call — `connectBrowserSkill()` starts it
67
+ unless `BSK_AUTO_START=0` (sandboxes that reap background processes keep the daemon on the host
68
+ and share `BSK_HOME`; see upstream's sandboxed-agents guide).
@@ -1,11 +1,33 @@
1
1
  # The owned engine
2
2
 
3
- A browser **your code launches and owns**, driven over CDP, with its own profile. The opposite of
4
- the attached engine: no user logins, full control.
5
-
6
- **This package ships no such engine.** These documents describe the contract and the technique, so
7
- that a locally installed CDP library — or a script you write against one — is driven correctly.
8
- If no owned engine is installed, say so and stay on the attached engine.
3
+ A browser **your code launches and owns**, driven over CDP by omowright with its own profile. The
4
+ opposite of the attached engine: no user logins, full control.
5
+
6
+ ```js
7
+ const { omowright } = await loadOmowright()
8
+ const profile = mkdtempSync(join(tmpdir(), "omowright-"))
9
+ const browser = await omowright.connectPipe({
10
+ browserPath: "<CloakBrowser or chrome-headless-shell binary>",
11
+ browserArgs: ["--headless", "--no-first-run", `--user-data-dir=${profile}`],
12
+ storageRoot: profile,
13
+ dialogPolicy: { accept: true },
14
+ })
15
+ try {
16
+ const page = await browser.newTab("https://example.com/")
17
+ const tree = omowright.compactSnapshot(await page.snapshot()) // ALWAYS compact before a model reads it
18
+ await page.locator("e3").click() // refs come straight from the snapshot
19
+ await Bun.write("shot.png", await page.screenshot())
20
+ } finally {
21
+ await browser.close()
22
+ rmSync(profile, { recursive: true, force: true }) // paired: a leftover profile is a logged-in browser nobody watches
23
+ }
24
+ ```
25
+
26
+ `connectPipe` launches over `--remote-debugging-pipe`: no listening port, stdio drained, the
27
+ process reaped on `close()`. `connect("http://127.0.0.1:<port>")` attaches to a browser something
28
+ else launched. `connectCloakProfile({ profileDir })` launches CloakBrowser with a pinned
29
+ fingerprint seed — the stealth path for WAF and bot-scored targets, where the attached engine's
30
+ console capture would be a signal.
9
31
 
10
32
  ## When it is the right engine
11
33
 
@@ -16,27 +38,25 @@ If no owned engine is installed, say so and stay on the attached engine.
16
38
  | Solving a challenge widget programmatically | needs coordinate control and OCR |
17
39
  | Reading the network instead of the DOM | needs request interception on your own target |
18
40
  | A QA flight trace (steps, HAR, screenshots) | recording someone's real session is not acceptable |
41
+ | Headless or unattended runs | the user's browser is on their desk |
19
42
 
20
43
  For anything that needs the user's login, the attached engine wins. For extracting text from a
21
44
  blocked URL, neither: use the `ultimate-browsing` skill.
22
45
 
23
- ## What an owned engine must give you
46
+ ## The page
24
47
 
25
- 1. A transport that opens no listening port (launch over a pipe), or an explicit local CDP endpoint.
26
- 2. An accessibility snapshot with stable in-page refs, and a **compact** form that drops the ref
27
- map before the tree reaches a model — on a real page that map is roughly half the bytes and the
28
- client never reads it.
29
- 3. Locators that resolve those refs in-page, including refs inside cross-origin frames.
30
- 4. Coordinate input, for what locators cannot address.
31
- 5. A dialog policy, so `alert` / `confirm` / `beforeunload` can never block a run.
48
+ `OmOPage` is Playwright-shaped: `goto`, `snapshot`, `locator(ref | css)`, `click`, `fill`,
49
+ `press`, `hover`, `check`, `selectOption`, `dragTo`, `setInputFiles`, `screenshot`, `pdf`,
50
+ `evaluate`, `waitForURL`, `keyboard`, `mouse`, `frameLocator`. A snapshot is an accessibility tree
51
+ with virtual refs (`[ref=e3]`, cross-origin frames as `f1e3`); `compactSnapshot()` drops the refs
52
+ map, about half the bytes. Readiness is a content probe (body plus interactive elements, landmarks
53
+ or text), not a timer; `goto(url, { waitUntil: "commit" })` is the escape hatch for empty pages.
32
54
 
33
55
  ## Reference
34
56
 
35
- - [ladder.md](ladder.md) — the escalation ladder, viewport pinning, coordinate control, challenge widgets
36
- - [network.md](network.md) — read the network instead of the DOM; traces and request interception
37
- - [frames-and-humans.md](frames-and-humans.md) — cross-origin frames, overlays, dialogs, human handoff
38
-
39
- ## Cleanup is paired
57
+ - [ladder.md](ladder.md) — the escalation ladder, viewport pinning, `createCua`, `createCaptcha`
58
+ - [network.md](network.md) — `createNetworkSnoop`, `collectWhileScrolling`, `createTrace`, `createRoutes`
59
+ - [frames-and-humans.md](frames-and-humans.md) — `snapshotWithFrames`, `describeLayers`, dialog policy, `emulate`, `requestHuman`
40
60
 
41
- Close the browser and remove the profile directory in the same `finally`. A profile left behind is
42
- a logged-in browser nobody is watching.
61
+ The library's own skill (`skills/omowright/SKILL.md` and `presets/*` in the omowright repository)
62
+ is the authoritative, longer treatment of each; these pages are the routing summary.