{"id":48757957,"url":"https://github.com/lexmount/browser-skill","last_synced_at":"2026-05-22T05:01:20.819Z","repository":{"id":347180213,"uuid":"1193127163","full_name":"lexmount/browser-skill","owner":"lexmount","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-21T13:27:40.000Z","size":521,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-21T22:13:17.276Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lexmount.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-26T22:45:07.000Z","updated_at":"2026-05-21T13:28:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lexmount/browser-skill","commit_stats":null,"previous_names":["lexmount/browser-skill"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/lexmount/browser-skill","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexmount%2Fbrowser-skill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexmount%2Fbrowser-skill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexmount%2Fbrowser-skill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexmount%2Fbrowser-skill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lexmount","download_url":"https://codeload.github.com/lexmount/browser-skill/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexmount%2Fbrowser-skill/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33326683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-21T12:23:38.849Z","status":"online","status_checked_at":"2026-05-22T02:00:06.671Z","response_time":265,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-13T04:10:42.777Z","updated_at":"2026-05-22T05:01:20.809Z","avatar_url":"https://github.com/lexmount.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# lex-browser-runtime in browser-skill\n\n`lex-browser-runtime` is the SDK-first runtime layer for Lexmount-backed browser\nautomation.\n\nThis repository is the canonical home for both the runtime package and the\ninstallable Lexmount browser skill. The earlier `lex-browser-runtime` repository\nwas used to extract and validate the runtime layer; release and skill\ndistribution now happen from `lexmount/browser-skill`.\n\nThe current milestone keeps the transport deliberately small while moving the\nruntime assist capabilities out of browser-use: browser lifecycle, capability\nregistry, telemetry contracts, API fetch safety, response compaction, compact\nstate detection, and deterministic high-volume completion contracts live here.\nThe near-term acceptance test is parity: browser-use should be able to call this\nSDK and rerun the same LexBench-Browser 20-case slice with the same\nruntime-assist gains.\n\nThe runtime is also the home for the reusable engine behind the\n`lexmount/browser-skill` surface. Agent-facing skills and installers should call\nthis package instead of owning their own Lexmount lifecycle/action implementation.\n\n## Scope\n\n- Create, describe, and close Lexmount browser sessions.\n- List/get/close sessions and contexts for skill/CLI workflows.\n- Support an existing-CDP backend for local tests and integration shims.\n- Expose a small JSON CLI for Lexmount session/context lifecycle and direct\n  shared websocket URLs.\n- Run Playwright-backed primitive browser actions against an explicit CDP URL,\n  Lexmount session id, or direct shared websocket URL.\n- Validate and run browser-skill case files with JSONL events and summary\n  artifacts.\n- Route and run multi-source browser research jobs with concurrent Lexmount\n  sessions and structured evidence artifacts for an outer agent to summarize.\n- Load runtime capability knowledge from adapter JSON and site-hint YAML files.\n- Fetch adapter-approved public APIs with pre/post redirect URL safety checks.\n- Compact known API/page responses into stable, answerable runtime observations.\n- Provide deterministic runtime completion contracts for high-volume flows where\n  UI clicking is the wrong primitive.\n- Produce agent-agnostic runtime traces that benchmark harnesses can store under\n  `agent_metadata.runtime_assist`.\n\n## Non-Goals\n\n- This package is not an agent planner.\n- This package still does not expose an HTTP or MCP service; callers use the SDK\n  directly or the thin local CLI.\n- The first SDK milestone does not integrate Skyvern, Agent-TARS, Claude Code, or\n  OpenAI CUA.\n- Batch retry/watch and full producer/consumer orchestration templates from\n  `browser-skill` are intentionally kept out of this extraction and should move\n  in separate PRs.\n\n## CLI Surface\n\nInstall the optional skill dependencies when using the CLI against Lexmount\nbrowsers:\n\n```bash\nuv pip install -e '.[skill]'\n```\n\nCommon commands:\n\n```bash\nlex-browser-runtime session create\nlex-browser-runtime session create --create-context --metadata-json '{\"owner\":\"demo\"}'\nlex-browser-runtime session list --status active\nlex-browser-runtime session get --session-id \u003cid\u003e\nlex-browser-runtime session close --session-id \u003cid\u003e\nlex-browser-runtime context list\nlex-browser-runtime direct-url\nlex-browser-runtime action open-url --session-id \u003cid\u003e --url https://example.com\nlex-browser-runtime action snapshot --session-id \u003cid\u003e\nlex-browser-runtime case validate --file examples/basic-open.json\nlex-browser-runtime case run --file examples/basic-open.json --stop-on-error\nlex-browser-runtime research route --query \"最好吃的红烧肉\" --preset food\nlex-browser-runtime research run --query \"最好吃的红烧肉\" --preset food --max-sites 10 --concurrency 5\n```\n\nThe CLI emits structured JSON compatible with the original browser skill helper,\nincluding the dedicated `browser_parallel_limit_reached` error code when the\nLexmount active browser quota is full.\n\n`direct-url` returns a masked Lexmount shared-browser websocket URL by default\nbecause the underlying protocol carries the API key in the URL query string. Use\n`--reveal-url` only when an interactive caller needs the live URL, and treat that\noutput as a secret: do not store it in persistent logs, issue trackers, or shared\ntranscripts.\n\n## Development\n\n```bash\nmake venv\nmake deps\nmake check\n```\n\nThe package supports Python 3.11+ so it can be installed into the existing\nbrowser-use benchmark environment.\n\n## Installable Agent Skill\n\nThe portable Claude Code / Codex skill lives in\n`skills/lexmount-browser`. It is a thin wrapper around this package, so installed\nagents can quickly use Lexmount without copying the old `browser-skill` helper\nimplementation.\n\nInstall into both local Codex and Claude Code skill directories:\n\n```bash\npython3 scripts/install_lexmount_browser_skill.py --target both\n```\n\nOptionally write the current Lexmount credentials into the installed skill and\nbootstrap its local runtime environment:\n\n```bash\nLEXMOUNT_API_KEY=... LEXMOUNT_PROJECT_ID=... \\\npython3 scripts/install_lexmount_browser_skill.py \\\n  --target both \\\n  --write-env-from-current \\\n  --bootstrap\n```\n\nAfter installation, agents should call the stable wrapper:\n\n```bash\n~/.codex/skills/lexmount-browser/scripts/lexmount-browser session create\n~/.codex/skills/lexmount-browser/scripts/lexmount-browser action snapshot --session-id \u003cid\u003e\n~/.codex/skills/lexmount-browser/scripts/lexmount-browser case run --file ~/.codex/skills/lexmount-browser/examples/basic-open.json --close-created-session\n~/.codex/skills/lexmount-browser/scripts/lexmount-browser research run --query \"最好吃的红烧肉\" --preset food --max-sites 10 --concurrency 5\n```\n\nFor Claude Code, use the same path under `~/.claude/skills/lexmount-browser`.\n\nFor research or recommendation tasks, the installed skill should not become a\nsecond LLM agent. Claude Code or Codex remains responsible for query\ninterpretation, source selection adjustments, and the final answer. The runtime\nrunner handles deterministic routing, concurrent Lexmount browser sessions, page\nextraction, and artifact writing. A run returns paths for `routes.json`,\n`events.jsonl`, `sources.jsonl`, and `summary.json`.\n\n## npm Installer Release\n\nThe installable skill is packaged as:\n\n- npm package: `@lexmount/browser-skill-installer`\n- binary: `lexmount-browser-skill-install`\n\nAfter publishing, users can install without cloning this repository:\n\n```bash\nnpx @lexmount/browser-skill-installer\n```\n\nNon-interactive installation is available for CI or scripted setup:\n\n```bash\nLEXMOUNT_INSTALL_NONINTERACTIVE=1 \\\nLEXMOUNT_INSTALL_TARGET=both \\\nLEXMOUNT_INSTALL_REGION=china \\\nLEXMOUNT_INSTALL_DEPS=1 \\\nLEXMOUNT_API_KEY=... \\\nLEXMOUNT_PROJECT_ID=... \\\nnpx @lexmount/browser-skill-installer\n```\n\nRelease flow:\n\n1. Bump `package.json` to a new unpublished version.\n2. Push the change and tag.\n3. Create a GitHub Release for the tag.\n4. `.github/workflows/publish.yml` validates the package and runs\n   `npm publish`.\n\nLocal release validation:\n\n```bash\nnpm run release:npm:check\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flexmount%2Fbrowser-skill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flexmount%2Fbrowser-skill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flexmount%2Fbrowser-skill/lists"}