@unotest/web 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- const _0x240e79=_0x25e6;(function(_0x1021cd,_0x23d64a){const _0x4d546c={_0x14c545:0x1e9,_0x2063da:0x1d1,_0x1fee5d:0x1f2,_0x3c9a7c:0x1d2,_0x1da06a:0x1e8,_0x19d116:0x1f3},_0x11231d=_0x25e6,_0x5969af=_0x1021cd();while(!![]){try{const _0x445241=-parseInt(_0x11231d(_0x4d546c._0x14c545))/0x1+-parseInt(_0x11231d(0x1e2))/0x2*(-parseInt(_0x11231d(0x1d0))/0x3)+parseInt(_0x11231d(_0x4d546c._0x2063da))/0x4*(parseInt(_0x11231d(_0x4d546c._0x1fee5d))/0x5)+parseInt(_0x11231d(_0x4d546c._0x3c9a7c))/0x6*(parseInt(_0x11231d(_0x4d546c._0x1da06a))/0x7)+-parseInt(_0x11231d(0x1e3))/0x8*(parseInt(_0x11231d(0x1dc))/0x9)+parseInt(_0x11231d(0x1ee))/0xa+-parseInt(_0x11231d(_0x4d546c._0x19d116))/0xb;if(_0x445241===_0x23d64a)break;else _0x5969af['push'](_0x5969af['shift']());}catch(_0x2ac0a9){_0x5969af['push'](_0x5969af['shift']());}}}(_0x41b5,0xe6e42));var __defProp=Object['defineProperty'],__name=(_0x2fb7db,_0x22975e)=>__defProp(_0x2fb7db,_0x240e79(0x1d6),{'value':_0x22975e,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'jsconfigJson':_0x240e79(0x1e6),'scenarioTemplate':_0x240e79(0x1ea),'agentsMd':'#\x20@unotest/web\x20—\x20guide\x20for\x20AI\x20agents\x20(and\x20humans)\x0a\x0aThis\x20project\x20uses\x20[`@unotest/web`](https://www.npmjs.com/package/@unotest/web)\x0afor\x20end-to-end\x20testing\x20of\x20web\x20applications.\x0a\x0a##\x20Writing\x20a\x20test\x20—\x20use\x20the\x20skill\x20+\x20MCP\x0a\x0aFor\x20ANY\x20request\x20to\x20write,\x20record,\x20or\x20run\x20an\x20e2e\x20test:\x0a\x0a1.\x20Open\x20the\x20**`write-e2e-test`**\x20skill\x20—\x20`.claude/skills/write-e2e-test/SKILL.md`\x0a\x20\x20\x20(in\x20Claude\x20Code\x20you\x20can\x20also\x20run\x20`/write-e2e-test`)\x20—\x20and\x20follow\x20it.\x0a2.\x20Drive\x20the\x20browser\x20through\x20the\x20**`unotest-web`\x20MCP\x20tools**:\x20`new_context`\x20→\x0a\x20\x20\x20`explore_start`\x20→\x20`explore_step`\x20→\x20`get_page_snapshot`\x20→\x20`run_test`.\x0a\x0aDo\x20NOT\x20hand-author\x20tests\x20blind\x20or\x20map\x20the\x20project\x20with\x20`find`/`ls`/`awk`\x20—\x20the\x0askill\x27s\x20Phase\x200\x20names\x20the\x20exact\x20files\x20to\x20read.\x20Runnable,\x20copy-pasteable\x0aexamples\x20live\x20in\x20`unotest/e2e/examples/`.\x0a\x0a##\x20Layout\x0a\x0a-\x20`unotest/e2e/<feature>/<name>.js`\x20—\x20test\x20scenarios,\x20grouped\x20by\x20feature/page\x0a\x20\x20(one\x20`test_*`\x20function\x20per\x20file).\x20**Required:**\x20every\x20scenario\x20lives\x20in\x20a\x0a\x20\x20feature\x20subfolder.\x20A\x20test\x20file\x20placed\x20directly\x20in\x20`unotest/e2e/`\x20is\x20rejected\x0a\x20\x20by\x20the\x20linter\x20(`lint:scenario-in-root`).\x0a-\x20`unotest/e2e/_helpers/`\x20—\x20project-specific\x20helpers\x20(visible\x20to\x20all\x20scenarios)\x0a-\x20`unotest/e2e/_template.js`\x20—\x20starting-point\x20template\x20(copy\x20into\x20a\x20feature\x20folder)\x0a\x0a##\x20DSL\x20conventions\x0a\x0aThe\x20DSL\x20is\x20a\x20strict\x20JS\x20subset\x20parsed\x20by\x20@unotest/dsl.\x20Method\x20chains,\x20options-\x0aobjects,\x20and\x20variables\x20are\x20allowed.\x20Multi-line\x20strings\x20use\x0abackticks\x20but\x20`${...}`\x20interpolation\x20is\x20forbidden\x20(sandbox\x20boundary\x20—\x0apass\x20values\x20via\x20positional\x20args).\x0a\x0a**Every\x20step\x20must\x20sit\x20inside\x20a\x20`step(\x22description\x22,\x20()\x20=>\x20{\x20…\x20})`\x20block\x20(linter\x0aenforces).**\x20The\x20title\x20is\x20plain-English\x20intent;\x20the\x20steps\x20inside\x20are\x20the\x0aimplementation.\x20When\x20a\x20step\x20later\x20breaks\x20(selector\x20drift),\x20you\x20read\x20the\x0atitle\x20to\x20understand\x20what\x20the\x20group\x20was\x20trying\x20to\x20do\x20and\x20repair\x20it.\x20Group\x20by\x0aintent,\x20one\x20block\x20per\x20logical\x20chunk:\x0a\x0a```js\x0afunction\x20test_login()\x20{\x0a\x20\x20step(\x22Sign\x20in\x20as\x20the\x20demo\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27https://app.example.com/login\x27);\x0a\x20\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20\x27demo@example.com\x27);\x0a\x20\x20\x20\x20click(getByRole(\x27button\x27,\x20{name:\x20\x27Log\x20in\x27}));\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Dashboard\x20shows\x20the\x20signed-in\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20assertText(getByRole(\x27heading\x27),\x20\x27Welcome\x27);\x0a\x20\x20});\x0a}\x0a```\x0a\x0a**Base\x20URL\x20—\x20write\x20relative\x20paths.**\x20`APP_BASE_URL`\x20(in\x20`unotest/.env`)\x20is\x20the\x0aapp\x27s\x20base;\x20`goto(\x27/login\x27)`\x20resolves\x20against\x20it.\x20Don\x27t\x20concatenate\x0a(`goto(APP_BASE_URL\x20+\x20\x27/login\x27)`)\x20—\x20just\x20pass\x20the\x20path:\x0a\x0a```js\x0agoto(\x27/login\x27);\x0afill(getByLabel(\x27Password\x27),\x20TEST_USER_PASSWORD);\x0a```\x0a\x0a**Environments.**\x20Override\x20`APP_BASE_URL`\x20(and\x20any\x20var)\x20per\x20environment\x20with\x0aoverlay\x20files\x20—\x20`unotest/.env.staging`,\x20`unotest/.env.production`\x20(secrets:\x0a`unotest/.secrets.<env>`).\x20Select\x20one\x20at\x20run\x20time:\x20`npx\x20@unotest/web\x20e2e\x20<name>\x0a--env\x20staging`.\x20The\x20overlay\x20layers\x20over\x20the\x20base\x20`.env`\x20(overlay\x20wins).\x0a\x0a**External\x20variables\x20&\x20secrets:**\x20reference\x20logins\x20/\x20tokens\x20by\x20a\x20bare\x0a`UPPER_SNAKE`\x20name\x20—\x20resolved\x20from\x20`unotest/.env`\x20(normal)\x20or\x20`unotest/.secrets`\x0a(secret,\x20masked\x20in\x20logs).\x20No\x20`env()`/`secret()`\x20wrapper.\x20A\x20lowercase\x20name\x20is\x20an\x0ain-scenario\x20binding;\x20an\x20unknown\x20`UPPER_SNAKE`\x20fails\x20the\x20run\x20asking\x20you\x20to\x20add\x20it\x0ato\x20`unotest/.env`.\x0a\x0a**Selector\x20hierarchy\x20(D-22\x20—\x20linter\x20enforces):**\x0a1.\x20`getByTestId(id)`\x20—\x20most\x20stable\x0a2.\x20`getByRole(role,\x20{name})`\x20—\x20semantic,\x20a11y-aware\x0a3.\x20`getByLabel(text)`\x20—\x20for\x20form\x20fields\x0a4.\x20`getByText(text)`\x20—\x20for\x20unique\x20text\x0a5.\x20`locator(css)`\x20—\x20last\x20resort\x20(linter\x20warns)\x0a\x0aFull\x20reference\x20shipped\x20with\x20the\x20package:\x0a-\x20`node_modules/@unotest/web/guides/dsl-reference.md`\x20—\x20DSL\x20functions\x20+\x20linter\x20codes\x0a\x0a##\x20Running\x20(CLI)\x0a\x0a-\x20`npx\x20@unotest/web\x20e2e\x20<feature>/<name>`\x20—\x20run\x20a\x20scenario\x20by\x20name\x0a-\x20`npx\x20@unotest/web\x20lint`\x20—\x20static\x20check\x20of\x20all\x20scenarios\x20+\x20helpers\x0a-\x20`npx\x20@unotest/web\x20mcp`\x20—\x20start\x20the\x20MCP\x20server\x20for\x20agent\x20control\x0a\x0a##\x20Via\x20MCP\x20(Claude\x20Code\x20/\x20Claude\x20Desktop\x20/\x20Cursor)\x0a\x0aThe\x20MCP\x20server\x20exposes:\x0a-\x20`run_test\x20name=\x22<name>\x22\x20mode=\x22step\x22\x20pauseOnFailure=true`\x20—\x20run\x20with\x20step-mode\x0a-\x20`step`\x20/\x20`resume`\x20—\x20advance\x20one\x20AST\x20node\x20/\x20run\x20until\x20next\x20pause\x0a-\x20`inspect_runtime`\x20—\x20current\x20state,\x20last\x20error,\x20locals\x20dump\x0a-\x20`abort_runtime`\x20—\x20kill\x20a\x20paused\x20runtime\x0a\x0aFor\x20agent-fix\x20workflows\x20on\x20flaky\x20tests:\x20`agent_fix\x20testId=\x22<id>\x22`\x20returns\x20a\x0astructured\x20context\x20bundle\x20(see\x20D-25\x20—\x20we\x20never\x20call\x20LLMs\x20or\x20auto-apply\x0adiffs,\x20the\x20diff\x20comes\x20from\x20your\x20MCP-host\x20agent).\x0a','claudeMdBody':_0x240e79(0x1d5),'examples':{'01-smoke.js':_0x240e79(0x1f5),'02-form-fill.js':_0x240e79(0x1cf)},'secretsExample':_0x240e79(0x1de),'envExample':_0x240e79(0x1f0)};function unotestConfigMjs(_0x55a1db){const _0x50dc45={_0x2a38c2:0x1d8,_0x11f930:0x1ed},_0x319753=_0x240e79,_0x39ce27=_0x55a1db===void 0x0?_0x319753(0x1df):_0x319753(0x1db)+JSON['stringify'](_0x55a1db)+',';return _0x319753(_0x50dc45._0x2a38c2)+_0x39ce27+_0x319753(_0x50dc45._0x11f930);}__name(unotestConfigMjs,_0x240e79(0x1da));function suitePackageJson(_0x1e7251){const _0x4c41e6=_0x240e79;return JSON['stringify']({'name':_0x4c41e6(0x1e1),'private':!![],'devDependencies':{'@unotest/web':'^'+_0x1e7251}},null,0x2)+'\x0a';}__name(suitePackageJson,_0x240e79(0x1e4));import{readFileSync}from'fs';import{dirname,resolve}from'path';function _0x25e6(_0x211068,_0x34759f){_0x211068=_0x211068-0x1cb;const _0x41b5de=_0x41b5();let _0x25e6be=_0x41b5de[_0x211068];if(_0x25e6['AMWHXl']===undefined){var _0x413613=function(_0x3f49cb){const _0x465543='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2fb7db='',_0x22975e='';for(let _0x55a1db=0x0,_0x39ce27,_0x1e7251,_0x3e186e=0x0;_0x1e7251=_0x3f49cb['charAt'](_0x3e186e++);~_0x1e7251&&(_0x39ce27=_0x55a1db%0x4?_0x39ce27*0x40+_0x1e7251:_0x1e7251,_0x55a1db++%0x4)?_0x2fb7db+=String['fromCharCode'](0xff&_0x39ce27>>(-0x2*_0x55a1db&0x6)):0x0){_0x1e7251=_0x465543['indexOf'](_0x1e7251);}for(let _0x41b919=0x0,_0x59e4cd=_0x2fb7db['length'];_0x41b919<_0x59e4cd;_0x41b919++){_0x22975e+='%'+('00'+_0x2fb7db['charCodeAt'](_0x41b919)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x22975e);};_0x25e6['zbEVVG']=_0x413613,_0x25e6['DLmGxS']={},_0x25e6['AMWHXl']=!![];}const _0x2cc505=_0x41b5de[0x0],_0x2e4a8b=_0x211068+_0x2cc505,_0x2b537b=_0x25e6['DLmGxS'][_0x2e4a8b];return!_0x2b537b?(_0x25e6be=_0x25e6['zbEVVG'](_0x25e6be),_0x25e6['DLmGxS'][_0x2e4a8b]=_0x25e6be):_0x25e6be=_0x2b537b,_0x25e6be;}import{fileURLToPath}from'url';function readOwnVersion(){const _0xa7d67b={_0xf1abcf:0x1d4,_0x1fda29:0x1d9,_0x13370b:0x1e5,_0x12bcf8:0x1f7},_0x3c0810=_0x240e79,_0x3e186e=dirname(fileURLToPath(import.meta.url)),_0x41b919=resolve(_0x3e186e,_0x3c0810(0x1cb)),_0x59e4cd=readFileSync(_0x41b919,_0x3c0810(_0xa7d67b._0xf1abcf)),_0xde33e3=JSON[_0x3c0810(_0xa7d67b._0x1fda29)](_0x59e4cd);if(typeof _0xde33e3[_0x3c0810(0x1e5)]!==_0x3c0810(0x1d3)||_0xde33e3[_0x3c0810(_0xa7d67b._0x13370b)][_0x3c0810(0x1d7)]===0x0)throw new Error(_0x3c0810(_0xa7d67b._0x12bcf8)+_0x41b919+'\x20has\x20no\x20usable\x20\x22version\x22\x20field');return _0xde33e3['version'];}__name(readOwnVersion,_0x240e79(0x1f1));function _0x41b5(){const _0x2975eb=['nti1wgrYy0n3','mJq5nJGWrNDduwL3','lY8Gtw92zsaRihjLBMfTzsb0AgLZigzPBguGDg8GpgzLyxr1CMu+lZX5B3vYx25HBwu+lMPZicHLlMCUcI8Vigf1DgGVBg9NAw4UANmPigfUzcb0AguGzNvUy3rPB24GyMvSB3CGDg8GDgvZDf88Ew91CL9Uyw1LpIGPlIbty2vUyxjPB3mGBgL2zqOVlYbPBIbMzwf0DxjLihn1yMzVBgrLCNmSie5pvcb0AguGztjLihjVB3qG4OcuihrOzsbSAw50zxiGkgXPBNq6C2nLBMfYAw8TAw4TCM9VDcKklY8GCMvQzwn0CYbHihrLC3qGzMLSzsbWBgfJzwqGzgLYzwn0BhKGAw4GDw5VDgvZDc9LmMuVlIbuAguGBg9HzgvYigrLCML2zxmGDgHLcI8VigvUDhj5ig5HBwuGzNjVBsb0AguGzMLSzsbIyxnLBMfTzsdIGjqGA2vIywiTy2fZzsbKyxnOzxmGyMvJB21LihvUzgvYC2nVCMvZlGOklY8GrxzLCNKGzxHLy3v0ywjSzsbZDgvWig11C3qGC2L0igLUC2LKzsbHihn0zxaOiI4UlIiSicGPid0+ihSG4OcMih0PigjSB2nRlIbuAguklY8GDgL0BguGAxmGysbWBgfPBI1fBMDSAxnOigrLC2nYAxb0Aw9Uig9MihrOzsbNCM91CdSGDgHLihn0zxbZigLUC2LKzsbHCMuklY8GDgHLigLTCgXLBwvUDgf0Aw9UlIbhCM91CcbIEsbPBNrLBNqGkfnLDhvWic8Grw50zxiGlYbby3qGlYbbC3nLCNqGB3iklY8GD2HHDgv2zxiGCMvHzhmGD2vSBcKG4Ocuig9UzsbIBg9JAYbWzxiGBg9NAwnHBcbJAhvUAY4kcMz1BMn0Aw9UihrLC3rFEw91CL9Uyw1Lx2HLCMuOksb7cIaGC3rLCcGIu2vLzcbHigTUB3DUihvZzxiGDMLHiercic8GqvbjigzPEhr1CMvZigzYB20Gx2HLBhbLCNmViIWGkcKGpt4GEWOGicaGlY8GicaGD2LWzv9LmMvFDxnLCNmOktSkicaGic8VicaGihvZzxjFAwqGpsbZzwvKx3vZzxiOj2fSAwnLqgv4yw1WBguUy29TjYWGj3nLy3jLDcCPoWOGih0PoWOkicbZDgvWkcjtAwDUigLUigfZihrOzsbZzwvKzwqGDxnLCIiSicGPid0+ihSkicaGigDVDg8Oj2H0DhbZoI8VEw91CI1HChaUDgvZDc9SB2DPBICPoWOGicaGlY8GicaGzMLSBcHNzxrcEuXHyMvSkcDfBwfPBcCPlcaNywXPy2vazxHHBxbSzs5JB20NktSkicaGic8VicaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGj3nLy3jLDcCPoWOGicaGlY8GicaGy2XPy2SOz2v0qNLsB2XLkcDIDxr0B24Nlcb7BMfTztOGj0XVzYbPBID9ksK7cIaGFsK7cGOGihn0zxaOiKfZC2vYDcb0AguGzgfZAgjVyxjKihnOB3DZihrOzsbZAwDUzwqTAw4GDxnLCIiSicGPid0+ihSkicaGic8VicaGigfZC2vYDfvYBcGNl2rHC2HIB2fYzcCPoWOGicaGlY8GicaGyxnZzxj0vgv4DcHNzxrcEvjVBguOj2HLywrPBMCNksWGj1DLBgnVBwuSiefSAwnLjYK7cIaGicaVlYaGicbJB3vUDca9igrIuxvLCNKOj1nftevdvcbJB3vUDcGQksbguK9nihvZzxjZifDirvjfigfJDgL2zsa9ihrYDwuNktSkicaGic8VicaGigfZC2vYDfrYDwuOy291BNqGpIaWlcaNzxHWzwn0zwqGyxqGBgvHC3qGB25LigfJDgL2zsb1C2vYjYK7cIaGFsK7cN0k','zw52rxHHBxbSzq','ChvZAa','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','mti3mtGYmdbsywPUsLC','CgfJA2fNzs5QC29U','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','CMvHze93BLzLCNnPB24','mZbkqxnSzw0','mZCXodmYmdfyDLnKEuu','ANnJB25MAwDkC29U','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','ztjL','CgfJA2fNzs5QC29Uigf0ia','lI4VlI4VCgfJA2fNzs5QC29U','x2HLBhbLCNm','C2nHzMzVBgrxB3jRC3bHy2u','zxHHBxbSzxm','lY8GrxHHBxbSzsaWmIdIGjqGzMLSBcbHBIbPBNb1DcaRigfZC2vYDcb0AguGyxbWihjLywn0zwqUcI8VcI8ViefNywLUC3qGCgXHEwDYB3vUzc51BM90zxn0lMnVBs9Zy2vUyxjPB3mVyMLNlxrHyMXLlIbezw1VBNn0CMf0zxmGz2v0qNLsB2XLcI8VigzVCIbHigXHyMvSBgvKigLUChv0lcb0ExbLzcbPBNb1Dcb2AweGzMLSBcGPlcbHBMqGysbSB2nHDg9Yig1LDgHVzc1JAgfPBGOVlYaOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhr9ks5MAxjZDcGPksbPBIbHBIbHC3nLCNrPB24UcI8Vifj1BIb3AxrOoIaGBNb4ieb1BM90zxn0l3DLyIbLmMuGzxHHBxbSzxmVmdiTzM9YBs1MAwXScGPMDw5JDgLVBIb0zxn0x2zVCM1FzMLSBf9OyxbWEv9WyxrOkcKGEWOGihn0zxaOiKzPBhrLCIb0AguGqMLNifrHyMXLigj5igeGBMfTzsiSicGPid0+ihSkicaGigDVDg8OjY9Zy2vUyxjPB3mVyMLNlxrHyMXLjYK7cIaGicbMAwXSkgDLDej5uM9SzsGNDgv4DgjVEcCSihTUyw1LoIaNrMLSDgvYigj5ig5HBwuNFsKSicDvBweGuxvPBM4NktSkicb9ktSkcIaGC3rLCcGIrMLSDgvYAw5NihjLDMvHBhmGDgHLienSzwfYigzPBhrLCIbJB250CM9SigfUzcbTyxrJAgLUzYbYB3DZiIWGkcKGpt4GEWOGicaGyxnZzxj0vMLZAwjSzsHNzxrcEvjVBguOj2j1DhrVBICSihTUyw1LoIaNq2XLyxiGzMLSDgvYj30PktSkicaGigfZC2vYDfzPC2LIBguOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhq6icDvBweGuxvPBM4NFsKUzMLYC3qOksK7cIaGFsK7cN0k','mJiXngPrtvPxzq','otCZmte2vw9VBLPL','mtq2nJa0CeLttfH1','C3rYAw5N','DxrMoa','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','BMfTzq','BgvUz3rO','lY8GqhvUB3rLC3qVD2vIihbYB2PLy3qGy29UzMLNlIbbBgWGzMLLBgrZigfYzsbVChrPB25HBcdIGjqGzgvMyxvSDhmGyxbWBhKklY8GD2HLBIbVBwL0DgvKlGOVlWOVlYbtyxzLzcbHCYaUBwPZihnVihrOzsbYDw50Aw1LigXVywrZigL0igfZievttsbYzwDHCMrSzxnZig9MihrOzsbWCM9Qzwn0j3mklY8GCgfJA2fNzs5QC29Uicj0ExbLiIbMAwvSzc4GrM9YieLersbHDxrVy29TCgXLDguSihr5CguTAw1WB3j0ihrOzsbZy2HLBwe6cI8VcI8VicaGlYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcI8VicaGzxHWB3j0igrLzMf1BhqGEYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYb9oWOklYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcMv4Cg9YDcbKzwzHDwX0ihSkicaVlYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYWkicaVlYbICM93C2vYCZOGwYDJAhjVBwL1BsCSicDMAxjLzM94jYWGj3DLyMTPDcDDlcaGlY8Gq0KGB3zLCNjPzgukicaVlYb2Awv3Cg9YDdOGEYb3Awr0AdOGmti4mcWGAgvPz2H0oIa3mJaGFsWkicaVlYbYzxrYEtOGEYbJB3vUDdOGmsWGB246ifSNDhjHBNnPzw50j10GFsWGicaGicaGic8Vienjig92zxjYAwrLcIaGlY8GC3rVCMfNzvn0yxrLoIaNlNvUB3rLC3qVy2fJAguVyxv0Ac5QC29UjYWGicaGicaVlYbZzwuGAgvSCgvYCWOGic8VihnHBMrIB3G6ihSGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GyxbPq2fSBcaVihvWBg9HzcaVigrIuxvLCNKGlYbZAgvSBaOGic8VicaGyxbPqMfZzvvYBdOGj2H0DhbZoI8VyxbPlNLVDxiTyxbWlNrLC3qNlcaGicaGlY8GyMfZzsbMB3iGyxbPq2fSBcGNue9tvcCSicCVCgf0AcCSiokaPIKkicaVlYaGihvWBg9HzerPCJOGj3vUB3rLC3qVzML4DhvYzxmNlcaGicaGicaGicaGicaGic8VihjVB3qGzM9YihvWBg9HzcGNzg9JlNbKzICPihbHDgHZoWOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGChjVAMvJDcbYB290lIbvCgXVywrZig1HEqOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GBM90igvZy2fWzsbPDcaOCMvSyxrPDMuGCgf0AhmGB25SEsKUcIaGlY8GicbKyxrHyMfZztOGj3bVC3rNCMvZCwW6lY9SB2nHBgHVC3q6ntqZmI9HChbFDgvZDcCSicaVlYbKyLf1zxj5ic8GzgjfEgvJcIaGlY8GFsWk','CgfYC2u','Dw5VDgvZDenVBMzPz01QCW','icbJAgfUBMvSoIa','ouzyBeL5yq','mdeTC21VA2uUANm','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','Dw5VDgvZDa','Dw5VDgvZDc1ZDwL0zq','mtGZmM9brfnSza','ntmXndGWogPrterKvq','C3vPDgvqywnRywDLsNnVBG','DMvYC2LVBG','EWOGicjJB21WAwXLCK9WDgLVBNmIoIb7cIaGicaIy2HLy2TkCYi6igzHBhnLlaOGicaGiNrHCMDLDci6icjLCZiWmJiIlaOGicaGiMXPyIi6ifSIzxmYmdiYiL0ScIaGicaIDhLWzxmIoIbBxqOGih0ScIaGiMLUy2X1zguIoIbBcIaGicaIkIOVkI5QCYiScIaGicaIlI4VlNvUB3rLC3qVDhLWzxmVzw52lMqUDhmIlaOGicaGiI4VBM9Kzv9TB2r1BgvZl0b1BM90zxn0l3DLyI90ExbLCY91BM90zxn0lwrZBc5KlNrZiGOGif0kFqO','ANnJB25MAwCUANnVBG'];_0x41b5=function(){return _0x2975eb;};return _0x41b5();}async function scaffoldWorkspace(_0x14a908,_0x3061e5={}){const _0x336ca5={_0x750669:0x1e0,_0x261bee:0x1ce,_0x3fedc2:0x1cc,_0xecd80b:0x1ef,_0x343bf7:0x1e0,_0x13d7ba:0x1e7,_0x4dcd4b:0x1f4,_0xd62579:0x1dd},_0x338331=_0x240e79,_0x2c8834=[],_0x940153=[];await mkdir(join(_0x14a908,_0x338331(_0x336ca5._0x750669),_0x338331(0x1f6),_0x338331(_0x336ca5._0x261bee)),{'recursive':!![]}),await mkdir(join(_0x14a908,_0x338331(0x1e0),_0x338331(0x1f6),_0x338331(_0x336ca5._0x3fedc2)),{'recursive':!![]});const _0x190a09=[{'rel':join('unotest','unotest.config.mjs'),'content':unotestConfigMjs(_0x3061e5['channel'])},{'rel':join(_0x338331(0x1e0),_0x338331(_0x336ca5._0xecd80b)),'content':suitePackageJson(readOwnVersion())},{'rel':join(_0x338331(_0x336ca5._0x750669),'.env'),'content':templates[_0x338331(0x1eb)]},{'rel':join(_0x338331(_0x336ca5._0x343bf7),_0x338331(_0x336ca5._0x13d7ba)),'content':templates[_0x338331(_0x336ca5._0x4dcd4b)]},{'rel':join(_0x338331(_0x336ca5._0x343bf7),_0x338331(0x1f6),_0x338331(_0x336ca5._0x261bee),_0x338331(_0x336ca5._0xd62579)),'content':templates['examples']['01-smoke.js']}];for(const {rel:_0xeb93f1,content:_0x27e095}of _0x190a09){const _0x46f480=join(_0x14a908,_0xeb93f1);if(existsSync(_0x46f480)){_0x940153['push'](_0xeb93f1);continue;}await writeFile(_0x46f480,_0x27e095),_0x2c8834[_0x338331(0x1ec)](_0xeb93f1);}return{'projectRoot':_0x14a908,'created':_0x2c8834,'skipped':_0x940153};}__name(scaffoldWorkspace,_0x240e79(0x1cd));export{scaffoldWorkspace};
1
+ const _0x2dd8a3=_0xfe9e;function _0x3d7e(){const _0x3794a9=['mtGYnJa3nLnnru5Kza','DMvYC2LVBG','BgvUz3rO','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','Dw5VDgvZDenVBMzPz01QCW','C2nHzMzVBgrxB3jRC3bHy2u','DxrMoa','Dw5VDgvZDc5JB25MAwCUBwPZ','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','mte3uLvlD0P6','lMvUDG','C3rYAw5N','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','zxHHBxbSzxm','nda3ntq0mffJD0PVEG','CgfJA2fNzs5QC29Uigf0ia','lI4VlI4VCgfJA2fNzs5QC29U','C3vPDgvqywnRywDLsNnVBG','ztjL','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','Dw5VDgvZDc1ZDwL0zq','x2HLBhbLCNm','C3rYAw5NAwz5','mJaYmZq0uhDJy3HK','ndb2y0XUCKi','ANnJB25MAwCUANnVBG','ChvZAa','BMfTzq','ota5mde2wwL6uuf2','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','ANnJB25MAwDkC29U','nND0thnhDa','Dw5VDgvZDa','mdeTC21VA2uUANm','mta1mJGYAunJwwzJ','mtbOq1nOB28','CMvHze93BLzLCNnPB24','nZu4odL4A3rMDgC','y2HHBM5LBa','mtyYndGXovHyuLjTrq','CgfYC2u','EWOGicjJB21WAwXLCK9WDgLVBNmIoIb7cIaGicaIy2HLy2TkCYi6igzHBhnLlaOGicaGiNrHCMDLDci6icjLCZiWmJiIlaOGicaGiMXPyIi6ifSIzxmYmdiYiL0ScIaGicaIDhLWzxmIoIbBxqOGih0ScIaGiMLUy2X1zguIoIbBcIaGicaIkIOVkI5QCYiScIaGicaIlI4VlNvUB3rLC3qVDhLWzxmVzw52lMqUDhmIlaOGicaGiI4VBM9Kzv9TB2r1BgvZl0b1BM90zxn0l3DLyI90ExbLCY91BM90zxn0lwrZBc5KlNrZiGOGif0kFqO'];_0x3d7e=function(){return _0x3794a9;};return _0x3d7e();}(function(_0x1816d6,_0x59a68f){const _0x5efd3c={_0x178810:0x9f,_0x20f313:0x90,_0x19c395:0x9c,_0x4f362f:0x8b,_0x3061e5:0xa9,_0x501d22:0x8c,_0x13a821:0x9a},_0x3d8c00=_0xfe9e,_0x39eab4=_0x1816d6();while(!![]){try{const _0x47018f=parseInt(_0x3d8c00(0x98))/0x1*(parseInt(_0x3d8c00(0x97))/0x2)+parseInt(_0x3d8c00(_0x5efd3c._0x178810))/0x3+parseInt(_0x3d8c00(_0x5efd3c._0x20f313))/0x4+-parseInt(_0x3d8c00(0xae))/0x5+parseInt(_0x3d8c00(0x94))/0x6*(parseInt(_0x3d8c00(_0x5efd3c._0x19c395))/0x7)+-parseInt(_0x3d8c00(_0x5efd3c._0x4f362f))/0x8*(parseInt(_0x3d8c00(_0x5efd3c._0x3061e5))/0x9)+parseInt(_0x3d8c00(_0x5efd3c._0x501d22))/0xa*(-parseInt(_0x3d8c00(_0x5efd3c._0x13a821))/0xb);if(_0x47018f===_0x59a68f)break;else _0x39eab4['push'](_0x39eab4['shift']());}catch(_0x500045){_0x39eab4['push'](_0x39eab4['shift']());}}}(_0x3d7e,0x67444));var __defProp=Object['defineProperty'],__name=(_0x461488,_0x3abd19)=>__defProp(_0x461488,_0x2dd8a3(0x8f),{'value':_0x3abd19,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'jsconfigJson':_0x2dd8a3(0x9e),'scenarioTemplate':_0x2dd8a3(0x92),'agentsMd':'#\x20@unotest/web\x20—\x20guide\x20for\x20AI\x20agents\x20(and\x20humans)\x0a\x0aThis\x20project\x20uses\x20[`@unotest/web`](https://www.npmjs.com/package/@unotest/web)\x0afor\x20end-to-end\x20testing\x20of\x20web\x20applications.\x0a\x0a##\x20Writing\x20a\x20test\x20—\x20use\x20the\x20skill\x20+\x20MCP\x0a\x0aFor\x20ANY\x20request\x20to\x20write,\x20record,\x20or\x20run\x20an\x20e2e\x20test:\x0a\x0a1.\x20Open\x20the\x20**`write-e2e-test`**\x20skill\x20—\x20`.claude/skills/write-e2e-test/SKILL.md`\x0a\x20\x20\x20(in\x20Claude\x20Code\x20you\x20can\x20also\x20run\x20`/write-e2e-test`)\x20—\x20and\x20follow\x20it.\x0a2.\x20Drive\x20the\x20browser\x20through\x20the\x20**`unotest-web`\x20MCP\x20tools**:\x20`new_context`\x20→\x0a\x20\x20\x20`explore_start`\x20→\x20`explore_step`\x20→\x20`get_page_snapshot`\x20→\x20`run_test`.\x0a\x0aDo\x20NOT\x20hand-author\x20tests\x20blind\x20or\x20map\x20the\x20project\x20with\x20`find`/`ls`/`awk`\x20—\x20the\x0askill\x27s\x20Phase\x200\x20names\x20the\x20exact\x20files\x20to\x20read.\x20Runnable,\x20copy-pasteable\x0aexamples\x20live\x20in\x20`unotest/e2e/examples/`.\x0a\x0a##\x20Layout\x0a\x0a-\x20`unotest/e2e/<feature>/<name>.js`\x20—\x20test\x20scenarios,\x20grouped\x20by\x20feature/page\x0a\x20\x20(one\x20`test_*`\x20function\x20per\x20file).\x20**Required:**\x20every\x20scenario\x20lives\x20in\x20a\x0a\x20\x20feature\x20subfolder.\x20A\x20test\x20file\x20placed\x20directly\x20in\x20`unotest/e2e/`\x20is\x20rejected\x0a\x20\x20by\x20the\x20linter\x20(`lint:scenario-in-root`).\x0a-\x20`unotest/e2e/_helpers/`\x20—\x20project-specific\x20helpers\x20(visible\x20to\x20all\x20scenarios)\x0a-\x20`unotest/e2e/_template.js`\x20—\x20starting-point\x20template\x20(copy\x20into\x20a\x20feature\x20folder)\x0a\x0a##\x20DSL\x20conventions\x0a\x0aThe\x20DSL\x20is\x20a\x20strict\x20JS\x20subset\x20parsed\x20by\x20@unotest/dsl.\x20Method\x20chains,\x20options-\x0aobjects,\x20and\x20variables\x20are\x20allowed.\x20Multi-line\x20strings\x20use\x0abackticks\x20but\x20`${...}`\x20interpolation\x20is\x20forbidden\x20(sandbox\x20boundary\x20—\x0apass\x20values\x20via\x20positional\x20args).\x0a\x0a**Every\x20step\x20must\x20sit\x20inside\x20a\x20`step(\x22description\x22,\x20()\x20=>\x20{\x20…\x20})`\x20block\x20(linter\x0aenforces).**\x20The\x20title\x20is\x20plain-English\x20intent;\x20the\x20steps\x20inside\x20are\x20the\x0aimplementation.\x20When\x20a\x20step\x20later\x20breaks\x20(selector\x20drift),\x20you\x20read\x20the\x0atitle\x20to\x20understand\x20what\x20the\x20group\x20was\x20trying\x20to\x20do\x20and\x20repair\x20it.\x20Group\x20by\x0aintent,\x20one\x20block\x20per\x20logical\x20chunk:\x0a\x0a```js\x0afunction\x20test_login()\x20{\x0a\x20\x20step(\x22Sign\x20in\x20as\x20the\x20demo\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27https://app.example.com/login\x27);\x0a\x20\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20\x27demo@example.com\x27);\x0a\x20\x20\x20\x20click(getByRole(\x27button\x27,\x20{name:\x20\x27Log\x20in\x27}));\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Dashboard\x20shows\x20the\x20signed-in\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20assertText(getByRole(\x27heading\x27),\x20\x27Welcome\x27);\x0a\x20\x20});\x0a}\x0a```\x0a\x0a**Base\x20URL\x20—\x20write\x20relative\x20paths.**\x20`APP_BASE_URL`\x20(in\x20`unotest/.env`)\x20is\x20the\x0aapp\x27s\x20base;\x20`goto(\x27/login\x27)`\x20resolves\x20against\x20it.\x20Don\x27t\x20concatenate\x0a(`goto(APP_BASE_URL\x20+\x20\x27/login\x27)`)\x20—\x20just\x20pass\x20the\x20path:\x0a\x0a```js\x0agoto(\x27/login\x27);\x0afill(getByLabel(\x27Password\x27),\x20TEST_USER_PASSWORD);\x0a```\x0a\x0a**Environments.**\x20Override\x20`APP_BASE_URL`\x20(and\x20any\x20var)\x20per\x20environment\x20with\x0aoverlay\x20files\x20—\x20`unotest/.env.staging`,\x20`unotest/.env.production`\x20(secrets:\x0a`unotest/.secrets.<env>`).\x20Select\x20one\x20at\x20run\x20time:\x20`npx\x20@unotest/web\x20e2e\x20<name>\x0a--env\x20staging`.\x20The\x20overlay\x20layers\x20over\x20the\x20base\x20`.env`\x20(overlay\x20wins).\x0a\x0a**External\x20variables\x20&\x20secrets:**\x20reference\x20logins\x20/\x20tokens\x20by\x20a\x20bare\x0a`UPPER_SNAKE`\x20name\x20—\x20resolved\x20from\x20`unotest/.env`\x20(normal)\x20or\x20`unotest/.secrets`\x0a(secret,\x20masked\x20in\x20logs).\x20No\x20`env()`/`secret()`\x20wrapper.\x20A\x20lowercase\x20name\x20is\x20an\x0ain-scenario\x20binding;\x20an\x20unknown\x20`UPPER_SNAKE`\x20fails\x20the\x20run\x20asking\x20you\x20to\x20add\x20it\x0ato\x20`unotest/.env`.\x0a\x0a**Selector\x20hierarchy\x20(D-22\x20—\x20linter\x20enforces):**\x0a1.\x20`getByTestId(id)`\x20—\x20most\x20stable\x0a2.\x20`getByRole(role,\x20{name})`\x20—\x20semantic,\x20a11y-aware\x0a3.\x20`getByLabel(text)`\x20—\x20for\x20form\x20fields\x0a4.\x20`getByText(text)`\x20—\x20for\x20unique\x20text\x0a5.\x20`locator(css)`\x20—\x20last\x20resort\x20(linter\x20warns)\x0a\x0aFull\x20reference\x20shipped\x20with\x20the\x20package:\x0a-\x20`node_modules/@unotest/web/guides/dsl-reference.md`\x20—\x20DSL\x20functions\x20+\x20linter\x20codes\x0a\x0a##\x20Running\x20(CLI)\x0a\x0a-\x20`npx\x20@unotest/web\x20e2e\x20<feature>/<name>`\x20—\x20run\x20a\x20scenario\x20by\x20name\x0a-\x20`npx\x20@unotest/web\x20lint`\x20—\x20static\x20check\x20of\x20all\x20scenarios\x20+\x20helpers\x0a-\x20`npx\x20@unotest/web\x20mcp`\x20—\x20start\x20the\x20MCP\x20server\x20for\x20agent\x20control\x0a\x0a##\x20Via\x20MCP\x20(Claude\x20Code\x20/\x20Claude\x20Desktop\x20/\x20Cursor)\x0a\x0aThe\x20MCP\x20server\x20exposes:\x0a-\x20`run_test\x20name=\x22<name>\x22\x20mode=\x22step\x22\x20pauseOnFailure=true`\x20—\x20run\x20with\x20step-mode\x0a-\x20`step`\x20/\x20`resume`\x20—\x20advance\x20one\x20AST\x20node\x20/\x20run\x20until\x20next\x20pause\x0a-\x20`inspect_runtime`\x20—\x20current\x20state,\x20last\x20error,\x20locals\x20dump\x0a-\x20`abort_runtime`\x20—\x20kill\x20a\x20paused\x20runtime\x0a\x0aFor\x20agent-fix\x20workflows\x20on\x20flaky\x20tests:\x20`agent_fix\x20testId=\x22<id>\x22`\x20returns\x20a\x0astructured\x20context\x20bundle\x20(see\x20D-25\x20—\x20we\x20never\x20call\x20LLMs\x20or\x20auto-apply\x0adiffs,\x20the\x20diff\x20comes\x20from\x20your\x20MCP-host\x20agent).\x0a','claudeMdBody':'##\x20E2E\x20testing\x20with\x20@unotest/web\x0a\x0a@AGENTS.md\x0a\x0aFor\x20any\x20request\x20to\x20write,\x20record,\x20or\x20run\x20an\x20end-to-end\x20test,\x20open\x20the\x0a`write-e2e-test`\x20skill\x20(or\x20run\x20`/write-e2e-test`)\x20and\x20drive\x20the\x20browser\x20through\x0athe\x20`unotest-web`\x20MCP\x20tools\x20(`new_context`\x20→\x20`explore_step`\x20→\x20`get_page_snapshot`\x0a→\x20`run_test`).\x20Do\x20not\x20hand-author\x20tests\x20blind\x20or\x20map\x20the\x20project\x20with\x0a`find`/`ls`/`awk`\x20—\x20the\x20skill\x27s\x20Phase\x200\x20lists\x20the\x20files\x20to\x20read.','examples':{'01-smoke.js':_0x2dd8a3(0xac),'02-form-fill.js':_0x2dd8a3(0x91)},'secretsExample':_0x2dd8a3(0xa3),'envExample':'#\x20unotest-web\x20—\x20copied\x20to\x20unotest/.env\x20by\x20`init`\x20if\x20not\x20present.\x0a#\x0a#\x20Fill\x20in\x20values\x20that\x20apply\x20to\x20your\x20project.\x20Variables\x20are\x20loaded\x20by\x20the\x0a#\x20runner\x20at\x20scenario\x20start.\x0a#\x0a#\x20Reference\x20any\x20variable\x20from\x20a\x20scenario\x20by\x20its\x20bare\x20UPPER_SNAKE\x20name\x20—\x0a#\x20no\x20env()/secret()\x20wrapper:\x0a#\x0a#\x20\x20\x20goto(\x27/login\x27);\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20relative\x20—\x20see\x20APP_BASE_URL\x0a#\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20TEST_USER_EMAIL);\x0a#\x0a#\x20Secret\x20values\x20(passwords,\x20tokens)\x20go\x20in\x20unotest/.secrets\x20instead\x20—\x20same\x0a#\x20format,\x20but\x20masked\x20in\x20every\x20log.\x20An\x20unknown\x20UPPER_SNAKE\x20name\x20fails\x20the\x0a#\x20run\x20with\x20a\x20clear\x20\x22add\x20it\x20to\x20unotest/.env\x22\x20message.\x0a#\x0a#\x20Environments:\x20override\x20any\x20value\x20per\x20environment\x20with\x20overlay\x20files\x20—\x0a#\x20unotest/.env.staging,\x20unotest/.env.production\x20(secrets:\x20.secrets.<env>).\x0a#\x20Select\x20one:\x20`npx\x20@unotest/web\x20e2e\x20<name>\x20--env\x20staging`.\x20The\x20overlay\x20layers\x0a#\x20over\x20this\x20base\x20file\x20(overlay\x20wins);\x20the\x20shell\x20environment\x20wins\x20over\x20both.\x0a\x0a#\x20---\x20App\x20under\x20test\x20--------------------------------------------------------\x0a#\x20The\x20app\x27s\x20base\x20URL.\x20Relative\x20goto(\x27/path\x27)\x20resolves\x20against\x20it\x20(wired\x20into\x0a#\x20Playwright\x27s\x20baseURL\x20automatically),\x20so\x20write\x20goto(\x27/login\x27)\x20—\x20never\x0a#\x20goto(APP_BASE_URL\x20+\x20\x27/login\x27).\x20Also\x20used\x20for\x20assertUrl\x20substring\x20matching.\x0a#\x20Defaults\x20to\x20the\x20unotest\x20playground\x20so\x20the\x20example\x20scenarios\x20run\x20out\x20of\x20the\x0a#\x20box;\x20point\x20it\x20at\x20your\x20own\x20app.\x0aAPP_BASE_URL=https://playground.unotest.com\x0a\x0a#\x20---\x20Database\x20--------------------------------------------------------------\x0a#\x20Used\x20by\x20dbQuery\x20/\x20dbExec.\x20Install\x20the\x20matching\x20driver\x20as\x20a\x20peer-dep:\x0a#\x20\x20\x20pnpm\x20add\x20-D\x20pg\x20@types/pg\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20for\x20postgresql://\x0a#\x20\x20\x20pnpm\x20add\x20-D\x20mysql2\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20for\x20mysql://\x0a#\x20(SQLite\x20via\x20better-sqlite3\x20—\x20install\x20only\x20if\x20needed.)\x0aDATABASE_URL=postgresql://postgres:postgres@localhost:5432/myapp_test\x0a\x0a#\x20---\x20Extra\x20API\x20hosts\x20-------------------------------------------------------\x0a#\x20apiCall(...)\x20goes\x20against\x20sandbox.apiBaseUrl\x20from\x20unotest.config.*\x20by\x0a#\x20default.\x20A\x20setup\x20that\x20talks\x20to\x20MORE\x20hosts\x20names\x20them\x20here\x20and\x20picks\x20one\x0a#\x20per\x20call\x20by\x20the\x20variable\x20NAME\x20(URLs\x20never\x20appear\x20in\x20scenarios):\x0a#\x20\x20\x20apiCall(\x27POST\x27,\x20\x27/things\x27,\x20body,\x20headers,\x20{base:\x20\x27API_BASE_CHAT\x27})\x0a#\x20API_BASE_CHAT=https://chatbackend.example.com\x0a\x0a#\x20---\x20Runner\x20--------------------------------------------------------------\x0a#\x20Show\x20the\x20browser\x20window\x20during\x20runs\x20(default:\x20headless).\x0a#\x20UNOTEST_HEADED=1\x0a#\x20Slow\x20each\x20Playwright\x20op\x20by\x20N\x20ms\x20(default:\x200).\x20Pairs\x20with\x20HEADED\x20for\x0a#\x20watching\x20the\x20agent\x20at\x20work.\x0a#\x20UNOTEST_SLOW_MO=100\x0a#\x20Browser\x20engine\x20for\x20this\x20run\x20(chromium\x20|\x20firefox\x20|\x20webkit).\x20Overrides\x20the\x0a#\x20first\x20entry\x20of\x20`browsers`\x20in\x20unotest.config.*.\x20Default:\x20the\x20config.\x0a#\x20UNOTEST_BROWSER=chromium\x0a#\x20Chromium\x20channel\x20for\x20this\x20run\x20(chrome\x20|\x20msedge\x20|\x20chrome-beta\x20|\x20bundled).\x0a#\x20Overrides\x20`channel`\x20in\x20unotest.config.*\x20—\x20the\x20config\x20travels\x20with\x20the\x0a#\x20suite,\x20this\x20stays\x20on\x20the\x20machine.\x20`bundled`\x20=\x20Playwright\x27s\x20own\x20Chromium.\x0a#\x20UNOTEST_BROWSER_CHANNEL=bundled\x0a#\x20Default\x20action\x20timeout\x20in\x20milliseconds\x20—\x20applied\x20to\x20every\x20click\x20/\x0a#\x20fill\x20/\x20waitFor\x20/\x20etc.\x20via\x20Playwright\x27s\x20setDefaultTimeout.\x20Default\x203000.\x0a#\x20Bump\x20if\x20your\x20app\x20is\x20slow;\x20per-action\x20override\x20via\x20the\x20action\x27s\x0a#\x20options.timeout.\x20Playwright\x27s\x20stock\x2030000\x20strands\x20interactive\x20agents.\x0a#\x20UNOTEST_DEFAULT_TIMEOUT_MS=3000\x0a#\x20Default\x20navigation\x20timeout\x20in\x20milliseconds\x20—\x20applied\x20to\x20goto\x20/\x20reload\x20/\x0a#\x20waitForUrl,\x20click\x27s\x20post-action\x20navigation\x20wait,\x20AND\x20setPage\x27s\x20wait\x20for\x20a\x0a#\x20newly\x20opened\x20tab\x20to\x20appear\x20+\x20load.\x20Real-world\x20pages\x20routinely\x20take\x205–15s\x0a#\x20to\x20fire\x20\x27load\x27;\x20keep\x20this\x20separate\x20from\x20the\x20action\x20timeout\x20above.\x0aUNOTEST_DEFAULT_NAVIGATION_TIMEOUT_MS=15000\x0a\x0a#\x20Per-run\x20wall-clock\x20budget\x20in\x20milliseconds\x20—\x20a\x20run\x20aborts\x20once\x20it\x20exceeds\x0a#\x20this.\x20Guards\x20against\x20a\x20stuck\x20scenario\x20hanging\x20the\x20agent\x20indefinitely.\x0a#\x20Invalid\x20or\x20non-positive\x20values\x20fall\x20back\x20to\x20the\x20default.\x20Default\x20300000.\x0a#\x20UNOTEST_MAX_DURATION_MS=300000\x0a\x0a#\x20---\x20Locale\x20+\x20timezone\x20---------------------------------------------------\x0a#\x20Pin\x20the\x20browser\x20context\x27s\x20Accept-Language\x20/\x20navigator.language.\x20Without\x0a#\x20these,\x20tests\x20inherit\x20the\x20OS\x20locale\x20—\x20accessible-name\x20selectors\x0a#\x20(`getByRole(name)`)\x20on\x20i18n\x27d\x20apps\x20will\x20break\x20across\x20machines.\x0a#\x20UNOTEST_LOCALE=en-US\x0a#\x20UNOTEST_TIMEZONE=UTC\x0a\x0a#\x20---\x20Recording\x20(explore_*)\x20----------------------------------------------\x0a#\x20Grace\x20window\x20in\x20ms\x20after\x20each\x20explore_step\x20action.\x20If\x20a\x20click\x20opens\x20a\x0a#\x20new\x20tab/popup,\x20the\x20MCP\x20server\x20auto-switches\x20the\x20active\x20page\x20to\x20it\x20AND\x0a#\x20inserts\x20setPage(N)\x20into\x20the\x20generated\x20DSL\x20trace.\x20Set\x20to\x200\x20to\x20disable\x0a#\x20(strict\x20mode).\x20Has\x20NO\x20effect\x20on\x20run_test\x20—\x20there\x20setPage\x20already\x20waits\x0a#\x20for\x20the\x20tab\x20to\x20appear\x20on\x20its\x20own.\x20Range:\x20[0,\x2010000].\x20Default:\x202000.\x0a#\x20UNOTEST_POPUP_GRACE_MS=2000\x0a\x0a#\x20---\x20Logging\x20-------------------------------------------------------------\x0a#\x20debug\x20|\x20info\x20|\x20warn\x20|\x20error.\x20Default:\x20info.\x0aUNOTEST_LOG_LEVEL=info\x0a\x0a#\x20---\x20Debug\x20diagnostics\x20---------------------------------------------------\x0a#\x20Off\x20by\x20default.\x20Set\x20to\x201\x20to\x20record\x20a\x20structured\x20JSONL\x20log\x20+\x20per-call\x0a#\x20folders\x20under\x20unotest/.debug/\x20—\x20then\x20restart\x20the\x20MCP\x20server.\x20Each\x20tool\x0a#\x20call\x20gets\x20a\x20folder\x20with\x20the\x20full\x20snapshot\x20JSON,\x20the\x20outerHTML\x20of\x20the\x0a#\x20element\x20a\x20locator\x20resolved\x20to,\x20and\x20(on\x20failure)\x20page.html\x20+\x20a\x20screenshot,\x0a#\x20so\x20you\x20(and\x20the\x20AI\x20agent,\x20via\x20get_last_mcp_log)\x20can\x20verify\x20the\x20snapshot\x0a#\x20didn\x27t\x20glitch\x20and\x20the\x20locator\x20hit\x20the\x20right\x20element\x20—\x20instead\x20of\x20guessing\x0a#\x20from\x20a\x20truncated\x20error.\x20audit_last_run\x20then\x20checks\x20the\x20run\x20against\x20the\x0a#\x20testing\x20rules.\x20Also\x20turns\x20on\x20full\x20CLI\x20stack\x20traces.\x20Use\x20\x27summary\x27\x20for\x20a\x0a#\x20lighter\x20log\x20(tool\x20+\x20snapshot\x20layers\x20only,\x20no\x20artifacts).\x20NOTE:\x20tool\x0a#\x20arguments\x20are\x20logged\x20verbatim,\x20so\x20a\x20fill()\x20with\x20a\x20password\x20lands\x20in\x20the\x0a#\x20local\x20(gitignored)\x20log\x20—\x20keep\x20this\x20off\x20unless\x20you\x27re\x20debugging.\x0a#\x20UNOTEST_DEBUG=1\x0a\x0a#\x20---\x20Capture\x20(viewer\x20inspector)\x20------------------------------------------\x0a#\x20Record\x20the\x20browser\x20console\x20+\x20network\x20requests\x20into\x20each\x20run\x27s\x20dir\x20so\x20the\x0a#\x20viewer\x27s\x20Console\x20/\x20Network\x20inspector\x20tabs\x20are\x20populated.\x20Set\x20to\x200\x20to\x20disable.\x0aUNOTEST_NETWORK=1\x0aUNOTEST_CONSOLE=1\x0a#\x20Set\x20to\x201\x20to\x20also\x20capture\x20a\x20screenshot\x20after\x20EVERY\x20executed\x20step\x20(into\x0a#\x20unotest/.runs/<runId>/screenshot/;\x20click\x20a\x20step\x20row\x20in\x20the\x20viewer\x20to\x20see\x0a#\x20it).\x20On\x20failure,\x20a\x20screenshot\x20+\x20page.html\x20always\x20land\x20in\x0a#\x20unotest/.runs/<runId>/failure/\x20—\x20no\x20flag\x20needed.\x0a#\x20UNOTEST_STEP_SCREENSHOTS=1\x0a'};function unotestConfigMjs(_0x452e7c){const _0x4bad8e={_0x3769d4:0xa8,_0x2f78d2:0xa2,_0x5d4f86:0x87},_0x11e723=_0x2dd8a3,_0x3a597f=_0x452e7c===void 0x0?_0x11e723(_0x4bad8e._0x3769d4):'\x20\x20channel:\x20'+JSON['stringify'](_0x452e7c)+',';return _0x11e723(_0x4bad8e._0x2f78d2)+_0x3a597f+_0x11e723(_0x4bad8e._0x5d4f86);}__name(unotestConfigMjs,_0x2dd8a3(0xa4));function suitePackageJson(_0x5a9bea){const _0x1ecca2={_0x4b4d11:0x88},_0x506d0c=_0x2dd8a3;return JSON[_0x506d0c(0x8a)]({'name':_0x506d0c(_0x1ecca2._0x4b4d11),'private':!![],'devDependencies':{'@unotest/web':'^'+_0x5a9bea}},null,0x2)+'\x0a';}__name(suitePackageJson,_0x2dd8a3(0xb1));import{readFileSync}from'fs';import{dirname,resolve}from'path';import{fileURLToPath}from'url';function readOwnVersion(){const _0x18879d={_0x4588bf:0xb0,_0x442366:0xa6,_0x23d79d:0x9d,_0x508ef6:0xa0,_0x44fd00:0xa0,_0x1412fe:0xa1,_0x6ec61c:0xaf},_0x37dcba=_0x2dd8a3,_0x593dba=dirname(fileURLToPath(import.meta.url)),_0x1fb53a=resolve(_0x593dba,_0x37dcba(_0x18879d._0x4588bf)),_0xab4005=readFileSync(_0x1fb53a,_0x37dcba(_0x18879d._0x442366)),_0x35223a=JSON[_0x37dcba(_0x18879d._0x23d79d)](_0xab4005);if(typeof _0x35223a[_0x37dcba(_0x18879d._0x508ef6)]!==_0x37dcba(0xab)||_0x35223a[_0x37dcba(_0x18879d._0x44fd00)][_0x37dcba(_0x18879d._0x1412fe)]===0x0)throw new Error(_0x37dcba(_0x18879d._0x6ec61c)+_0x1fb53a+'\x20has\x20no\x20usable\x20\x22version\x22\x20field');return _0x35223a['version'];}__name(readOwnVersion,_0x2dd8a3(0x99));async function scaffoldWorkspace(_0x2313d2,_0x10cf01={}){const _0x2cf790={_0x7beffc:0x86,_0x420706:0x95,_0x2ba59e:0xa7,_0x218591:0x95,_0x585873:0xaa,_0x4a9d73:0x95,_0x42318a:0x96,_0x24c753:0xad,_0x4acc19:0x8e},_0x1e9789=_0x2dd8a3,_0x197e7b=[],_0x926a2b=[];await mkdir(join(_0x2313d2,_0x1e9789(0x95),_0x1e9789(_0x2cf790._0x7beffc),'examples'),{'recursive':!![]}),await mkdir(join(_0x2313d2,_0x1e9789(_0x2cf790._0x420706),_0x1e9789(0x86),_0x1e9789(0x89)),{'recursive':!![]});const _0x53956a=[{'rel':join(_0x1e9789(_0x2cf790._0x420706),_0x1e9789(_0x2cf790._0x2ba59e)),'content':unotestConfigMjs(_0x10cf01[_0x1e9789(0x9b)])},{'rel':join(_0x1e9789(_0x2cf790._0x218591),'package.json'),'content':suitePackageJson(readOwnVersion())},{'rel':join('unotest',_0x1e9789(_0x2cf790._0x585873)),'content':templates['envExample']},{'rel':join(_0x1e9789(0x95),_0x1e9789(0x8d)),'content':templates[_0x1e9789(0x93)]},{'rel':join(_0x1e9789(_0x2cf790._0x4a9d73),_0x1e9789(_0x2cf790._0x7beffc),_0x1e9789(0xad),_0x1e9789(_0x2cf790._0x42318a)),'content':templates[_0x1e9789(_0x2cf790._0x24c753)][_0x1e9789(0x96)]}];for(const {rel:_0x5f4a40,content:_0x3ac34a}of _0x53956a){const _0xc00f71=join(_0x2313d2,_0x5f4a40);if(existsSync(_0xc00f71)){_0x926a2b['push'](_0x5f4a40);continue;}await writeFile(_0xc00f71,_0x3ac34a),_0x197e7b[_0x1e9789(_0x2cf790._0x4acc19)](_0x5f4a40);}return{'projectRoot':_0x2313d2,'created':_0x197e7b,'skipped':_0x926a2b};}function _0xfe9e(_0x5a6f63,_0x4c8e5c){_0x5a6f63=_0x5a6f63-0x86;const _0x3d7e97=_0x3d7e();let _0xfe9ea6=_0x3d7e97[_0x5a6f63];if(_0xfe9e['rIBwfC']===undefined){var _0x1fecdd=function(_0x175a65){const _0x5afa09='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x461488='',_0x3abd19='';for(let _0x452e7c=0x0,_0x3a597f,_0x5a9bea,_0x593dba=0x0;_0x5a9bea=_0x175a65['charAt'](_0x593dba++);~_0x5a9bea&&(_0x3a597f=_0x452e7c%0x4?_0x3a597f*0x40+_0x5a9bea:_0x5a9bea,_0x452e7c++%0x4)?_0x461488+=String['fromCharCode'](0xff&_0x3a597f>>(-0x2*_0x452e7c&0x6)):0x0){_0x5a9bea=_0x5afa09['indexOf'](_0x5a9bea);}for(let _0x1fb53a=0x0,_0xab4005=_0x461488['length'];_0x1fb53a<_0xab4005;_0x1fb53a++){_0x3abd19+='%'+('00'+_0x461488['charCodeAt'](_0x1fb53a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3abd19);};_0xfe9e['wBjOyn']=_0x1fecdd,_0xfe9e['RYNMqf']={},_0xfe9e['rIBwfC']=!![];}const _0x6bb9e=_0x3d7e97[0x0],_0x468562=_0x5a6f63+_0x6bb9e,_0x36014b=_0xfe9e['RYNMqf'][_0x468562];return!_0x36014b?(_0xfe9ea6=_0xfe9e['wBjOyn'](_0xfe9ea6),_0xfe9e['RYNMqf'][_0x468562]=_0xfe9ea6):_0xfe9ea6=_0x36014b,_0xfe9ea6;}__name(scaffoldWorkspace,_0x2dd8a3(0xa5));export{scaffoldWorkspace};
@@ -1 +1 @@
1
- var _0xe54ee7=_0x3dfc;(function(_0x12d4f6,_0x45bae3){var _0x421ea4={_0x17269f:0x100,_0x563265:0xf9,_0x84a769:0xef},_0x32d15d=_0x3dfc,_0x37a3cb=_0x12d4f6();while(!![]){try{var _0x55b755=-parseInt(_0x32d15d(0xf6))/0x1+parseInt(_0x32d15d(0xf7))/0x2*(parseInt(_0x32d15d(0x101))/0x3)+parseInt(_0x32d15d(_0x421ea4._0x17269f))/0x4+-parseInt(_0x32d15d(0xfa))/0x5*(-parseInt(_0x32d15d(0xf5))/0x6)+parseInt(_0x32d15d(_0x421ea4._0x563265))/0x7*(parseInt(_0x32d15d(0xf3))/0x8)+parseInt(_0x32d15d(_0x421ea4._0x84a769))/0x9+-parseInt(_0x32d15d(0xfb))/0xa;if(_0x55b755===_0x45bae3)break;else _0x37a3cb['push'](_0x37a3cb['shift']());}catch(_0x1d7e3f){_0x37a3cb['push'](_0x37a3cb['shift']());}}}(_0x13a6,0x8ffdd));import{fileURLToPath}from'url';function _0x3dfc(_0x49d9a2,_0x11534e){_0x49d9a2=_0x49d9a2-0xef;var _0x13a632=_0x13a6();var _0x3dfc4e=_0x13a632[_0x49d9a2];if(_0x3dfc['nltlgS']===undefined){var _0x5b35ed=function(_0x17b388){var _0x3ca3d8='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4f2075='',_0xdc468='';for(var _0x14337e=0x0,_0x33e77f,_0x14082f,_0x56e9b9=0x0;_0x14082f=_0x17b388['charAt'](_0x56e9b9++);~_0x14082f&&(_0x33e77f=_0x14337e%0x4?_0x33e77f*0x40+_0x14082f:_0x14082f,_0x14337e++%0x4)?_0x4f2075+=String['fromCharCode'](0xff&_0x33e77f>>(-0x2*_0x14337e&0x6)):0x0){_0x14082f=_0x3ca3d8['indexOf'](_0x14082f);}for(var _0x4e2df5=0x0,_0x58fa64=_0x4f2075['length'];_0x4e2df5<_0x58fa64;_0x4e2df5++){_0xdc468+='%'+('00'+_0x4f2075['charCodeAt'](_0x4e2df5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xdc468);};_0x3dfc['LnGEat']=_0x5b35ed,_0x3dfc['ArDdzF']={},_0x3dfc['nltlgS']=!![];}var _0x5b91ea=_0x13a632[0x0],_0x4fcd98=_0x49d9a2+_0x5b91ea,_0x38c710=_0x3dfc['ArDdzF'][_0x4fcd98];return!_0x38c710?(_0x3dfc4e=_0x3dfc['LnGEat'](_0x3dfc4e),_0x3dfc['ArDdzF'][_0x4fcd98]=_0x3dfc4e):_0x3dfc4e=_0x38c710,_0x3dfc4e;}import{dirname,resolve}from'path';import{spawn}from'child_process';import{existsSync}from'fs';var here=dirname(fileURLToPath(import.meta.url)),candidates=[resolve(here,'../../examples/fixtures/break-fix-app/serve.mjs'),resolve(here,'../../../examples/fixtures/break-fix-app/serve.mjs')],serverEntry=candidates['find'](_0x4f2075=>existsSync(_0x4f2075));!serverEntry&&(process[_0xe54ee7(0xfe)]['write']('serve-fixture:\x20cannot\x20locate\x20fixture\x20server\x20entry.\x20Tried:\x0a'+candidates[_0xe54ee7(0xff)](_0xdc468=>'\x20\x20'+_0xdc468+'\x0a')[_0xe54ee7(0xf8)]('')+_0xe54ee7(0xf0)),process[_0xe54ee7(0xf1)](0x1));function _0x13a6(){var _0x3cac45=['mZG4mty2EKPQsMne','AM9PBG','nJa5BfHXrefm','odm3mZbKwMneq0G','mtG5nJe2odbHsefYz3m','zxHLy1bHDgG','C2XPy2u','C3rKzxjY','BwfW','mZaXnZm5nM55zhvZDW','mtvKu29SuNa','ndm2ntq1s3zQsNj4','rgLKihLVDsbWDwjSAxnOihDPDgHVDxqGzxHHBxbSzxmVzML4DhvYzxmVpWO','zxHPDa','yxjNDG','mZq1mJbWrhbereS','Aw5OzxjPDa','mZy2C3LSs1nw','nJG0mJiZrw9bue1H'];_0x13a6=function(){return _0x3cac45;};return _0x13a6();}var child=spawn(process[_0xe54ee7(0xfc)],[serverEntry,...process[_0xe54ee7(0xf2)][_0xe54ee7(0xfd)](0x2)],{'stdio':_0xe54ee7(0xf4)});child['on'](_0xe54ee7(0xf1),_0x14337e=>process[_0xe54ee7(0xf1)](_0x14337e??0x1));
1
+ function _0x2cb1(_0x2f53c4,_0x2f8c27){_0x2f53c4=_0x2f53c4-0x197;var _0x488435=_0x4884();var _0x2cb1b9=_0x488435[_0x2f53c4];if(_0x2cb1['hzBVJw']===undefined){var _0xab9ec7=function(_0xc8ba29){var _0x106b9b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4838ff='',_0x4e6351='';for(var _0xe7d241=0x0,_0x2544b3,_0x4bf744,_0x329d63=0x0;_0x4bf744=_0xc8ba29['charAt'](_0x329d63++);~_0x4bf744&&(_0x2544b3=_0xe7d241%0x4?_0x2544b3*0x40+_0x4bf744:_0x4bf744,_0xe7d241++%0x4)?_0x4838ff+=String['fromCharCode'](0xff&_0x2544b3>>(-0x2*_0xe7d241&0x6)):0x0){_0x4bf744=_0x106b9b['indexOf'](_0x4bf744);}for(var _0x547fba=0x0,_0x40cdd6=_0x4838ff['length'];_0x547fba<_0x40cdd6;_0x547fba++){_0x4e6351+='%'+('00'+_0x4838ff['charCodeAt'](_0x547fba)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4e6351);};_0x2cb1['lURvpn']=_0xab9ec7,_0x2cb1['bZthqP']={},_0x2cb1['hzBVJw']=!![];}var _0x55e31d=_0x488435[0x0],_0x25a52a=_0x2f53c4+_0x55e31d,_0x1f384a=_0x2cb1['bZthqP'][_0x25a52a];return!_0x1f384a?(_0x2cb1b9=_0x2cb1['lURvpn'](_0x2cb1b9),_0x2cb1['bZthqP'][_0x25a52a]=_0x2cb1b9):_0x2cb1b9=_0x1f384a,_0x2cb1b9;}var _0x3264ab=_0x2cb1;function _0x4884(){var _0x5582c5=['mta5oti3mLrREg9Lvq','mtK4otC4m1j6zLr3Aq','nJu1mZC1sgjsqKH2','lI4VlI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mteWodGYCwLOz2fs','mJiYmtbly1DeyMq','D3jPDgu','zMLUza','zxHPDa','zxHLy1bHDgG','C3rKzxjY','mJKYsufrBhn3','Aw5OzxjPDa','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mZjStwDXALi','AM9PBG','mJa5mJe5ne9mCeThtG','ntm1nZm0Cu9iBuXq'];_0x4884=function(){return _0x5582c5;};return _0x4884();}(function(_0x40d440,_0x5e1cc8){var _0x24d50b={_0x25a481:0x1a2,_0x1b3722:0x19c,_0x3e1887:0x197,_0x2c07fe:0x199,_0x46c69b:0x198},_0xe12437=_0x2cb1,_0x2502c3=_0x40d440();while(!![]){try{var _0x20384a=parseInt(_0xe12437(0x1a8))/0x1+parseInt(_0xe12437(0x19b))/0x2+parseInt(_0xe12437(0x1a7))/0x3+-parseInt(_0xe12437(_0x24d50b._0x25a481))/0x4*(-parseInt(_0xe12437(_0x24d50b._0x1b3722))/0x5)+-parseInt(_0xe12437(_0x24d50b._0x3e1887))/0x6+-parseInt(_0xe12437(_0x24d50b._0x2c07fe))/0x7+parseInt(_0xe12437(0x1a5))/0x8*(-parseInt(_0xe12437(_0x24d50b._0x46c69b))/0x9);if(_0x20384a===_0x5e1cc8)break;else _0x2502c3['push'](_0x2502c3['shift']());}catch(_0x37ecd2){_0x2502c3['push'](_0x2502c3['shift']());}}}(_0x4884,0x6e446));import{fileURLToPath}from'url';import{dirname,resolve}from'path';import{spawn}from'child_process';import{existsSync}from'fs';var here=dirname(fileURLToPath(import.meta.url)),candidates=[resolve(here,_0x3264ab(0x1a4)),resolve(here,_0x3264ab(0x19a))],serverEntry=candidates[_0x3264ab(0x19e)](_0x4838ff=>existsSync(_0x4838ff));!serverEntry&&(process[_0x3264ab(0x1a1)][_0x3264ab(0x19d)]('serve-fixture:\x20cannot\x20locate\x20fixture\x20server\x20entry.\x20Tried:\x0a'+candidates['map'](_0x4e6351=>'\x20\x20'+_0x4e6351+'\x0a')[_0x3264ab(0x1a6)]('')+'Did\x20you\x20publish\x20without\x20examples/fixtures/?\x0a'),process[_0x3264ab(0x19f)](0x1));var child=spawn(process[_0x3264ab(0x1a0)],[serverEntry,...process['argv']['slice'](0x2)],{'stdio':_0x3264ab(0x1a3)});child['on'](_0x3264ab(0x19f),_0xe7d241=>process[_0x3264ab(0x19f)](_0xe7d241??0x1));
@@ -1 +1 @@
1
- const _0x25fe25=_0x572c;(function(_0x1a66e0,_0xcb7b10){const _0x375d14={_0x120ce0:0xf8,_0x218af0:0xd5,_0x58bb99:0xb4,_0x1602fe:0xd3,_0x1b5098:0xf4,_0x3180ef:0xdb},_0x59e32f=_0x572c,_0x5d2925=_0x1a66e0();while(!![]){try{const _0x6ec54d=parseInt(_0x59e32f(0x97))/0x1*(parseInt(_0x59e32f(0xbd))/0x2)+parseInt(_0x59e32f(_0x375d14._0x120ce0))/0x3*(parseInt(_0x59e32f(_0x375d14._0x218af0))/0x4)+-parseInt(_0x59e32f(_0x375d14._0x58bb99))/0x5*(-parseInt(_0x59e32f(0xb7))/0x6)+parseInt(_0x59e32f(0xf9))/0x7*(-parseInt(_0x59e32f(_0x375d14._0x1602fe))/0x8)+parseInt(_0x59e32f(_0x375d14._0x1b5098))/0x9+parseInt(_0x59e32f(0xd1))/0xa+-parseInt(_0x59e32f(_0x375d14._0x3180ef))/0xb;if(_0x6ec54d===_0xcb7b10)break;else _0x5d2925['push'](_0x5d2925['shift']());}catch(_0x2ede1d){_0x5d2925['push'](_0x5d2925['shift']());}}}(_0x2a3c,0x8e938));var __defProp=Object[_0x25fe25(0xa5)],__name=(_0x5774d3,_0x1484bd)=>__defProp(_0x5774d3,_0x25fe25(0xb5),{'value':_0x1484bd,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x1a143b}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0xca2c35={_0x3865b9:0xde},_0x2daa67=_0x25fe25;for(const _0x3a81e9 of[probeChrome,probeEdge,probeChromeBeta]){const _0x143575=_0x3a81e9();if(_0x143575[_0x2daa67(_0xca2c35._0x3865b9)]!==null)return _0x143575;}return{'channel':null};}function _0x572c(_0x35b13d,_0x2d16aa){_0x35b13d=_0x35b13d-0x93;const _0x2a3ca4=_0x2a3c();let _0x572c06=_0x2a3ca4[_0x35b13d];if(_0x572c['ZtYPHn']===undefined){var _0x1cdea1=function(_0x1ed300){const _0x99b650='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a143b='',_0x5774d3='';for(let _0x1484bd=0x0,_0x3a81e9,_0x143575,_0x341462=0x0;_0x143575=_0x1ed300['charAt'](_0x341462++);~_0x143575&&(_0x3a81e9=_0x1484bd%0x4?_0x3a81e9*0x40+_0x143575:_0x143575,_0x1484bd++%0x4)?_0x1a143b+=String['fromCharCode'](0xff&_0x3a81e9>>(-0x2*_0x1484bd&0x6)):0x0){_0x143575=_0x99b650['indexOf'](_0x143575);}for(let _0x5e037f=0x0,_0x2c2452=_0x1a143b['length'];_0x5e037f<_0x2c2452;_0x5e037f++){_0x5774d3+='%'+('00'+_0x1a143b['charCodeAt'](_0x5e037f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5774d3);};_0x572c['LtzChj']=_0x1cdea1,_0x572c['ucubuj']={},_0x572c['ZtYPHn']=!![];}const _0x2bf216=_0x2a3ca4[0x0],_0x1e43ac=_0x35b13d+_0x2bf216,_0x1a359b=_0x572c['ucubuj'][_0x1e43ac];return!_0x1a359b?(_0x572c06=_0x572c['LtzChj'](_0x572c06),_0x572c['ucubuj'][_0x1e43ac]=_0x572c06):_0x572c06=_0x1a359b,_0x572c06;}__name(probeSystemBrowser,_0x25fe25(0xba));function probeChrome(){const _0x4f7bfb={_0x5b1f0b:0xc9},_0xc325d3=_0x25fe25,_0x341462=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x341462)return{'channel':_0xc325d3(_0x4f7bfb._0x5b1f0b),'path':_0x341462,'label':_0xc325d3(0xca)};return{'channel':null};}__name(probeChrome,_0x25fe25(0x95));function probeEdge(){const _0x2bfa1f={_0x39c597:0xdc},_0x54217a=_0x25fe25,_0x5e037f=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x5e037f)return{'channel':_0x54217a(_0x2bfa1f._0x39c597),'path':_0x5e037f,'label':_0x54217a(0xe5)};return{'channel':null};}__name(probeEdge,'probeEdge');function probeChromeBeta(){const _0x7881ae=_0x25fe25,_0x2c2452=firstExistingPath(CHROME_BETA_PATHS);if(_0x2c2452)return{'channel':_0x7881ae(0x9b),'path':_0x2c2452,'label':_0x7881ae(0xb6)};return{'channel':null};}__name(probeChromeBeta,_0x25fe25(0x9f));var CHROME_PATHS=((()=>{const _0xea51eb={_0x1324f0:0xcb,_0x5ca95f:0x96,_0x28cbd4:0xf2,_0xfb4637:0xad},_0x50173c=_0x25fe25;switch(process[_0x50173c(0xd4)]){case'darwin':return['/Applications/Google\x20Chrome.app/Contents/MacOS/Google\x20Chrome'];case _0x50173c(_0xea51eb._0x1324f0):return[process[_0x50173c(_0xea51eb._0x5ca95f)][_0x50173c(0xe9)]+_0x50173c(_0xea51eb._0x28cbd4),process['env']['ProgramFiles(x86)']+_0x50173c(_0xea51eb._0x28cbd4),process['env'][_0x50173c(_0xea51eb._0xfb4637)]+_0x50173c(0xf2)];default:return[_0x50173c(0xa4),'/usr/bin/google-chrome-stable',_0x50173c(0xf7),'/usr/bin/chromium','/usr/bin/chromium-browser'];}})()),CHROME_BIN_NAMES=['google-chrome','google-chrome-stable','chromium',_0x25fe25(0xc1)],EDGE_PATHS=((()=>{const _0x1cb05c={_0x24199d:0xe0,_0x3aade2:0xcb},_0xa65302=_0x25fe25;switch(process[_0xa65302(0xd4)]){case _0xa65302(0xbf):return[_0xa65302(_0x1cb05c._0x24199d)];case _0xa65302(_0x1cb05c._0x3aade2):return[process[_0xa65302(0x96)]['ProgramFiles']+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe',process[_0xa65302(0x96)]['ProgramFiles(x86)']+_0xa65302(0xc6)];default:return['/usr/bin/microsoft-edge',_0xa65302(0xc5)];}})()),EDGE_BIN_NAMES=['microsoft-edge',_0x25fe25(0xbc)],CHROME_BETA_PATHS=((()=>{const _0xfa8750={_0x473c8a:0xe9,_0x54b7f2:0xcf},_0x2bf419=_0x25fe25;switch(process[_0x2bf419(0xd4)]){case _0x2bf419(0xbf):return[_0x2bf419(0xb3)];case'win32':return[process[_0x2bf419(0x96)][_0x2bf419(_0xfa8750._0x473c8a)]+_0x2bf419(_0xfa8750._0x54b7f2)];default:return[_0x2bf419(0xa8)];}})());function firstExistingPath(_0x48f46b){const _0xc48728=_0x25fe25;for(const _0x49a995 of _0x48f46b){if(!_0x49a995||_0x49a995[_0xc48728(0xa7)](_0xc48728(0xa1)))continue;if(existsSync(_0x49a995))return _0x49a995;}return null;}__name(firstExistingPath,_0x25fe25(0xe8));function whichOf(_0x4ed8e2){const _0x40e4c8={_0x209618:0xcb,_0x148d59:0xbb,_0x10515b:0x99,_0x4fc4a8:0xb2,_0x2441ce:0x9e},_0x482a1b=_0x25fe25;if(process[_0x482a1b(0xd4)]===_0x482a1b(_0x40e4c8._0x209618))return void 0x0;for(const _0xf5e2c4 of _0x4ed8e2){try{const _0x30ac48=execFileSync(_0x482a1b(_0x40e4c8._0x148d59),[_0xf5e2c4],{'encoding':_0x482a1b(_0x40e4c8._0x10515b)})[_0x482a1b(_0x40e4c8._0x4fc4a8)]();if(_0x30ac48[_0x482a1b(_0x40e4c8._0x2441ce)]>0x0&&existsSync(_0x30ac48))return _0x30ac48;}catch{}}return void 0x0;}__name(whichOf,_0x25fe25(0xab));function runEnvironmentChecks(_0x482d20={}){const _0x553b4a={_0x11360b:0xd7},_0x36b48d=_0x25fe25,_0x1adcea=_0x482d20[_0x36b48d(_0x553b4a._0x11360b)]??process[_0x36b48d(0xd7)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x1adcea)];}__name(runEnvironmentChecks,_0x25fe25(0xb8));function checkNodeVersion(){const _0x56ebd8={_0x5429d8:0x94,_0x2fc0d5:0xb0,_0x34fdf3:0xae,_0x106d28:0x9d},_0x4ee876=_0x25fe25,_0x4d08fb=process[_0x4ee876(_0x56ebd8._0x5429d8)]['node'],_0x33392b=Number(_0x4d08fb[_0x4ee876(_0x56ebd8._0x2fc0d5)]('.')[0x0]);if(!Number[_0x4ee876(_0x56ebd8._0x34fdf3)](_0x33392b)||_0x33392b<0x14)return{'name':_0x4ee876(0xdd),'severity':'error','message':_0x4ee876(_0x56ebd8._0x106d28)+_0x4d08fb+')','detail':'Install\x20Node\x2020+\x20via\x20nvm\x20/\x20fnm\x20/\x20volta\x20and\x20re-run.'};return{'name':'Node.js\x20version','severity':'ok','message':_0x4d08fb};}__name(checkNodeVersion,_0x25fe25(0xce));function checkSystemBrowser(){const _0x4c466c={_0x3889f7:0xde,_0x28ed29:0xd2,_0x41a954:0xe3},_0x6c9872=_0x25fe25,_0x1f9c7b=probeSystemBrowser();if(_0x1f9c7b[_0x6c9872(_0x4c466c._0x3889f7)]!==null)return{'name':_0x6c9872(0xe7),'severity':'ok','message':_0x1f9c7b[_0x6c9872(0xe2)]+_0x6c9872(_0x4c466c._0x28ed29),'detail':_0x1f9c7b[_0x6c9872(0x9c)]};return{'name':'System\x20browser','severity':_0x6c9872(_0x4c466c._0x41a954),'message':'no\x20Chrome\x20/\x20Edge\x20/\x20Chromium\x20detected','detail':_0x6c9872(0xb1)};}__name(checkSystemBrowser,'checkSystemBrowser');function checkWritableCwd(_0x42e4f7){const _0x40c60b={_0x12dc48:0xc0,_0xb8a753:0xc4},_0x2edade=_0x25fe25;if(!_0x1a143b(_0x42e4f7))return{'name':'Target\x20directory','severity':_0x2edade(0xf0),'message':_0x2edade(0x93)+_0x42e4f7+'\x20does\x20not\x20exist','detail':_0x2edade(_0x40c60b._0x12dc48)};return{'name':_0x2edade(_0x40c60b._0xb8a753),'severity':'ok','message':_0x42e4f7};}function _0x2a3c(){const _0x4b0f6e=['D2HPy2G','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','mte1odK5ofv0AMzruq','y2HLy2TxCML0ywjSzun3za','zgfYD2LU','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','y2HYB21PDw0TyNjVD3nLCG','C3vWCg9YDgvKs2LUzhm','ls1IywLS','vgfYz2v0igrPCMvJDg9YEq','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','ls1ICMvHAW','yxv0Ag9Y','y2HYB21L','r29Vz2XLienOCM9Tzq','D2LUmZi','A2LUza','ChvZAa','y2HLy2ToB2rLvMvYC2LVBG','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','yxv0Ag9YAw5N','mZK1otu2meXjy1vXCG','igzVDw5K','mtzzEhHoEgy','CgXHDgzVCM0','mtjWquztAwS','AM9PBG','y3DK','ztjL','CgfYC2u','ls13B3jRzxjZpq','mta1mZC5nJDkz1PcB2u','BxnLzgDL','tM9Kzs5QCYb2zxjZAw9U','y2HHBM5LBa','ChjVAMvJDfjVB3q','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','v2vIuNvUBMvYqwrHChrLCG','BgfIzwW','D2fYBMLUzW','D29YA2vYCW','twLJCM9ZB2z0ievKz2u','C3vMzML4','u3LZDgvTigjYB3DZzxi','zMLYC3rfEgLZDgLUz1bHDgG','uhjVz3jHBuzPBgvZ','vu5pvevtvf9iruferuq','CMvZB2X2zq','B2jQzwn0','C2nOzwr1BgvZ','qhvUB3rLC3qVD2vI','yxbWu2vYDMvYqxjNCW','zxjYB3i','zg9JDg9Y','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','C2nOzwr1BgvZqxjNCW','oda4mJK5mgz5C0Lvta','C3rYAw5N','DMfSDwvZ','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','mJiZmta3zhPUvezJ','mJeXmteXnMnjCfjXqG','DgfYz2v0ia','DMvYC2LVBNm','ChjVyMvdAhjVBwu','zw52','munZEvHJwq','CMvZB2X2zujPBG','DxrMoa','zgvIDwC','y2HYB21LlwjLDge','Cgf0Aa','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','BgvUz3rO','ChjVyMvdAhjVBwvczxrH','yMLU','Dw5KzwzPBMvK','ls1QC29U','y29SBgvJDgLVBG','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','zgvMAw5LuhjVCgvYDhK','yNvPBgrbCMDZ','C3rHCNrZv2L0Aa','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','Dw5VDgvZDc13zwi','l3bHy2THz2uUANnVBG','D2HPy2HpzG','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','te9dquXbufbeqvrb','AxngAw5PDgu','yNvPBgrfBNy','C3bSAxq','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','DhjPBq','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','mZqXnxfnuLfcCa','BMfTzq','r29Vz2XLienOCM9TzsbczxrH','ndi2C0nIthD1','CNvUrw52AxjVBM1LBNrdAgvJA3m','C2nLBMfYAw8','ChjVyMvtExn0zw1cCM93C2vY'];_0x2a3c=function(){return _0x4b0f6e;};return _0x2a3c();}__name(checkWritableCwd,_0x25fe25(0xbe));var PACKAGE_NAME=_0x25fe25(0xee),WebRunnerAdapter=class{static{__name(this,_0x25fe25(0xe1));}[_0x25fe25(0xb5)]=PACKAGE_NAME;[_0x25fe25(0xe6)]='';[_0x25fe25(0x9a)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0x25fe25(0xc2)]=[_0x25fe25(0xb9),'collection','authoring'];[_0x25fe25(0x98)](){const _0x2ca9af={_0x5dce20:0xac},_0x3e8087=_0x25fe25,_0x4acc94=createRequire(import.meta.url),_0x395ebc=_0x4acc94[_0x3e8087(0xeb)](PACKAGE_NAME+_0x3e8087(0xaa)),_0x51bf80=JSON[_0x3e8087(0xd9)](readFileSync(_0x395ebc,_0x3e8087(0x99))),_0x2403e4=pickBin(_0x51bf80);if(!_0x2403e4)throw new Error(PACKAGE_NAME+_0x3e8087(_0x2ca9af._0x5dce20));return join(dirname(_0x395ebc),_0x2403e4);}[_0x25fe25(0xa6)](_0x29d9ce){const _0x5f3868={_0xc8998a:0xb9,_0x39d945:0xd8,_0x36dead:0x9a,_0x1ca748:0xcd,_0x70c7e7:0xc7,_0x1b2c1c:0xd6,_0x42fe94:0xcc,_0x2aea3b:0xa3,_0x306a9c:0xe4,_0x282a39:0xc3,_0x513fda:0xd0,_0x4f671a:0xc8,_0x583234:0xcc},_0x4bfb2f=_0x25fe25;if(_0x29d9ce[_0x4bfb2f(0xcc)]===_0x4bfb2f(_0x5f3868._0xc8998a)){const _0x12b656=[_0x4bfb2f(_0x5f3868._0x39d945),_0x29d9ce[_0x4bfb2f(0xb9)]];if(_0x29d9ce[_0x4bfb2f(_0x5f3868._0x36dead)])_0x12b656[_0x4bfb2f(0xcd)]('--debug');return _0x29d9ce['breakpoints']&&_0x29d9ce['breakpoints'][_0x4bfb2f(0x9e)]>0x0&&_0x12b656[_0x4bfb2f(_0x5f3868._0x1ca748)](_0x4bfb2f(_0x5f3868._0x70c7e7),_0x29d9ce['breakpoints'][_0x4bfb2f(_0x5f3868._0x1b2c1c)](',')),_0x12b656;}if(_0x29d9ce[_0x4bfb2f(_0x5f3868._0x42fe94)]==='collection'){const _0x3766d6=['collection',_0x29d9ce[_0x4bfb2f(_0x5f3868._0x2aea3b)]];_0x29d9ce['workers']!==void 0x0&&_0x29d9ce[_0x4bfb2f(_0x5f3868._0x306a9c)]>0x1&&_0x3766d6['push'](_0x4bfb2f(0xda)+_0x29d9ce['workers']);if(_0x29d9ce['bail'])_0x3766d6[_0x4bfb2f(0xcd)](_0x4bfb2f(_0x5f3868._0x282a39));return _0x3766d6;}if(_0x29d9ce[_0x4bfb2f(0xcc)]===_0x4bfb2f(_0x5f3868._0x513fda))return[_0x4bfb2f(_0x5f3868._0x4f671a),_0x29d9ce[_0x4bfb2f(0xb9)]];const _0x42b162=_0x29d9ce;throw new UnsupportedRunKindError(_0x42b162[_0x4bfb2f(_0x5f3868._0x583234)],this['name']);}[_0x25fe25(0xaf)](_0x5658cc){const _0x8f8202=_0x25fe25,_0x27789d={};if(_0x5658cc['headed'])_0x27789d[_0x8f8202(0xea)]='1';return _0x27789d;}[_0x25fe25(0xef)](){return['app-server'];}[_0x25fe25(0xf3)](){const _0x403619={_0x257e7d:0xed},_0x13bae6=_0x25fe25;return[_0x13bae6(_0x403619._0x257e7d),_0x13bae6(0xa2)];}async[_0x25fe25(0xf1)](_0x58549c){const _0x4562cf={_0x1ad4e4:0xdf},_0x455340=_0x25fe25;return runEnvironmentChecks({'cwd':_0x58549c[_0x455340(_0x4562cf._0x1ad4e4)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x1e6698){const _0x2f2546={_0x5ceb13:0xf5,_0x5bd0ce:0xa0,_0x2c121f:0xf6},_0x2ceec6=_0x25fe25;if(typeof _0x1e6698['bin']===_0x2ceec6(_0x2f2546._0x5ceb13))return _0x1e6698['bin'];if(_0x1e6698[_0x2ceec6(0xa0)]&&typeof _0x1e6698[_0x2ceec6(_0x2f2546._0x5bd0ce)]===_0x2ceec6(0xec))return _0x1e6698[_0x2ceec6(0xa0)][_0x2ceec6(0xa9)]??Object[_0x2ceec6(_0x2f2546._0x2c121f)](_0x1e6698['bin'])[0x0]??null;return null;}__name(pickBin,'pickBin');export{web_runner_adapter_default as default,webRunnerAdapter};
1
+ const _0x5b719e=_0x1c71;(function(_0x25f1af,_0x48b7d1){const _0x26598={_0x2c66dd:0x132,_0x99b28e:0x134,_0x2ae345:0x139,_0x476a8b:0x127,_0x5073d4:0x14f},_0xbef82d=_0x1c71,_0x4fdaee=_0x25f1af();while(!![]){try{const _0x57deb8=parseInt(_0xbef82d(0x184))/0x1*(parseInt(_0xbef82d(0x163))/0x2)+parseInt(_0xbef82d(_0x26598._0x2c66dd))/0x3*(parseInt(_0xbef82d(0x11b))/0x4)+parseInt(_0xbef82d(0x16e))/0x5*(-parseInt(_0xbef82d(0x16a))/0x6)+-parseInt(_0xbef82d(0x155))/0x7*(parseInt(_0xbef82d(_0x26598._0x99b28e))/0x8)+parseInt(_0xbef82d(0x159))/0x9*(-parseInt(_0xbef82d(0x142))/0xa)+parseInt(_0xbef82d(_0x26598._0x2ae345))/0xb*(parseInt(_0xbef82d(_0x26598._0x476a8b))/0xc)+parseInt(_0xbef82d(_0x26598._0x5073d4))/0xd;if(_0x57deb8===_0x48b7d1)break;else _0x4fdaee['push'](_0x4fdaee['shift']());}catch(_0x5d765e){_0x4fdaee['push'](_0x4fdaee['shift']());}}}(_0x5534,0x7103a));var __defProp=Object[_0x5b719e(0x147)],__name=(_0xa51c42,_0x17a880)=>__defProp(_0xa51c42,_0x5b719e(0x149),{'value':_0x17a880,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';function _0x5534(){const _0x557b89=['D2HPy2G','yxv0Ag9Y','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','Dw5VDgvZDc13zwi','ChjVAMvJDfjVB3q','mZe0EefPtNvu','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','ls1IywLS','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','AxngAw5PDgu','yMLU','AM9PBG','mZG0sMXOEgTi','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','C2nOzwr1BgvZqxjNCW','u3LZDgvTigjYB3DZzxi','ntmZmtvZAgPrCuS','yNjLywTWB2LUDhm','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LlMfWCc9dB250zw50CY9nywnpuY9hB29NBguGq2HYB21L','l3bHy2THz2uUANnVBG','C3rYAw5N','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','yNvPBgrfBNy','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','CgfYC2u','ChjVyMvdAhjVBwvczxrH','y2HHBM5LBa','C2nLBMfYAw8','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','vgfYz2v0igrPCMvJDg9YEq','ChjVyMvfzgDL','zxjYB3i','r29Vz2XLienOCM9Tzq','A2LUza','Dw5KzwzPBMvK','y2HYB21PDw0','v2vIuNvUBMvYqwrHChrLCG','igzVDw5K','mti5n2H1EKjYCG','z29Vz2XLlwnOCM9Tzq','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','ndG0nJrhzLHcDeC','zgfYD2LU','C2nOzwr1BgvZ','yMfPBa','BgvUz3rO','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','uhjVz3jHBuzPBgvZkhG4nIK','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','CMvZB2X2zq','l3vZCI9IAw4Vy2HYB21PDw0','y2HYB21PDw0TyNjVD3nLCG','Cgf0Aa','mJG2nZi4v1j3AeL4','yxv0Ag9YAw5N','zg9JDg9Y','BwLJCM9ZB2z0lwvKz2u','y29SBgvJDgLVBG','y3DK','zgvIDwC','ChjVyMvdAhjVBwu','y2HYB21L','C3rHCNrZv2L0Aa','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','m0DIzK1rCa','yxbWu2vYDMvYqxjNCW','mJmYrLfSrwvS','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','BM9Kzq','mJK3EgDKBfvR','ls13B3jRzxjZpq','D2HPy2HpzG','r29Vz2XLienOCM9TzsbczxrH','ztjL','y2HYB21LlwjLDge','CMvZB2X2zujPBG','BgfIzwW','vu5pvevtvf9iruferuq','mJb0qNzmDKC','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','uhjVz3jHBuzPBgvZ','D2fYBMLUzW','zgvMAw5LuhjVCgvYDhK','AgvHzgvK','BMfTzq','zMLYC3rfEgLZDgLUz1bHDgG','ChvZAa','yNvPBgrbCMDZ','ls1Kzwj1zW','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','nJi4nZK3mhP1qLnkBa','igrVzxmGBM90igv4Axn0','zw52','y2HLy2TtExn0zw1cCM93C2vY','CgXHDgzVCM0','D29YA2vYCW','mZaXnJnYtxD4tg8','D2LUmZi','tM9Kzs5QCYb2zxjZAw9U','yxbWlxnLCNzLCG','mZm0mJmZCLHOrerT','qhvUB3rLC3qVD2vI','DgfYz2v0ia','ls1ICMvHAW','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH'];_0x5534=function(){return _0x557b89;};return _0x5534();}import{dirname,join}from'path';function _0x1c71(_0x4e53e3,_0x612063){_0x4e53e3=_0x4e53e3-0x11a;const _0x553403=_0x5534();let _0x1c7187=_0x553403[_0x4e53e3];if(_0x1c71['UldvyA']===undefined){var _0x32c6b8=function(_0x4bfb6b){const _0x13ddd4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x35eddf='',_0xa51c42='';for(let _0x17a880=0x0,_0x38f8cb,_0x197dc5,_0x1f661f=0x0;_0x197dc5=_0x4bfb6b['charAt'](_0x1f661f++);~_0x197dc5&&(_0x38f8cb=_0x17a880%0x4?_0x38f8cb*0x40+_0x197dc5:_0x197dc5,_0x17a880++%0x4)?_0x35eddf+=String['fromCharCode'](0xff&_0x38f8cb>>(-0x2*_0x17a880&0x6)):0x0){_0x197dc5=_0x13ddd4['indexOf'](_0x197dc5);}for(let _0x48554c=0x0,_0x21c999=_0x35eddf['length'];_0x48554c<_0x21c999;_0x48554c++){_0xa51c42+='%'+('00'+_0x35eddf['charCodeAt'](_0x48554c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xa51c42);};_0x1c71['yNEcCU']=_0x32c6b8,_0x1c71['ibECiC']={},_0x1c71['UldvyA']=!![];}const _0x4093ea=_0x553403[0x0],_0x3cd030=_0x4e53e3+_0x4093ea,_0x5e7491=_0x1c71['ibECiC'][_0x3cd030];return!_0x5e7491?(_0x1c7187=_0x1c71['yNEcCU'](_0x1c7187),_0x1c71['ibECiC'][_0x3cd030]=_0x1c7187):_0x1c7187=_0x5e7491,_0x1c7187;}import{existsSync as _0x35eddf}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0x572f2b={_0x104095:0x178},_0x729dc7=_0x5b719e;for(const _0x38f8cb of[probeChrome,probeEdge,probeChromeBeta]){const _0x197dc5=_0x38f8cb();if(_0x197dc5[_0x729dc7(_0x572f2b._0x104095)]!==null)return _0x197dc5;}return{'channel':null};}__name(probeSystemBrowser,'probeSystemBrowser');function probeChrome(){const _0x5265bd={_0x5a1e3c:0x17e},_0x39f54d=_0x5b719e,_0x1f661f=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x1f661f)return{'channel':_0x39f54d(0x12f),'path':_0x1f661f,'label':_0x39f54d(_0x5265bd._0x5a1e3c)};return{'channel':null};}__name(probeChrome,_0x5b719e(0x12e));function probeEdge(){const _0x48554c=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x48554c)return{'channel':'msedge','path':_0x48554c,'label':'Microsoft\x20Edge'};return{'channel':null};}__name(probeEdge,_0x5b719e(0x17c));function probeChromeBeta(){const _0x5400f6={_0x4da1cb:0x13e,_0x422d5d:0x13c},_0x4d3c75=_0x5b719e,_0x21c999=firstExistingPath(CHROME_BETA_PATHS);if(_0x21c999)return{'channel':_0x4d3c75(_0x5400f6._0x4da1cb),'path':_0x21c999,'label':_0x4d3c75(_0x5400f6._0x422d5d)};return{'channel':null};}__name(probeChromeBeta,_0x5b719e(0x177));var CHROME_PATHS=((()=>{const _0x3afaeb={_0x437bd6:0x170,_0x26b783:0x156,_0x20e332:0x145,_0x1624cd:0x173,_0x120f81:0x124,_0x1e0a93:0x16b},_0xdb6b88=_0x5b719e;switch(process[_0xdb6b88(0x153)]){case _0xdb6b88(0x11c):return[_0xdb6b88(_0x3afaeb._0x437bd6)];case _0xdb6b88(_0x3afaeb._0x26b783):return[process['env'][_0xdb6b88(_0x3afaeb._0x20e332)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe',process['env']['ProgramFiles(x86)']+_0xdb6b88(_0x3afaeb._0x1624cd),process[_0xdb6b88(0x151)]['LOCALAPPDATA']+_0xdb6b88(0x173)];default:return['/usr/bin/google-chrome',_0xdb6b88(0x11a),_0xdb6b88(0x136),_0xdb6b88(_0x3afaeb._0x120f81),_0xdb6b88(_0x3afaeb._0x1e0a93)];}})()),CHROME_BIN_NAMES=[_0x5b719e(0x185),_0x5b719e(0x135),_0x5b719e(0x181),_0x5b719e(0x125)],EDGE_PATHS=((()=>{const _0x31c652={_0x214fb3:0x11c,_0x1c7160:0x122,_0x4c9a60:0x121,_0x54cf62:0x131,_0x220e74:0x160},_0x57522d=_0x5b719e;switch(process['platform']){case _0x57522d(_0x31c652._0x214fb3):return[_0x57522d(_0x31c652._0x1c7160)];case _0x57522d(0x156):return[process[_0x57522d(0x151)][_0x57522d(0x145)]+_0x57522d(0x131),process['env'][_0x57522d(_0x31c652._0x4c9a60)]+_0x57522d(_0x31c652._0x54cf62)];default:return[_0x57522d(0x120),_0x57522d(_0x31c652._0x220e74)];}})()),EDGE_BIN_NAMES=[_0x5b719e(0x12a),_0x5b719e(0x17a)],CHROME_BETA_PATHS=((()=>{const _0x1b6359={_0x3e7da8:0x153,_0x124671:0x137,_0x2b33e2:0x145,_0x48da09:0x143,_0x28a591:0x15d},_0x47e44f=_0x5b719e;switch(process[_0x47e44f(_0x1b6359._0x3e7da8)]){case'darwin':return[_0x47e44f(_0x1b6359._0x124671)];case'win32':return[process['env'][_0x47e44f(_0x1b6359._0x2b33e2)]+_0x47e44f(_0x1b6359._0x48da09)];default:return[_0x47e44f(_0x1b6359._0x28a591)];}})());function firstExistingPath(_0x268ed5){const _0x38c5c8=_0x5b719e;for(const _0x27ce8c of _0x268ed5){if(!_0x27ce8c||_0x27ce8c[_0x38c5c8(0x130)](_0x38c5c8(0x180)))continue;if(existsSync(_0x27ce8c))return _0x27ce8c;}return null;}__name(firstExistingPath,_0x5b719e(0x14a));function whichOf(_0x5578f4){const _0x275be4=_0x5b719e;if(process['platform']===_0x275be4(0x156))return void 0x0;for(const _0x2f02bd of _0x5578f4){try{const _0x2495cf=execFileSync(_0x275be4(0x15e),[_0x2f02bd],{'encoding':'utf8'})['trim']();if(_0x2495cf[_0x275be4(0x11f)]>0x0&&existsSync(_0x2495cf))return _0x2495cf;}catch{}}return void 0x0;}__name(whichOf,_0x5b719e(0x13b));function runEnvironmentChecks(_0x120661={}){const _0x144381={_0x391257:0x12c},_0x9fee0e=_0x5b719e,_0x4dede7=_0x120661[_0x9fee0e(0x12c)]??process[_0x9fee0e(_0x144381._0x391257)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x4dede7)];}__name(runEnvironmentChecks,'runEnvironmentChecks');function checkNodeVersion(){const _0xf19d15={_0x5d61e0:0x138,_0x30539d:0x167,_0x3658af:0x17d,_0xd816cc:0x14e,_0x104e6d:0x157},_0x5c836b=_0x5b719e,_0x5aea2f=process['versions'][_0x5c836b(_0xf19d15._0x5d61e0)],_0x2fb5aa=Number(_0x5aea2f['split']('.')[0x0]);if(!Number[_0x5c836b(_0xf19d15._0x30539d)](_0x2fb5aa)||_0x2fb5aa<0x14)return{'name':_0x5c836b(0x157),'severity':_0x5c836b(_0xf19d15._0x3658af),'message':_0x5c836b(0x144)+_0x5aea2f+')','detail':_0x5c836b(_0xf19d15._0xd816cc)};return{'name':_0x5c836b(_0xf19d15._0x104e6d),'severity':'ok','message':_0x5aea2f};}__name(checkNodeVersion,'checkNodeVersion');function checkSystemBrowser(){const _0x3b9f43={_0x3b266e:0x16d,_0x3a1ec7:0x140,_0x130379:0x146,_0x1dcab4:0x175},_0x2a0a95=_0x5b719e,_0x170bb1=probeSystemBrowser();if(_0x170bb1['channel']!==null)return{'name':_0x2a0a95(_0x3b9f43._0x3b266e),'severity':'ok','message':_0x170bb1[_0x2a0a95(_0x3b9f43._0x3a1ec7)]+_0x2a0a95(0x183),'detail':_0x170bb1[_0x2a0a95(0x126)]};return{'name':'System\x20browser','severity':_0x2a0a95(_0x3b9f43._0x130379),'message':'no\x20Chrome\x20/\x20Edge\x20/\x20Chromium\x20detected','detail':_0x2a0a95(_0x3b9f43._0x1dcab4)};}__name(checkSystemBrowser,_0x5b719e(0x152));function checkWritableCwd(_0x325421){const _0x459cec={_0x2ec11b:0x17d,_0x2cac6e:0x166},_0x2bd390=_0x5b719e;if(!_0x35eddf(_0x325421))return{'name':'Target\x20directory','severity':_0x2bd390(_0x459cec._0x2ec11b),'message':_0x2bd390(0x15b)+_0x325421+_0x2bd390(0x150),'detail':_0x2bd390(_0x459cec._0x2cac6e)};return{'name':_0x2bd390(0x17b),'severity':'ok','message':_0x325421};}__name(checkWritableCwd,'checkWritableCwd');var PACKAGE_NAME=_0x5b719e(0x15a),WebRunnerAdapter=class{static{__name(this,_0x5b719e(0x182));}[_0x5b719e(0x149)]=PACKAGE_NAME;['suffix']='';[_0x5b719e(0x12d)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};['supportedKinds']=[_0x5b719e(0x179),_0x5b719e(0x12b),'authoring'];[_0x5b719e(0x13f)](){const _0x5dd629={_0x3b6301:0x171,_0x1375c7:0x176,_0x2061c8:0x164},_0xeb47c1=_0x5b719e,_0x554182=createRequire(import.meta.url),_0x2e72d4=_0x554182[_0xeb47c1(0x123)](PACKAGE_NAME+_0xeb47c1(_0x5dd629._0x3b6301)),_0xa8183c=JSON[_0xeb47c1(_0x5dd629._0x1375c7)](readFileSync(_0x2e72d4,'utf8')),_0x4038af=pickBin(_0xa8183c);if(!_0x4038af)throw new Error(PACKAGE_NAME+_0xeb47c1(_0x5dd629._0x2061c8));return join(dirname(_0x2e72d4),_0x4038af);}[_0x5b719e(0x14c)](_0x2c4d31){const _0x713ab3={_0x462b3d:0x13d,_0x4a4fef:0x179,_0x1273e3:0x14b,_0x55922d:0x14d,_0x933e0c:0x16f,_0x2d77d7:0x11f,_0x19b876:0x15c,_0x5aaa45:0x169,_0x5cfe68:0x12b,_0x45a3d2:0x154,_0x5d4fe9:0x14b,_0x3ccbd2:0x128,_0x49a0d0:0x15f,_0x189e01:0x17f},_0x53e366=_0x5b719e;if(_0x2c4d31['kind']===_0x53e366(0x179)){const _0x24143d=[_0x53e366(_0x713ab3._0x462b3d),_0x2c4d31[_0x53e366(_0x713ab3._0x4a4fef)]];if(_0x2c4d31[_0x53e366(0x12d)])_0x24143d[_0x53e366(_0x713ab3._0x1273e3)](_0x53e366(_0x713ab3._0x55922d));return _0x2c4d31[_0x53e366(_0x713ab3._0x933e0c)]&&_0x2c4d31[_0x53e366(_0x713ab3._0x933e0c)][_0x53e366(_0x713ab3._0x2d77d7)]>0x0&&_0x24143d[_0x53e366(0x14b)](_0x53e366(_0x713ab3._0x19b876),_0x2c4d31[_0x53e366(0x16f)][_0x53e366(_0x713ab3._0x5aaa45)](',')),_0x24143d;}if(_0x2c4d31[_0x53e366(0x17f)]===_0x53e366(_0x713ab3._0x5cfe68)){const _0x2986f2=[_0x53e366(_0x713ab3._0x5cfe68),_0x2c4d31[_0x53e366(0x12b)]];_0x2c4d31[_0x53e366(_0x713ab3._0x45a3d2)]!==void 0x0&&_0x2c4d31[_0x53e366(0x154)]>0x1&&_0x2986f2[_0x53e366(_0x713ab3._0x5d4fe9)](_0x53e366(0x13a)+_0x2c4d31[_0x53e366(0x154)]);if(_0x2c4d31[_0x53e366(0x11e)])_0x2986f2['push'](_0x53e366(0x165));return _0x2986f2;}if(_0x2c4d31[_0x53e366(0x17f)]===_0x53e366(_0x713ab3._0x3ccbd2))return[_0x53e366(_0x713ab3._0x49a0d0),_0x2c4d31[_0x53e366(0x179)]];const _0x51811b=_0x2c4d31;throw new UnsupportedRunKindError(_0x51811b[_0x53e366(_0x713ab3._0x189e01)],this[_0x53e366(0x149)]);}[_0x5b719e(0x174)](_0x12db07){const _0x436030={_0x464cc7:0x148,_0x5eafe8:0x141},_0x3f3438=_0x5b719e,_0x4c4b39={};if(_0x12db07[_0x3f3438(_0x436030._0x464cc7)])_0x4c4b39[_0x3f3438(_0x436030._0x5eafe8)]='1';return _0x4c4b39;}[_0x5b719e(0x133)](){const _0x53dbbe=_0x5b719e;return[_0x53dbbe(0x158)];}[_0x5b719e(0x16c)](){const _0x538f0d=_0x5b719e;return[_0x538f0d(0x11d),'--json'];}async[_0x5b719e(0x129)](_0x2b6e98){const _0x3ece3e={_0x421382:0x162},_0x4d67ef=_0x5b719e;return runEnvironmentChecks({'cwd':_0x2b6e98[_0x4d67ef(_0x3ece3e._0x421382)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x57b68e){const _0x460d06={_0x65a93a:0x168,_0x763a38:0x172},_0x36d7a6=_0x5b719e;if(typeof _0x57b68e[_0x36d7a6(_0x460d06._0x65a93a)]===_0x36d7a6(_0x460d06._0x763a38))return _0x57b68e['bin'];if(_0x57b68e[_0x36d7a6(_0x460d06._0x65a93a)]&&typeof _0x57b68e['bin']==='object')return _0x57b68e['bin'][_0x36d7a6(0x161)]??Object['values'](_0x57b68e[_0x36d7a6(0x168)])[0x0]??null;return null;}__name(pickBin,'pickBin');export{web_runner_adapter_default as default,webRunnerAdapter};
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  status: stable
3
- last_updated: 2026-05-14
3
+ last_updated: 2026-09-03
4
4
  ---
5
5
 
6
6
  # Agent integration
7
7
 
8
- `@unotest/web` ships an MCP server with **39 tools**. This manual covers
8
+ `@unotest/web` ships an MCP server with **50 tools**. This manual covers
9
9
  how to wire it into common MCP clients and what the agent can do once
10
10
  connected.
11
11
 
@@ -27,7 +27,7 @@ connected.
27
27
  ```
28
28
 
29
29
  Claude Code prompts for approval on first start. After approve, the
30
- 39 `mcp__unotest-web__*` tools appear in the agent's tool surface.
30
+ 50 `mcp__unotest-web__*` tools appear in the agent's tool surface.
31
31
 
32
32
  ### Claude Desktop
33
33
 
@@ -56,22 +56,30 @@ echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
56
56
  | npx @unotest/web mcp
57
57
  ```
58
58
 
59
- Should return JSON with `tools: [...44 entries]` (default env: full
59
+ Should return JSON with `tools: [...50 entries]` (default env: full
60
60
  toolset, snapshots on, grounder off).
61
61
 
62
62
  ## Tool catalog
63
63
 
64
- ### Core browser actions (22)
64
+ ### Core lifecycle and observers (9)
65
65
 
66
- Direct equivalents of the DSL surface usable when the agent wants to
67
- drive the page outside a `run_test` (e.g., exploratory navigation,
68
- manual setup).
66
+ Open and close the browser, and read what the agent "sees" — a semantic
67
+ outline, not pixels.
69
68
 
70
- `new_context`, `close_context`, `goto`, `reload`, `get_url`, `get_title`,
71
- `click`, `double_click`, `fill`, `press`, `check`, `uncheck`,
72
- `select_option`, `hover`, `scroll_into_view`, `wait_for`, `wait_for_url`,
73
- `wait_for_text`, `get_page_snapshot`, `get_frame_snapshot`,
74
- `get_aria_snapshot`, `find_element`.
69
+ `new_context`, `close_context`, `get_url`, `get_title`,
70
+ `get_page_snapshot`, `get_frame_snapshot`, `get_aria_snapshot`,
71
+ `find_element`, `check_locator`.
72
+
73
+ There is deliberately **no `click` / `fill` / `goto` tool**. Acting on the
74
+ page goes through `explore_step` (below), which performs the action AND
75
+ records it, so an exploration is always a thing that can be turned into a
76
+ scenario. Per-action tools existed until the recording-mode change and
77
+ were removed: an action nobody recorded left the agent with a page it
78
+ could not explain how it reached.
79
+
80
+ `check_locator({locator, limit?})` evaluates a locator written exactly as
81
+ it appears in a scenario against the live page and reports what it really
82
+ matches — verifying a selector without re-running the test.
75
83
 
76
84
  `get_page_snapshot` / `get_frame_snapshot` return a compact outline of
77
85
  **interactive** elements (action surface). `get_aria_snapshot` returns
@@ -114,7 +122,25 @@ driver runs `core` from the same code. Typical matrices:
114
122
  # local-model driver: UNOTEST_TOOLSET=core UNOTEST_SNAPSHOT=0 UNOTEST_GROUNDER_MODE=local
115
123
  ```
116
124
 
117
- ### Debugger (6)
125
+ ### Exploration (10)
126
+
127
+ The recording loop: every action is performed and written down in one
128
+ call, so the exploration is a draft scenario from the first step.
129
+
130
+ - `explore_start` — begin a session (it opens the browser context itself)
131
+ - `explore_step` — perform ONE action and record it; intent locators are
132
+ resolved here
133
+ - `explore_steps` — several actions in one call, `autoRun` to run the
134
+ result immediately
135
+ - `explore_state` / `explore_steps` — what has been recorded so far
136
+ - `explore_record` — add a step without performing it
137
+ - `explore_remove_step` — drop a recorded step
138
+ - `explore_run_flow` — replay a `flow_*` helper inside the session
139
+ - `explore_stop` — end the session
140
+ - `generate_dsl_from_exploration` — the recording as DSL text
141
+ - `save_exploration_as_test` — write it to `unotest/e2e/<name>.js`
142
+
143
+ ### Debugger (11)
118
144
 
119
145
  The reason most agents pick this package over driving Playwright
120
146
  directly. Detailed workflow in `debugger-tools.md`.
@@ -137,6 +163,11 @@ directly. Detailed workflow in `debugger-tools.md`.
137
163
  event, last failure (with line/col + error), and all local variables.
138
164
  - `abort_runtime` — kill the runtime, release the browser context.
139
165
  - `list_runtimes` — recover a lost `runtimeId`.
166
+ - `record_action` — append an action to a live debug session.
167
+ - `attach_debug_session` / `detach_debug_session` — join the run a human
168
+ is already driving in the viewer, instead of opening a second browser.
169
+ - `take_wheel` / `release_wheel` — take control of that shared session,
170
+ and hand it back.
140
171
 
141
172
  ### Multi-context (4)
142
173
 
@@ -187,6 +218,21 @@ Auto-switch runs **only** under `explore_step` (recording / ad-hoc).
187
218
  - `get_failure_network` — HAR (tier 3 — not yet wired, see
188
219
  `KNOWN_ISSUES.md`)
189
220
 
221
+ ### Reading a box (6)
222
+
223
+ The route these belong to is above, under
224
+ [Reading a run that happened on a box](#reading-a-run-that-happened-on-a-box);
225
+ this is the list.
226
+
227
+ - `box_envs` — environments this read token may look at
228
+ - `box_runs` — run history in one of them (`latest` / `running` /
229
+ `scenario` / `limit`)
230
+ - `box_run` — what happened in one run
231
+ - `box_run_download` — fetch it and unpack its failure bundle into
232
+ `.unotest/failures/`, where the tools above read from
233
+ - `box_queue` — who is waiting, who is running
234
+ - `box_screenshot` — one frame the run captured, as an image
235
+
190
236
  ### `ground_element` (1, experimental, off by default)
191
237
 
192
238
  Registered when `UNOTEST_GROUNDER_MODE` is `local` or `remote` for the
@@ -277,6 +323,13 @@ the last failed call plus recent failing exits. `filter:"layer:resolver"`
277
323
  `filter:"tool:explore_step"` → recent events for that tool. `limit` caps
278
324
  the count (default 50).
279
325
 
326
+ ### `open_viewer` (1)
327
+
328
+ Start the local viewer, or return the URL of the one already running (it
329
+ reads the lockfile rather than opening a second). Hand that URL to the
330
+ person you are working with when the answer is easier to look at than to
331
+ describe — a run's step tree, a screenshot strip, a diff of sources.
332
+
280
333
  ## Variable environments (dev / staging / prod)
281
334
 
282
335
  Scenario variables come from `unotest/.env` + `unotest/.secrets`.
@@ -309,6 +362,129 @@ effective `baseUrl`. A missing variable error also lists the searched
309
362
  layers, and every CLI run prints a one-line header with the layers and
310
363
  the effective baseUrl.
311
364
 
365
+ ## Watching a collection run
366
+
367
+ An agent that starts `npx @unotest/web collection <name>` in the
368
+ background gets the CLI's per-scenario lines only when the process
369
+ ends — a piped stdout is block-buffered. The run's own journal is the
370
+ progress source, and it is written line by line as the run goes:
371
+
372
+ ```
373
+ unotest/.runs/<yyyy>/<mm>/<dd>/col-<name>-<id>/steps.jsonl
374
+ ```
375
+
376
+ `.runs` becomes `.runs.<env>` for a `--env <name>` run; the date shard
377
+ is UTC. `col-<name>-` is the collection run's id prefix and the `<id>`
378
+ tail is a timestamp plus random hex, so take the newest directory with
379
+ that prefix once the run has started.
380
+
381
+ The file holds one JSON object per line, four kinds:
382
+
383
+ | `kind` | Fields | When |
384
+ | --- | --- | --- |
385
+ | `collection-run:started` | `runId`, `collection`, `scenarios[]` (in order) | before the first scenario |
386
+ | `collection-run:scenario-started` | `scenario`, `scenarioRunId` | each scenario takes a worker |
387
+ | `collection-run:scenario-finished` | `scenario`, `scenarioRunId`, `outcome` | `completed` / `failed` / `aborted` / `interrupted` |
388
+ | `collection-run:finished` | `outcome` | the run is over — nothing follows |
389
+
390
+ Every line also carries `t` (epoch ms). `scenarioRunId` names the
391
+ scenario's own run directory under the same `.runs` root, where its
392
+ `steps.jsonl` and failure bundle live. A line that does not parse is the
393
+ one being written — retry on the next read, never treat it as the end.
394
+
395
+ ```sh
396
+ tail -f unotest/.runs/2026/09/03/col-smoke-*/steps.jsonl \
397
+ | jq -c 'select(.kind | startswith("collection-run:scenario"))
398
+ | {kind, scenario, outcome}'
399
+ ```
400
+
401
+ This shape is a published contract: the event types
402
+ (`CollectionRunArtifact`) and the file name (`STEPS_FILE`) are exported
403
+ from `@unotest/protocol` under semver, and the box daemon reads the same
404
+ events for its metrics.
405
+
406
+ ## Reading a run that happened on a box
407
+
408
+ The journal above is on your machine. A run ordered with `bundle push
409
+ --run` is not: the box answers with run ids and hangs up, because a suite
410
+ takes minutes and a request held open that long is a timeout, not a
411
+ result. These six tools read the answer back.
412
+
413
+ **The route, end to end.** You pushed and ordered a run:
414
+
415
+ ```sh
416
+ npx @unotest/web bundle push --run --env test --collection smoke
417
+ # → { "runs": [{ "runId": "checkout-mqf3pwr1", ... }] }
418
+ ```
419
+
420
+ 1. `box_run { environment: "acme/test", runId: "checkout-mqf3pwr1" }` —
421
+ status, the failure that ended the run, the results of soft steps, the
422
+ judge's verdicts, notes and logs. For most failures this is the whole
423
+ answer and you stop here.
424
+ 2. It failed and you want the artifacts:
425
+ `box_run_download { environment, runId }`. The run's zip lands in
426
+ `.unotest/box/`, and its failure bundle is unpacked into
427
+ `.unotest/failures/<runId>/<testFn>/` — the directory the reply names.
428
+ 3. From there it is the loop you already know:
429
+ `get_failure_trace { testId: "<that directory>" }`, then
430
+ `get_failure_console`, `get_failure_a11y`, `get_failure_screenshot`,
431
+ and `agent_fix` when you have a fix to propose. **Nothing about them
432
+ changes** — a box failure is debugged with the same tools as a local
433
+ one, which is the entire point of unpacking to that path.
434
+
435
+ Where the route starts differently:
436
+
437
+ - **No run id?** `box_runs { environment }` lists recent runs;
438
+ `{ latest: true }` collapses them to the last run per scenario with its
439
+ failing streak — the answer a single status cannot give. `{ running:
440
+ true }` shows what is in flight.
441
+ - **No environment name?** `box_envs` lists them as
442
+ `<project>/<environment>`, with the bundle each is serving.
443
+ - **The run never started?** `box_queue { environment }` — it is probably
444
+ behind someone else's.
445
+ - **You want to see the page**, not read about it: `box_screenshot
446
+ { environment, runId }` returns a frame as an image. Frames exist when
447
+ the scenario called `screenshot()` or the environment runs with
448
+ `UNOTEST_STEP_SCREENSHOTS=1`; without `step` you get the last one,
449
+ which on a failed run is usually the state that failed.
450
+
451
+ **Credentials.** Reading uses a *personal* read token —
452
+ `UNOTEST_BOX_READ_TOKEN` alongside `UNOTEST_BOX_URL`. It is read-only
453
+ whatever its owner's role on the box, it is revocable, and it is minted
454
+ by a person for themselves on the box's guard. `UNOTEST_BOX_TOKEN` is the
455
+ project's push credential and cannot read runs; without a read token
456
+ every `box_*` tool refuses with a message saying where to get one, rather
457
+ than failing in some way you have to interpret.
458
+
459
+ The token lives in **`unotest/.secrets`**:
460
+
461
+ ```
462
+ UNOTEST_BOX_READ_TOKEN=ubr_...
463
+ ```
464
+
465
+ and the box address in `unotest/.env` as `UNOTEST_BOX_URL`. This matters
466
+ for an agent specifically: your MCP server is started by your editor, so
467
+ a token exported in a shell is a token the server was never handed —
468
+ you would have to edit the editor's own JSON config and reconnect.
469
+
470
+ Both values are resolved on **every call**, not once when the server
471
+ starts: a token minted and written into `unotest/.secrets` mid-session is
472
+ used by the next `box_*` call, with nothing to restart. An exported value
473
+ still wins when there is one.
474
+
475
+ `unotest/.env` is never read for the token: that file travels inside a
476
+ pushed bundle, while `.secrets` does not (it is gitignored, excluded from
477
+ the bundle, and `env push` leaves `UNOTEST_*` at home).
478
+
479
+ **Two answers worth reading carefully.** `unavailable` means the
480
+ environment's viewer is still starting or its bundle failed to install —
481
+ wait and retry, the address is fine. `rate-limited` means wait and send
482
+ the *same* token again; it never means the token is bad.
483
+
484
+ Size: a run with a frame per step is mostly PNGs. `box_run_download
485
+ { screenshots: false }` asks the box to leave them out, so the download
486
+ shrinks rather than just the unpacking.
487
+
312
488
  ## Debug logging
313
489
 
314
490
  Set `UNOTEST_DEBUG=1` in `unotest/.env` and restart the MCP server to