[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CRVAHDZATWW77G67WYYQHA":3,"skill-same:01M6CRVAHDZATWW77G67WYYQHA":71},{"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":23,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M6CRVAHDZATWW77G67WYYQHA","browser",null,"Drive a live browser with async Python against QwenPaw's builtin Browser SDK. The full reference is below; re-load this browser skill after context compaction.","agentscope-ai\u002FQwenPaw","agentscope-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F211762292?v=4","01M6CRT6543BZGGVK3P85GC08Q","AgentScope-AI","01M6CRT698G78F0SPC659YEK6E",37704,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Fsrc\u002Fqwenpaw\u002Fagents\u002Fskills\u002Fbrowser-en\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"python","sdk","context","drive","reference","async","builtin","Browser Skill","full","live","compaction","with","re","load","qwenpaw","2026-11-10 10:12:30",false,"---\nname: browser\ndescription: \"Drive a live browser with async Python against QwenPaw's builtin Browser SDK. The full reference is below; re-load this browser skill after context compaction.\"\nmetadata:\n  builtin_skill_version: \"0.3\"\n  qwenpaw:\n    emoji: \"?\"\n    requires: {}\n---\n\n# Browser\n\nWork with discipline: perceive the current page, act through the documented\nsurface, then re-perceive before claiming success. State only facts observed\nin this turn. When stuck, a complete delivery is the step you are stuck on\nplus the partial results you have verified — never fill in content you did not\nobserve just to produce a full answer.\n\nRespect the human boundary: for login, captcha, 2FA, or any human-only step,\ncall `await browser.handoff(...)` and stop. Never automate those flows.\nWhen the browser cannot finish, do not substitute data from another channel\n(such as web_search) and still call it a browser result — state each fact's\nreal source.\n\nThis is QwenPaw's builtin Browser SDK, not Playwright. Its surface is closed:\nanything not listed does not exist. The complete reference is below; re-load\nthis browser skill with the Skill tool if it is no longer in context.\n\n\u003C!-- BEGIN GENERATED: browser-manual -->\nQwenPaw Browser SDK — complete reference. This is QwenPaw's OWN internal\nSDK and this is the ENTIRE API; these are all the entrypoints. The SDK\nis already in scope as Browser — call the methods below directly. Write\nasync Python. Work in a loop: perceive → act → verify.\n\n# Copy this shape:\nbrowser = await Browser.connect()                  # connect once; reused all session\npage = await browser.open(\"https:\u002F\u002Fexample.com\")   # open a page\nobs = await page.snapshot()                         # PERCEIVE — page text is obs.text\nif len(obs.text) \u003C 6000:\n    print(obs.text)\nelse:\n    # Large page: read selectively instead of dumping everything.\n    lines = [line for line in obs.text.splitlines()\n             if \"keyword\" in line]\n    print(f\"{len(obs.text)} chars total; {len(lines)} matching lines:\")\n    print(\"\\n\".join(lines[:80]))\n# For a focused count, use: await page.snapshot(query=\"keyword\")\nawait page.get_by_role(\"textbox\", name=\"Search\").fill(\"laptop\")   # ACT\nawait page.get_by_role(\"button\", name=\"Search\").click()            # ACT\nobs = await page.snapshot()                         # VERIFY — re-perceive to confirm\nprint(\"Verified; inspect obs.text with the selective pattern above.\")\n\nSession state: this is a stateful session — variables you assign (browser,\npage) persist across calls, so connect once and reuse them. If a call\nreports the session was reset, re-run await Browser.connect().\n\nChrome backend caveat: with backend=chrome you operate inside the user's\nreal browser. A session is a tab-ownership group — tabs are isolated per\nsession, but identity (cookies, logins, storage) is shared with the user's\nprofile and with every other session. Do not rely on session-level identity\nisolation on this backend.\n\nbrowser (orchestration):\nawait Browser.connect(*, identity: \"auto\"|\"user\"|\"avatar\"|\"guest\" = \"auto\") -> browser\n    Connect as an identity: user, avatar, guest, or auto.\n\n    ``auto`` picks ``user`` when Chrome is connected, otherwise ``guest``.\n    An unavailable explicit identity raises instead of substituting.\nawait browser.open(url: str | None = None) -> page\n    Open a page at ``url`` and return it.\n\n    Reuses this session's active page when one exists; otherwise a\n    new page is created. Pages are released when the response cycle ends;\n    start each cycle by calling ``open(url)`` again.\nawait browser.pages() -> list of page ref (.id, .url, .title, .active)\n    List open pages with URL, title, and active-state details.\nawait browser.switch_page(page: page ref (.id, .url, .title, .active)) -> none\n    Make the given page ref active for later operations.\nawait browser.close_page(page: page ref (.id, .url, .title, .active)) -> none\n    Close the given page ref in this session.\nawait browser.session_status() -> session status (.owner, .variant, .context, .connected)\n    Report the owner, variant, context, and connected state.\nawait browser.handoff(reason: str, instructions: str = \"\") -> a result dict\n    Hand a step back to a human (captcha, login, 2FA).\n\n    Pass a short reason and instructions; the run stops on this signal —\n    never automate these flows. The active cycle-scoped page is retained\n    for one extra response cycle after the handoff.\nawait browser.present(url: str | None = None) -> page\n    Open a page retained for the chat lifetime.\nawait browser.close() -> none\n    Close this session's browser and release its context.\n\npage (operation):\nawait page.goto(url: str) -> a result dict\n    Navigate this page to ``url`` and return raw navigation facts.\nawait page.go_back() -> a result dict\n    Navigate back to the previous page in history.\nawait page.go_forward() -> a result dict\n    Navigate forward to the next page in history.\nawait page.reload() -> a result dict\n    Reload the current page.\nawait page.keep() -> none\n    Retain this page across response cycles for the current chat.\nawait page.wait_for_load_state(state: str = \"load\", *, timeout: float | None = None) -> none\n    Wait until the page reaches the requested load state.\n\n    ``networkidle`` semantics depend on the backend: the Playwright\n    backend waits for true network quiescence, while CDP-based\n    backends (cdp, chrome) degrade to ``document.readyState ==\n    \"complete\"`` plus a fixed 500 ms quiet delay and do NOT track\n    in-flight requests — content loaded by late XHR may still be\n    missing when this returns.\nawait page.wait_for_timeout(timeout: float) -> none\n    Sleep unconditionally for *timeout* milliseconds (capped at 30 000).\n\n    Prefer :py:meth:`locator.wait_for(state, timeout)\n    \u003CLocatorView.wait_for>` when waiting for a specific DOM condition\n    — it returns as soon as the condition is met and is both faster\n    and more reliable than an unconditional sleep.\nawait page.screenshot() -> a result dict\n    Capture this page to a PNG file in the active workspace.\npage.get_by_role(role: str, *, name: str | None = None) -> locator\n    Locate elements by accessible role and optional name.\npage.get_by_text(text: str) -> locator\n    Locate elements by their visible text.\npage.get_by_label(text: str) -> locator\n    Locate a form control by its associated label text.\npage.get_by_placeholder(text: str) -> locator\n    Locate an input by its placeholder text.\npage.locator(selector: str) -> locator\n    Locate elements by a CSS selector when no semantic locator fits.\npage.frame_locator(selector: str) -> locator\n    Scope subsequent locators to the iframe matching ``selector``.\nawait page.snapshot(query: str | None = None) -> observation (read .text; .match_count when you pass a query)\n    Perceive the page and return readable content in ``.text``.\n\n    Pass ``query`` to also report ``.match_count``.\nawait page.current_surface() -> surface facts (.url, .title, .load_state)\n    Return this page's current URL, title, and load facts.\npage.mouse -> coordinate\u002Fkeyboard input surface (see methods below)\n    Viewport-coordinate input surface.\n\n    click(x, y) -> a result dict; verify the effect with snapshot().\npage.keyboard -> coordinate\u002Fkeyboard input surface (see methods below)\n    Keyboard input surface.\n\n    press(key) -> a result dict; verify the effect with snapshot().\n\npage.get_by_* \u002F page.locator(...) return a locator that mirrors a SUBSET\nof Playwright's Python locator API — the Playwright-shaped part of this\nSDK:\n  compose\u002Fscope (chainable): get_by_role\u002Fget_by_text\u002Fget_by_label\u002F\n      get_by_placeholder, locator(sel), filter(...), nth(i), first, last (properties)\n  iframe scope: page.frame_locator(sel).locator(...) (one frame; no nested frames)\n  read (await): count()->int, inner_text()->str, text_content()->str|None,\n      all_text_contents()->list, get_attribute(name)->str|None,\n      input_value()->str, is_visible()->bool, is_enabled()->bool\n  act (await; returns a short evidence line — read .evidence): click(), fill(v),\n      type(t), press(key), check(), uncheck(), set_checked(b),\n      select_option(*v), hover(), dblclick(), scroll(),\n      focus(), blur(), clear(), wait_for(state), screenshot(),\n      bounding_box()->dict|None (viewport [\"x\"] [\"y\"] [\"width\"] [\"height\"]; None when the element is not visible)\n  strict-mode\n      uniqueness is enforced — act only when the locator resolves to exactly\n      one element (use count() to check). element_handle \u002F raw CDP unavailable.\n\nBackend differences (chrome\u002Fcdp vs playwright): on chrome\u002Fcdp the\naccessible name is a heuristic (aria-labelledby > aria-label > alt >\ntitle > text content) - container elements may match\nget_by_role(name=) more broadly than under playwright, so\nstrict-mode errors are more likely there; narrow with\nfilter(has_text=) or a more specific role. is_enabled() reflects\nonly the disabled property, not aria-disabled. press() supports a\nfixed key set: printable characters, Enter, Tab, Escape, Backspace,\nDelete, Arrow keys, Home\u002FEnd\u002FPageUp\u002FPageDown, and\nControl\u002FShift\u002FAlt\u002FMeta combos - anything else fails with guidance.\ntype() sets the value directly and fires an input event; editors that\nneed real per-key events may not react - prefer fill() where possible.\n\nReading results (read these fields; the type names don't matter):\n  snapshot()        -> .text (page text), .match_count (when you pass query)\n  current_surface() -> .url, .title, .load_state\n  page refs         -> .id, .url, .title, .active\n  screenshot()      -> result dict; read [\"path\"]\n  bounding_box()    -> viewport [\"x\"] [\"y\"] [\"width\"] [\"height\"]; None when the element is not visible\n  mouse.click()\u002Fkeyboard.press() -> result dict; fields depend on the backend, so verify with snapshot()\n  actions           -> .evidence (a short line saying what happened)\n  locator reads return plain str\u002Fint\u002Fbool\u002Flist directly.\n\nIf a locator fails, step DOWN one rung (don't jump):\n  1. semantic  page.get_by_role\u002Flabel\u002Ftext            first choice\n  2. css       page.locator(css)                       role missing\u002Funstable\n  3. coordinates use locator.bounding_box() first for an exact, low-cost viewport rectangle; use a screenshot to explore only when the element is absent from snapshot()\nFor captcha\u002Flogin\u002F2FA or any human-only step: await browser.handoff(reason,\ninstructions) and stop — never automate them.\n\u003C!-- END GENERATED: browser-manual -->\n","# Browser\n\nWork with discipline: perceive the current page, act through the documented\nsurface, then re-perceive before claiming success. State only facts observed\nin this turn. When stuck, a complete delivery is the step you are stuck on\nplus the partial results you have verified — never fill in content you did not\nobserve just to produce a full answer.\n\nRespect the human boundary: for login, captcha, 2FA, or any human-only step,\ncall `await browser.handoff(...)` and stop. Never automate those flows.\nWhen the browser cannot finish, do not substitute data from another channel\n(such as web_search) and still call it a browser result — state each fact's\nreal source.\n\nThis is QwenPaw's builtin Browser SDK, not Playwright. Its surface is closed:\nanything not listed does not exist. The complete reference is below; re-load\nthis browser skill with the Skill tool if it is no longer in context.\n\n\u003C!-- BEGIN GENERATED: browser-manual -->\nQwenPaw Browser SDK — complete reference. This is QwenPaw's OWN internal\nSDK and this is the ENTIRE API; these are all the entrypoints. The SDK\nis already in scope as Browser — call the methods below directly. Write\nasync Python. Work in a loop: perceive → act → verify.\n\n# Copy this shape:\nbrowser = await Browser.connect()                  # connect once; reused all session\npage = await browser.open(\"https:\u002F\u002Fexample.com\")   # open a page\nobs = await page.snapshot()                         # PERCEIVE — page text is obs.text\nif len(obs.text) \u003C 6000:\n    print(obs.text)\nelse:\n    # Large page: read selectively instead of dumping everything.\n    lines = [line for line in obs.text.splitlines()\n             if \"keyword\" in line]\n    print(f\"{len(obs.text)} chars total; {len(lines)} matching lines:\")\n    print(\"\\n\".join(lines[:80]))\n# For a focused count, use: await page.snapshot(query=\"keyword\")\nawait page.get_by_role(\"textbox\", name=\"Search\").fill(\"laptop\")   # ACT\nawait page.get_by_role(\"button\", name=\"Search\").click()            # ACT\nobs = await page.snapshot()                         # VERIFY — re-perceive to confirm\nprint(\"Verified; inspect obs.text with the selective pattern above.\")\n\nSession state: this is a stateful session — variables you assign (browser,\npage) persist across calls, so connect once and reuse them. If a call\nreports the session was reset, re-run await Browser.connect().\n\nChrome backend caveat: with backend=chrome you operate inside the user's\nreal browser. A session is a tab-ownership group — tabs are isolated per\nsession, but identity (cookies, logins, storage) is shared with the user's\nprofile and with every other session. Do not rely on session-level identity\nisolation on this backend.\n\nbrowser (orchestration):\nawait Browser.connect(*, identity: \"auto\"|\"user\"|\"avatar\"|\"guest\" = \"auto\") -> browser\n    Connect as an identity: user, avatar, guest, or auto.\n\n    ``auto`` picks ``user`` when Chrome is connected, otherwise ``guest``.\n    An unavailable explicit identity raises instead of substituting.\nawait browser.open(url: str | None = None) -> page\n    Open a page at ``url`` and return it.\n\n    Reuses this session's active page when one exists; otherwise a\n    new page is created. Pages are released when the response cycle ends;\n    start each cycle by calling ``open(url)`` again.\nawait browser.pages() -> list of page ref (.id, .url, .title, .active)\n    List open pages with URL, title, and active-state details.\nawait browser.switch_page(page: page ref (.id, .url, .title, .active)) -> none\n    Make the given page ref active for later operations.\nawait browser.close_page(page: page ref (.id, .url, .title, .active)) -> none\n    Close the given page ref in this session.\nawait browser.session_status() -> session status (.owner, .variant, .context, .connected)\n    Report the owner, variant, context, and connected state.\nawait browser.handoff(reason: str, instructions: str = \"\") -> a result dict\n    Hand a step back to a human (captcha, login, 2FA).\n\n    Pass a short reason and instructions; the run stops on this signal —\n    never automate these flows. The active cycle-scoped page is retained\n    for one extra response cycle after the handoff.\nawait browser.present(url: str | None = None) -> page\n    Open a page retained for the chat lifetime.\nawait browser.close() -> none\n    Close this session's browser and release its context.\n\npage (operation):\nawait page.goto(url: str) -> a result dict\n    Navigate this page to ``url`` and return raw navigation facts.\nawait page.go_back() -> a result dict\n    Navigate back to the previous page in history.\nawait page.go_forward() -> a result dict\n    Navigate forward to the next page in history.\nawait page.reload() -> a result dict\n    Reload the current page.\nawait page.keep() -> none\n    Retain this page across response cycles for the current chat.\nawait page.wait_for_load_state(state: str = \"load\", *, timeout: float | None = None) -> none\n    Wait until the page reaches the requested load state.\n\n    ``networkidle`` semantics depend on the backend: the Playwright\n    backend waits for true network quiescence, while CDP-based\n    backends (cdp, chrome) degrade to ``document.readyState ==\n    \"complete\"`` plus a fixed 500 ms quiet delay and do NOT track\n    in-flight requests — content loaded by late XHR may still be\n    missing when this returns.\nawait page.wait_for_timeout(timeout: float) -> none\n    Sleep unconditionally for *timeout* milliseconds (capped at 30 000).\n\n    Prefer :py:meth:`locator.wait_for(state, timeout)\n    \u003CLocatorView.wait_for>` when waiting for a specific DOM condition\n    — it returns as soon as the condition is met and is both faster\n    and more reliable than an unconditional sleep.\nawait page.screenshot() -> a result dict\n    Capture this page to a PNG file in the active workspace.\npage.get_by_role(role: str, *, name: str | None = None) -> locator\n    Locate elements by accessible role and optional name.\npage.get_by_text(text: str) -> locator\n    Locate elements by their visible text.\npage.get_by_label(text: str) -> locator\n    Locate a form control by its associated label text.\npage.get_by_placeholder(text: str) -> locator\n    Locate an input by its placeholder text.\npage.locator(selector: str) -> locator\n    Locate elements by a CSS selector when no semantic locator fits.\npage.frame_locator(selector: str) -> locator\n    Scope subsequent locators to the iframe matching ``selector``.\nawait page.snapshot(query: str | None = None) -> observation (read .text; .match_count when you pass a query)\n    Perceive the page and return readable content in ``.text``.\n\n    Pass ``query`` to also report ``.match_count``.\nawait page.current_surface() -> surface facts (.url, .title, .load_state)\n    Return this page's current URL, title, and load facts.\npage.mouse -> coordinate\u002Fkeyboard input surface (see methods below)\n    Viewport-coordinate input surface.\n\n    click(x, y) -> a result dict; verify the effect with snapshot().\npage.keyboard -> coordinate\u002Fkeyboard input surface (see methods below)\n    Keyboard input surface.\n\n    press(key) -> a result dict; verify the effect with snapshot().\n\npage.get_by_* \u002F page.locator(...) return a locator that mirrors a SUBSET\nof Playwright's Python locator API — the Playwright-shaped part of this\nSDK:\n  compose\u002Fscope (chainable): get_by_role\u002Fget_by_text\u002Fget_by_label\u002F\n      get_by_placeholder, locator(sel), filter(...), nth(i), first, last (properties)\n  iframe scope: page.frame_locator(sel).locator(...) (one frame; no nested frames)\n  read (await): count()->int, inner_text()->str, text_content()->str|None,\n      all_text_contents()->list, get_attribute(name)->str|None,\n      input_value()->str, is_visible()->bool, is_enabled()->bool\n  act (await; returns a short evidence line — read .evidence): click(), fill(v),\n      type(t), press(key), check(), uncheck(), set_checked(b),\n      select_option(*v), hover(), dblclick(), scroll(),\n      focus(), blur(), clear(), wait_for(state), screenshot(),\n      bounding_box()->dict|None (viewport [\"x\"] [\"y\"] [\"width\"] [\"height\"]; None when the element is not visible)\n  strict-mode\n      uniqueness is enforced — act only when the locator resolves to exactly\n      one element (use count() to check). element_handle \u002F raw CDP unavailable.\n\nBackend differences (chrome\u002Fcdp vs playwright): on chrome\u002Fcdp the\naccessible name is a heuristic (aria-labelledby > aria-label > alt >\ntitle > text content) - container elements may match\nget_by_role(name=) more broadly than under playwright, so\nstrict-mode errors are more likely there; narrow with\nfilter(has_text=) or a more specific role. is_enabled() reflects\nonly the disabled property, not aria-disabled. press() supports a\nfixed key set: printable characters, Enter, Tab, Escape, Backspace,\nDelete, Arrow keys, Home\u002FEnd\u002FPageUp\u002FPageDown, and\nControl\u002FShift\u002FAlt\u002FMeta combos - anything else fails with guidance.\ntype() sets the value directly and fires an input event; editors that\nneed real per-key events may not react - prefer fill() where possible.\n\nReading results (read these fields; the type names don't matter):\n  snapshot()        -> .text (page text), .match_count (when you pass query)\n  current_surface() -> .url, .title, .load_state\n  page refs         -> .id, .url, .title, .active\n  screenshot()      -> result dict; read [\"path\"]\n  bounding_box()    -> viewport [\"x\"] [\"y\"] [\"width\"] [\"height\"]; None when the element is not visible\n  mouse.click()\u002Fkeyboard.press() -> result dict; fields depend on the backend, so verify with snapshot()\n  actions           -> .evidence (a short line saying what happened)\n  locator reads return plain str\u002Fint\u002Fbool\u002Flist directly.\n\nIf a locator fails, step DOWN one rung (don't jump):\n  1. semantic  page.get_by_role\u002Flabel\u002Ftext            first choice\n  2. css       page.locator(css)                       role missing\u002Funstable\n  3. coordinates use locator.bounding_box() first for an exact, low-cost viewport rectangle; use a screenshot to explore only when the element is absent from snapshot()\nFor captcha\u002Flogin\u002F2FA or any human-only step: await browser.handoff(reason,\ninstructions) and stop — never automate them.\n\u003C!-- END GENERATED: browser-manual -->\n",{"name":5,"metadata":44,"description":7},{"qwenpaw":45,"builtin_skill_version":48},{"emoji":46,"requires":47},"?",{},"0.3","main","c26d31c0688aa9cce9bc1aef688177d2e14e25df","src\u002Fqwenpaw\u002Fagents\u002Fskills\u002Fbrowser-en",3284,"https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw","http:\u002F\u002Fqwenpaw.agentscope.io\u002F","https:\u002F\u002Fgithub.com\u002Fagentscope-ai","2026-11-13 15:25:45",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add agentscope-ai\u002FQwenPaw --skill browser",{"tool":63,"command":64},"bunx","bunx skills add agentscope-ai\u002FQwenPaw --skill browser",{"tool":66,"command":67},"pnpm","pnpm dlx skills add agentscope-ai\u002FQwenPaw --skill browser","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Fsrc\u002Fqwenpaw\u002Fagents\u002Fskills\u002Fbrowser-en\u002FSKILL.md",true,[],[72,86,99,109,121,138],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":79,"publishedAt":39},"01M6CRZ8QQ6RWS9P0PBDZDZSY8","portable-qoder","A stable standalone Qoder fixture Skill.","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fportability\u002Fqoder-mini\u002Fskills\u002Fportable-qoder\u002FSKILL.md",[78],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[80,81,82,83,84,85],"portable","qoder","portable qoder","fixture skill","fixture","standalone",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":97,"publishedAt":39},"01M6CRZ61PNG319SVCYZZVC7HA","report","Report fixture status.","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fportability\u002Fqoder-mini\u002Fplugins\u002Fcustom\u002Fmini-plugin-0.1.0\u002Fskills\u002Freport\u002FSKILL.md",[92],{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[88,98,84],"status",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":106,"publishedAt":39},"01M6CRZ3PTN8ZGW30RHF081Z00","portable-skill","A stable standalone Codex fixture Skill.","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fportability\u002Fcodex-mini\u002Fskills\u002Fportable-skill\u002FSKILL.md",[105],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[80,107,108,83,84,85],"portable skill","codex",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":39},"01M6CRZ1DNK71D5M63SQ3SPTMH","building-native-ui","Build a small native interface.","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fportability\u002Fcodex-mini\u002Fplugins\u002Fcache\u002Fmini-market\u002Fexpo\u002F1.0.0\u002Fskills\u002Fbuilding-native-ui\u002FSKILL.md",[],[116,117,118,119,120],"native","ui","building native ui","build","interface",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":128,"publishedAt":39},"01M6CRYYTRG56E165X66FRWZC8","browser_visible","当用户需要控制 browser 的浏览器启动方式时，使用本 skill。browser 默认由 Playwright 直接管理、不开放调试端口（需让其他本地工具附加时显式传 `cdp_port`）；`headed` 控制是否显示窗口，`private_mode` 保留用于兼容、不再改变默认行为，`browser_args` 传入额外的 Chromium 启动参数，`executable_path` 指定自定义浏览器可执行文件路径。","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Fsrc\u002Fqwenpaw\u002Fagents\u002Ftools\u002Fdeprecated_browser\u002Fskills\u002Fbrowser_visible-zh\u002FSKILL.md",[127],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[129,5,130,131,132,133,134,135,136,137],"browser visible","path","chromium","playwright","cdp","port","文件","工具","mode",{"skillNo":139,"name":123,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":39},"01M6CRYVQ9DMBB2EN4JFWC4R7F","Use this skill when the user needs to control the browser launch mode for browser. By default browser is managed by Playwright and opens no debugging port (pass an explicit `cdp_port` to let another local tool attach); `headed` controls whether the window is visible, and `private_mode` is kept for backward compatibility and no longer changes the default.","https:\u002F\u002Fgithub.com\u002Fagentscope-ai\u002FQwenPaw\u002Fblob\u002Fmain\u002Fsrc\u002Fqwenpaw\u002Fagents\u002Ftools\u002Fdeprecated_browser\u002Fskills\u002Fbrowser_visible-en\u002FSKILL.md",[143],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[129,5,145,146,147,148,149,150,151,152,153,154,155,134,137,156,157,158,159,133,160,132],"user","compatibility","default","use","tool","debugging","launch","when","local","control","controls","for","changes","window","managed","attach"]