by openqa-cn
Jev Browser — indexed browser automation. Jev chooses the control, Playwright acts. A CodexQA skill.
# Add to your Claude Code skills
git clone https://github.com/openqa-cn/jev-browserjev-browser is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by openqa-cn. Jev Browser — indexed browser automation. Jev chooses the control, Playwright acts. A CodexQA skill. It has 60 GitHub stars.
jev-browser's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/openqa-cn/jev-browser" and add it to your Claude Code skills directory (see the Installation section above). jev-browser ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
jev-browser is primarily written in TypeScript. It is open-source under openqa-cn on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh jev-browser against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Drive a real browser through the codexqa-jev-browser CLI (TypeScript). Do not invent CSS/XPath/coordinates or replace the engine with a host browser tool.
runauto or generateexploreInstall once, from this skill directory (the directory that contains package.json and SKILL.md):
npm install
Playwright Chromium is the browser. Do not read another application's browser profile.
npx codexqa-jev-browser observe <url-or-local-html>
npx codexqa-jev-browser run cases/examples/search-docs.yaml
npx codexqa-jev-browser run cases/examples/search-docs.md
npx codexqa-jev-browser run --from-api https://qa.example.com/cases?suite=smoke
npx codexqa-jev-browser auto --url <url> --goal '<goal>'
npx codexqa-jev-browser generate --url <url> --goal '<goal>' --out generated/case.yaml --md --verify
npx codexqa-jev-browser explore --url <url> --out generated/explore
The browser window is shown by default. Set browser.headless: true to hide it. --headed forces a visible window. --no-screenshots skips images.
Do this before live auto / generate --goal. The CLI calls Jev or an OpenAI-compatible API itself. The host Cursor/Codex session model is not the decision model. observe, run, explore, and --decisions do not need a key. Do not stop those commands to ask for one.
Keys live in a .env file, not in the chat. The CLI loads the .env next to this SKILL.md first, then a repo-root .env, and does not override variables already set in the shell.
.env (or .env.example if .env is missing). If TYPESAFE_API_KEY or OPENAI_API_KEY is already set, run the command. Do not ask again..env.example to .env in the skill directory and tell the user to fill that file. Do not ask them to paste a key into the chat. Show this shape:# Each step: which control, which goal phrase to type, whether the step worked, whether the task is done.
TYPESAFE_API_KEY=
TYPESAFE_MODEL=jev-latest
TYPESAFE_BASE_URL=https://api.typesafe.ai/v1
# Task plan before the browser opens. Also the decision and the done check when TYPESAFE_API_KEY is empty.
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
TEXT_MODEL=gpt-4o-mini
TYPESAFE_API_KEY is set. OPENAI_MODEL is only the planner unless Jev is unset. A third-party gateway is OPENAI_BASE_URL or TYPESAFE_BASE_URL, not a separate product. Set HTTPS_PROXY in the same .env only when that gateway needs a proxy.generate writes the YAML after every successful step. Do not hand-author the case step by step while the run is walking the site..env.Optional CLI overrides (never --api-key): --model, --base-url, --config. Model name and gateway may also live in codexqa-jev-browser.config.yaml as ${OPENAI_API_KEY}-style placeholders.
Open or summarize reports/<run-id>/report.html before concluding. It contains suite totals, every step, and screenshots. Exit code is non-zero on failure. report.json is the machine-readable copy; report.md is the short summary.
DONE is not success. Assertions or visible evidence decide the result.${PASSWORD}), never in case files.{role, name, nth, within}.Per-app notes live in knowledge/<app>/*.md. On live auto / generate --goal, the CLI matches the start URL and the goal against each note's hosts and keywords, then appends the hits to the planner, the decision goal, and the field-text prompt. A note with general: true is included on every run.
Notes are reference for what to type and which visible control to prefer. They do not add operations. Do not copy them into case YAML. Add a new app by adding a note. Do not put that app's fill rules back into src/policy.ts.
--from-api pulls cases; steps may also use op: http for setup or backend checks.Schema and verbs: references/schema.md. Examples: references/examples.md.
简体中文 · How it works · Known limitations
Jev Browser is one skill in CodexQA: local Agent Skills that check whether code is actually good after it is written. This repository is the standalone project. The same skill is also installed from the CodexQA catalog.
GUI-model browser automation sends a screenshot to a vision model on every step. Recognition spends vision tokens, the loop waits for the model to read the image, and the click lands on coordinates.
CodexQA Jev Browser finds controls from an index built inside the page and treats visible page evidence as the result. Replay, goal runs, case generation, and site exploration share that index. The browser is Playwright Chromium. This repository has no benchmark against vision GUI models. The rows below are the structural answers to those costs.
On TypeSafe’s published System One comparison, a Jev decision is 40×–200× faster than a frontier LLM on the same kind of question (70–500 ms, against multi-second LLM calls). Their workflow demo is 193.6× faster and 444.6× cheaper: $0.000081 in 0.114 s versus $0.013880 in 8.566 s. TypeSafe calls that pair the high end of real-world gains. Jev lists input at $0.042 per million tokens, 238× lower than Claude Fable 5.1, and does not bill output tokens. These figures are for the decision call, not for loading the page or saving the report. Source: TypeSafe and the launch post.
The knowledge base is the main lever. Jev only chooses an indexed control, and the characters it can type are phrases already in the goal. It does not know that a Baidu cite is an ad, that the left city box is the departure city, or that a login dialog means stop. Those facts belong in knowledge/<app>/*.md.
A failed live run is usually a missing or wrong note, not a missing selector. Read the report, name the control the model should have used or avoided, and add that sentence to the matching note. hosts matches the site. keywords match the goal. general: true is attached on every run, such as the login-dialog stop. Notes are reference. The model still has to pick an index that was observed. Do not put that site's fill rules into src/policy.ts.
| Pain | What this runtime does |
|---|---|
| A GUI model finds controls from a screenshot, and every step spends vision tokens | The decision receives an index the page already built: role, name, current value, and allowed operations. The model answers a choice question. Screenshots stay in the report and mark the control that was used. |
| Every step waits for a vision model to finish reading the image | Observation runs inside the page. run, explore, and --decisions do not call a decision model. After generate writes YAML, --verify replays it on the same index. |
| Coordinate and vision grounding miss the control, and a layout change breaks the click | Actions hit data-codexqa-jev-browser-id. Cases resolve role / name / nth / within against the live index, including controls inside iframes. The index must still be in the action space before the click, and the page is checked again after it. |
| The browser you launch is part of the run | The runtime uses Playwright Chromium. |
TYPESAFE_API_KEY, each step is a /systemone questionnaire: which operation, and which observed target. The same channel judges whether that one action showed up on the next page. An OpenAI-compatible chat/completions call is the fallback decision model. --decisions skips both.{role, name, nth, within}. Those fields are resolved against the live index, including controls inside iframes. generate writes that YAML after every successful step. --verify then replays the file through run.done_when as something that must be on the page. DONE passes only when that evidence is visible. A failed assertion still runs teardown. The HTML report keeps the marked screenshot, step timing, token use, and the session video.observe, run, explore, and --decisions stop at the index and the actor. Live auto and generate --goal add the planner and a decision provider. generate turns a passing trace back into a case the actor can replay alone.
Typing uses characters the same Jev decision chooses from phrases already in the goal. Which control receives them is still the node id on the index. Notes in knowledge/<app>/ stay on that decision.
Each run writes reports/<run-id>/report.html: the case, every step, and the marked screenshot. Open the sample:
npm install
cp .env.example .env # live auto / generate --goal
Model calls use HTTPS_PROXY only when that variable is set.
Node.js 20 or newer.
The CLI calls Jev or an OpenAI-compatible API itself. The host Cursor or Codex session is not the decision model. Copy .env.example to .env and fill it in. The CLI reads cwd/.env, then the repo-root .env, and does not override variables already set in the shell. Do not commit .env.
# Per-step decision: which control, which goal phrase to type, whether the step worked, whether the task is done.
TYPESAFE_API_KEY=
TYPESAFE_MODEL=jev-latest
TYPESAFE_BASE_URL=https://api.typesafe.ai/v1
# Task plan before the case runs. Also the decision and the done check when TYPESAFE_API_KEY is unset.
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
TEXT_MODEL=gpt-4o-mini
| Call | When | Variables |
|---|---|---|
Jev /systemone |
Per-step operation and target, the text to type, the per-step effect verdict, and whether the task is done | TYPESAFE_API_KEY. Optional: TYPESAFE_MODEL, TYPESAFE_BASE_URL |
| Chat completions | Task plan, before the browser opens. Also the whole decision and the done check when Jev is unset | OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL. TEXT_MODEL defaults to OPENAI_MODEL |
| None | observe, run, explore, auto --decisions, generate --decisions |
— |
Priority for the decision provider: --decisions script, then Jev when TYPESAFE_API_KEY is set, then chat completions. --model and --base-url override the chat model and gateway. codexqa-jev-browser.config.yaml may use ${OPENAI_API_KEY}-style placeholders. Do not pass --api-key or put a raw key in a case file. Set HTTPS_PROXY only if the gateway needs it. The CLI does not probe local proxy ports.
npx codexqa-jev-browser observe examples/app/index.html
npx codexqa-jev-browser run cases/examples/search-docs.yaml cases/examples/login.yaml
npx codexqa-jev-browser run cases/examples/search-docs.md
npx codexqa-jev-browser run --from-api https://qa.example.com/cases
npx codexqa-jev-browser auto --url examples/app/index.html --goal '搜索 Pilot 并打开文档' \
--decisions cases/scripts/decisions-search.yaml
npx codexqa-jev-browser generate --url examples/app/index.html --goal '搜索 Pilot 并打开文档' \
--decisions cases/scripts/decisions-search.yaml --out generated/search.yaml --md --verify
npx codexqa-jev-browser explore --url examples/app/index.html --out generated/explore
The window is visible by default. browser.headless: true hides it. --headed forces a window. --no-screenshots skips images.
Reports land in reports/<run-id>/report.html. report.json is the machine-readable copy. report.md is the short summary. A failing case exits non-zero.
SKILL.md Agent entry: when to use this skill and which command to run
bin/ CLI launcher
src/ Runtime. observe/ builds the control index. report/ writes the HTML report
knowledge/ Notes for the decision. general/ applies to every site; other folders are per app
cases/ Replay examples, plus scripted decisions under cases/scripts
examples/app/ Small local HTML pages used by tests and the commands above
references/ Step schema and examples
tests/ Offline checks. They do not call a live site or a live model
agents/openai.yaml Display name and short description for the Agents surface
docs/jev-browser-overview.en.jpg English product overview at the top of this README
docs/jev-browser-overview.jpg Chinese product overview, used by README.zh-CN.md
docs/jev-report.png Report screenshot in the Execution report section
reports/ One folder per run. Git ignores it
Browser replay is the UI step. The rest of the check lives in CodexQA: requirements, cases, test data, blast radius, defect scans, and a review page you can open. Install the catalog, or only this skill:
npx skills add openqa-cn/codexqa
npx skills