[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698QTJCJSGPD9EVAGSGSSRP":3,"skill-same:01M698QTJCJSGPD9EVAGSGSSRP":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":43,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M698QTJCJSGPD9EVAGSGSSRP","openclaw-docker-e2e-authoring",null,"Author OpenClaw Docker E2E and live provider Docker lanes.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394302,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fopenclaw-docker-e2e-authoring\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",[9,26,27,28,29,30,31,32],"openclaw docker e2e authoring","docker","e2e","authoring","provider","live","author","2026-11-10 10:12:30",false,"---\nname: openclaw-docker-e2e-authoring\ndescription: \"Author OpenClaw Docker E2E and live provider Docker lanes.\"\n---\n\n# OpenClaw Docker E2E Authoring\n\nUse this when adding or changing Docker E2E lanes, release-path Docker tests,\nor live-provider Docker proof.\n\n## Lane Choice\n\n- Deterministic Docker: fake the dependency\u002Fserver and assert the exact runtime\n  contract crossing the boundary.\n- Live Docker: use real provider credentials\u002Fmodel only when user-visible\n  behavior needs the real service.\n- Prefer both when they prove different risks: deterministic for byte\u002Fpayload\n  routing, live for actual provider behavior.\n\n## Authoring Rules\n\n- Test-only helpers live in `test\u002Fhelpers` or `scripts\u002Fe2e\u002Flib\u002F\u003Clane>\u002F`, not\n  `src\u002F**`, unless production imports them.\n- Package-installed app runs from `\u002Fapp`; mount only explicit harness\u002Fhelper\n  paths read-only.\n- Fake servers should log boundary requests as JSONL and clients should assert\n  the real dependency payload, not just process success.\n- Add the package script and `scripts\u002Flib\u002Fdocker-e2e-scenarios.mjs` lane in the\n  same change.\n- If a lane installs a plugin from npm, default the spec via env so published\n  and local override paths are both testable.\n\n## Media And Vision\n\n- Expected answer must exist only in pixels or provider output being tested.\n- Use neutral filenames, neutral prompts, and no metadata leaks.\n- Random bitmap\u002FOCR tokens reuse the repo OCR-safe alphabet `24567ACEF` unless\n  the test owns a stronger glyph set.\n- Make the expected answer unique per run when proving real image\n  understanding.\n\n## `chat.send` E2E\n\n- Require `chat.send` to return `status: \"started\"` and a string `runId`.\n- Wait for completion with `agent.wait`.\n- Assert final user-visible text via `chat.history` when event ordering is not\n  the behavior under test.\n- Keep originating channel\u002Faccount metadata only when the bug path needs queued\n  inbound\u002Fchannel context.\n\n## Verification\n\nRun the smallest proof that covers the touched lane:\n\n```bash\npnpm exec oxfmt --write \u003Cchanged files>\nnode --check \u003Cnew .mjs files>\nbash -n \u003Cnew .sh files>\nnode scripts\u002Frun-vitest.mjs test\u002Fscripts\u002Fdocker-e2e-plan.test.ts\nOPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:\u003Clane>\n```\n\nFor real-provider lanes, run the matching live Docker script after deterministic\nDocker is green. Finish with `$autoreview` before commit\u002FPR.\n","# OpenClaw Docker E2E Authoring\n\nUse this when adding or changing Docker E2E lanes, release-path Docker tests,\nor live-provider Docker proof.\n\n## Lane Choice\n\n- Deterministic Docker: fake the dependency\u002Fserver and assert the exact runtime\n  contract crossing the boundary.\n- Live Docker: use real provider credentials\u002Fmodel only when user-visible\n  behavior needs the real service.\n- Prefer both when they prove different risks: deterministic for byte\u002Fpayload\n  routing, live for actual provider behavior.\n\n## Authoring Rules\n\n- Test-only helpers live in `test\u002Fhelpers` or `scripts\u002Fe2e\u002Flib\u002F\u003Clane>\u002F`, not\n  `src\u002F**`, unless production imports them.\n- Package-installed app runs from `\u002Fapp`; mount only explicit harness\u002Fhelper\n  paths read-only.\n- Fake servers should log boundary requests as JSONL and clients should assert\n  the real dependency payload, not just process success.\n- Add the package script and `scripts\u002Flib\u002Fdocker-e2e-scenarios.mjs` lane in the\n  same change.\n- If a lane installs a plugin from npm, default the spec via env so published\n  and local override paths are both testable.\n\n## Media And Vision\n\n- Expected answer must exist only in pixels or provider output being tested.\n- Use neutral filenames, neutral prompts, and no metadata leaks.\n- Random bitmap\u002FOCR tokens reuse the repo OCR-safe alphabet `24567ACEF` unless\n  the test owns a stronger glyph set.\n- Make the expected answer unique per run when proving real image\n  understanding.\n\n## `chat.send` E2E\n\n- Require `chat.send` to return `status: \"started\"` and a string `runId`.\n- Wait for completion with `agent.wait`.\n- Assert final user-visible text via `chat.history` when event ordering is not\n  the behavior under test.\n- Keep originating channel\u002Faccount metadata only when the bug path needs queued\n  inbound\u002Fchannel context.\n\n## Verification\n\nRun the smallest proof that covers the touched lane:\n\n```bash\npnpm exec oxfmt --write \u003Cchanged files>\nnode --check \u003Cnew .mjs files>\nbash -n \u003Cnew .sh files>\nnode scripts\u002Frun-vitest.mjs test\u002Fscripts\u002Fdocker-e2e-plan.test.ts\nOPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:\u003Clane>\n```\n\nFor real-provider lanes, run the matching live Docker script after deterministic\nDocker is green. Finish with `$autoreview` before commit\u002FPR.\n",{"name":5,"description":7},"main","f1c93577085244aa96aa87b53a2df9b59d293bd7",".agents\u002Fskills\u002Fopenclaw-docker-e2e-authoring",82862,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-11 08:46:30",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add openclaw\u002Fopenclaw --skill openclaw-docker-e2e-authoring",{"tool":53,"command":54},"bunx","bunx skills add openclaw\u002Fopenclaw --skill openclaw-docker-e2e-authoring",{"tool":56,"command":57},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill openclaw-docker-e2e-authoring","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fopenclaw-docker-e2e-authoring\u002FSKILL.md",true,[],[62,68,91,109,130,152],{"skillNo":63,"name":64,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":33},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[64],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":33},"01M698YY8QGQ7S8TJNKJG6VTPH","xurl","xurl CLI for authenticated X posts, replies, reads\u002Fsearch, DMs, media upload, followers, auth status, or raw v2 API calls.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[],[70,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],"for","api","calls","replies","posts","upload","tap","install","brew","node","Media","search","npm","status","auth","cli",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":33},"01M698YWT1CJ0WK88WB909R9RT","weather","Current weather and forecasts with web_fetch, falling back to wttr.in curl for locations, rain, temperature, travel planning.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[93,98,99,82,100,83,101,102,103,104,105,106,75,107,108],"travel planning","travel","fetch","curl","https","help","planning","web","back","temperature","with",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":120,"publishedAt":33},"01M698YV2Q0R0JJKAWGFS21K0N","visualize","Create inline visuals for code and explanations, or author persistent OpenClaw dashboard widgets with show_widget.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fvisualize\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[111,121,122,32,123,75,108,124,125,126,127,128,9,129],"widgets","openclaw dashboard","inline","show","code","create","visuals","dashboard","widget",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":142,"publishedAt":33},"01M698YS2TRJH9ENG28HD9CD87","trello","Manage Trello boards, lists, and cards via the Trello REST API.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftrello\u002FSKILL.md",[136,139],{"categoryNo":137,"categoryName":138,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":140,"categoryName":141,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000030","开发工程师",[132,102,143,144,145,146,147,148,82,83,149,101,76,150,151],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":33},"01M698YQ9Q3M4W78EWV2KSCSVW","tmux","Control tmux sessions\u002Fpanes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftmux\u002FSKILL.md",[],[154,82,159,160,75,161,162,163,164,165,166,167,83,168,169,170,171,172,173],"send","darwin","keys","paste","output","control","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]