[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71R5SX47ZDYEY1N8KA7G7KA":3,"skill-same:01M71R5SX47ZDYEY1N8KA7G7KA":61},{"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":18,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":34,"commitSha":35,"skillDirectory":36,"forksCount":37,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":40,"install":41,"resources":54},"01M71R5SX47ZDYEY1N8KA7G7KA","browser",null,"Control a real browser via CDP for web tasks; check and write site playbooks before improvising.","human-plus-machine\u002Fmonkeybot","human-plus-machine","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F280167390?v=4","01M71R5340DFF1C4XV5B369MPN","human plus machine","01M71R5357ZTPM4CKBNH5XNSFY",3,"MIT","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fexamples\u002Fskills\u002Fbrowser\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28],"cdp","for","tasks","check","control","web","via","write","site","real browser","2026-11-10 13:02:02",false,"---\nname: browser\ndescription: Control a real browser via CDP for web tasks; check and write site playbooks before improvising.\n---\n\n# browser\n\nUse the **browser** MCP tools (`browser__*` in the active tool list) for any web interaction: automation, scraping, testing, or site work. These come from the **`browser` MCP server** (stdio process), not from monkeybot core built-ins.\n\n## Before any browser tool\n\nIf `browser__*` tools are not in the active tool list yet, call **`enable_mcp(\"browser\")` first**. Use the server name from the harness MCP catalog (or this skill). Do not read MCP config files. That connects the catalogued server and advertises browser tools on the next model step (same user turn).\n\n## Default: indexed DOM (prefer this)\n\nDo **not** start with screenshots. Prefer intent tools when you already know the labels or the flow:\n\n1. Multi-field forms: `browser_act([{do:\"fill_form\", fields:{Email: \"...\", ...}, submit:true}])`. Resolves labels via `label[for]`, aria-label, aria-labelledby, placeholder, name, id, then nearest preceding row text. Checkboxes take `\"true\"`\u002F`\"false\"`. Unresolved labels are listed (`how` says which strategy matched) and are not an error unless every field failed.\n2. Known button\u002Flink text: `browser_click_text(\"Continue\", role=\"button\")`. On a miss, `did_you_mean` lists near-misses — do not immediately `get_elements`.\n3. Multi-step (login, pagination): `browser_act([{do:\"click\", index:n}, {do:\"input\", index:n, text:\"...\"}, ...])` — up to 25 steps; one observation at the end. Allowed `do`: click, input, select, press, click_text, wait_for, wait_idle, goto, scroll, settle, tab, open_tab, fill_form, login. On failure, resume from `failed_step` using the returned observation.\n4. Structured scraping: `browser_extract(selector, {title:\"h2\", href:\"a@href\"})` instead of `browser_js`.\n\nOtherwise use the indexed element tree:\n\n1. `browser_get_elements()` — returns interactive elements as an indexed text tree, e.g. `[35]\u003Cbutton>Submit\u003C\u002Fbutton>`. Viewport-only by default (footer says how many are below; pass `viewport_only=false` or scroll). Filter with `kind=` (`inputs`\u002F`buttons`\u002F`links`) or `contains=`.\n2. Act with `browser_click_by_index(index)`, `browser_input_by_index(index, text)`, or `browser_select_by_index(index, option_text)`. Each action settles and returns `observation` (a `diff` by default). Read that — do not call `get_elements` again unless you need a different filter or the whole tree. Pass `observe=\"none\"` to skip the snapshot, `observe=\"full\"` for the viewport tree. `browser_goto` returns a full observation by default.\n3. Indices remain valid until navigation. Re-call `browser_get_elements()` after navigation only if the action observation is not enough. Use `browser_get_text` to read page copy instead of `browser_js(\"document.body.innerText\")`.\n\n`browser_input_by_index` fills in-page by default. If a field ignores the typed value (search-as-you-type, autocomplete comboboxes, or sites that only listen to `keydown`), pass `mode=\"keys\"`.\n\nThis is the default workflow: no image tokens, no pixel guessing, and clicks resolve through the live DOM.\n\n## Before acting on a site\n\n1. Call `browser_list_playbooks` with the host or URL. If `flows` are listed, call `browser_run_playbook(host, name, params)` instead of re-planning.\n2. If there are notes but no flows, call `browser_read_playbook` and follow them.\n3. Use `browser_get_elements` to see what you can click\u002Ftype — not a screenshot.\n4. After a playbook `failed_step`, continue by hand from the returned observation. Then `browser_write_playbook(..., append=true)` with a corrected `playbook` YAML fence. Secrets are never flow params — use `{do: login, expected_origin: ...}` which maps to `browser_login`.\n\n## Fallback: screenshots + coordinates (last resort)\n\nIf `browser_get_elements` returns an error, retry once (or with `viewport_only: false`) before giving up — do **not** immediately screenshot. Use `browser_screenshot` **only** when the indexed tree truly cannot help: canvas apps, heavy shadow-DOM UIs, drag-and-drop, or visually confirming layout\u002Frendering.\n\n`browser_screenshot` saves JPEGs under **`.\u002Fbrowser\u002FScreenshots\u002F`** (`max_dim=1200`, quality 60; pass `format=\"png\"` if you need PNG). The tool response includes:\n\n- `path` — workspace-relative path (e.g. `.\u002Fbrowser\u002FScreenshots\u002Fshot-….jpg`)\n- `bytes` \u002F `format` — file size and `jpeg` or `png`\n- `screenshots_dir` — always `.\u002Fbrowser\u002FScreenshots`\n- `viewport` — width\u002Fheight for coordinate clicks\n- `annotated` \u002F `labeled` — present when `annotate=True`\n\nOn vision models, after a fallback screenshot call **`load_file`** with the returned `path`. Prefer `annotate=True` then `browser_click_by_index`; use `browser_click(x, y)` only when there is no useful index. Do not screenshot after every ordinary click when indexed tools work.\n\nText-only models should never rely on screenshots for page understanding — use `browser_get_elements`, `browser_extract`, or `browser_js(...)`.\n\n## Workflow\n\n- First navigation: `browser_goto(url)` — response includes a full observation plus matching playbook filenames and executable `flows` when present.\n- After navigation: `browser_wait_for` or `browser_wait_idle` only if the observation is not enough.\n- Clicking \u002F typing (default): `browser_click_text` \u002F `browser_act` (including `do: fill_form`) when you know the labels or the flow; otherwise `browser_get_elements` once → `browser_click_by_index` \u002F `browser_input_by_index` \u002F `browser_select_by_index`. Read `observation` on each action. Indices stay valid until navigation.\n- Reading: `browser_get_text` for body copy; `browser_extract` for structured rows; action `observation` (diff) after in-page mutations. Call `browser_get_elements` again only for a different filter or the whole tree.\n- Clicking (fallback only): `browser_screenshot(annotate=True)` → `load_file(path)` → `browser_click_by_index`. Use `browser_click(x, y)` only when there is no useful index.\n- Ad hoc DOM extraction: `browser_extract` for repeating cards\u002Frows; `browser_js(expression)` only when you need custom page text or attributes.\n- Login walls: if the user asked to sign in on the Spaces in-app browser, call `browser_login(expected_origin=\"https:\u002F\u002Fthe-site.com\")` (optionally with `username`). It uses a saved password and returns `{ok, loggedIn, origin}` only — never read or type the password yourself. Always pass `expected_origin`: the login targets the tab the user has focused, which is not necessarily the tab your other `browser_*` calls address, so this is what stops a login landing on the wrong site. Check the returned `origin` before reporting success. If it returns `this password is not allowed for agent use` or `focused tab is on a different origin`, stop and ask the user. Still stop for MFA, consent, or a password the user must type themselves.\n\n## Tabs\n\nTabs have short aliases (`t1`, `t2`, …) or a name you pass to `browser_open_tab(alias=...)`. **Reads never move focus** (`browser_get_elements(tab=...)`, `browser_page_info`, `browser_js`, `browser_wait_for`, `browser_read_tabs`, `browser_extract`). **Actions do** (click, input, select, fill, fill_form, click_text, act, screenshot, …) because headed Chrome throttles timers and pauses painting in background tabs.\n\nOpen a second tab to compare pages, keep a form while reading docs, or fan out with `browser_read_tabs`. At most 10 agent-controlled tabs (`BROWSER_MCP_MAX_TABS`). If you hit the cap, relay the returned list (aliases, titles, last-used) to the user, ask which to close, then `browser_close_tab` and retry — never close a tab without their confirmation. If the error scope is `app`, the Spaces window is full across chats; do not describe that as this chat's 10-tab cap. Close tabs you opened when done. Do not expect a background SPA to finish loading while unfocused. `browser_login` still targets the tab the **user** has focused, not `tab=`.\n\n## After learning something non-obvious\n\nWhen you finish a task on a host without a playbook—or discover selectors, waits, auth quirks, or flows worth reusing—call `browser_write_playbook(host, content)`.\n\n- Prefer a `playbook` YAML fence (name, params, steps, optional expect) so the next visit can `browser_run_playbook`.\n- Keep notes terse: what worked, exact selectors, edge cases.\n- If a playbook already exists, pass `append: true` to add a section instead of overwriting. Broken fences are rejected and not written.\n- Do not hand-author huge docs; write a `playbook` fence from what actually worked in the browser.\n\n## Cleanup\n\n- Call `browser_stop` when browsing is done, especially after cloud\u002Fremote browser sessions.\n- Screenshots accumulate under `.\u002Fbrowser\u002FScreenshots\u002F`; delete old captures when no longer needed.\n\n## Setup (operators)\n\nThe `browser` MCP server must already be catalogued by the operator. Do not read MCP config files to discover it — call `enable_mcp(\"browser\")`. Full install, production deployment (local dev, self-hosted headless, Browser Use Cloud), env vars, and troubleshooting: **`docs\u002Fbrowser-mcp.md`** in the monkeybot repo (also linked from `docs\u002Fmcp.md`).\n","# browser\n\nUse the **browser** MCP tools (`browser__*` in the active tool list) for any web interaction: automation, scraping, testing, or site work. These come from the **`browser` MCP server** (stdio process), not from monkeybot core built-ins.\n\n## Before any browser tool\n\nIf `browser__*` tools are not in the active tool list yet, call **`enable_mcp(\"browser\")` first**. Use the server name from the harness MCP catalog (or this skill). Do not read MCP config files. That connects the catalogued server and advertises browser tools on the next model step (same user turn).\n\n## Default: indexed DOM (prefer this)\n\nDo **not** start with screenshots. Prefer intent tools when you already know the labels or the flow:\n\n1. Multi-field forms: `browser_act([{do:\"fill_form\", fields:{Email: \"...\", ...}, submit:true}])`. Resolves labels via `label[for]`, aria-label, aria-labelledby, placeholder, name, id, then nearest preceding row text. Checkboxes take `\"true\"`\u002F`\"false\"`. Unresolved labels are listed (`how` says which strategy matched) and are not an error unless every field failed.\n2. Known button\u002Flink text: `browser_click_text(\"Continue\", role=\"button\")`. On a miss, `did_you_mean` lists near-misses — do not immediately `get_elements`.\n3. Multi-step (login, pagination): `browser_act([{do:\"click\", index:n}, {do:\"input\", index:n, text:\"...\"}, ...])` — up to 25 steps; one observation at the end. Allowed `do`: click, input, select, press, click_text, wait_for, wait_idle, goto, scroll, settle, tab, open_tab, fill_form, login. On failure, resume from `failed_step` using the returned observation.\n4. Structured scraping: `browser_extract(selector, {title:\"h2\", href:\"a@href\"})` instead of `browser_js`.\n\nOtherwise use the indexed element tree:\n\n1. `browser_get_elements()` — returns interactive elements as an indexed text tree, e.g. `[35]\u003Cbutton>Submit\u003C\u002Fbutton>`. Viewport-only by default (footer says how many are below; pass `viewport_only=false` or scroll). Filter with `kind=` (`inputs`\u002F`buttons`\u002F`links`) or `contains=`.\n2. Act with `browser_click_by_index(index)`, `browser_input_by_index(index, text)`, or `browser_select_by_index(index, option_text)`. Each action settles and returns `observation` (a `diff` by default). Read that — do not call `get_elements` again unless you need a different filter or the whole tree. Pass `observe=\"none\"` to skip the snapshot, `observe=\"full\"` for the viewport tree. `browser_goto` returns a full observation by default.\n3. Indices remain valid until navigation. Re-call `browser_get_elements()` after navigation only if the action observation is not enough. Use `browser_get_text` to read page copy instead of `browser_js(\"document.body.innerText\")`.\n\n`browser_input_by_index` fills in-page by default. If a field ignores the typed value (search-as-you-type, autocomplete comboboxes, or sites that only listen to `keydown`), pass `mode=\"keys\"`.\n\nThis is the default workflow: no image tokens, no pixel guessing, and clicks resolve through the live DOM.\n\n## Before acting on a site\n\n1. Call `browser_list_playbooks` with the host or URL. If `flows` are listed, call `browser_run_playbook(host, name, params)` instead of re-planning.\n2. If there are notes but no flows, call `browser_read_playbook` and follow them.\n3. Use `browser_get_elements` to see what you can click\u002Ftype — not a screenshot.\n4. After a playbook `failed_step`, continue by hand from the returned observation. Then `browser_write_playbook(..., append=true)` with a corrected `playbook` YAML fence. Secrets are never flow params — use `{do: login, expected_origin: ...}` which maps to `browser_login`.\n\n## Fallback: screenshots + coordinates (last resort)\n\nIf `browser_get_elements` returns an error, retry once (or with `viewport_only: false`) before giving up — do **not** immediately screenshot. Use `browser_screenshot` **only** when the indexed tree truly cannot help: canvas apps, heavy shadow-DOM UIs, drag-and-drop, or visually confirming layout\u002Frendering.\n\n`browser_screenshot` saves JPEGs under **`.\u002Fbrowser\u002FScreenshots\u002F`** (`max_dim=1200`, quality 60; pass `format=\"png\"` if you need PNG). The tool response includes:\n\n- `path` — workspace-relative path (e.g. `.\u002Fbrowser\u002FScreenshots\u002Fshot-….jpg`)\n- `bytes` \u002F `format` — file size and `jpeg` or `png`\n- `screenshots_dir` — always `.\u002Fbrowser\u002FScreenshots`\n- `viewport` — width\u002Fheight for coordinate clicks\n- `annotated` \u002F `labeled` — present when `annotate=True`\n\nOn vision models, after a fallback screenshot call **`load_file`** with the returned `path`. Prefer `annotate=True` then `browser_click_by_index`; use `browser_click(x, y)` only when there is no useful index. Do not screenshot after every ordinary click when indexed tools work.\n\nText-only models should never rely on screenshots for page understanding — use `browser_get_elements`, `browser_extract`, or `browser_js(...)`.\n\n## Workflow\n\n- First navigation: `browser_goto(url)` — response includes a full observation plus matching playbook filenames and executable `flows` when present.\n- After navigation: `browser_wait_for` or `browser_wait_idle` only if the observation is not enough.\n- Clicking \u002F typing (default): `browser_click_text` \u002F `browser_act` (including `do: fill_form`) when you know the labels or the flow; otherwise `browser_get_elements` once → `browser_click_by_index` \u002F `browser_input_by_index` \u002F `browser_select_by_index`. Read `observation` on each action. Indices stay valid until navigation.\n- Reading: `browser_get_text` for body copy; `browser_extract` for structured rows; action `observation` (diff) after in-page mutations. Call `browser_get_elements` again only for a different filter or the whole tree.\n- Clicking (fallback only): `browser_screenshot(annotate=True)` → `load_file(path)` → `browser_click_by_index`. Use `browser_click(x, y)` only when there is no useful index.\n- Ad hoc DOM extraction: `browser_extract` for repeating cards\u002Frows; `browser_js(expression)` only when you need custom page text or attributes.\n- Login walls: if the user asked to sign in on the Spaces in-app browser, call `browser_login(expected_origin=\"https:\u002F\u002Fthe-site.com\")` (optionally with `username`). It uses a saved password and returns `{ok, loggedIn, origin}` only — never read or type the password yourself. Always pass `expected_origin`: the login targets the tab the user has focused, which is not necessarily the tab your other `browser_*` calls address, so this is what stops a login landing on the wrong site. Check the returned `origin` before reporting success. If it returns `this password is not allowed for agent use` or `focused tab is on a different origin`, stop and ask the user. Still stop for MFA, consent, or a password the user must type themselves.\n\n## Tabs\n\nTabs have short aliases (`t1`, `t2`, …) or a name you pass to `browser_open_tab(alias=...)`. **Reads never move focus** (`browser_get_elements(tab=...)`, `browser_page_info`, `browser_js`, `browser_wait_for`, `browser_read_tabs`, `browser_extract`). **Actions do** (click, input, select, fill, fill_form, click_text, act, screenshot, …) because headed Chrome throttles timers and pauses painting in background tabs.\n\nOpen a second tab to compare pages, keep a form while reading docs, or fan out with `browser_read_tabs`. At most 10 agent-controlled tabs (`BROWSER_MCP_MAX_TABS`). If you hit the cap, relay the returned list (aliases, titles, last-used) to the user, ask which to close, then `browser_close_tab` and retry — never close a tab without their confirmation. If the error scope is `app`, the Spaces window is full across chats; do not describe that as this chat's 10-tab cap. Close tabs you opened when done. Do not expect a background SPA to finish loading while unfocused. `browser_login` still targets the tab the **user** has focused, not `tab=`.\n\n## After learning something non-obvious\n\nWhen you finish a task on a host without a playbook—or discover selectors, waits, auth quirks, or flows worth reusing—call `browser_write_playbook(host, content)`.\n\n- Prefer a `playbook` YAML fence (name, params, steps, optional expect) so the next visit can `browser_run_playbook`.\n- Keep notes terse: what worked, exact selectors, edge cases.\n- If a playbook already exists, pass `append: true` to add a section instead of overwriting. Broken fences are rejected and not written.\n- Do not hand-author huge docs; write a `playbook` fence from what actually worked in the browser.\n\n## Cleanup\n\n- Call `browser_stop` when browsing is done, especially after cloud\u002Fremote browser sessions.\n- Screenshots accumulate under `.\u002Fbrowser\u002FScreenshots\u002F`; delete old captures when no longer needed.\n\n## Setup (operators)\n\nThe `browser` MCP server must already be catalogued by the operator. Do not read MCP config files to discover it — call `enable_mcp(\"browser\")`. Full install, production deployment (local dev, self-hosted headless, Browser Use Cloud), env vars, and troubleshooting: **`docs\u002Fbrowser-mcp.md`** in the monkeybot repo (also linked from `docs\u002Fmcp.md`).\n",{"name":5,"description":7},"develop","3f4ce06b117cf078c4edf4cd8041134d301404ac","examples\u002Fskills\u002Fbrowser",2,"https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine","2026-11-12 05:23:37",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add human-plus-machine\u002Fmonkeybot --skill browser",{"tool":47,"command":48},"bunx","bunx skills add human-plus-machine\u002Fmonkeybot --skill browser",{"tool":50,"command":51},"pnpm","pnpm dlx skills add human-plus-machine\u002Fmonkeybot --skill browser","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fexamples\u002Fskills\u002Fbrowser\u002FSKILL.md",true,[55],{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"playbooks\u002F.gitkeep","OTHER","其他",0,"https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fexamples\u002Fskills\u002Fbrowser\u002Fplaybooks\u002F.gitkeep",[62,79,85,98,105,131],{"skillNo":63,"name":5,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":72,"publishedAt":29},"01M71R6545453TAC4Y71JM2362","Smoke-test browser skill fixture.","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fregression\u002Ft4\u002Fagent\u002Fskills\u002Fbrowser\u002FSKILL.md",[67],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,73,74,75,76,77,78],"skill fixture","fixture","test","test browser","smoke","Browser Skill",{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":29},"01M71R63F3CPF727VZAXTPWJNW","plain","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fregression\u002Ffixtures\u002Fskills\u002Fplain\u002FSKILL.md",[],[81],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":29},"01M71R60VVZE567ZPHWTFHM58S","diagnostics","Inspect a failing run and report the first error.","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fregression\u002Ffixtures\u002Fskills\u002Fdiagnostics\u002FSKILL.md",[],[87,92,93,94,95,96,97],"error","first","run","inspect","report","failing",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":29},"01M71R5Z5JTN6H8NSDE755H9TB","nested","Nested skills must not be discovered.","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fregression\u002Ffixtures\u002Fskills\u002Fa\u002Fnested\u002FSKILL.md",[],[100],{"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":114,"publishedAt":29},"01M71R5XACZGNRRQ7DH1CA170Y","image-generator","Generate images with Gemini image models (Nano Banana Pro) and display them in chat.","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fexamples\u002Fskills\u002Fimage-generator\u002FSKILL.md",[111],{"categoryNo":112,"categoryName":113,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000016","图像与多媒体",[115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130],"image","generator","image generator","pro","banana","nano banana","images","models","gemini","nano banana pro","nano","display","chat","with","gemini image","generate",{"skillNo":132,"name":87,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":29},"01M71R5VJ9QHZT480VSWGP6B37","Run deployment health checks (env, runtime, computation) and return JSON status.","https:\u002F\u002Fgithub.com\u002Fhuman-plus-machine\u002Fmonkeybot\u002Fblob\u002Fdevelop\u002Fexamples\u002Fskills\u002Fdiagnostics\u002FSKILL.md",[],[87,137,138,94,139,140,141,142,143],"health","runtime","computation","json","deployment","status","env"]