[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C2M3XAREA6D2DP906R5WY7":3,"skill-same:01M6C2M3XAREA6D2DP906R5WY7":93},{"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":54,"linkOnly":55,"markdownContent":56,"markdownBody":57,"frontMatter":58,"refName":69,"commitSha":70,"skillDirectory":71,"forksCount":72,"repositoryHtmlUrl":73,"repositoryHomepageUrl":74,"ownerHtmlUrl":75,"ownerBlogUrl":76,"ownerDescription":77,"updatedAt":78,"install":79,"resources":92},"01M6C2M3XAREA6D2DP906R5WY7","browser-doctor",null,"Read-only health check on browser-control setup. Verifies browser binary, Playwright MCP Bridge extension presence, token file mode\u002Fcontents, AIWG MCP registration, provider config injection, and optional workspace allow-list. Outputs pass\u002Ffail per check with remediation commands.","jmagly\u002Faiwg","jmagly","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1159087?v=4","01M6C10AK8N2WCSQN11FYGTJWN","Joseph Magly","01M6C10AQ8A2RMED1Y1BSVY7NF",229,"MIT","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fbrowser-control\u002Fskills\u002Fbrowser-doctor\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,47,48,49,50,51,52,53],"doctor","browser","browser doctor","list","browser mcp","mode","playwright mcp","presence","token","commands","registration","up","health check","only","browser control","bridge","MCP","read","check","health","verify","injection","remediation","file","diagnose","config","playwright","2026-11-10 10:12:30",false,"---\nnamespace: aiwg\nname: browser-doctor\ndescription: Read-only health check on browser-control setup. Verifies browser binary, Playwright MCP Bridge extension presence, token file mode\u002Fcontents, AIWG MCP registration, provider config injection, and optional workspace allow-list. Outputs pass\u002Ffail per check with remediation commands.\nversion: 0.1.0-draft\nstatus: draft\nplatforms: [all]\ntriggers:\n  - \"check browser control\"\n  - \"browser doctor\"\n  - \"verify playwright setup\"\n  - \"diagnose browser mcp\"\n  - \"is playwright wired up\"\n---\n\n# Browser Doctor Skill (DRAFT)\n\n> Status: DRAFT — scaffolded from PoC. Implementation pending Inception outputs.\n\n## Purpose\n\nDiagnostic, read-only health check. Tells the user what's wired correctly and what needs `browser-setup` or `browser-reset` to fix.\n\n## When This Skill Applies\n\n- After `browser-setup` to verify the wizard's work\n- Before debugging \"why isn't the agent driving my browser?\"\n- In CI \u002F smoke tests to detect drift (extension uninstalled, token rotated, provider config rewritten)\n\n## Checks (planned)\n\n| # | Check | Pass criteria | On fail |\n|---|---|---|---|\n| 1 | Browser binary present | Configured browser path exists and is executable | `aiwg run skill browser-setup` to re-detect |\n| 2 | Browser version | `\u003Cbinary> --version` returns a known-good version | Update browser or document version mismatch |\n| 3 | Extension installed | `\u003Cprofile>\u002FExtensions\u002Fmmlmfjhmonkocbjadbfplnigmagldckm\u002F` exists | Install from Web Store; rerun setup |\n| 4 | Token file present | `~\u002F.config\u002Fplaywright-mcp\u002Ftoken` exists | `aiwg run skill browser-reset` |\n| 5 | Token file mode | mode 600, owner-only | `chmod 600 ~\u002F.config\u002Fplaywright-mcp\u002Ftoken` |\n| 6 | Token file non-empty | size > 16 bytes | Re-capture token via reset |\n| 7 | AIWG MCP registered | `aiwg mcp list` includes `playwright` | `browser-setup` |\n| 8 | MCP args correct | Args include `--extension` | Re-register with correct args |\n| 9 | MCP env block | `PLAYWRIGHT_MCP_EXTENSION_TOKEN` in env | Re-register with env block |\n| 10 | Provider injected | Active provider config contains `playwright` in `mcpServers` | `aiwg mcp inject --provider \u003Cp> --servers playwright` |\n| 11 | Provider env passthrough | Provider config's playwright entry preserves env | Re-inject |\n| 12 | Probe connect | Spawn MCP, list tools, find `browser_tabs` | See diagnostics; likely token mismatch |\n| 13 | Allow-list present (optional) | `.aiwg\u002Fbrowser-allowlist.yaml` exists | `cp templates\u002Fbrowser-allowlist.yaml.tmpl .aiwg\u002Fbrowser-allowlist.yaml` |\n| 14 | Conflicting overrides | No `--mcp-config` wrapper detected for the active provider | Document precedence; remove wrapper or add playwright to it |\n\n## Output\n\nStructured JSON suitable for both human display and CI consumption:\n\n```json\n{\n  \"summary\": { \"passed\": 13, \"failed\": 1, \"skipped\": 0 },\n  \"checks\": [\n    {\n      \"id\": 1,\n      \"name\": \"Browser binary present\",\n      \"status\": \"pass\",\n      \"detail\": \"\u002Fusr\u002Fbin\u002Fgoogle-chrome (148.0.7778.167)\"\n    },\n    {\n      \"id\": 13,\n      \"name\": \"Allow-list present (optional)\",\n      \"status\": \"warn\",\n      \"detail\": \".aiwg\u002Fbrowser-allowlist.yaml not found\",\n      \"remediation\": \"cp $AIWG_ROOT\u002F${CLAUDE_PLUGIN_ROOT}\u002Ftemplates\u002Fbrowser-allowlist.yaml.tmpl .aiwg\u002Fbrowser-allowlist.yaml\"\n    }\n  ]\n}\n```\n\nPlain-text rendering for interactive use:\n\n```\nBrowser Control — Health Check\n==============================\n\n[PASS] 1\u002F14  Browser binary present       \u002Fusr\u002Fbin\u002Fgoogle-chrome (148.0.7778.167)\n[PASS] 2\u002F14  Browser version              recent enough\n[PASS] 3\u002F14  Extension installed          mmlmfjhmonkocbjadbfplnigmagldckm\n[PASS] 4\u002F14  Token file present           ~\u002F.config\u002Fplaywright-mcp\u002Ftoken\n…\n[WARN] 13\u002F14 Allow-list (optional)        not scaffolded; consider adding\n\n13 PASS, 1 WARN, 0 FAIL\n```\n\n## Constraints\n\n- Read-only — never writes, never modifies registry or configs\n- Never echoes token value (only checks existence + mode + length)\n- Probe check spawns + kills within a few seconds; no persistent side effects\n\n## Open implementation questions\n\n1. Should \"probe connect\" be opt-in (`--probe`) since it spawns a process?\n2. Should we cache last-known-good versions per browser to detect downgrades?\n3. How aggressively to flag #14 (conflicting overrides)? In some workspaces (e.g., this one with `claude-role`), the override is intentional.\n\n## References\n\n- `.aiwg\u002Farchitecture\u002Fadr-remote-browser-control.md`\n- `skills\u002Fbrowser-setup\u002FSKILL.md` (this addon)\n- `skills\u002Fbrowser-reset\u002FSKILL.md` (this addon)\n","# Browser Doctor Skill (DRAFT)\n\n> Status: DRAFT — scaffolded from PoC. Implementation pending Inception outputs.\n\n## Purpose\n\nDiagnostic, read-only health check. Tells the user what's wired correctly and what needs `browser-setup` or `browser-reset` to fix.\n\n## When This Skill Applies\n\n- After `browser-setup` to verify the wizard's work\n- Before debugging \"why isn't the agent driving my browser?\"\n- In CI \u002F smoke tests to detect drift (extension uninstalled, token rotated, provider config rewritten)\n\n## Checks (planned)\n\n| # | Check | Pass criteria | On fail |\n|---|---|---|---|\n| 1 | Browser binary present | Configured browser path exists and is executable | `aiwg run skill browser-setup` to re-detect |\n| 2 | Browser version | `\u003Cbinary> --version` returns a known-good version | Update browser or document version mismatch |\n| 3 | Extension installed | `\u003Cprofile>\u002FExtensions\u002Fmmlmfjhmonkocbjadbfplnigmagldckm\u002F` exists | Install from Web Store; rerun setup |\n| 4 | Token file present | `~\u002F.config\u002Fplaywright-mcp\u002Ftoken` exists | `aiwg run skill browser-reset` |\n| 5 | Token file mode | mode 600, owner-only | `chmod 600 ~\u002F.config\u002Fplaywright-mcp\u002Ftoken` |\n| 6 | Token file non-empty | size > 16 bytes | Re-capture token via reset |\n| 7 | AIWG MCP registered | `aiwg mcp list` includes `playwright` | `browser-setup` |\n| 8 | MCP args correct | Args include `--extension` | Re-register with correct args |\n| 9 | MCP env block | `PLAYWRIGHT_MCP_EXTENSION_TOKEN` in env | Re-register with env block |\n| 10 | Provider injected | Active provider config contains `playwright` in `mcpServers` | `aiwg mcp inject --provider \u003Cp> --servers playwright` |\n| 11 | Provider env passthrough | Provider config's playwright entry preserves env | Re-inject |\n| 12 | Probe connect | Spawn MCP, list tools, find `browser_tabs` | See diagnostics; likely token mismatch |\n| 13 | Allow-list present (optional) | `.aiwg\u002Fbrowser-allowlist.yaml` exists | `cp templates\u002Fbrowser-allowlist.yaml.tmpl .aiwg\u002Fbrowser-allowlist.yaml` |\n| 14 | Conflicting overrides | No `--mcp-config` wrapper detected for the active provider | Document precedence; remove wrapper or add playwright to it |\n\n## Output\n\nStructured JSON suitable for both human display and CI consumption:\n\n```json\n{\n  \"summary\": { \"passed\": 13, \"failed\": 1, \"skipped\": 0 },\n  \"checks\": [\n    {\n      \"id\": 1,\n      \"name\": \"Browser binary present\",\n      \"status\": \"pass\",\n      \"detail\": \"\u002Fusr\u002Fbin\u002Fgoogle-chrome (148.0.7778.167)\"\n    },\n    {\n      \"id\": 13,\n      \"name\": \"Allow-list present (optional)\",\n      \"status\": \"warn\",\n      \"detail\": \".aiwg\u002Fbrowser-allowlist.yaml not found\",\n      \"remediation\": \"cp $AIWG_ROOT\u002F${CLAUDE_PLUGIN_ROOT}\u002Ftemplates\u002Fbrowser-allowlist.yaml.tmpl .aiwg\u002Fbrowser-allowlist.yaml\"\n    }\n  ]\n}\n```\n\nPlain-text rendering for interactive use:\n\n```\nBrowser Control — Health Check\n==============================\n\n[PASS] 1\u002F14  Browser binary present       \u002Fusr\u002Fbin\u002Fgoogle-chrome (148.0.7778.167)\n[PASS] 2\u002F14  Browser version              recent enough\n[PASS] 3\u002F14  Extension installed          mmlmfjhmonkocbjadbfplnigmagldckm\n[PASS] 4\u002F14  Token file present           ~\u002F.config\u002Fplaywright-mcp\u002Ftoken\n…\n[WARN] 13\u002F14 Allow-list (optional)        not scaffolded; consider adding\n\n13 PASS, 1 WARN, 0 FAIL\n```\n\n## Constraints\n\n- Read-only — never writes, never modifies registry or configs\n- Never echoes token value (only checks existence + mode + length)\n- Probe check spawns + kills within a few seconds; no persistent side effects\n\n## Open implementation questions\n\n1. Should \"probe connect\" be opt-in (`--probe`) since it spawns a process?\n2. Should we cache last-known-good versions per browser to detect downgrades?\n3. How aggressively to flag #14 (conflicting overrides)? In some workspaces (e.g., this one with `claude-role`), the override is intentional.\n\n## References\n\n- `.aiwg\u002Farchitecture\u002Fadr-remote-browser-control.md`\n- `skills\u002Fbrowser-setup\u002FSKILL.md` (this addon)\n- `skills\u002Fbrowser-reset\u002FSKILL.md` (this addon)\n",{"name":5,"status":59,"version":60,"triggers":61,"namespace":66,"platforms":67,"description":7},"draft","0.1.0-draft",[62,29,63,64,65],"check browser control","verify playwright setup","diagnose browser mcp","is playwright wired up","aiwg",[68],"all","main","6754967c344ccb087a8de06972f55a41067b291b","agentic\u002Fcode\u002Fplugins\u002Fbrowser-control\u002Fskills\u002Fbrowser-doctor",36,"https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg","https:\u002F\u002Faiwg.io","https:\u002F\u002Fgithub.com\u002Fjmagly","https:\u002F\u002Fintegrolabs.io","ml\u002Fai, industrial automation, safety\u002Fsecurity, ssi\r\n\r\nmagly.net\r\nintegrolabs.io\r\naiwg.io\r\nfortemi.com\r\npagenary.com\r\nbytecask.com","2026-11-12 00:33:10",{"source":8,"skillName":5,"commands":80,"prompt":90,"zipAvailable":91},[81,84,87],{"tool":82,"command":83},"npx","npx skills add jmagly\u002Faiwg --skill browser-doctor",{"tool":85,"command":86},"bunx","bunx skills add jmagly\u002Faiwg --skill browser-doctor",{"tool":88,"command":89},"pnpm","pnpm dlx skills add jmagly\u002Faiwg --skill browser-doctor","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fbrowser-control\u002Fskills\u002Fbrowser-doctor\u002FSKILL.md",true,[],[94,119,143,149,156,170],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":101,"publishedAt":54},"01M70QA0BSYJ49EES9V4RE8QH1","host-hardening","Read-only system hardening baseline and plan-first host hardening recommendations for SSH, Docker bind addresses, firewall persistence, datastores, exporters and audit retention.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[100],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[102,103,104,44,105,106,49,107,108,109,110,111,40,112,113,114,115,116,117,118],"host","host hardening","hardening","re","recommendations","plan","port","verification","Bash","access","retention","audit","never","firewall","bind","secrets","request",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":129,"publishedAt":54},"01M70PNT2Z4HMZPRBTAF6073NN","exposure-analysis","Read-only firewall analysis and effective host exposure reconstruction for Docker published ports, UFW bypass, stale rules, CDN scope, IPv6 asymmetry and external probe allowlists.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fforensics\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[125,128],{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[130,131,132,44,133,108,134,135,110,136,102,137,40,138,139,114,115,140,141,142],"exposure analysis","analysis","unknown","credentials","collection","ufw","ports","internet","local","scope","reconstruction","operator","write",{"skillNo":144,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":148,"publishedAt":54},"01M70P8QATMPKA78E4FT5D2TNA","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[147],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[104,102,103,111,44,118,49,106,113,107,108,109,110,117,40,112,105,114,115,116],{"skillNo":150,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":155,"publishedAt":54},"01M70NMPVJ5H0JH131P60FW4R8","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fforensics-complete\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[153,154],{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[131,130,114,133,108,134,110,132,102,137,40,138,139,44,115,136,135,140,141,142],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":54},"01M6CB4DDR0B4NNCFK7ZK7449H","fixture-skill","Exercise rule delivery.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frule-delivery\u002Fskills\u002Ffixture-skill\u002FSKILL.md",[162],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[164,165,166,167,168,169],"fixture skill","fixture","rule","delivery","true","exercise",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":177,"publishedAt":54},"01M6CB4AVK1W76MFMPP0JP32CJ","pi-local","Pi-local duplicate-precedence fixture.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fproviders\u002Fpi\u002Fproject\u002F.pi\u002Fskills\u002Fpi-local\u002FSKILL.md",[176],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[178,179,138,180,165],"pi","pi local","duplicate"]