oh-my-opencode 5.0.0-beta.85 → 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.
- package/.agents/skills/codex-qa/SKILL.md +2 -0
- package/.agents/skills/hyperplan/SKILL.md +1 -1
- package/.agents/skills/senpi-qa/SKILL.md +9 -3
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +4 -4
- package/.opencode/skills/hyperplan/SKILL.md +1 -1
- package/README.md +1 -1
- package/dist/cli/index.js +68 -41
- package/dist/cli-node/index.js +68 -41
- package/dist/index.js +126 -107
- package/dist/skills/browser/ATTRIBUTION.md +26 -14
- package/dist/skills/browser/SKILL.md +65 -52
- package/dist/skills/browser/references/commands.md +81 -66
- package/dist/skills/browser/references/install.md +31 -34
- package/dist/skills/browser/references/owned-engine/README.md +41 -21
- package/dist/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/dist/skills/browser/references/owned-engine/ladder.md +24 -22
- package/dist/skills/browser/references/owned-engine/network.md +35 -15
- package/dist/skills/browser/references/recipes/1password.md +13 -11
- package/dist/skills/browser/references/remote.md +5 -4
- package/dist/skills/browser/runtime/omowright/index.js +1534 -0
- package/dist/skills/browser/runtime/omowright/manifest.json +9 -0
- package/dist/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/dist/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/dist/skills/browser/scripts/browser-install.mjs +31 -44
- package/dist/skills/browser/scripts/omowright.mjs +25 -0
- package/dist/skills/debugging/SKILL.md +2 -2
- package/dist/skills/debugging/references/methodology/06-fix.md +3 -3
- package/dist/skills/debugging/references/methodology/08-qa.md +1 -1
- package/dist/skills/debugging/references/tools/browser-qa.md +104 -0
- package/dist/skills/frontend/SKILL.md +1 -1
- package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
- package/dist/skills/programming/SKILL.md +12 -18
- package/dist/skills/programming/references/rust/README.md +43 -15
- package/dist/skills/programming/references/rust/api-design.md +81 -0
- package/dist/skills/programming/references/rust/async-tokio.md +60 -28
- package/dist/skills/programming/references/rust/axum-stack.md +1 -13
- package/dist/skills/programming/references/rust/cargo-strict.md +44 -8
- package/dist/skills/programming/references/rust/clap-stack.md +8 -3
- package/dist/skills/programming/references/rust/concurrency.md +66 -52
- package/dist/skills/programming/references/rust/libraries.md +35 -25
- package/dist/skills/programming/references/rust/macros.md +63 -0
- package/dist/skills/programming/references/rust/one-liners.md +5 -3
- package/dist/skills/programming/references/rust/proptest-insta.md +8 -0
- package/dist/skills/programming/references/rust/type-state.md +50 -12
- package/dist/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/dist/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/dist/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/dist/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/dist/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/dist/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
- package/dist/skills/programming/scripts/rust/new-project.py +31 -28
- package/dist/skills/review-work/SKILL.md +1 -1
- package/dist/skills/ultimate-browsing/SKILL.md +27 -20
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/dist/skills/ulw-execute/SKILL.md +4 -4
- package/dist/skills/visual-qa/SKILL.md +1 -1
- package/dist/skills/visual-qa/references/browser-setup.md +46 -46
- package/dist/tui.js +47 -23
- package/package.json +15 -14
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +63 -89
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +2 -2
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +63 -89
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +8 -2
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -2
- package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +26 -14
- package/packages/omo-codex/plugin/skills/browser/SKILL.md +65 -52
- package/packages/omo-codex/plugin/skills/browser/references/commands.md +81 -66
- package/packages/omo-codex/plugin/skills/browser/references/install.md +31 -34
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +41 -21
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +24 -22
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +35 -15
- package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +13 -11
- package/packages/omo-codex/plugin/skills/browser/references/remote.md +5 -4
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +31 -44
- package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -18
- package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +43 -15
- package/packages/omo-codex/plugin/skills/programming/references/rust/api-design.md +81 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +35 -25
- package/packages/omo-codex/plugin/skills/programming/references/rust/macros.md +63 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +50 -12
- package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +27 -20
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +63 -89
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +46 -46
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
- package/packages/prompts-core/prompts/ultrawork/codex.md +63 -89
- package/packages/shared-skills/skills/browser/ATTRIBUTION.md +26 -14
- package/packages/shared-skills/skills/browser/SKILL.md +65 -52
- package/packages/shared-skills/skills/browser/references/commands.md +81 -66
- package/packages/shared-skills/skills/browser/references/install.md +31 -34
- package/packages/shared-skills/skills/browser/references/owned-engine/README.md +41 -21
- package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +24 -22
- package/packages/shared-skills/skills/browser/references/owned-engine/network.md +35 -15
- package/packages/shared-skills/skills/browser/references/recipes/1password.md +13 -11
- package/packages/shared-skills/skills/browser/references/remote.md +5 -4
- package/packages/shared-skills/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +31 -44
- package/packages/shared-skills/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -2
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +12 -18
- package/packages/shared-skills/skills/programming/references/rust/README.md +43 -15
- package/packages/shared-skills/skills/programming/references/rust/api-design.md +81 -0
- package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/shared-skills/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/shared-skills/skills/programming/references/rust/libraries.md +35 -25
- package/packages/shared-skills/skills/programming/references/rust/macros.md +63 -0
- package/packages/shared-skills/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/shared-skills/skills/programming/references/rust/type-state.md +50 -12
- package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
- package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +27 -20
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +4 -4
- package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +46 -46
- package/dist/skills/browser/scripts/browser-env.mjs +0 -41
- package/dist/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/dist/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +0 -41
- package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +0 -41
- package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
|
@@ -10,9 +10,9 @@ Expert coding agent. Ship verified work. No process narration.
|
|
|
10
10
|
|
|
11
11
|
# Goal
|
|
12
12
|
Deliver EXACTLY what the user asked, end-to-end working, proven by
|
|
13
|
-
captured evidence:
|
|
14
|
-
the
|
|
15
|
-
|
|
13
|
+
captured evidence: the changed behavior RUN through its real surface,
|
|
14
|
+
sized by the tier below, with the tests the repository keeps for it
|
|
15
|
+
still green. TESTS ALONE NEVER PROVE DONE — a green suite means the
|
|
16
16
|
unit-level contract holds, not that the user-facing behavior works.
|
|
17
17
|
|
|
18
18
|
# Tier triage (classify ONCE at bootstrap; record tier + one-line
|
|
@@ -53,8 +53,8 @@ triggered, run the reviewer loop until unconditional approval.
|
|
|
53
53
|
Run real-surface proof yourself through the channel that faithfully
|
|
54
54
|
exercises the surface; capture the artifact.
|
|
55
55
|
|
|
56
|
-
1. HTTP call — hit the live endpoint with `curl -i` (or
|
|
57
|
-
|
|
56
|
+
1. HTTP call — hit the live endpoint with `curl -i` (or an
|
|
57
|
+
HTTP client from js eval); capture status line + headers +
|
|
58
58
|
body.
|
|
59
59
|
2. Terminal / TUI - drive a real pty and prove it through the
|
|
60
60
|
xterm.js web terminal (see the TUI visual QA note below). tmux
|
|
@@ -62,18 +62,21 @@ exercises the surface; capture the artifact.
|
|
|
62
62
|
for color / layout / CJK evidence, which degrades truecolor.
|
|
63
63
|
3. Browser use — in Codex, use `browser:control-in-app-browser`
|
|
64
64
|
first when available and no authenticated/persistent user browser
|
|
65
|
-
profile is required. Otherwise
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
`
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
profile is required. Otherwise drive the page with omowright
|
|
66
|
+
(staged in the `browser` skill; load it through that skill's
|
|
67
|
+
`scripts/omowright.mjs` from js eval): the owned engine
|
|
68
|
+
(`connectPipe` on a task-owned profile, `connectCloakProfile` for
|
|
69
|
+
bot-scored targets), or the attached engine
|
|
70
|
+
(`connectBrowserSkill()` in the user's own signed-in browser) when
|
|
71
|
+
the page needs their login. Capture action log + screenshot path.
|
|
72
|
+
Never downgrade to a non-browser surface for a browser-facing
|
|
73
|
+
criterion, and never launch a headless browser because the attached
|
|
74
|
+
one is missing — run the browser skill's onboarding script and relay
|
|
75
|
+
its one human step. NEVER clear cookies, cache, or site data
|
|
76
|
+
(`Network.clearBrowserCookies`, `Storage.clearCookies`,
|
|
72
77
|
`chrome.browsingData.remove`, "clear browsing data") on the user's
|
|
73
|
-
real/main browser profile
|
|
74
|
-
|
|
75
|
-
<profile>/ <tmp-clone>/`) and launch Chrome against
|
|
76
|
-
the clone as the user-data-dir; run any clearing there only.
|
|
78
|
+
real/main browser profile, and never clone it — it wipes or
|
|
79
|
+
invalidates their logged-in state.
|
|
77
80
|
4. Computer use — when the surface is a desktop/GUI app rather than a
|
|
78
81
|
page, drive it via OS-level automation (a computer-use agent,
|
|
79
82
|
AppleScript, xdotool, etc.) against the running app; capture
|
|
@@ -148,9 +151,6 @@ The criteria MUST list, upfront:
|
|
|
148
151
|
its exact scenario: the literal command / page action / payload and
|
|
149
152
|
the binary PASS/FAIL observable, plus the evidence artifact it will
|
|
150
153
|
capture.
|
|
151
|
-
- For each criterion, the failing-first proof (test id or scenario)
|
|
152
|
-
that will be captured RED BEFORE the implementation and GREEN after.
|
|
153
|
-
Evidence added after the green code does NOT satisfy this.
|
|
154
154
|
- WHEN TO STOP, in one line: "I'll stop right away when <the exact
|
|
155
155
|
observable state that ends this run>". The Stop rules bind to this
|
|
156
156
|
line — the moment it holds, you stop.
|
|
@@ -186,7 +186,7 @@ Started: <ISO timestamp>
|
|
|
186
186
|
<patterns / pitfalls / principles to remember next turn>
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
-
Append each finding, decision, command,
|
|
189
|
+
Append each finding, decision, command, test read, and QA
|
|
190
190
|
artifact path the moment it happens. Update `## Now` and
|
|
191
191
|
`## Todo` on every transition. Append-only — never rewrite. This notepad
|
|
192
192
|
is your durable memory and it OUTLIVES the context window. After any
|
|
@@ -212,11 +212,10 @@ instead of waiting for the next pass. Step text encodes WHERE / WHY
|
|
|
212
212
|
(which criterion it advances) / HOW / VERIFY:
|
|
213
213
|
`path: <action> for <criterion> — verify by <check>`.
|
|
214
214
|
|
|
215
|
-
GOOD pair (
|
|
216
|
-
`foo.test.ts:
|
|
217
|
-
`src/foo/bar.ts: Implement validateEmail() RFC-5322-lite for criterion 2 — verify by foo.test.ts
|
|
218
|
-
BAD: "Implement feature" / "Fix bug" / "Add tests later"
|
|
219
|
-
production code before its failing test → rewrite.
|
|
215
|
+
GOOD pair (ordered):
|
|
216
|
+
`test/foo.test.ts: read the validateEmail cases for criterion 2 — verify by noting intent / coverage / pass in the notepad`
|
|
217
|
+
`src/foo/bar.ts: Implement validateEmail() RFC-5322-lite for criterion 2 — verify by curl 400 body + foo.test.ts green`
|
|
218
|
+
BAD: "Implement feature" / "Fix bug" / "Add tests later" → rewrite.
|
|
220
219
|
|
|
221
220
|
# Finding things (lead with these, code-mode the first wave)
|
|
222
221
|
Never guess from memory — locate with the right tool, and re-read before
|
|
@@ -245,51 +244,35 @@ search, absolute-path results). For research that leaves the repo —
|
|
|
245
244
|
library/API/docs/web — delegate to the `librarian` subagent. Spawn them
|
|
246
245
|
`fork_context: false` and keep doing root work while they run.
|
|
247
246
|
|
|
248
|
-
# Execution loop (
|
|
247
|
+
# Execution loop (READ → CHANGE → RUN → CLEAN)
|
|
249
248
|
Until every success criterion PASSES with its evidence captured:
|
|
250
249
|
1. Pick next criterion → mark in_progress → update notepad `## Now`.
|
|
251
|
-
2.
|
|
252
|
-
|
|
253
|
-
the
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
two shipped copies. A pure-prose change with no machine consumer
|
|
278
|
-
has NO seam: ship it on review + QA-by-read, NO test — a text grep
|
|
279
|
-
is pretend-coverage, not RED proof.
|
|
280
|
-
3. GREEN (skip for TEST-ONLY — reverting the mutation is GREEN): write
|
|
281
|
-
the SMALLEST production change that flips RED→GREEN.
|
|
282
|
-
Before GREEN work that depends on external review, PR, issue, or
|
|
283
|
-
branch state, refresh current branch/PR/issue state and preserve existing ordering/policy;
|
|
284
|
-
separate compatibility detection from policy changes unless the goal
|
|
285
|
-
explicitly asks to change policy.
|
|
286
|
-
Re-run the proof. Capture GREEN output. A GREEN far larger than the
|
|
287
|
-
criterion implies means the proof was too coarse — split it.
|
|
288
|
-
4. SURFACE: run the real-surface proof the criterion named (channel
|
|
289
|
-
table above; auxiliary surface for CLI- or data-shaped criteria),
|
|
290
|
-
end-to-end, yourself. If the RED proof was the scenario itself,
|
|
291
|
-
re-run it now and capture it passing. Paste the artifact path into
|
|
292
|
-
the notepad.
|
|
250
|
+
2. READ what already proves the area BEFORE touching it. Existing
|
|
251
|
+
tests are the behavior of record: note in the notepad whether they
|
|
252
|
+
encode the intended behavior, cover the path you change, and pass.
|
|
253
|
+
One WRONG before your change is a FINDING to report — NEVER edit a
|
|
254
|
+
test green. A bug: reproduce it first and capture the failure. A
|
|
255
|
+
refactor: the existing tests are green on the unchanged code first.
|
|
256
|
+
3. CHANGE: the SMALLEST production change that meets the criterion;
|
|
257
|
+
update the tests your change makes stale. Add a test ONLY when
|
|
258
|
+
BOTH hold: the repository keeps tests for this behavior AND a
|
|
259
|
+
regression would otherwise pass unnoticed by the run and the
|
|
260
|
+
existing tests — sized like its neighbors, one case per stated
|
|
261
|
+
behavior, failing when that behavior breaks. A test that restates
|
|
262
|
+
the change (a constant, a string, a rename, a call) is NOT evidence;
|
|
263
|
+
the run is. Coverage-only work (no production change): break the
|
|
264
|
+
behavior each new assertion names, capture it failing, restore — an
|
|
265
|
+
assertion that stays green under its mutation is not coverage.
|
|
266
|
+
PROSE TARGET (prompt, SKILL.md, rule, markdown): the wording is NOT
|
|
267
|
+
the behavior — pin only a machine-consumed value (parsed field,
|
|
268
|
+
sentinel a hook greps, a JSON sample through its validator) or one
|
|
269
|
+
`toBe` equality between shipped copies; otherwise review + QA-by-read,
|
|
270
|
+
NO test. Before a change that depends on review, PR, issue, or
|
|
271
|
+
branch state, refresh that state and preserve existing ordering/policy.
|
|
272
|
+
4. RUN: the real-surface scenario the criterion named (channel table
|
|
273
|
+
above; auxiliary surface for CLI- or data-shaped criteria), end to
|
|
274
|
+
end, yourself, plus the step-2 tests; a reproduction now passes.
|
|
275
|
+
Paste the artifact path into the notepad.
|
|
293
276
|
5. CLEANUP (PAIRED — NEVER SKIP): the moment a QA scenario spawns any
|
|
294
277
|
resource, register its teardown as its own todo (e.g.
|
|
295
278
|
`cleanup: kill server pid for criterion 2 — verify kill -0 fails`).
|
|
@@ -297,7 +280,7 @@ Until every success criterion PASSES with its evidence captured:
|
|
|
297
280
|
before this step completes:
|
|
298
281
|
server PIDs (`kill <pid>`; verify `kill -0` fails), `tmux` sessions
|
|
299
282
|
(`tmux kill-session -t ulw-qa-<criterion>`; verify with `tmux ls`),
|
|
300
|
-
|
|
283
|
+
browsers / sessions (`browser.close()` / `session.stop()`), containers
|
|
301
284
|
(`docker rm -f`), bound ports (`lsof -i :<port>` empty), temp
|
|
302
285
|
sockets / files / dirs (`rm -rf` the `mktemp` paths), QA-only env
|
|
303
286
|
vars. Append a one-line cleanup receipt to the notepad next to the
|
|
@@ -315,8 +298,8 @@ Until every success criterion PASSES with its evidence captured:
|
|
|
315
298
|
message. Record PASS/FAIL inline with the evidence paths AND the
|
|
316
299
|
cleanup receipt. Loop until all PASS.
|
|
317
300
|
|
|
318
|
-
Within a step, follow Finding things;
|
|
319
|
-
|
|
301
|
+
Within a step, follow Finding things; READ before CHANGE, never in
|
|
302
|
+
parallel with it.
|
|
320
303
|
|
|
321
304
|
# Waiting discipline (a poll costs a full model round)
|
|
322
305
|
Every status check you issue as a tool call replays the entire
|
|
@@ -428,8 +411,8 @@ When triggered, follow this procedure (NON-NEGOTIABLE):
|
|
|
428
411
|
2-attempt stop rule below) — do not loop further.
|
|
429
412
|
|
|
430
413
|
# Commits
|
|
431
|
-
Commit frequently: one atomic commit per verified increment (
|
|
432
|
-
|
|
414
|
+
Commit frequently: one atomic commit per verified increment (change +
|
|
415
|
+
its evidence), never one end-of-run omnibus; each commit builds +
|
|
433
416
|
tests green on its own; no WIP on the final branch.
|
|
434
417
|
BEFORE composing each message, read the history and mimic it: run
|
|
435
418
|
`git log --oneline -20` plus `git log -5 -- <touched paths>` and match
|
|
@@ -442,20 +425,11 @@ convention. If a plan file exists, final commit footer:
|
|
|
442
425
|
commits this session — then stage + draft the message instead.
|
|
443
426
|
|
|
444
427
|
# Constraints
|
|
445
|
-
- Every behavior change
|
|
446
|
-
the
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
only: pure formatting, comment-only edits, dependency bumps with no
|
|
451
|
-
behavior delta, rename-only moves — justify each in `## Findings`.
|
|
452
|
-
- A test that cannot fail for the regression it names is NOT
|
|
453
|
-
evidence: mock-call assertions, pinned constants, a fixture equal
|
|
454
|
-
to the default it must override, an expected value re-derived from
|
|
455
|
-
the output under test. Prefer a real-surface proof with no new
|
|
456
|
-
test over a tautological one.
|
|
457
|
-
- Refactors: characterization tests pinning current observable
|
|
458
|
-
behavior FIRST, green against the old code, green throughout.
|
|
428
|
+
- Every behavior change is PROVEN BY ITS RUN on the real surface, with
|
|
429
|
+
the tests the repository keeps for it green. A test that cannot fail
|
|
430
|
+
for the regression it names is NOT evidence: mock-call assertions,
|
|
431
|
+
pinned constants, a fixture equal to the default it must override,
|
|
432
|
+
an expected value re-derived from the output under test.
|
|
459
433
|
- Smallest correct change. No drive-by refactors.
|
|
460
434
|
- Never suppress lints / errors / test failures. Never delete, skip,
|
|
461
435
|
`.only`, `.skip`, `xfail`, or comment out tests to green the suite.
|
|
@@ -464,8 +438,8 @@ commits this session — then stage + draft the message instead.
|
|
|
464
438
|
# Output discipline
|
|
465
439
|
- First line literally: `ULTRAWORK MODE ENABLED!`
|
|
466
440
|
- After bootstrap: 1-2 paragraph plan summary + notepad path.
|
|
467
|
-
- During execution: surface only state changes (
|
|
468
|
-
|
|
441
|
+
- During execution: surface only state changes (existing tests read,
|
|
442
|
+
scenario PASS/FAIL with evidence paths, reviewer verdict).
|
|
469
443
|
- Final message: outcome + success-criteria checklist with evidence
|
|
470
444
|
refs + notepad path + reviewer approval (if gate triggered) + commit
|
|
471
445
|
list (`<sha> <subject>`). No file-by-file changelog unless asked.
|
|
@@ -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
|
-
|
|
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
|
|
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:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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/`
|
|
23
|
-
|
|
24
|
-
|
|
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,
|
|
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
|
-
|
|
8
|
+
One library, two engines. omowright ships inside this skill; choose the engine before you act:
|
|
9
9
|
|
|
10
|
-
| You need | Engine |
|
|
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 |
|
|
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
|
|
18
|
-
|
|
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
|
|
21
|
+
## Step 0 — load omowright and prove the stack
|
|
21
22
|
|
|
22
|
-
```
|
|
23
|
-
|
|
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
|
-
|
|
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-
|
|
32
|
-
| `no-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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. **
|
|
51
|
-
|
|
52
|
-
|
|
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** (`
|
|
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.
|
|
67
|
+
5. **Always `stop()` the session,** on success and on failure.
|
|
58
68
|
|
|
59
|
-
|
|
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
|
-
```
|
|
67
|
-
|
|
75
|
+
```js
|
|
76
|
+
const outcome = await session.requestHelp({ prompt: "<what you need done>", targets: ["@e4"], timeoutMs: 300_000 })
|
|
68
77
|
```
|
|
69
78
|
|
|
70
|
-
Then
|
|
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,
|
|
76
|
-
or recovery code. The value of
|
|
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
|
-
-
|
|
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
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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) |
|