[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DB36R01368FQD1P561BEM5":3,"skill-same:01M6DB36R01368FQD1P561BEM5":104},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M6DB36R01368FQD1P561BEM5","browser-rail",null,"Use as the DEFAULT for any multi-step browser work on a site the owner is signed into - reading, filling, clicking, uploading, or posting across several turns on grok.com, chatgpt.com, a dashboard, a webmail, an admin panel, or any logged-in app. Drives a dedicated CDP Chrome\u002FEdge profile with Playwright over role locators (the a11y tree), not pixels. Covers the Chrome-136 break where --remote-debugging-port is silently IGNORED on the default user-data-dir, the dedicated-profile fix, how the owner signs in ONCE so no credential ever passes through an agent, passing content as an evaluate ARG instead of inlining it into JS, and when to fall back to claude-in-chrome instead. Triggers include drive the browser, log into a site and do X, automate this web app, upload a file to a web page, attach to my Chrome, CDP, remote debugging port, connect_over_cdp, browser automation, or scrape a page I am logged into. NOT for a one-off look at a tab the owner already has open (use claude-in-chrome) and NOT for fetching a public page (use WebFetch or firecrawl).","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"browser rail","browser","work","app","across","back","attach","cdp","default","log","fix","browser automation","work on","how","open","scrape","automate this","connect","debugging","dashboard","2026-11-10 10:12:30",false,"---\nname: browser-rail\ndescription: Use as the DEFAULT for any multi-step browser work on a site the owner is signed into - reading, filling, clicking, uploading, or posting across several turns on grok.com, chatgpt.com, a dashboard, a webmail, an admin panel, or any logged-in app. Drives a dedicated CDP Chrome\u002FEdge profile with Playwright over role locators (the a11y tree), not pixels. Covers the Chrome-136 break where --remote-debugging-port is silently IGNORED on the default user-data-dir, the dedicated-profile fix, how the owner signs in ONCE so no credential ever passes through an agent, passing content as an evaluate ARG instead of inlining it into JS, and when to fall back to claude-in-chrome instead. Triggers include drive the browser, log into a site and do X, automate this web app, upload a file to a web page, attach to my Chrome, CDP, remote debugging port, connect_over_cdp, browser automation, or scrape a page I am logged into. NOT for a one-off look at a tab the owner already has open (use claude-in-chrome) and NOT for fetching a public page (use WebFetch or firecrawl).\n---\n\n# Browser Rail\n\nA fast, durable rail for driving a **logged-in** browser from an agent. Attach to\na dedicated CDP profile with Playwright, resolve elements by ROLE, and never touch\na credential.\n\n## The break this exists to route around\n\n**Chrome 136+ ignores `--remote-debugging-port` when it points at the DEFAULT\nuser-data-dir.** It does not warn; the port simply never listens. Every \"just\nattach to the browser you already have open\" recipe written before that change is\nnow silently dead, and the failure looks like a Playwright bug rather than a\nbrowser policy.\n\nThe fix is a **dedicated automation profile**. A separate `--user-data-dir` is\nstill allowed to open the debugging port.\n\nMeasured on this box (2026-07-24): Chrome `150.0.7871.129` on port 9222 with\n`--user-data-dir=C:\\Users\\Prekzursil\\.chrome-automation` answers\n`GET \u002Fjson\u002Fversion` with HTTP 200 and a live `webSocketDebuggerUrl`.\n\n## Start the rail\n\n```powershell\npwsh -File scripts\u002FStart-BrowserRail.ps1\npwsh -File scripts\u002FStart-BrowserRail.ps1 -Browser edge -Port 9333\npwsh -File scripts\u002FStart-BrowserRail.ps1 -Status\n```\n\nIdempotent: if the port already answers **and** the running browser's\n`--user-data-dir` is the rail profile, nothing launches and it reports\n`SUCCESS:browser-rail already live ...; reused`. If the port is held by a\n**different** profile it reports `FAILED` instead of attaching to whatever is\nlistening. `-Stop` refuses to kill a browser whose profile is not the rail\nprofile, so it can never close the owner's real Chrome.\n\nIt ends on a terminal line (AGENTS.md §4): `SUCCESS:browser-rail \u003Cdetail>` or\n`FAILED:browser-rail \u003Creason>`.\n\n## Credentials: the owner signs in once, you never do\n\n**Never type, paste, request, or read a password, OTP, or recovery code.** The rail\ndoes not need one.\n\n1. The launcher opens the dedicated profile as a NORMAL visible browser window.\n2. **The owner** signs into the sites they want automated, by hand, once.\n3. Chrome persists those cookies in the profile directory. Every later attach is\n   already authenticated.\n\nThe launcher creates the profile directory only when it is absent and never writes\ninto it — the owner's session data lives there.\n\nSeeding the profile by copying the live one does **not** carry logins: Chrome holds\n`Default\u002FNetwork\u002FCookies` under an exclusive lock while it runs, so the copy skips\nexactly the file that matters. Do not try to work around that lock. Ask the owner\nto sign in.\n\nIf a probe says the session is not authenticated, the correct action is to **tell\nthe owner to sign in** — not to attempt a login flow.\n\n## Drive by role, not by pixels\n\n`page.accessibility` does **not** exist in the installed Playwright (1.61.0,\nmeasured). Use **role locators**, which read the same accessibility tree:\n\n```python\npage.get_by_role(\"button\", name=\"Send\")\npage.get_by_role(\"textbox\", name=\"Message\")\npage.get_by_role(\"link\", name=\"Settings\")\n```\n\nRole locators beat both CSS selectors and screenshots: they survive restyling and\nclass-name churn, they say what the control *is*, and they cost no vision tokens.\nReach for a screenshot only to show the owner something visual, or when a canvas\nelement genuinely has no accessible name.\n\n## The Python helper\n\n`scripts\u002Fbrowser_rail.py`. The pure half imports without\nPlaywright installed; the browser half imports it lazily.\n\n```python\nfrom browser_rail import AuthSignals, PostRequest, find_or_open_page, is_authed, rail\n\nSIGNALS = AuthSignals(\n    logged_out_url_substrings=(\"\u002Flogin\", \"\u002Fsign-in\"),\n    logged_out_names=(\"Sign in\", \"Create account\"),\n    logged_in_names=(\"Sign out\", \"New chat\"),\n)\n\nwith rail() as browser:                       # connect_over_cdp on 127.0.0.1:9222\n    page, opened = find_or_open_page(browser, \"https:\u002F\u002Fgrok.com\u002F\")\n    verdict = is_authed(page, SIGNALS)\n    if verdict.authed is not True:\n        raise SystemExit(f\"ask the owner to sign in ({verdict.reason})\")\n```\n\n`find_or_open_page` REUSES a tab already on that domain — usually the\nauthenticated one — instead of opening a duplicate that loses page state. Its\nmatch is host-based, so `notgrok.com` and `https:\u002F\u002Fevil.com\u002Fgrok.com` do not\ncount as `grok.com`.\n\n### Three auth states, not two\n\n`is_authed` returns an `AuthVerdict` whose `authed` is `True`, `False`, or\n**`None` = UNKNOWN**. `None` means no configured signal fired; it is NOT a\nsynonym for \"logged out\". A detector's silence is not evidence.\n\nConfigure BOTH directions and check `signals.both_states_ready` — a signal set\nwith only logged-out markers can never return `True`.\n\nThis is not theoretical. During live verification the probe was configured with\nexample.com's OLD link text (\"More information\"); the page now renders \"Learn\nmore\". The verdict came back `None \u002F no-signal-fired` rather than a confident\nwrong answer. A one-directional detector would have reported \"logged out\".\n\nAmbiguity resolves to **not authed** on purpose: a false \"not authed\" costs one\nmanual check, a false \"authed\" sends the agent into a confusing downstream\nfailure.\n\n### Pass content as an ARG — never inline it into JS\n\nConcatenating content into a JS source string re-parses it as code. Quotes,\nbackslashes, and `\u003C\u002Fscript>` in the payload then change what executes.\n\n```python\nevaluate_with_arg(page, \"(arg) => arg.text.length\", {\"text\": body})   # correct\npage.evaluate(f\"() => '{body}'\")                                       # WRONG\n```\n\n`evaluate_with_arg`, `upload_text_as_file`, and `post_json` all route through\n`assert_payload_not_inlined`, which raises `PayloadInlinedError` when caller\ncontent appears verbatim in the source. **Stated limit:** it only scans payload\nstrings of 12+ characters, because shorter strings occur naturally in ordinary JS.\nIt is a lint against the common mistake, not a proof.\n\n`post_json` fetches from the page's own origin with `credentials: 'include'`, so\nthe request inherits the logged-in session — no cookie is ever extracted.\n\n### Canonical `browser_*` verb names (Browser Use borrow)\n\nThe rail also exposes a Browser-Use-style `browser_*` vocabulary: a thin, stable\nALIAS layer so a caller can name an action the same way even if an underlying\nhelper is later renamed. `VERB_TABLE` maps each of the 13 borrowed verbs to the\nfunction that implements it, and addressing stays role+name (which survives a\nrestyle), so this standardises only the NAMES.\n\n- Navigate \u002F interact: `browser_navigate` (= `find_or_open_page`, keeps tab\n  reuse), `browser_click`, `browser_type`, `browser_get_state`, `browser_scroll`,\n  `browser_go_back`, `browser_extract_content`.\n- Tabs \u002F sessions: `browser_list_tabs`, `browser_switch_tab`, `browser_close_tab`,\n  `browser_list_sessions`, `browser_close_session` (a CDP DISCONNECT, not a quit),\n  `browser_close_all`.\n- The four rail-only verbs keep `browser_*` aliases too: `browser_is_authed`,\n  `browser_evaluate`, `browser_upload_text`, `browser_post_json`.\n\nBrowser Use's `retry_with_browser_use_agent` is deliberately NOT adopted: the\nrail is a primitive layer, not an agent runtime.\n\n## Work over 60s runs under longrun\n\nCrawls, multi-page sweeps, and long form flows exceed 60s. Per AGENTS.md §4a, run\nthem through `scripts\u002Flongrun.ps1` with `run_in_background` + `Monitor` — never a\nblocking foreground call:\n\n```powershell\npwsh -File scripts\u002Flongrun.ps1 -Id browser-sweep -HeartbeatSec 15 -HangTimeoutSec 300 `\n  -Cmd python my_sweep.py\n```\n\nA browser rail is exactly the workload that stalls invisibly (a modal, an expired\nsession, a captcha). The heartbeat is what turns a silent hang into a `FAILED:` line.\n\n## When to use claude-in-chrome instead\n\n`claude-in-chrome` drives the owner's **real, already-open** browser and shows what\nthey see. It is the right tool when:\n\n- the task is ONE quick look at a tab the owner already has open;\n- the site is signed in on the DEFAULT profile only, and asking the owner to sign\n  into the rail profile is not worth it;\n- the owner wants to watch and take over mid-flow;\n- an extension the automation profile lacks is required.\n\nUse the rail instead when the work is multi-step, repeated, or scripted, when you\nneed deterministic role locators and real return values rather than a pixel relay,\nor when opening tabs in the owner's main window would disturb their session.\n\nRough cost note: attaching over CDP and reading roles returns structured data,\nwhereas a pixel relay spends vision tokens per look. Treat that as a directional\nclaim, not a benchmark — no head-to-head timing was run.\n\n## Playwright MCP `--extension` bridge\n\nThere is a third option that drives the owner's REAL profile through a browser\nextension, with no dedicated profile at all. It needs a `~\u002F.claude.json` change.\n**Do not edit that file live** — it is clobbered within ~30s. The exact config\ntext, and both the `--extension` and `--cdp-endpoint` variants, are in\n[references\u002Fplaywright-mcp-extension.md](references\u002Fplaywright-mcp-extension.md)\nfor the claude-closed lane to apply.\n\n## Verify before you trust\n\n```powershell\npwsh -File scripts\u002FStart-BrowserRail.ps1 -Status   # rail alive?\npython scripts\u002Fmutation_probe.py                   # tests still fire?\npython scripts\u002Fmanual_probe_live.py                # browser half works?\n```\n\n`mutation_probe.py` reverts six real behaviours and requires the suite to go RED on\neach. A green suite that has never been mutation-checked is not evidence that it\nprotects anything.\n","# Browser Rail\n\nA fast, durable rail for driving a **logged-in** browser from an agent. Attach to\na dedicated CDP profile with Playwright, resolve elements by ROLE, and never touch\na credential.\n\n## The break this exists to route around\n\n**Chrome 136+ ignores `--remote-debugging-port` when it points at the DEFAULT\nuser-data-dir.** It does not warn; the port simply never listens. Every \"just\nattach to the browser you already have open\" recipe written before that change is\nnow silently dead, and the failure looks like a Playwright bug rather than a\nbrowser policy.\n\nThe fix is a **dedicated automation profile**. A separate `--user-data-dir` is\nstill allowed to open the debugging port.\n\nMeasured on this box (2026-07-24): Chrome `150.0.7871.129` on port 9222 with\n`--user-data-dir=C:\\Users\\Prekzursil\\.chrome-automation` answers\n`GET \u002Fjson\u002Fversion` with HTTP 200 and a live `webSocketDebuggerUrl`.\n\n## Start the rail\n\n```powershell\npwsh -File scripts\u002FStart-BrowserRail.ps1\npwsh -File scripts\u002FStart-BrowserRail.ps1 -Browser edge -Port 9333\npwsh -File scripts\u002FStart-BrowserRail.ps1 -Status\n```\n\nIdempotent: if the port already answers **and** the running browser's\n`--user-data-dir` is the rail profile, nothing launches and it reports\n`SUCCESS:browser-rail already live ...; reused`. If the port is held by a\n**different** profile it reports `FAILED` instead of attaching to whatever is\nlistening. `-Stop` refuses to kill a browser whose profile is not the rail\nprofile, so it can never close the owner's real Chrome.\n\nIt ends on a terminal line (AGENTS.md §4): `SUCCESS:browser-rail \u003Cdetail>` or\n`FAILED:browser-rail \u003Creason>`.\n\n## Credentials: the owner signs in once, you never do\n\n**Never type, paste, request, or read a password, OTP, or recovery code.** The rail\ndoes not need one.\n\n1. The launcher opens the dedicated profile as a NORMAL visible browser window.\n2. **The owner** signs into the sites they want automated, by hand, once.\n3. Chrome persists those cookies in the profile directory. Every later attach is\n   already authenticated.\n\nThe launcher creates the profile directory only when it is absent and never writes\ninto it — the owner's session data lives there.\n\nSeeding the profile by copying the live one does **not** carry logins: Chrome holds\n`Default\u002FNetwork\u002FCookies` under an exclusive lock while it runs, so the copy skips\nexactly the file that matters. Do not try to work around that lock. Ask the owner\nto sign in.\n\nIf a probe says the session is not authenticated, the correct action is to **tell\nthe owner to sign in** — not to attempt a login flow.\n\n## Drive by role, not by pixels\n\n`page.accessibility` does **not** exist in the installed Playwright (1.61.0,\nmeasured). Use **role locators**, which read the same accessibility tree:\n\n```python\npage.get_by_role(\"button\", name=\"Send\")\npage.get_by_role(\"textbox\", name=\"Message\")\npage.get_by_role(\"link\", name=\"Settings\")\n```\n\nRole locators beat both CSS selectors and screenshots: they survive restyling and\nclass-name churn, they say what the control *is*, and they cost no vision tokens.\nReach for a screenshot only to show the owner something visual, or when a canvas\nelement genuinely has no accessible name.\n\n## The Python helper\n\n`scripts\u002Fbrowser_rail.py`. The pure half imports without\nPlaywright installed; the browser half imports it lazily.\n\n```python\nfrom browser_rail import AuthSignals, PostRequest, find_or_open_page, is_authed, rail\n\nSIGNALS = AuthSignals(\n    logged_out_url_substrings=(\"\u002Flogin\", \"\u002Fsign-in\"),\n    logged_out_names=(\"Sign in\", \"Create account\"),\n    logged_in_names=(\"Sign out\", \"New chat\"),\n)\n\nwith rail() as browser:                       # connect_over_cdp on 127.0.0.1:9222\n    page, opened = find_or_open_page(browser, \"https:\u002F\u002Fgrok.com\u002F\")\n    verdict = is_authed(page, SIGNALS)\n    if verdict.authed is not True:\n        raise SystemExit(f\"ask the owner to sign in ({verdict.reason})\")\n```\n\n`find_or_open_page` REUSES a tab already on that domain — usually the\nauthenticated one — instead of opening a duplicate that loses page state. Its\nmatch is host-based, so `notgrok.com` and `https:\u002F\u002Fevil.com\u002Fgrok.com` do not\ncount as `grok.com`.\n\n### Three auth states, not two\n\n`is_authed` returns an `AuthVerdict` whose `authed` is `True`, `False`, or\n**`None` = UNKNOWN**. `None` means no configured signal fired; it is NOT a\nsynonym for \"logged out\". A detector's silence is not evidence.\n\nConfigure BOTH directions and check `signals.both_states_ready` — a signal set\nwith only logged-out markers can never return `True`.\n\nThis is not theoretical. During live verification the probe was configured with\nexample.com's OLD link text (\"More information\"); the page now renders \"Learn\nmore\". The verdict came back `None \u002F no-signal-fired` rather than a confident\nwrong answer. A one-directional detector would have reported \"logged out\".\n\nAmbiguity resolves to **not authed** on purpose: a false \"not authed\" costs one\nmanual check, a false \"authed\" sends the agent into a confusing downstream\nfailure.\n\n### Pass content as an ARG — never inline it into JS\n\nConcatenating content into a JS source string re-parses it as code. Quotes,\nbackslashes, and `\u003C\u002Fscript>` in the payload then change what executes.\n\n```python\nevaluate_with_arg(page, \"(arg) => arg.text.length\", {\"text\": body})   # correct\npage.evaluate(f\"() => '{body}'\")                                       # WRONG\n```\n\n`evaluate_with_arg`, `upload_text_as_file`, and `post_json` all route through\n`assert_payload_not_inlined`, which raises `PayloadInlinedError` when caller\ncontent appears verbatim in the source. **Stated limit:** it only scans payload\nstrings of 12+ characters, because shorter strings occur naturally in ordinary JS.\nIt is a lint against the common mistake, not a proof.\n\n`post_json` fetches from the page's own origin with `credentials: 'include'`, so\nthe request inherits the logged-in session — no cookie is ever extracted.\n\n### Canonical `browser_*` verb names (Browser Use borrow)\n\nThe rail also exposes a Browser-Use-style `browser_*` vocabulary: a thin, stable\nALIAS layer so a caller can name an action the same way even if an underlying\nhelper is later renamed. `VERB_TABLE` maps each of the 13 borrowed verbs to the\nfunction that implements it, and addressing stays role+name (which survives a\nrestyle), so this standardises only the NAMES.\n\n- Navigate \u002F interact: `browser_navigate` (= `find_or_open_page`, keeps tab\n  reuse), `browser_click`, `browser_type`, `browser_get_state`, `browser_scroll`,\n  `browser_go_back`, `browser_extract_content`.\n- Tabs \u002F sessions: `browser_list_tabs`, `browser_switch_tab`, `browser_close_tab`,\n  `browser_list_sessions`, `browser_close_session` (a CDP DISCONNECT, not a quit),\n  `browser_close_all`.\n- The four rail-only verbs keep `browser_*` aliases too: `browser_is_authed`,\n  `browser_evaluate`, `browser_upload_text`, `browser_post_json`.\n\nBrowser Use's `retry_with_browser_use_agent` is deliberately NOT adopted: the\nrail is a primitive layer, not an agent runtime.\n\n## Work over 60s runs under longrun\n\nCrawls, multi-page sweeps, and long form flows exceed 60s. Per AGENTS.md §4a, run\nthem through `scripts\u002Flongrun.ps1` with `run_in_background` + `Monitor` — never a\nblocking foreground call:\n\n```powershell\npwsh -File scripts\u002Flongrun.ps1 -Id browser-sweep -HeartbeatSec 15 -HangTimeoutSec 300 `\n  -Cmd python my_sweep.py\n```\n\nA browser rail is exactly the workload that stalls invisibly (a modal, an expired\nsession, a captcha). The heartbeat is what turns a silent hang into a `FAILED:` line.\n\n## When to use claude-in-chrome instead\n\n`claude-in-chrome` drives the owner's **real, already-open** browser and shows what\nthey see. It is the right tool when:\n\n- the task is ONE quick look at a tab the owner already has open;\n- the site is signed in on the DEFAULT profile only, and asking the owner to sign\n  into the rail profile is not worth it;\n- the owner wants to watch and take over mid-flow;\n- an extension the automation profile lacks is required.\n\nUse the rail instead when the work is multi-step, repeated, or scripted, when you\nneed deterministic role locators and real return values rather than a pixel relay,\nor when opening tabs in the owner's main window would disturb their session.\n\nRough cost note: attaching over CDP and reading roles returns structured data,\nwhereas a pixel relay spends vision tokens per look. Treat that as a directional\nclaim, not a benchmark — no head-to-head timing was run.\n\n## Playwright MCP `--extension` bridge\n\nThere is a third option that drives the owner's REAL profile through a browser\nextension, with no dedicated profile at all. It needs a `~\u002F.claude.json` change.\n**Do not edit that file live** — it is clobbered within ~30s. The exact config\ntext, and both the `--extension` and `--cdp-endpoint` variants, are in\n[references\u002Fplaywright-mcp-extension.md](references\u002Fplaywright-mcp-extension.md)\nfor the claude-closed lane to apply.\n\n## Verify before you trust\n\n```powershell\npwsh -File scripts\u002FStart-BrowserRail.ps1 -Status   # rail alive?\npython scripts\u002Fmutation_probe.py                   # tests still fire?\npython scripts\u002Fmanual_probe_live.py                # browser half works?\n```\n\n`mutation_probe.py` reverts six real behaviours and requires the suite to go RED on\neach. A green suite that has never been mutation-checked is not evidence that it\nprotects anything.\n",{"name":5,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Fskills\u002Fbrowser-rail","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill browser-rail",{"tool":64,"command":65},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill browser-rail",{"tool":67,"command":68},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill browser-rail","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002FSKILL.md",true,[72,78,84,88,92,96,100],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Fplaywright-mcp-extension.md","REFERENCE","参考文档",4166,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Freferences\u002Fplaywright-mcp-extension.md",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"scripts\u002Fbrowser_rail.py","SCRIPT","脚本",22577,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Fscripts\u002Fbrowser_rail.py",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fmanual_probe_live.py",3779,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Fscripts\u002Fmanual_probe_live.py",{"path":89,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Fmutation_probe.py",3964,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Fscripts\u002Fmutation_probe.py",{"path":93,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002FREADME.md",3425,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Fscripts\u002FREADME.md",{"path":97,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002FStart-BrowserRail.ps1",9206,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Fscripts\u002FStart-BrowserRail.ps1",{"path":101,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Ftest_browser_rail.py",11859,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbrowser-rail\u002Fscripts\u002Ftest_browser_rail.py",[105,127,152,177,191,205],{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":47},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[112,113,114,115,116,117,118,119,120,121,122,123,124,125,126],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":47},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[133],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[135,40,136,137,138,139,140,141,41,142,143,144,145,146,121,147,148,149,150,151],"openmm md","decision","pick","linux","analyze","tool","stack","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":162,"publishedAt":47},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[158,161],{"categoryNo":159,"categoryName":160,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[163,164,165,166,167,168,169,170,171,172,40,173,174,175,176],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":47},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[179,184,185,186,187,188,189,190],"setup","report","project","installation","project setup","issues","state",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":198,"publishedAt":47},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[197],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[193,199,117,200,201,202,121,203,29,39,204],"start issue","issue","ready","work on issue","user","development",{"skillNo":206,"name":184,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":210,"publishedAt":47},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[184,186,149,211,188,212],"files","interactive"]