@ranger-testing/ranger-cli 2.5.4-alpha.1f7a251-7 → 2.5.4-alpha.2709b75-22
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.
- package/README.md +36 -14
- package/build/cli.js +1 -1
- package/build/commands/addEnv.js +1 -1
- package/build/commands/authEncrypt.js +1 -1
- package/build/commands/clean.js +1 -1
- package/build/commands/config.js +1 -1
- package/build/commands/deleteProfile.js +1 -0
- package/build/commands/env.js +1 -1
- package/build/commands/feature.js +1 -1
- package/build/commands/hook.js +1 -1
- package/build/commands/hooks/autoPrompt.js +1 -1
- package/build/commands/hooks/disable.js +1 -1
- package/build/commands/hooks/enable.js +1 -1
- package/build/commands/hooks/exitPlanMode.js +1 -1
- package/build/commands/hooks/index.js +1 -1
- package/build/commands/hooks/output.js +1 -1
- package/build/commands/hooks/planReminder.js +1 -1
- package/build/commands/hooks/planStart.js +1 -1
- package/build/commands/hooks/postEdit.js +1 -1
- package/build/commands/hooks/preCompact.js +1 -1
- package/build/commands/hooks/sessionEnd.js +1 -1
- package/build/commands/hooks/sessionStart.js +1 -1
- package/build/commands/hooks/stopHook.js +1 -1
- package/build/commands/index.js +1 -1
- package/build/commands/login.js +1 -1
- package/build/commands/mcpBootstrap.js +1 -1
- package/build/commands/migrateProfile.js +1 -1
- package/build/commands/setup/claude.js +1 -1
- package/build/commands/setup/opencode.js +1 -1
- package/build/commands/setupCi.js +1 -1
- package/build/commands/skillup.js +1 -1
- package/build/commands/start.js +1 -1
- package/build/commands/status.js +1 -1
- package/build/commands/update.js +1 -1
- package/build/commands/updateEnv.js +1 -1
- package/build/commands/useEnv.js +1 -1
- package/build/commands/utils/activeProfile.js +1 -1
- package/build/commands/utils/agentEnv.js +1 -1
- package/build/commands/utils/browserSessionsApi.js +1 -1
- package/build/commands/utils/claudeConfig.js +1 -1
- package/build/commands/utils/claudeOverrideSettings.js +1 -1
- package/build/commands/utils/claudePlugin.js +1 -1
- package/build/commands/utils/cloudProfile.js +1 -1
- package/build/commands/utils/cloudProfileSession.js +1 -1
- package/build/commands/utils/crypto.js +1 -1
- package/build/commands/utils/desirePathLog.js +1 -1
- package/build/commands/utils/deviceAuth.js +1 -1
- package/build/commands/utils/environment.js +1 -1
- package/build/commands/utils/featureApi.js +1 -1
- package/build/commands/utils/fixWebmDuration.js +1 -1
- package/build/commands/utils/gitTracked.js +1 -1
- package/build/commands/utils/keychain.js +1 -1
- package/build/commands/utils/legacyWarning.js +1 -0
- package/build/commands/utils/localAgentInstallationsApi.js +1 -1
- package/build/commands/utils/matchAuthEnvironment.js +1 -1
- package/build/commands/utils/mcpImageBase64.js +1 -1
- package/build/commands/utils/model.js +1 -1
- package/build/commands/utils/opencodeConfig.js +1 -1
- package/build/commands/utils/playwrightCli.js +1 -1
- package/build/commands/utils/profileMessages.js +1 -1
- package/build/commands/utils/profileSetupBanner.js +1 -1
- package/build/commands/utils/projectsConfig.js +1 -1
- package/build/commands/utils/rangerConfig.js +1 -1
- package/build/commands/utils/rangerRoot.js +1 -1
- package/build/commands/utils/resolveProfileContext.js +1 -1
- package/build/commands/utils/resolveProfileUrl.js +1 -1
- package/build/commands/utils/retry.js +1 -1
- package/build/commands/utils/sessionCache.js +1 -1
- package/build/commands/utils/settings.js +1 -1
- package/build/commands/utils/skillContent.js +1 -1
- package/build/commands/utils/skills.js +1 -1
- package/build/commands/utils/stitchWebmFiles.js +1 -1
- package/build/commands/utils/telemetry.js +1 -1
- package/build/commands/utils/tokenRefresh.js +1 -1
- package/build/commands/utils/traceSnapshotMapper.js +1 -1
- package/build/commands/utils/userApi.js +1 -1
- package/build/commands/utils/version.js +1 -1
- package/build/commands/verifyFeature.js +1 -1
- package/build/commands/verifyFeatureCli.js +1 -1
- package/build/skills/ranger/SKILL.md +24 -8
- package/build/skills/ranger/create.md +16 -3
- package/build/skills/ranger/verify.md +37 -18
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(_0x18d502,_0x5b1b28){const _0x3a1625=_0x3816,_0x355bfc=_0x18d502();while(!![]){try{const _0x1720f9=parseInt(_0x3a1625(0x121))/0x1*(-parseInt(_0x3a1625(0x13c))/0x2)+parseInt(_0x3a1625(0x173))/0x3+parseInt(_0x3a1625(0x153))/0x4*(-parseInt(_0x3a1625(0x14c))/0x5)+-parseInt(_0x3a1625(0x188))/0x6+parseInt(_0x3a1625(0x12b))/0x7*(parseInt(_0x3a1625(0x14d))/0x8)+-parseInt(_0x3a1625(0x176))/0x9*(-parseInt(_0x3a1625(0x17b))/0xa)+parseInt(_0x3a1625(0x177))/0xb*(parseInt(_0x3a1625(0x129))/0xc);if(_0x1720f9===_0x5b1b28)break;else _0x355bfc['push'](_0x355bfc['shift']());}catch(_0x2fd36a){_0x355bfc['push'](_0x355bfc['shift']());}}}(_0xd62d,0xaf260));import{mkdir,readFile,readdir,rename,stat}from'fs/promises';import{basename,join}from'path';function _0x3816(_0x36474b,_0x3c2b2d){_0x36474b=_0x36474b-0x103;const _0xd62d62=_0xd62d();let _0x3816af=_0xd62d62[_0x36474b];return _0x3816af;}import{extractBashCommand,parsePlaywrightCliCommand,quoteShellArg,runPlaywrightCliCommand}from'./utils/playwrightCli.js';const PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS=0xea60,PLAYWRIGHT_CLI_PREVIEW_LIMIT=0xf0,VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN=/^(?:\d{2}_.+\.(?:png|ya?ml)|key_.+\.png|session-recording(?:-\d+)?\.webm|trace(?:\.trace)?(?:-\d+)?\.zip|current_snap\.ya?ml)$/i;function truncatePreview(_0x444994,_0x6ba93c=PLAYWRIGHT_CLI_PREVIEW_LIMIT){const _0x2810ff=_0x3816,_0x1d53c3={'AXlRR':function(_0x3f7b3a,_0x48f7dc){return _0x3f7b3a+_0x48f7dc;},'lKgUq':'...'};return _0x444994['length']>_0x6ba93c?_0x1d53c3['AXlRR'](_0x444994[_0x2810ff(0x16e)](0x0,_0x6ba93c),_0x1d53c3['lKgUq']):_0x444994;}function buildCliArtifactPath(_0x4443ff,_0x2f5c78){return join(_0x4443ff,_0x2f5c78);}function toStepDisplayName(_0x43dfdc){const _0x593b49=_0x3816,_0x1836c6=basename(_0x43dfdc)['replace'](/\.(?:png|ya?ml)$/i,'')['replace'](/^key_/i,'')['replace'](/^\d+_/,'')[_0x593b49(0x13b)](/-/g,'\x20');return{'name':_0x1836c6,'isKeyStep':/^key_/i[_0x593b49(0x10a)](basename(_0x43dfdc))};}function extractShellValue(_0x1b35c6){if(!_0x1b35c6)return null;return _0x1b35c6[0x1]??_0x1b35c6[0x2]??_0x1b35c6[0x3]??null;}function extractFilenameOption(_0x58b72f){return extractShellValue(_0x58b72f['match'](/--filename(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/));}function extractFirstCommandArgument(_0xc52965,_0x43df9d){const _0x56a521=_0x3816,_0x1541d6={'IpvAz':'\x5c$&','gPWvr':function(_0x20a298,_0x3012f5){return _0x20a298(_0x3012f5);}},_0x4b2f73=_0x43df9d['replace'](/[.*+?^${}()|[\]\\]/g,_0x1541d6[_0x56a521(0x10b)]);return _0x1541d6['gPWvr'](extractShellValue,_0xc52965['match'](new RegExp('(?:^|\x5cs)'+_0x4b2f73+_0x56a521(0x184))));}function _0xd62d(){const _0x3ff655=['`\x0a\x0a-\x20Write\x20all\x20artifacts\x20under\x20`','commandArgs','open\x20new\x20tab','GWzmy','authorName','hxnbg','--filename=','03_learn-more.png','01_initial-state.png','`\x20and\x20read\x20the\x20snapshot\x20file\x20to\x20inspect\x20the\x20page.\x0a5.\x20**IMMEDIATELY\x20check\x20for\x20blocking\x20HTTP\x20errors\x20before\x20proceeding.**\x0a6.\x20Execute\x20the\x20task\x20step-by-step\x20with\x20Playwright\x20CLI\x20commands.\x0a7.\x20Use\x20`','slice','keys','invocation','clBzV','notes','1734879FykGJu','short','\x20snapshot\x20--filename\x20','1278qtPWjO','33CXDxhS','capture\x20snapshot','\x0a\x0a##\x20Reviewer\x20Feedback\x20to\x20Address\x0aThe\x20following\x20reviewer\x20comments\x20were\x20left\x20on\x20the\x20previous\x20version\x20of\x20this\x20item.\x0aVerify\x20that\x20each\x20concern\x20has\x20been\x20addressed\x20in\x20the\x20current\x20implementation.\x0aFor\x20each\x20comment\x20you\x20believe\x20has\x20been\x20addressed,\x20include\x20its\x20ID\x20(the\x20bracketed\x20value)\x20in\x20the\x20addressedCommentIds\x20array\x20in\x20your\x20output.\x0a\x0a','QgSfP','64360SzxOkV','npxtt','SjYgO','BDeQM','\x20tracing-start`\x0a3.\x20Run\x20`','-\x20[','open\x20new\x20tab\x20','\x20(on\x20element:\x20<','\x20open`,\x20then\x20`','(?:\x5cs+(?:\x22([^\x22]+)\x22|\x27([^\x27]+)\x27|(\x5cS+)))','You\x20are\x20testing\x20browser\x20automation.\x20Your\x20task\x20is\x20simple:\x0a\x0aUse\x20Bash\x20and\x20Playwright\x20CLI\x20only.\x20The\x20browser\x20command\x20prefix\x20is:\x0a','gETUO','env','3227592yKqLVD','pop','\x0a-\x20You\x20may\x20ONLY\x20navigate\x20to\x20paths\x20under\x20this\x20base\x20URL\x20(same\x20protocol,\x20host,\x20and\x20port)\x0a-\x20For\x20example,\x20if\x20the\x20base\x20URL\x20is\x20\x22http://localhost:3000\x22,\x20you\x20can\x20navigate\x20to\x20\x22http://localhost:3000/home\x22,\x20\x22http://localhost:3000/settings\x22,\x20etc.\x0a-\x20DO\x20NOT\x20navigate\x20to\x20any\x20different\x20domain,\x20host,\x20or\x20port\x20under\x20any\x20circumstances\x0a-\x20If\x20documentation\x20or\x20code\x20diffs\x20suggest\x20a\x20path\x20exists\x20(e.g.,\x20\x22/dashboard\x22),\x20you\x20may\x20navigate\x20to\x20that\x20path\x20ONLY\x20under\x20the\x20base\x20URL\x20above\x0a-\x20The\x20base\x20URL\x20above\x20is\x20the\x20ONLY\x20authorized\x20profile\x20for\x20this\x20verification','`\x0a5.\x20Read\x20the\x20snapshot\x20file\x20to\x20find\x20the\x20\x22Learn\x20More\x22\x20link\x20reference\x0a6.\x20Run\x20`','\x0a\x0a1.\x20Run\x20`','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a6.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','\x0a\x0aAfter\x20completing\x20authentication,\x20proceed\x20with\x20the\x20verification\x20task\x20below.\x0aIf\x20authentication\x20fails,\x20return\x20immediately\x20with\x20evaluation\x20\x22blocked\x22\x20and\x20describe\x20the\x20auth\x20failure.','press','\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','click\x20','createdAt','CQALy','test','IpvAz','hook_event_name','**\x20(','`\x0a-\x20`run-code\x20\x22await\x20page.waitForTimeout(1000)\x22`\x20for\x20waits\x20or\x20small\x20custom\x20checks\x0a\x0a##\x20Screenshot\x20Guidelines\x20-\x20IMPORTANT\x0aTake\x20screenshots\x20throughout\x20the\x20verification\x20flow\x20so\x20a\x20human\x20can\x20review\x20it\x20for\x20completeness.\x20Screenshots\x20are\x20your\x20evidence\x20trail.\x0a\x0a**When\x20to\x20take\x20screenshots\x20(use\x20Playwright\x20CLI\x20screenshot):**\x0a-\x20After\x20the\x20initial\x20snapshot\x20(capture\x20starting\x20state)\x0a-\x20Before\x20and\x20after\x20clicking\x20buttons\x20or\x20submitting\x20forms\x0a-\x20When\x20important\x20UI\x20elements\x20appear\x20(modals,\x20notifications,\x20loading\x20states)\x0a-\x20After\x20navigating\x20to\x20different\x20views\x20or\x20pages\x0a-\x20When\x20verifying\x20specific\x20elements\x20exist\x0a-\x20At\x20the\x20final\x20state\x20showing\x20the\x20completed\x20action\x0a\x0a**Screenshot\x20naming:**\x0a-\x20Use\x20descriptive\x20filenames\x20under\x20`','snapshot','key_04_success-state.png','trace.zip','playwright_cli_video_stop','`,\x20then\x20`','ClJrY','tracing-stop','run\x20custom\x20Playwright\x20code','meFEn','textContent','TNhMk','Bash','stderr','authorEmail','numeric','`\x20writes\x20a\x20YAML\x20snapshot\x20you\x20can\x20read\x20for\x20element\x20refs\x0a-\x20`click\x20<ref>`,\x20`fill\x20<ref>\x20\x22text\x22`,\x20`check\x20<ref>`,\x20`press\x20Enter`\x0a-\x20`tab-list`,\x20`tab-select\x20<index>`,\x20`tab-new\x20<url>`\x0a-\x20`screenshot\x20--filename\x20','isFile','\x0a\x0a##\x20Critical:\x20Early\x20Error\x20Detection\x0aAfter\x20step\x202\x20(taking\x20initial\x20snapshot),\x20IMMEDIATELY\x20check\x20for\x20blocking\x20HTTP\x20errors:\x0a\x0a**Blocking\x20errors\x20to\x20detect:**\x0a-\x20HTTP\x20404:\x20\x22404\x22,\x20\x22Not\x20Found\x22,\x20\x22Page\x20not\x20found\x22,\x20\x22does\x20not\x20exist\x22\x0a-\x20HTTP\x20500:\x20\x22500\x22,\x20\x22Internal\x20Server\x20Error\x22,\x20\x22Server\x20Error\x22,\x20\x22Something\x20went\x20wrong\x22\x0a-\x20HTTP\x20400:\x20\x22400\x22,\x20\x22Bad\x20Request\x22,\x20\x22Invalid\x20request\x22\x0a\x0a**Also\x20check\x20for:**\x0a-\x20Framework\x20error\x20pages\x20(Next.js\x20error\x20boundary,\x20React\x20error\x20page,\x20\x22Application\x20error\x22)\x0a-\x20Completely\x20blank/empty\x20pages\x20with\x20no\x20content\x0a-\x20\x22Cannot\x20GET\x20/path\x22\x20messages\x0a\x0a**If\x20ANY\x20blocking\x20error\x20is\x20detected:**\x0a1.\x20DO\x20NOT\x20continue\x20with\x20the\x20task\x0a2.\x20Return\x20IMMEDIATELY\x20with\x20evaluation:\x20\x22blocked\x22\x0a3.\x20Set\x20evaluationReason\x20to\x20describe\x20the\x20specific\x20error\x20(e.g.,\x20\x22HTTP\x20404\x20-\x20Page\x20not\x20found\x20at\x20/dashboard\x22)\x0a4.\x20Include\x20the\x20error\x20in\x20issues\x20array\x20with\x20severity:\x20\x22BLOCKER\x22\x20and\x20appropriate\x20type\x20(HTTP_404,\x20HTTP_500,\x20HTTP_400,\x20or\x20NAVIGATION_ERROR)\x0a\x0aThis\x20early\x20exit\x20prevents\x20wasting\x20time\x20on\x20tasks\x20that\x20cannot\x20succeed\x20due\x20to\x20fundamental\x20errors.','507082HjLGLk','close','tool_call','canonicalFlow','bfMxk','trackPhaseEnd','rnaUL','selector','6054564iSvBpD','KohhG','14MopNIV','open','02_learn-more.yml','kbdsU','select\x20tab','GbsBh','target','split','stop\x20video\x20recording','jbunm','00_mozilla-homepage.yml','\x20run-code\x20\x22<playwright\x20code>\x22`.\x0a7.\x20Do\x20not\x20run\x20`close`,\x20`tracing-stop`,\x20or\x20`video-stop`;\x20the\x20host\x20finalizes\x20the\x20session\x20and\x20artifacts.\x0a8.\x20After\x20completing\x20the\x20verification,\x20evaluate\x20whether\x20the\x20result\x20adequately\x20verifies\x20the\x20scenario','MSYIy','wiRKT','CAJvN','playwright-cli','replace','2xEGQBF','name','tool_name','length','map','\x20run-code\x20\x22<playwright\x20code>\x22`.\x0a9.\x20Do\x20not\x20run\x20`close`,\x20`tracing-stop`,\x20or\x20`video-stop`;\x20the\x20host\x20finalizes\x20the\x20session\x20and\x20artifacts.\x0a10.\x20After\x20completing\x20the\x20verification,\x20evaluate\x20whether\x20the\x20result\x20adequately\x20verifies\x20the\x20scenario','set','YOjPz','key_03_success-state.png','[ranger-verification-agent]\x20','`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a5.\x20Run\x20`','click','WtXBv','##\x20App\x20Context\x0aYou\x20are\x20connected\x20to\x20a\x20desktop\x20application\x20via\x20CDP\x20(Chrome\x20DevTools\x20Protocol)\x20at\x20','##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`','video-start','19250ZAKMKL','647304lzQXQg','\x20screenshot\x20--filename\x20','DYmCP','`\x0a9.\x20Run\x20`','trace.trace.zip','UBVcB','1460BxLZhq','OLIni','join','error','ckGUf','open\x20browser','content','EAcfj','\x0a\x0a##\x20Task\x20to\x20Execute\x0a','tool_input','\x20open\x20','FzMJW','Reviewer','sort','01_initial.yml','FXRJQ','check'];_0xd62d=function(){return _0x3ff655;};return _0xd62d();}function formatCommandTarget(_0x4cd515){const _0x352ccf=_0x3816;if(!_0x4cd515)return _0x352ccf(0x131);if(/^e\d+$/i[_0x352ccf(0x10a)](_0x4cd515))return'ref\x20'+_0x4cd515;return JSON['stringify'](truncatePreview(_0x4cd515,0x78));}function formatPlaywrightCliLog(_0x93a6c1,_0x5beca8){const _0x5c2113=_0x3816,_0x5c453a={'qpzZr':_0x5c2113(0x12c),'meFEn':function(_0x2a1dcb,_0xbf6c87,_0x141476){return _0x2a1dcb(_0xbf6c87,_0x141476);},'DhDON':'tracing-start','wiRKT':'start\x20tracing','xhEaK':'start\x20video\x20recording','CQALy':_0x5c2113(0x133),'lhnJI':_0x5c2113(0x10f),'qsnDA':function(_0x21c7eb,_0x19f4e0){return _0x21c7eb(_0x19f4e0);},'HyRtZ':function(_0x532b9f,_0x3c1bdc){return _0x532b9f(_0x3c1bdc);},'YJXkN':_0x5c2113(0x163),'SXFeU':'fill','OLIni':function(_0x46bd4c,_0x1d161a){return _0x46bd4c(_0x1d161a);},'RKtoZ':'tab-select','EVJnL':_0x5c2113(0x12f)};switch(_0x5beca8){case _0x5c453a['qpzZr']:{const _0x408e46=_0x5c453a[_0x5c2113(0x117)](extractFirstCommandArgument,_0x93a6c1,_0x5beca8);return _0x408e46?'open\x20'+_0x408e46:_0x5c2113(0x158);}case _0x5c453a['DhDON']:return _0x5c453a[_0x5c2113(0x138)];case'tracing-stop':return'stop\x20tracing';case _0x5c2113(0x14b):return _0x5c453a['xhEaK'];case'video-stop':return _0x5c453a[_0x5c2113(0x109)];case _0x5c453a['lhnJI']:{const _0x23d1da=extractFilenameOption(_0x93a6c1);if(!_0x23d1da)return _0x5c2113(0x178);const {name:_0x9fc40e}=toStepDisplayName(_0x23d1da);return'capture\x20snapshot\x20`'+_0x9fc40e+'`';}case'screenshot':{const _0x56dd7a=extractFilenameOption(_0x93a6c1);if(!_0x56dd7a)return'capture\x20screenshot';const {name:_0x40fa74,isKeyStep:_0x2907d4}=_0x5c453a['qsnDA'](toStepDisplayName,_0x56dd7a);return _0x2907d4?'capture\x20key\x20step\x20`'+_0x40fa74+'`':'capture\x20step\x20`'+_0x40fa74+'`';}case _0x5c2113(0x147):return _0x5c2113(0x107)+_0x5c453a['HyRtZ'](formatCommandTarget,extractFirstCommandArgument(_0x93a6c1,_0x5beca8));case _0x5c453a['YJXkN']:return'check\x20'+formatCommandTarget(extractFirstCommandArgument(_0x93a6c1,_0x5beca8));case _0x5c453a['SXFeU']:return'fill\x20'+_0x5c453a[_0x5c2113(0x154)](formatCommandTarget,extractFirstCommandArgument(_0x93a6c1,_0x5beca8));case _0x5c2113(0x105):return'press\x20'+_0x5c453a[_0x5c2113(0x154)](formatCommandTarget,_0x5c453a['meFEn'](extractFirstCommandArgument,_0x93a6c1,_0x5beca8));case'run-code':return _0x5c2113(0x116);case'tab-new':{const _0x31306c=extractFirstCommandArgument(_0x93a6c1,_0x5beca8);return _0x31306c?_0x5c2113(0x181)+_0x31306c:_0x5c2113(0x166);}case _0x5c453a['RKtoZ']:{const _0xe10a13=extractFirstCommandArgument(_0x93a6c1,_0x5beca8);return _0xe10a13?'select\x20tab\x20'+_0xe10a13:_0x5c453a['EVJnL'];}default:return _0x5beca8;}}function extractPlaywrightCliToolDescription(_0x2ab466){const _0x56ce2=_0x3816,_0x567eca={'KohhG':function(_0x2e6bab,_0x129c45){return _0x2e6bab>_0x129c45;}},_0x540bc6=_0x2ab466['description'];if(typeof _0x540bc6!=='string')return null;const _0x41c091=_0x540bc6['trim']()[_0x56ce2(0x13b)](/\s+/g,'\x20');return _0x567eca[_0x56ce2(0x12a)](_0x41c091[_0x56ce2(0x13f)],0x0)?_0x41c091:null;}export function formatPlaywrightCliConsoleLogMessage(_0x541d57,_0x592458,_0x54c27b){const _0x41e450=_0x3816,_0x10a42f={'jCiMM':function(_0xf45fad,_0xdf6f03,_0x22222f){return _0xf45fad(_0xdf6f03,_0x22222f);}},_0x184c6c=_0x10a42f['jCiMM'](formatPlaywrightCliLog,_0x592458,_0x54c27b),_0x2ae345=extractPlaywrightCliToolDescription(_0x541d57);if(!_0x2ae345)return'[playwright-cli]\x20'+_0x184c6c;if(process[_0x41e450(0x187)]['DEBUG'])return _0x41e450(0x145)+_0x2ae345+'\x20('+_0x184c6c+')';return _0x41e450(0x145)+_0x2ae345;}export function buildVerifyFeatureCliDebugPrompt(_0x5b6150,_0x1002f4){const _0x4a0aeb=_0x3816,_0x57f012={'SjYgO':function(_0x48b1c1,_0x1b2b38,_0xfdba39){return _0x48b1c1(_0x1b2b38,_0xfdba39);},'zjdAL':_0x4a0aeb(0x12d),'npxtt':function(_0x39cee9,_0x405e55){return _0x39cee9(_0x405e55);}},_0x545532=_0x57f012[_0x4a0aeb(0x17d)](buildCliArtifactPath,_0x1002f4,_0x4a0aeb(0x135)),_0x577f3a=_0x57f012[_0x4a0aeb(0x17d)](buildCliArtifactPath,_0x1002f4,'01_mozilla-homepage.png'),_0xca6536=_0x57f012[_0x4a0aeb(0x17d)](buildCliArtifactPath,_0x1002f4,_0x57f012['zjdAL']),_0x4dbe80=buildCliArtifactPath(_0x1002f4,_0x4a0aeb(0x16b)),_0x5548fd=quoteShellArg(_0x545532),_0x2c75c9=quoteShellArg(_0x577f3a),_0x58d3d0=quoteShellArg(_0xca6536),_0x18586e=_0x57f012[_0x4a0aeb(0x17c)](quoteShellArg,_0x4dbe80);return _0x4a0aeb(0x185)+_0x5b6150+_0x4a0aeb(0x18c)+_0x5b6150+'\x20open\x20https://www.mozilla.org`\x0a2.\x20Run\x20`'+_0x5b6150+_0x4a0aeb(0x17f)+_0x5b6150+'\x20video-start`\x0a4.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x1002f4+_0x4a0aeb(0x146)+_0x5b6150+'\x20snapshot\x20--filename\x20'+_0x5548fd+_0x4a0aeb(0x18b)+_0x5b6150+_0x4a0aeb(0x14e)+_0x2c75c9+'`\x0a7.\x20Click\x20the\x20\x22Learn\x20More\x22\x20link\x20with\x20Playwright\x20CLI\x0a8.\x20Run\x20`'+_0x5b6150+_0x4a0aeb(0x175)+_0x58d3d0+_0x4a0aeb(0x150)+_0x5b6150+'\x20screenshot\x20--filename\x20'+_0x18586e+'`\x0a10.\x20Return\x20immediately\x20with\x20the\x20structured\x20output\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format.';}export function buildVerifyFeatureCliPrompt(_0xf574c0){const _0x4f2352=_0x3816,_0x36df48={'tWUkz':'en-US','EAcfj':_0x4f2352(0x174),'ckGUf':_0x4f2352(0x11d),'XAgQA':_0x4f2352(0x15f),'QgSfP':'\x20>\x20','GWzmy':'element','rnaUL':function(_0x3a0237,_0x561dbf,_0x507ef0){return _0x3a0237(_0x561dbf,_0x507ef0);},'bfMxk':'02_state.yml','GbsBh':function(_0x50df3b,_0x1d88b1,_0x50a258){return _0x50df3b(_0x1d88b1,_0x50a258);},'iPynj':function(_0x4c0e13,_0x3eb26f){return _0x4c0e13(_0x3eb26f);},'FuTDb':function(_0x51ce4e,_0x367de9){return _0x51ce4e(_0x367de9);},'kbdsU':'02_button-clicked.png','DYmCP':'03_result-visible.png','jbunm':_0x4f2352(0x110)},{checklistItem:_0x3cc1ef,itemFeedback:_0xf0b1b1,taskDescription:_0x52a49,cliCommandPrefix:_0x5f0f76,cliArtifactDir:_0x140061,isCdpMode:_0x1e84cc,url:_0x332e04,cdpEndpoint:_0x3cb580,loginInstructions:_0x5369e3}=_0xf574c0,_0x14a8ba=buildCliArtifactPath(_0x140061,_0x4f2352(0x161)),_0x449da1=_0x36df48[_0x4f2352(0x127)](buildCliArtifactPath,_0x140061,_0x36df48[_0x4f2352(0x125)]),_0x5c2f2a=_0x36df48['GbsBh'](buildCliArtifactPath,_0x140061,_0x4f2352(0x144)),_0x4b2bd2=_0x36df48[_0x4f2352(0x130)](buildCliArtifactPath,_0x140061,_0x4f2352(0x16c)),_0x2646fb=quoteShellArg(_0x14a8ba),_0x75b2cb=quoteShellArg(_0x449da1),_0x303383=_0x36df48['iPynj'](quoteShellArg,_0x5c2f2a),_0x2c289f=_0x36df48['FuTDb'](quoteShellArg,_0x4b2bd2),_0x1728bc=_0x3cc1ef[_0x4f2352(0x172)]?'\x0a\x0a##\x20Additional\x20Notes\x0a'+_0x3cc1ef[_0x4f2352(0x172)]:'';let _0x3d4bcd='';if(_0xf0b1b1&&_0xf0b1b1['unaddressedComments'][_0x4f2352(0x13f)]>0x0){const _0x19bf5a=_0xf0b1b1['unaddressedComments'][_0x4f2352(0x140)](_0x5427f2=>{const _0x24a640=_0x4f2352,_0x15be93=new Date(_0x5427f2[_0x24a640(0x108)])['toLocaleDateString'](_0x36df48['tWUkz'],{'month':_0x36df48[_0x24a640(0x15a)],'day':_0x36df48[_0x24a640(0x157)]}),_0x5b488f=_0x5427f2[_0x24a640(0x168)]||_0x5427f2[_0x24a640(0x11c)]||_0x36df48['XAgQA'],_0x15db18=_0x5427f2['domRef']?_0x24a640(0x182)+(_0x5427f2['domRef'][_0x24a640(0x128)][_0x24a640(0x132)](_0x36df48[_0x24a640(0x17a)])[_0x24a640(0x189)]()?.['split'](':')[0x0]||_0x36df48[_0x24a640(0x167)])+'>\x20\x22'+(_0x5427f2['domRef'][_0x24a640(0x118)]||'')['slice'](0x0,0x32)+'\x22)':'';return _0x24a640(0x180)+_0x5427f2['id']+']\x20**'+_0x5b488f+_0x24a640(0x10d)+_0x15be93+'):\x20\x22'+_0x5427f2[_0x24a640(0x159)]+'\x22'+_0x15db18;})[_0x4f2352(0x155)]('\x0a');_0x3d4bcd=_0x4f2352(0x179)+_0x19bf5a;}const _0x59429c=_0xf0b1b1?.[_0x4f2352(0x124)]?'\x0a\x0a##\x20Expected\x20Flow\x20(from\x20previous\x20verification)\x0a'+_0xf0b1b1[_0x4f2352(0x124)]:'',_0x2dad88=_0x1e84cc?_0x4f2352(0x149)+_0x3cb580+'.\x0aThis\x20is\x20NOT\x20a\x20web\x20app\x20—\x20there\x20is\x20no\x20URL\x20to\x20navigate\x20to.\x20The\x20app\x20is\x20already\x20running\x20and\x20connected.':'CRITICAL\x20URL\x20REQUIREMENT:\x0aYour\x20base\x20URL\x20is:\x20'+_0x332e04+_0x4f2352(0x18a),_0x424e39=_0x332e04?quoteShellArg(_0x332e04):'',_0x131aaf=_0x1e84cc?_0x4f2352(0x14a)+_0x5f0f76+_0x4f2352(0x183)+_0x5f0f76+'\x20tracing-start`,\x20then\x20`'+_0x5f0f76+'\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x140061+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`'+_0x5f0f76+'\x20snapshot\x20--filename\x20'+_0x2646fb+'`\x20to\x20inspect\x20the\x20current\x20app\x20state.\x0a5.\x20Read\x20snapshot\x20YAML\x20files\x20to\x20find\x20element\x20references\x20like\x20`e12`,\x20then\x20use\x20them\x20with\x20`click`,\x20`fill`,\x20`check`,\x20or\x20`select`.\x0a6.\x20Use\x20`'+_0x5f0f76+_0x4f2352(0x14e)+_0x2c289f+_0x4f2352(0x103)+_0x5f0f76+_0x4f2352(0x136):'##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`'+_0x5f0f76+_0x4f2352(0x15d)+_0x424e39+_0x4f2352(0x113)+_0x5f0f76+'\x20tracing-start`,\x20then\x20`'+_0x5f0f76+_0x4f2352(0x106)+_0x140061+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`'+_0x5f0f76+_0x4f2352(0x175)+_0x2646fb+_0x4f2352(0x16d)+_0x5f0f76+_0x4f2352(0x14e)+_0x2c289f+'`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a8.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`'+_0x5f0f76+_0x4f2352(0x141),_0x3261fe=_0x1e84cc?'\x0a\x0a##\x20Critical:\x20Early\x20Error\x20Detection\x0aAfter\x20taking\x20the\x20initial\x20snapshot,\x20IMMEDIATELY\x20check\x20for\x20blocking\x20errors:\x0a\x0a**Blocking\x20errors\x20to\x20detect:**\x0a-\x20Crash\x20or\x20error\x20dialogs\x20(\x22An\x20error\x20occurred\x22,\x20\x22Something\x20went\x20wrong\x22,\x20unhandled\x20exception\x20messages)\x0a-\x20Blank\x20or\x20empty\x20window\x20with\x20no\x20rendered\x20content\x0a-\x20Framework\x20error\x20boundaries\x20(React\x20error\x20page,\x20Electron\x20crash\x20reporter)\x0a-\x20Unresponsive\x20or\x20frozen\x20UI\x20(no\x20interactive\x20elements\x20in\x20snapshot)\x0a\x0a**If\x20ANY\x20blocking\x20error\x20is\x20detected:**\x0a1.\x20DO\x20NOT\x20continue\x20with\x20the\x20task\x0a2.\x20Return\x20IMMEDIATELY\x20with\x20evaluation:\x20\x22blocked\x22\x0a3.\x20Set\x20evaluationReason\x20to\x20describe\x20the\x20specific\x20error\x20(e.g.,\x20\x22App\x20crashed\x20—\x20error\x20dialog\x20visible\x20on\x20launch\x22)\x0a4.\x20Include\x20the\x20error\x20in\x20issues\x20array\x20with\x20severity:\x20\x22BLOCKER\x22\x20and\x20type:\x20\x22APP_ERROR\x22\x0a\x0aThis\x20early\x20exit\x20prevents\x20wasting\x20time\x20on\x20tasks\x20that\x20cannot\x20succeed\x20due\x20to\x20fundamental\x20errors.':_0x4f2352(0x120),_0x207a52=_0x5369e3?'\x0a\x0a##\x20Authentication\x0aBEFORE\x20starting\x20the\x20verification\x20task,\x20you\x20MUST\x20authenticate\x20using\x20these\x20steps:\x0a'+_0x5369e3+_0x4f2352(0x104):'';return'You\x20are\x20a\x20Feature\x20Review\x20Verifier.\x20Your\x20job\x20is\x20to\x20verify\x20a\x20scenario\x20by\x20executing\x20a\x20UI\x20flow\x20and\x20evaluating\x20whether\x20it\x20adequately\x20completes\x20the\x20scenario.\x0a\x0a##\x20Scenario\x20to\x20Verify\x0a'+_0x3cc1ef['description']+_0x1728bc+_0x3d4bcd+_0x59429c+_0x4f2352(0x15b)+_0x52a49+'\x0a\x0a'+_0x2dad88+_0x207a52+'\x0a\x0a'+_0x131aaf+'\x0a\x0a##\x20Browser\x20Command\x20Reference\x0aUse\x20Bash\x20to\x20run\x20Playwright\x20CLI\x20commands\x20with\x20this\x20exact\x20prefix:\x0a`'+_0x5f0f76+_0x4f2352(0x164)+_0x140061+'`\x0a-\x20`snapshot\x20--filename\x20'+_0x75b2cb+_0x4f2352(0x11e)+_0x303383+_0x4f2352(0x10e)+_0x140061+'`:\x20\x22'+_0x4b2bd2+'\x22,\x20\x22'+buildCliArtifactPath(_0x140061,_0x36df48[_0x4f2352(0x12e)])+'\x22,\x20\x22'+buildCliArtifactPath(_0x140061,_0x36df48[_0x4f2352(0x14f)])+'\x22\x0a-\x20Number\x20prefixes\x20(01_,\x2002_,\x20etc.)\x20help\x20maintain\x20chronological\x20order\x0a-\x20For\x20KEY\x20MOMENTS\x20that\x20prove\x20the\x20scenario\x20is\x20complete,\x20prefix\x20with\x20\x22key_\x22:\x20\x22'+buildCliArtifactPath(_0x140061,_0x36df48[_0x4f2352(0x134)])+'\x22\x0a-\x20The\x20\x22key_\x22\x20prefix\x20marks\x20screenshots\x20as\x20high-priority\x20evidence\x20for\x20human\x20reviewers\x0a\x0a**Aim\x20for\x203-6\x20screenshots\x20per\x20verification**\x20to\x20document\x20the\x20complete\x20flow.\x20Mark\x201-2\x20of\x20the\x20most\x20important\x20ones\x20with\x20the\x20\x22key_\x22\x20prefix.\x0a'+_0x3261fe+'\x0a##\x20Evaluation\x20Criteria\x0a-\x20VERIFIED:\x20The\x20task\x20completed\x20successfully\x20and\x20the\x20scenario\x20requirements\x20are\x20fully\x20met\x0a-\x20PARTIAL:\x20The\x20task\x20partially\x20completed\x20but\x20some\x20aspects\x20of\x20the\x20scenario\x20are\x20not\x20verified\x0a-\x20BLOCKED:\x20A\x20blocking\x20issue\x20(bug,\x20error,\x20missing\x20feature)\x20prevents\x20completion\x0a-\x20FAILED:\x20The\x20task\x20could\x20not\x20be\x20completed\x20due\x20to\x20errors\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format\x20with\x20your\x20evaluation.';}export function summarizeVerifyFeatureCliCommandAvailability(_0x47eb57){const _0x33bd83=_0x3816,_0x4b7fd2={'XetJI':function(_0x5727d4,_0x1ec8eb){return _0x5727d4===_0x1ec8eb;}},_0x16b19d=[..._0x47eb57[_0x33bd83(0x16f)]()]['sort']();let _0x17339a=0x0;for(const _0x547571 of _0x47eb57['values']()){_0x17339a+=_0x547571;}return{'cliCommandCount':_0x17339a,'cliCommandsSeen':_0x16b19d,'noCliCommandsCalled':_0x4b7fd2['XetJI'](_0x17339a,0x0)};}export function createVerifyFeatureCliHooks(_0x77aade){const _0xbe2e71=_0x3816,_0x546196={'wXlxZ':function(_0x309f67,_0xfe0687){return _0x309f67!==_0xfe0687;},'WtXBv':function(_0x1cca6e,_0x2b8f83){return _0x1cca6e!==_0x2b8f83;},'hxnbg':'Bash','CAJvN':_0xbe2e71(0x123),'UBVcB':_0xbe2e71(0x13a),'wyMSm':function(_0x337753,_0xb9b38c){return _0x337753(_0xb9b38c);},'ClJrY':'snapshot','fRmnC':'PostToolUseFailure'},_0x2435a9=new Map(),_0x5cc998=async _0x3a0a78=>{const _0x1152e8=_0xbe2e71;if(_0x546196['wXlxZ'](_0x3a0a78['hook_event_name'],'PostToolUse'))return{};const _0x49d562=_0x3a0a78;if(_0x546196[_0x1152e8(0x148)](_0x49d562[_0x1152e8(0x13e)],_0x546196[_0x1152e8(0x169)]))return{};const _0x3f0376=_0x49d562[_0x1152e8(0x15c)],_0x38ba37=extractBashCommand(_0x3f0376);if(!_0x38ba37)return{};const _0x85b5f7=parsePlaywrightCliCommand(_0x38ba37);if(!_0x85b5f7)return{};return _0x2435a9[_0x1152e8(0x142)](_0x85b5f7,(_0x2435a9['get'](_0x85b5f7)||0x0)+0x1),_0x77aade['trackPhaseStart'](_0x546196[_0x1152e8(0x139)],{'transport':_0x546196['UBVcB'],'toolName':_0x85b5f7}),_0x77aade[_0x1152e8(0x126)](_0x546196['CAJvN'],{'transport':_0x546196[_0x1152e8(0x152)],'toolName':_0x85b5f7,'bashCommandPreview':_0x546196['wyMSm'](truncatePreview,_0x38ba37)}),_0x85b5f7!==_0x546196[_0x1152e8(0x114)]&&console['log'](formatPlaywrightCliConsoleLogMessage(_0x3f0376,_0x38ba37,_0x85b5f7)),{};},_0x394e88=async _0x46ce2c=>{const _0x440a14=_0xbe2e71;if(_0x46ce2c[_0x440a14(0x10c)]!==_0x546196['fRmnC'])return{};const _0x2c6d0c=_0x46ce2c;if(_0x2c6d0c['tool_name']!==_0x546196[_0x440a14(0x169)])return{};return await _0x77aade['trackPhaseError']('tool_failure',_0x2c6d0c[_0x440a14(0x156)],{'transport':_0x440a14(0x13a),'toolName':_0x440a14(0x11a)}),{};};return{'postToolUseHook':_0x5cc998,'postToolUseFailureHook':_0x394e88,'commandCounts':_0x2435a9};}async function runPlaywrightCliLifecycleCommand(_0x4c9a33){const _0x5955b5=_0x3816,{sessionId:_0x36d9e5,configPath:_0xb3fc3a,commandArgs:_0x410a8f,env:_0x1939aa,telemetry:_0x1adbb5,phase:_0x2bb929,metadata:_0x2c2726,timeoutMs:_0x1e5d62}=_0x4c9a33;_0x1adbb5['trackPhaseStart'](_0x2bb929,_0x2c2726);try{const _0x35297c=await runPlaywrightCliCommand({'sessionId':_0x36d9e5,'configPath':_0xb3fc3a,'commandArgs':_0x410a8f,'cwd':process['cwd'](),'env':_0x1939aa,'timeoutMs':_0x1e5d62??PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS});_0x1adbb5['trackPhaseEnd'](_0x2bb929,{..._0x2c2726,'subcommand':_0x35297c[_0x5955b5(0x170)]['subcommand'],'stdoutPreview':truncatePreview(_0x35297c['stdout'],0x7d0),'stderrPreview':truncatePreview(_0x35297c[_0x5955b5(0x11b)],0x7d0)});}catch(_0x428b78){await _0x1adbb5['trackPhaseError'](_0x2bb929,_0x428b78,_0x2c2726);throw _0x428b78;}}export async function finalizeVerifyFeatureCliSession(_0x1a4f78){const _0x5245c2=_0x3816,_0x54966d={'clBzV':'playwright_cli_tracing_stop','FXRJQ':_0x5245c2(0x115),'MSYIy':_0x5245c2(0x112),'BDeQM':'video-stop','gETUO':function(_0x58ac04,_0x2dc25a,_0x4372e4){return _0x58ac04(_0x2dc25a,_0x4372e4);}},{telemetry:_0x561790,sessionId:_0x5669ab,configPath:_0x341474,cliArtifactDir:_0x590fc9,env:_0x543bb2,transportMetadata:_0x12ea48}=_0x1a4f78,_0x75603d=[{'phase':_0x54966d[_0x5245c2(0x171)],'commandArgs':[_0x54966d[_0x5245c2(0x162)]]},{'phase':_0x54966d[_0x5245c2(0x137)],'commandArgs':[_0x54966d[_0x5245c2(0x17e)],_0x5245c2(0x16a)+_0x54966d[_0x5245c2(0x186)](buildCliArtifactPath,_0x590fc9,'session-recording.webm')]},{'phase':'playwright_cli_close','commandArgs':[_0x5245c2(0x122)]}];for(const _0x6dbf2b of _0x75603d){try{await runPlaywrightCliLifecycleCommand({'sessionId':_0x5669ab,'configPath':_0x341474,'commandArgs':[..._0x6dbf2b[_0x5245c2(0x165)]],'env':_0x543bb2,'telemetry':_0x561790,'phase':_0x6dbf2b['phase'],'metadata':_0x12ea48});}catch{}}}export async function loadVerifyFeatureCliTraceUploadArtifact(_0x225a37){const _0x51e31f=_0x3816,_0x217e65={'CAOzi':function(_0x20e017,_0x709fe,_0x97636f){return _0x20e017(_0x709fe,_0x97636f);}},_0x149ea9=[_0x51e31f(0x111),_0x51e31f(0x151)];for(const _0xbd9b9 of _0x149ea9){const _0x3cfa9c=_0x217e65['CAOzi'](join,_0x225a37,_0xbd9b9);try{return{'buffer':await readFile(_0x3cfa9c),'source':_0x3cfa9c};}catch{}}return null;}export async function rehomeVerifyFeatureCliArtifacts(_0x3d6972){const _0x133d58=_0x3816,_0xf5b9bf={'FzMJW':function(_0x5547cc,_0x3a1cdb,_0x21765b){return _0x5547cc(_0x3a1cdb,_0x21765b);},'OqAVL':function(_0x4a1be9,_0x5ca443){return _0x4a1be9(_0x5ca443);},'TNhMk':function(_0x42b9fd,_0x234515,_0x41000c){return _0x42b9fd(_0x234515,_0x41000c);},'WtlsW':function(_0x50fa6d,_0x5ac9af){return _0x50fa6d===_0x5ac9af;},'YOjPz':function(_0x3d1a11,_0x15f683,_0x4dde45){return _0x3d1a11(_0x15f683,_0x4dde45);}},{cwd:_0x338484,cliArtifactDir:_0x2dccad,startTime:_0x2594f5}=_0x3d6972,_0x4be2a8=[];await mkdir(_0x2dccad,{'recursive':!![]});const _0x465fb1=await _0xf5b9bf[_0x133d58(0x15e)](readdir,_0x338484,{'withFileTypes':!![]});for(const _0x2a84b0 of _0x465fb1){if(!_0x2a84b0[_0x133d58(0x11f)]()||!VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN['test'](_0x2a84b0['name']))continue;const _0x5cc3d9=join(_0x338484,_0x2a84b0['name']),_0x176dc3=await _0xf5b9bf['OqAVL'](stat,_0x5cc3d9);if(_0x176dc3['mtimeMs']+0x7d0<_0x2594f5)continue;const _0x55d15f=_0xf5b9bf[_0x133d58(0x119)](buildCliArtifactPath,_0x2dccad,_0x2a84b0[_0x133d58(0x13d)]);if(_0xf5b9bf['WtlsW'](_0x5cc3d9,_0x55d15f))continue;await _0xf5b9bf[_0x133d58(0x143)](rename,_0x5cc3d9,_0x55d15f),_0x4be2a8['push'](_0x2a84b0[_0x133d58(0x13d)]);}return _0x4be2a8[_0x133d58(0x160)]();}
|
|
1
|
+
(function(_0x22cee6,_0x1d1a2f){const _0xedeea=_0x5112,_0xa77432=_0x22cee6();while(!![]){try{const _0x5ea0e1=parseInt(_0xedeea(0x228))/0x1*(-parseInt(_0xedeea(0x255))/0x2)+-parseInt(_0xedeea(0x26d))/0x3*(parseInt(_0xedeea(0x231))/0x4)+parseInt(_0xedeea(0x221))/0x5+-parseInt(_0xedeea(0x282))/0x6+-parseInt(_0xedeea(0x243))/0x7+parseInt(_0xedeea(0x227))/0x8+parseInt(_0xedeea(0x266))/0x9;if(_0x5ea0e1===_0x1d1a2f)break;else _0xa77432['push'](_0xa77432['shift']());}catch(_0xbefa45){_0xa77432['push'](_0xa77432['shift']());}}}(_0x1531,0x1acca));import{mkdir,readFile,readdir,rename,stat}from'fs/promises';import{basename,join}from'path';import{extractBashCommand,parsePlaywrightCliCommand,quoteShellArg,runPlaywrightCliCommand}from'./utils/playwrightCli.js';const PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS=0xea60,PLAYWRIGHT_CLI_PREVIEW_LIMIT=0xf0,VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN=/^(?:\d{2}_.+\.(?:png|ya?ml)|key_.+\.png|session-recording(?:-\d+)?\.webm|trace(?:\.trace)?(?:-\d+)?\.zip|current_snap\.ya?ml)$/i;function truncatePreview(_0x3e77ef,_0x53aaf6=PLAYWRIGHT_CLI_PREVIEW_LIMIT){const _0x392f40=_0x5112;return _0x3e77ef['length']>_0x53aaf6?_0x3e77ef['slice'](0x0,_0x53aaf6)+_0x392f40(0x25f):_0x3e77ef;}function buildCliArtifactPath(_0x2df82a,_0x5df149){return join(_0x2df82a,_0x5df149);}function toStepDisplayName(_0x4739e5){const _0x2aac21=_0x5112,_0x389bed={'kMhAR':function(_0x1bbed8,_0x4a49a0){return _0x1bbed8(_0x4a49a0);}},_0x5b2388=_0x389bed['kMhAR'](basename,_0x4739e5)['replace'](/\.(?:png|ya?ml)$/i,'')['replace'](/^key_/i,'')['replace'](/^\d+_/,'')['replace'](/-/g,'\x20');return{'name':_0x5b2388,'isKeyStep':/^key_/i[_0x2aac21(0x1f5)](basename(_0x4739e5))};}function extractShellValue(_0x55f15f){if(!_0x55f15f)return null;return _0x55f15f[0x1]??_0x55f15f[0x2]??_0x55f15f[0x3]??null;}function extractFilenameOption(_0x4ff49f){const _0xceb13=_0x5112,_0x88c564={'eOBnW':function(_0x550c9e,_0x2238bf){return _0x550c9e(_0x2238bf);}};return _0x88c564[_0xceb13(0x287)](extractShellValue,_0x4ff49f['match'](/--filename(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/));}function _0x5112(_0x8dac98,_0x57763f){_0x8dac98=_0x8dac98-0x1f3;const _0x153165=_0x1531();let _0x511259=_0x153165[_0x8dac98];return _0x511259;}function extractFirstCommandArgument(_0x4b544e,_0x22c196){const _0x5759d7=_0x5112,_0x27b256={'hpmtU':_0x5759d7(0x270)},_0xaa05fe=_0x22c196[_0x5759d7(0x215)](/[.*+?^${}()|[\]\\]/g,_0x27b256['hpmtU']);return extractShellValue(_0x4b544e[_0x5759d7(0x276)](new RegExp('(?:^|\x5cs)'+_0xaa05fe+_0x5759d7(0x251))));}function formatCommandTarget(_0x1b3331){const _0x41f82b=_0x5112,_0x44e894={'IwmJB':function(_0x249f7c,_0x5bd731,_0x5d7935){return _0x249f7c(_0x5bd731,_0x5d7935);}};if(!_0x1b3331)return'target';if(/^e\d+$/i[_0x41f82b(0x1f5)](_0x1b3331))return _0x41f82b(0x256)+_0x1b3331;return JSON[_0x41f82b(0x1f8)](_0x44e894['IwmJB'](truncatePreview,_0x1b3331,0x78));}function formatPlaywrightCliLog(_0x4fcc8b,_0x1215fa){const _0x4984b3=_0x5112,_0x1b8ab4={'FbGQx':function(_0x10582a,_0x3f426d,_0x4ddf68){return _0x10582a(_0x3f426d,_0x4ddf68);},'IVlfy':'open\x20browser','sScKz':'tracing-start','OpgON':_0x4984b3(0x23f),'AUhTD':_0x4984b3(0x278),'qcZCr':'video-stop','ihaYq':_0x4984b3(0x27a),'xHGEb':'snapshot','woHTE':function(_0xc6a189,_0x3d7d40){return _0xc6a189(_0x3d7d40);},'bSowi':_0x4984b3(0x25b),'ZtFuh':function(_0x13788e,_0xfe8ca9){return _0x13788e(_0xfe8ca9);},'VUSdE':_0x4984b3(0x241),'VPrOl':_0x4984b3(0x1fd),'tBPUa':function(_0x3dba00,_0x213eb1){return _0x3dba00(_0x213eb1);},'OuANI':function(_0x3752c8,_0x58a5ab,_0x1c8d10){return _0x3752c8(_0x58a5ab,_0x1c8d10);},'tlpQq':_0x4984b3(0x211),'JLNXr':_0x4984b3(0x23e),'CfZvH':_0x4984b3(0x280),'GSppm':'open\x20new\x20tab','shcJO':_0x4984b3(0x24c),'ESspL':'select\x20tab'};switch(_0x1215fa){case _0x4984b3(0x269):{const _0x907bbf=_0x1b8ab4['FbGQx'](extractFirstCommandArgument,_0x4fcc8b,_0x1215fa);return _0x907bbf?'open\x20'+_0x907bbf:_0x1b8ab4['IVlfy'];}case _0x1b8ab4[_0x4984b3(0x220)]:return _0x1b8ab4[_0x4984b3(0x26c)];case _0x1b8ab4[_0x4984b3(0x252)]:return'stop\x20tracing';case'video-start':return _0x4984b3(0x25d);case _0x1b8ab4['qcZCr']:return _0x1b8ab4[_0x4984b3(0x213)];case _0x1b8ab4['xHGEb']:{const _0x4769c3=_0x1b8ab4['woHTE'](extractFilenameOption,_0x4fcc8b);if(!_0x4769c3)return'capture\x20snapshot';const {name:_0x332706}=toStepDisplayName(_0x4769c3);return _0x4984b3(0x209)+_0x332706+'`';}case _0x1b8ab4[_0x4984b3(0x257)]:{const _0x365e8f=_0x1b8ab4[_0x4984b3(0x28e)](extractFilenameOption,_0x4fcc8b);if(!_0x365e8f)return _0x4984b3(0x210);const {name:_0x4f05ce,isKeyStep:_0xc28c0a}=toStepDisplayName(_0x365e8f);return _0xc28c0a?'capture\x20key\x20step\x20`'+_0x4f05ce+'`':_0x4984b3(0x27d)+_0x4f05ce+'`';}case _0x1b8ab4[_0x4984b3(0x248)]:return'click\x20'+formatCommandTarget(extractFirstCommandArgument(_0x4fcc8b,_0x1215fa));case _0x1b8ab4[_0x4984b3(0x260)]:return'check\x20'+formatCommandTarget(extractFirstCommandArgument(_0x4fcc8b,_0x1215fa));case _0x4984b3(0x203):return'fill\x20'+_0x1b8ab4['tBPUa'](formatCommandTarget,_0x1b8ab4[_0x4984b3(0x232)](extractFirstCommandArgument,_0x4fcc8b,_0x1215fa));case _0x4984b3(0x244):return _0x4984b3(0x265)+formatCommandTarget(_0x1b8ab4['OuANI'](extractFirstCommandArgument,_0x4fcc8b,_0x1215fa));case _0x1b8ab4[_0x4984b3(0x274)]:return _0x1b8ab4['JLNXr'];case _0x1b8ab4['CfZvH']:{const _0x3fe4b9=_0x1b8ab4['OuANI'](extractFirstCommandArgument,_0x4fcc8b,_0x1215fa);return _0x3fe4b9?_0x4984b3(0x225)+_0x3fe4b9:_0x1b8ab4[_0x4984b3(0x273)];}case _0x1b8ab4[_0x4984b3(0x1fa)]:{const _0x2789ba=_0x1b8ab4[_0x4984b3(0x232)](extractFirstCommandArgument,_0x4fcc8b,_0x1215fa);return _0x2789ba?'select\x20tab\x20'+_0x2789ba:_0x1b8ab4['ESspL'];}default:return _0x1215fa;}}function extractPlaywrightCliToolDescription(_0x526e87){const _0x372aeb=_0x5112,_0x16252e={'Vpyrp':function(_0x138bbe,_0x219805){return _0x138bbe!==_0x219805;},'mEVtk':_0x372aeb(0x284)},_0x22c6b3=_0x526e87[_0x372aeb(0x235)];if(_0x16252e[_0x372aeb(0x22a)](typeof _0x22c6b3,_0x16252e['mEVtk']))return null;const _0x57a22b=_0x22c6b3['trim']()[_0x372aeb(0x215)](/\s+/g,'\x20');return _0x57a22b['length']>0x0?_0x57a22b:null;}export function formatPlaywrightCliConsoleLogMessage(_0x58f73a,_0x3500b8,_0xe60910){const _0x374d91=_0x5112,_0x265e5c={'ONlXw':function(_0x3a9ce9,_0x15995c){return _0x3a9ce9(_0x15995c);}},_0x321793=formatPlaywrightCliLog(_0x3500b8,_0xe60910),_0x55de5e=_0x265e5c['ONlXw'](extractPlaywrightCliToolDescription,_0x58f73a);if(!_0x55de5e)return _0x374d91(0x277)+_0x321793;if(process[_0x374d91(0x20d)]['DEBUG'])return _0x374d91(0x246)+_0x55de5e+'\x20('+_0x321793+')';return'[ranger-verification-agent]\x20'+_0x55de5e;}export function buildVerifyFeatureCliDebugPrompt(_0x47e52c,_0xd5685d){const _0x3c34c9=_0x5112,_0x1bf57c={'dVbtz':function(_0x32eb68,_0x34df01,_0x5ce5a1){return _0x32eb68(_0x34df01,_0x5ce5a1);},'IDEDZ':_0x3c34c9(0x1f9),'WiBea':_0x3c34c9(0x217),'nKbQD':function(_0x43c8d3,_0x18ca55,_0x5bb858){return _0x43c8d3(_0x18ca55,_0x5bb858);},'OpAxy':_0x3c34c9(0x258),'kzkPv':function(_0x5e1f69,_0x2379f4){return _0x5e1f69(_0x2379f4);}},_0x4d51f6=_0x1bf57c['dVbtz'](buildCliArtifactPath,_0xd5685d,_0x1bf57c[_0x3c34c9(0x21a)]),_0x10ffb9=buildCliArtifactPath(_0xd5685d,_0x1bf57c['WiBea']),_0x4b62dd=_0x1bf57c[_0x3c34c9(0x216)](buildCliArtifactPath,_0xd5685d,_0x3c34c9(0x226)),_0x3f50c6=_0x1bf57c[_0x3c34c9(0x21e)](buildCliArtifactPath,_0xd5685d,_0x1bf57c['OpAxy']),_0x5105bc=_0x1bf57c[_0x3c34c9(0x1fb)](quoteShellArg,_0x4d51f6),_0x5f2bf8=quoteShellArg(_0x10ffb9),_0x2ad198=quoteShellArg(_0x4b62dd),_0x268d28=quoteShellArg(_0x3f50c6);return'You\x20are\x20testing\x20browser\x20automation.\x20Your\x20task\x20is\x20simple:\x0a\x0aUse\x20Bash\x20and\x20Playwright\x20CLI\x20only.\x20The\x20browser\x20command\x20prefix\x20is:\x0a'+_0x47e52c+_0x3c34c9(0x259)+_0x47e52c+_0x3c34c9(0x26a)+_0x47e52c+'\x20tracing-start`\x0a3.\x20Run\x20`'+_0x47e52c+'\x20video-start`\x0a4.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0xd5685d+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a5.\x20Run\x20`'+_0x47e52c+'\x20snapshot\x20--filename\x20'+_0x5105bc+_0x3c34c9(0x230)+_0x47e52c+_0x3c34c9(0x283)+_0x5f2bf8+'`\x0a7.\x20Click\x20the\x20\x22Learn\x20More\x22\x20link\x20with\x20Playwright\x20CLI\x0a8.\x20Run\x20`'+_0x47e52c+'\x20snapshot\x20--filename\x20'+_0x2ad198+'`\x0a9.\x20Run\x20`'+_0x47e52c+_0x3c34c9(0x283)+_0x268d28+'`\x0a10.\x20Return\x20immediately\x20with\x20the\x20structured\x20output\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format.';}export function buildVerifyFeatureCliPrompt(_0x82298b){const _0x21e7dd=_0x5112,_0x52f8f3={'WadOe':_0x21e7dd(0x229),'aGsne':function(_0x3f7e22,_0x371c89,_0x4a1884){return _0x3f7e22(_0x371c89,_0x4a1884);},'eKOvN':_0x21e7dd(0x1fc),'EEzZN':'02_state.yml','GToMw':function(_0x5bdb7c,_0x56eaf9,_0x2f8068){return _0x5bdb7c(_0x56eaf9,_0x2f8068);},'XXnLf':'key_03_success-state.png','hCxfF':function(_0x13dd8b,_0x480ea4){return _0x13dd8b(_0x480ea4);},'WWOEX':_0x21e7dd(0x238),'WBJxi':_0x21e7dd(0x279)},{checklistItem:_0x2bbcf2,itemFeedback:_0x280a47,taskDescription:_0x2f4219,cliCommandPrefix:_0x241ba9,cliArtifactDir:_0x41d598,isCdpMode:_0xe29a9c,url:_0x44a92d,cdpEndpoint:_0x34d355,loginInstructions:_0x254ed8}=_0x82298b,_0x2b57dd=_0x52f8f3['aGsne'](buildCliArtifactPath,_0x41d598,_0x52f8f3['eKOvN']),_0x58f7bb=buildCliArtifactPath(_0x41d598,_0x52f8f3[_0x21e7dd(0x272)]),_0x1cec32=_0x52f8f3['GToMw'](buildCliArtifactPath,_0x41d598,_0x52f8f3[_0x21e7dd(0x245)]),_0x266641=buildCliArtifactPath(_0x41d598,'01_initial-state.png'),_0x22b53d=_0x52f8f3['hCxfF'](quoteShellArg,_0x2b57dd),_0x5122bf=_0x52f8f3[_0x21e7dd(0x249)](quoteShellArg,_0x58f7bb),_0x1b53e2=_0x52f8f3[_0x21e7dd(0x249)](quoteShellArg,_0x1cec32),_0x48a220=_0x52f8f3[_0x21e7dd(0x249)](quoteShellArg,_0x266641),_0x31cfbf=_0x2bbcf2['notes']?_0x21e7dd(0x28c)+_0x2bbcf2[_0x21e7dd(0x214)]:'';let _0x44d7f0='';if(_0x280a47&&_0x280a47[_0x21e7dd(0x261)][_0x21e7dd(0x21d)]>0x0){const _0x2f4a6d=_0x280a47['unaddressedComments'][_0x21e7dd(0x20a)](_0x3ef32c=>{const _0x49dead=_0x21e7dd,_0x48d5cf=new Date(_0x3ef32c[_0x49dead(0x1f7)])['toLocaleDateString'](_0x49dead(0x22c),{'month':'short','day':_0x49dead(0x27f)}),_0x226cb2=_0x3ef32c['authorName']||_0x3ef32c[_0x49dead(0x202)]||'Reviewer',_0x1ec3ac=_0x3ef32c[_0x49dead(0x247)]?_0x49dead(0x205)+(_0x3ef32c[_0x49dead(0x247)][_0x49dead(0x223)][_0x49dead(0x224)](_0x52f8f3['WadOe'])['pop']()?.[_0x49dead(0x224)](':')[0x0]||_0x49dead(0x24e))+_0x49dead(0x26e)+(_0x3ef32c['domRef'][_0x49dead(0x1ff)]||'')['slice'](0x0,0x32)+'\x22)':'';return _0x49dead(0x28d)+_0x3ef32c['id']+']\x20**'+_0x226cb2+_0x49dead(0x218)+_0x48d5cf+_0x49dead(0x239)+_0x3ef32c['content']+'\x22'+_0x1ec3ac;})['join']('\x0a');_0x44d7f0=_0x21e7dd(0x23d)+_0x2f4a6d;}const _0x2f08cb=_0x280a47?.['canonicalFlow']?'\x0a\x0a##\x20Expected\x20Flow\x20(from\x20previous\x20verification)\x0a'+_0x280a47[_0x21e7dd(0x268)]:'',_0x43cc10=_0xe29a9c?_0x21e7dd(0x204)+_0x34d355+_0x21e7dd(0x262):'CRITICAL\x20URL\x20REQUIREMENT:\x0aYour\x20base\x20URL\x20is:\x20'+_0x44a92d+'\x0a-\x20You\x20may\x20ONLY\x20navigate\x20to\x20paths\x20under\x20this\x20base\x20URL\x20(same\x20protocol,\x20host,\x20and\x20port)\x0a-\x20For\x20example,\x20if\x20the\x20base\x20URL\x20is\x20\x22http://localhost:3000\x22,\x20you\x20can\x20navigate\x20to\x20\x22http://localhost:3000/home\x22,\x20\x22http://localhost:3000/settings\x22,\x20etc.\x0a-\x20DO\x20NOT\x20navigate\x20to\x20any\x20different\x20domain,\x20host,\x20or\x20port\x20under\x20any\x20circumstances\x0a-\x20If\x20documentation\x20or\x20code\x20diffs\x20suggest\x20a\x20path\x20exists\x20(e.g.,\x20\x22/dashboard\x22),\x20you\x20may\x20navigate\x20to\x20that\x20path\x20ONLY\x20under\x20the\x20base\x20URL\x20above\x0a-\x20The\x20base\x20URL\x20above\x20is\x20the\x20ONLY\x20authorized\x20profile\x20for\x20this\x20verification',_0x226b09=_0x44a92d?quoteShellArg(_0x44a92d):'',_0x2c16ea=_0xe29a9c?_0x21e7dd(0x25c)+_0x241ba9+'\x20open`,\x20then\x20`'+_0x241ba9+'\x20tracing-start`,\x20then\x20`'+_0x241ba9+'\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x41d598+_0x21e7dd(0x263)+_0x241ba9+_0x21e7dd(0x208)+_0x22b53d+'`\x20to\x20inspect\x20the\x20current\x20app\x20state.\x0a5.\x20Read\x20snapshot\x20YAML\x20files\x20to\x20find\x20element\x20references\x20like\x20`e12`,\x20then\x20use\x20them\x20with\x20`click`,\x20`fill`,\x20`check`,\x20or\x20`select`.\x0a6.\x20Use\x20`'+_0x241ba9+_0x21e7dd(0x283)+_0x48a220+_0x21e7dd(0x236)+_0x241ba9+_0x21e7dd(0x240):'##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`'+_0x241ba9+_0x21e7dd(0x28f)+_0x226b09+'`,\x20then\x20`'+_0x241ba9+'\x20tracing-start`,\x20then\x20`'+_0x241ba9+_0x21e7dd(0x212)+_0x41d598+_0x21e7dd(0x263)+_0x241ba9+'\x20snapshot\x20--filename\x20'+_0x22b53d+'`\x20and\x20read\x20the\x20snapshot\x20file\x20to\x20inspect\x20the\x20page.\x0a5.\x20**IMMEDIATELY\x20check\x20for\x20blocking\x20HTTP\x20errors\x20before\x20proceeding.**\x0a6.\x20Execute\x20the\x20task\x20step-by-step\x20with\x20Playwright\x20CLI\x20commands.\x0a7.\x20Use\x20`'+_0x241ba9+_0x21e7dd(0x283)+_0x48a220+_0x21e7dd(0x1f3)+_0x241ba9+_0x21e7dd(0x281),_0x11ac47=_0xe29a9c?_0x21e7dd(0x25a):_0x21e7dd(0x22d),_0x39eb30=_0x254ed8?_0x21e7dd(0x1fe)+_0x254ed8+'\x0a\x0aAfter\x20completing\x20authentication,\x20proceed\x20with\x20the\x20verification\x20task\x20below.\x0aIf\x20authentication\x20fails,\x20return\x20immediately\x20with\x20evaluation\x20\x22blocked\x22\x20and\x20describe\x20the\x20auth\x20failure.':'';return _0x21e7dd(0x27e)+_0x2bbcf2[_0x21e7dd(0x235)]+_0x31cfbf+_0x44d7f0+_0x2f08cb+_0x21e7dd(0x20f)+_0x2f4219+'\x0a\x0a'+_0x43cc10+_0x39eb30+'\x0a\x0a'+_0x2c16ea+'\x0a\x0a##\x20Browser\x20Command\x20Reference\x0aUse\x20Bash\x20to\x20run\x20Playwright\x20CLI\x20commands\x20with\x20this\x20exact\x20prefix:\x0a`'+_0x241ba9+_0x21e7dd(0x206)+_0x41d598+_0x21e7dd(0x253)+_0x5122bf+_0x21e7dd(0x24f)+_0x1b53e2+_0x21e7dd(0x22f)+_0x41d598+_0x21e7dd(0x21f)+_0x266641+'\x22,\x20\x22'+buildCliArtifactPath(_0x41d598,_0x21e7dd(0x237))+_0x21e7dd(0x21c)+buildCliArtifactPath(_0x41d598,_0x52f8f3[_0x21e7dd(0x219)])+'\x22\x0a-\x20Number\x20prefixes\x20(01_,\x2002_,\x20etc.)\x20help\x20maintain\x20chronological\x20order\x0a-\x20For\x20KEY\x20MOMENTS\x20that\x20prove\x20the\x20scenario\x20is\x20complete,\x20prefix\x20with\x20\x22key_\x22:\x20\x22'+buildCliArtifactPath(_0x41d598,_0x52f8f3['WBJxi'])+'\x22\x0a-\x20The\x20\x22key_\x22\x20prefix\x20marks\x20screenshots\x20as\x20high-priority\x20evidence\x20for\x20human\x20reviewers\x0a\x0a**Aim\x20for\x203-6\x20screenshots\x20per\x20verification**\x20to\x20document\x20the\x20complete\x20flow.\x20Mark\x201-2\x20of\x20the\x20most\x20important\x20ones\x20with\x20the\x20\x22key_\x22\x20prefix.\x0a'+_0x11ac47+'\x0a##\x20Evaluation\x20Criteria\x0a-\x20VERIFIED:\x20The\x20task\x20completed\x20successfully\x20and\x20the\x20scenario\x20requirements\x20are\x20fully\x20met\x0a-\x20PARTIAL:\x20The\x20task\x20partially\x20completed\x20but\x20some\x20aspects\x20of\x20the\x20scenario\x20are\x20not\x20verified\x0a-\x20BLOCKED:\x20A\x20blocking\x20issue\x20(bug,\x20error,\x20missing\x20feature)\x20prevents\x20completion\x0a-\x20FAILED:\x20The\x20task\x20could\x20not\x20be\x20completed\x20due\x20to\x20errors\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format\x20with\x20your\x20evaluation.';}export function summarizeVerifyFeatureCliCommandAvailability(_0x3a0ad4){const _0x404043=_0x5112,_0x2fc3df={'XswUY':function(_0x2fc2d0,_0x4275db){return _0x2fc2d0===_0x4275db;}},_0x59ea4b=[..._0x3a0ad4[_0x404043(0x22b)]()]['sort']();let _0x3907ea=0x0;for(const _0x4164d7 of _0x3a0ad4[_0x404043(0x285)]()){_0x3907ea+=_0x4164d7;}return{'cliCommandCount':_0x3907ea,'cliCommandsSeen':_0x59ea4b,'noCliCommandsCalled':_0x2fc3df[_0x404043(0x26f)](_0x3907ea,0x0)};}function _0x1531(){const _0x5ce5ef=['hook_event_name','PuRcA','playwright-cli','\x0a\x0a##\x20Additional\x20Notes\x0a','-\x20[','ZtFuh','\x20open\x20','nvsox','subcommand','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a8.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','video-stop','test','WdIpD','createdAt','stringify','00_mozilla-homepage.yml','shcJO','kzkPv','01_initial.yml','check','\x0a\x0a##\x20Authentication\x0aBEFORE\x20starting\x20the\x20verification\x20task,\x20you\x20MUST\x20authenticate\x20using\x20these\x20steps:\x0a','textContent','get','PostToolUseFailure','authorEmail','fill','##\x20App\x20Context\x0aYou\x20are\x20connected\x20to\x20a\x20desktop\x20application\x20via\x20CDP\x20(Chrome\x20DevTools\x20Protocol)\x20at\x20','\x20(on\x20element:\x20<','`\x0a\x0a-\x20Write\x20all\x20artifacts\x20under\x20`','cwd','\x20snapshot\x20--filename\x20','capture\x20snapshot\x20`','map','VmGRc','session-recording.webm','env','playwright_cli_close','\x0a\x0a##\x20Task\x20to\x20Execute\x0a','capture\x20screenshot','run-code','\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','ihaYq','notes','replace','dVbtz','01_mozilla-homepage.png','**\x20(','WWOEX','IDEDZ','dgYEQ','\x22,\x20\x22','length','nKbQD','`:\x20\x22','sScKz','192755amVxHP','trackPhaseStart','selector','split','open\x20new\x20tab\x20','02_learn-more.yml','1435672GSuPxu','92oCppaG','\x20>\x20','Vpyrp','keys','en-US','\x0a\x0a##\x20Critical:\x20Early\x20Error\x20Detection\x0aAfter\x20step\x202\x20(taking\x20initial\x20snapshot),\x20IMMEDIATELY\x20check\x20for\x20blocking\x20HTTP\x20errors:\x0a\x0a**Blocking\x20errors\x20to\x20detect:**\x0a-\x20HTTP\x20404:\x20\x22404\x22,\x20\x22Not\x20Found\x22,\x20\x22Page\x20not\x20found\x22,\x20\x22does\x20not\x20exist\x22\x0a-\x20HTTP\x20500:\x20\x22500\x22,\x20\x22Internal\x20Server\x20Error\x22,\x20\x22Server\x20Error\x22,\x20\x22Something\x20went\x20wrong\x22\x0a-\x20HTTP\x20400:\x20\x22400\x22,\x20\x22Bad\x20Request\x22,\x20\x22Invalid\x20request\x22\x0a\x0a**Also\x20check\x20for:**\x0a-\x20Framework\x20error\x20pages\x20(Next.js\x20error\x20boundary,\x20React\x20error\x20page,\x20\x22Application\x20error\x22)\x0a-\x20Completely\x20blank/empty\x20pages\x20with\x20no\x20content\x0a-\x20\x22Cannot\x20GET\x20/path\x22\x20messages\x0a\x0a**If\x20ANY\x20blocking\x20error\x20is\x20detected:**\x0a1.\x20DO\x20NOT\x20continue\x20with\x20the\x20task\x0a2.\x20Return\x20IMMEDIATELY\x20with\x20evaluation:\x20\x22blocked\x22\x0a3.\x20Set\x20evaluationReason\x20to\x20describe\x20the\x20specific\x20error\x20(e.g.,\x20\x22HTTP\x20404\x20-\x20Page\x20not\x20found\x20at\x20/dashboard\x22)\x0a4.\x20Include\x20the\x20error\x20in\x20issues\x20array\x20with\x20severity:\x20\x22BLOCKER\x22\x20and\x20appropriate\x20type\x20(HTTP_404,\x20HTTP_500,\x20HTTP_400,\x20or\x20NAVIGATION_ERROR)\x0a\x0aThis\x20early\x20exit\x20prevents\x20wasting\x20time\x20on\x20tasks\x20that\x20cannot\x20succeed\x20due\x20to\x20fundamental\x20errors.','rUGLA','`\x0a-\x20`run-code\x20\x22await\x20page.waitForTimeout(1000)\x22`\x20for\x20waits\x20or\x20small\x20custom\x20checks\x0a\x0a##\x20Screenshot\x20Guidelines\x20-\x20IMPORTANT\x0aTake\x20screenshots\x20throughout\x20the\x20verification\x20flow\x20so\x20a\x20human\x20can\x20review\x20it\x20for\x20completeness.\x20Screenshots\x20are\x20your\x20evidence\x20trail.\x0a\x0a**When\x20to\x20take\x20screenshots\x20(use\x20Playwright\x20CLI\x20screenshot):**\x0a-\x20After\x20the\x20initial\x20snapshot\x20(capture\x20starting\x20state)\x0a-\x20Before\x20and\x20after\x20clicking\x20buttons\x20or\x20submitting\x20forms\x0a-\x20When\x20important\x20UI\x20elements\x20appear\x20(modals,\x20notifications,\x20loading\x20states)\x0a-\x20After\x20navigating\x20to\x20different\x20views\x20or\x20pages\x0a-\x20When\x20verifying\x20specific\x20elements\x20exist\x0a-\x20At\x20the\x20final\x20state\x20showing\x20the\x20completed\x20action\x0a\x0a**Screenshot\x20naming:**\x0a-\x20Use\x20descriptive\x20filenames\x20under\x20`','`\x0a5.\x20Read\x20the\x20snapshot\x20file\x20to\x20find\x20the\x20\x22Learn\x20More\x22\x20link\x20reference\x0a6.\x20Run\x20`','24sGlBtL','OuANI','name','xdFyU','description','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a6.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','02_button-clicked.png','03_result-visible.png','):\x20\x22','uCjVM','sort','NQvtQ','\x0a\x0a##\x20Reviewer\x20Feedback\x20to\x20Address\x0aThe\x20following\x20reviewer\x20comments\x20were\x20left\x20on\x20the\x20previous\x20version\x20of\x20this\x20item.\x0aVerify\x20that\x20each\x20concern\x20has\x20been\x20addressed\x20in\x20the\x20current\x20implementation.\x0aFor\x20each\x20comment\x20you\x20believe\x20has\x20been\x20addressed,\x20include\x20its\x20ID\x20(the\x20bracketed\x20value)\x20in\x20the\x20addressedCommentIds\x20array\x20in\x20your\x20output.\x0a\x0a','run\x20custom\x20Playwright\x20code','start\x20tracing','\x20run-code\x20\x22<playwright\x20code>\x22`.\x0a7.\x20Do\x20not\x20run\x20`close`,\x20`tracing-stop`,\x20or\x20`video-stop`;\x20the\x20host\x20finalizes\x20the\x20session\x20and\x20artifacts.\x0a8.\x20After\x20completing\x20the\x20verification,\x20evaluate\x20whether\x20the\x20result\x20adequately\x20verifies\x20the\x20scenario','click','close','1323777WpZWrx','press','XXnLf','[ranger-verification-agent]\x20','domRef','VUSdE','hCxfF','Bash','playwright_cli_video_stop','tab-select','log','element','`\x20writes\x20a\x20YAML\x20snapshot\x20you\x20can\x20read\x20for\x20element\x20refs\x0a-\x20`click\x20<ref>`,\x20`fill\x20<ref>\x20\x22text\x22`,\x20`check\x20<ref>`,\x20`press\x20Enter`\x0a-\x20`tab-list`,\x20`tab-select\x20<index>`,\x20`tab-new\x20<url>`\x0a-\x20`screenshot\x20--filename\x20','trackPhaseEnd','(?:\x5cs+(?:\x22([^\x22]+)\x22|\x27([^\x27]+)\x27|(\x5cS+)))','AUhTD','`\x0a-\x20`snapshot\x20--filename\x20','zbdbf','3022rFLUwY','ref\x20','bSowi','03_learn-more.png','\x0a\x0a1.\x20Run\x20`','\x0a\x0a##\x20Critical:\x20Early\x20Error\x20Detection\x0aAfter\x20taking\x20the\x20initial\x20snapshot,\x20IMMEDIATELY\x20check\x20for\x20blocking\x20errors:\x0a\x0a**Blocking\x20errors\x20to\x20detect:**\x0a-\x20Crash\x20or\x20error\x20dialogs\x20(\x22An\x20error\x20occurred\x22,\x20\x22Something\x20went\x20wrong\x22,\x20unhandled\x20exception\x20messages)\x0a-\x20Blank\x20or\x20empty\x20window\x20with\x20no\x20rendered\x20content\x0a-\x20Framework\x20error\x20boundaries\x20(React\x20error\x20page,\x20Electron\x20crash\x20reporter)\x0a-\x20Unresponsive\x20or\x20frozen\x20UI\x20(no\x20interactive\x20elements\x20in\x20snapshot)\x0a\x0a**If\x20ANY\x20blocking\x20error\x20is\x20detected:**\x0a1.\x20DO\x20NOT\x20continue\x20with\x20the\x20task\x0a2.\x20Return\x20IMMEDIATELY\x20with\x20evaluation:\x20\x22blocked\x22\x0a3.\x20Set\x20evaluationReason\x20to\x20describe\x20the\x20specific\x20error\x20(e.g.,\x20\x22App\x20crashed\x20—\x20error\x20dialog\x20visible\x20on\x20launch\x22)\x0a4.\x20Include\x20the\x20error\x20in\x20issues\x20array\x20with\x20severity:\x20\x22BLOCKER\x22\x20and\x20type:\x20\x22APP_ERROR\x22\x0a\x0aThis\x20early\x20exit\x20prevents\x20wasting\x20time\x20on\x20tasks\x20that\x20cannot\x20succeed\x20due\x20to\x20fundamental\x20errors.','screenshot','##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`','start\x20video\x20recording','push','...','VPrOl','unaddressedComments','.\x0aThis\x20is\x20NOT\x20a\x20web\x20app\x20—\x20there\x20is\x20no\x20URL\x20to\x20navigate\x20to.\x20The\x20app\x20is\x20already\x20running\x20and\x20connected.','`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`','mtimeMs','press\x20','3788829lZHERt','tAupp','canonicalFlow','open','\x20open\x20https://www.mozilla.org`\x0a2.\x20Run\x20`','error','OpgON','12945pDEhHQ','>\x20\x22','XswUY','\x5c$&','tool_failure','EEzZN','GSppm','tlpQq','trackPhaseError','match','[playwright-cli]\x20','tracing-stop','key_04_success-state.png','stop\x20video\x20recording','hBlqr','VhETK','capture\x20step\x20`','You\x20are\x20a\x20Feature\x20Review\x20Verifier.\x20Your\x20job\x20is\x20to\x20verify\x20a\x20scenario\x20by\x20executing\x20a\x20UI\x20flow\x20and\x20evaluating\x20whether\x20it\x20adequately\x20completes\x20the\x20scenario.\x0a\x0a##\x20Scenario\x20to\x20Verify\x0a','numeric','tab-new','\x20run-code\x20\x22<playwright\x20code>\x22`.\x0a9.\x20Do\x20not\x20run\x20`close`,\x20`tracing-stop`,\x20or\x20`video-stop`;\x20the\x20host\x20finalizes\x20the\x20session\x20and\x20artifacts.\x0a10.\x20After\x20completing\x20the\x20verification,\x20evaluate\x20whether\x20the\x20result\x20adequately\x20verifies\x20the\x20scenario','1051248YHpvXH','\x20screenshot\x20--filename\x20','string','values','snapshot','eOBnW','wycRv'];_0x1531=function(){return _0x5ce5ef;};return _0x1531();}export function createVerifyFeatureCliHooks(_0x5cf157){const _0x9b8dce=_0x5112,_0x5213c5={'xdFyU':function(_0x14e8ae,_0x44fac6){return _0x14e8ae!==_0x44fac6;},'dgYEQ':_0x9b8dce(0x24a),'UrGpu':function(_0x65786c,_0x2f119d){return _0x65786c+_0x2f119d;},'TLkLK':'playwright-cli','nvsox':function(_0x5e5630,_0x5017a4){return _0x5e5630(_0x5017a4);},'VmGRc':_0x9b8dce(0x286),'rUGLA':_0x9b8dce(0x201),'UgpFf':function(_0x2d02a3,_0x1b0a0e){return _0x2d02a3!==_0x1b0a0e;}},_0x4e0a53=new Map(),_0x21eef2=async _0x59b396=>{const _0x4c1502=_0x9b8dce;if(_0x5213c5[_0x4c1502(0x234)](_0x59b396['hook_event_name'],'PostToolUse'))return{};const _0x403b04=_0x59b396;if(_0x5213c5[_0x4c1502(0x234)](_0x403b04['tool_name'],_0x5213c5['dgYEQ']))return{};const _0xd38c3b=_0x403b04['tool_input'],_0x2c4cd0=extractBashCommand(_0xd38c3b);if(!_0x2c4cd0)return{};const _0x215252=parsePlaywrightCliCommand(_0x2c4cd0);if(!_0x215252)return{};return _0x4e0a53['set'](_0x215252,_0x5213c5['UrGpu'](_0x4e0a53[_0x4c1502(0x200)](_0x215252)||0x0,0x1)),_0x5cf157[_0x4c1502(0x222)]('tool_call',{'transport':_0x5213c5['TLkLK'],'toolName':_0x215252}),_0x5cf157['trackPhaseEnd']('tool_call',{'transport':_0x5213c5['TLkLK'],'toolName':_0x215252,'bashCommandPreview':_0x5213c5[_0x4c1502(0x290)](truncatePreview,_0x2c4cd0)}),_0x5213c5['xdFyU'](_0x215252,_0x5213c5[_0x4c1502(0x20b)])&&console[_0x4c1502(0x24d)](formatPlaywrightCliConsoleLogMessage(_0xd38c3b,_0x2c4cd0,_0x215252)),{};},_0x4c0b7d=async _0x11eeca=>{const _0x364896=_0x9b8dce;if(_0x11eeca[_0x364896(0x289)]!==_0x5213c5[_0x364896(0x22e)])return{};const _0x5e2ff6=_0x11eeca;if(_0x5213c5['UgpFf'](_0x5e2ff6['tool_name'],_0x364896(0x24a)))return{};return await _0x5cf157[_0x364896(0x275)](_0x364896(0x271),_0x5e2ff6[_0x364896(0x26b)],{'transport':_0x364896(0x28b),'toolName':_0x5213c5[_0x364896(0x21b)]}),{};};return{'postToolUseHook':_0x21eef2,'postToolUseFailureHook':_0x4c0b7d,'commandCounts':_0x4e0a53};}async function runPlaywrightCliLifecycleCommand(_0x19b198){const _0x3f1ebc=_0x5112,_0xef973c={'SqFJZ':function(_0x2021e6,_0x8902ec){return _0x2021e6(_0x8902ec);},'wycRv':function(_0x1e4700,_0x5d4a40,_0x297668){return _0x1e4700(_0x5d4a40,_0x297668);}},{sessionId:_0x3c08cd,configPath:_0x3c8e75,commandArgs:_0x706cf8,env:_0x357b03,telemetry:_0x23f824,phase:_0x5a37b7,metadata:_0x2e4c90,timeoutMs:_0x466211}=_0x19b198;_0x23f824['trackPhaseStart'](_0x5a37b7,_0x2e4c90);try{const _0x1abeec=await _0xef973c['SqFJZ'](runPlaywrightCliCommand,{'sessionId':_0x3c08cd,'configPath':_0x3c8e75,'commandArgs':_0x706cf8,'cwd':process[_0x3f1ebc(0x207)](),'env':_0x357b03,'timeoutMs':_0x466211??PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS});_0x23f824[_0x3f1ebc(0x250)](_0x5a37b7,{..._0x2e4c90,'subcommand':_0x1abeec['invocation'][_0x3f1ebc(0x291)],'stdoutPreview':truncatePreview(_0x1abeec['stdout'],0x7d0),'stderrPreview':_0xef973c[_0x3f1ebc(0x288)](truncatePreview,_0x1abeec['stderr'],0x7d0)});}catch(_0x526981){await _0x23f824['trackPhaseError'](_0x5a37b7,_0x526981,_0x2e4c90);throw _0x526981;}}export async function finalizeVerifyFeatureCliSession(_0xfd9491){const _0x258b9a=_0x5112,_0x54f091={'SofDt':'playwright_cli_tracing_stop','PuRcA':_0x258b9a(0x24b),'hBlqr':function(_0x595763,_0x8e9a55,_0x3be047){return _0x595763(_0x8e9a55,_0x3be047);},'NQvtQ':_0x258b9a(0x20c),'VhETK':_0x258b9a(0x20e),'WdIpD':_0x258b9a(0x242),'tAupp':function(_0x13476b,_0x19df26){return _0x13476b(_0x19df26);}},{telemetry:_0x8ca0f6,sessionId:_0x1fbe14,configPath:_0xb95266,cliArtifactDir:_0xf395f3,env:_0x3e05a3,transportMetadata:_0x538d9a}=_0xfd9491,_0x4641b7=[{'phase':_0x54f091['SofDt'],'commandArgs':[_0x258b9a(0x278)]},{'phase':_0x54f091[_0x258b9a(0x28a)],'commandArgs':[_0x258b9a(0x1f4),'--filename='+_0x54f091[_0x258b9a(0x27b)](buildCliArtifactPath,_0xf395f3,_0x54f091[_0x258b9a(0x23c)])]},{'phase':_0x54f091[_0x258b9a(0x27c)],'commandArgs':[_0x54f091[_0x258b9a(0x1f6)]]}];for(const _0x3d05cd of _0x4641b7){try{await _0x54f091[_0x258b9a(0x267)](runPlaywrightCliLifecycleCommand,{'sessionId':_0x1fbe14,'configPath':_0xb95266,'commandArgs':[..._0x3d05cd['commandArgs']],'env':_0x3e05a3,'telemetry':_0x8ca0f6,'phase':_0x3d05cd['phase'],'metadata':_0x538d9a});}catch{}}}export async function loadVerifyFeatureCliTraceUploadArtifact(_0x312e6a){const _0x2030d1={'cIrcL':'trace.zip'},_0x2c6c22=[_0x2030d1['cIrcL'],'trace.trace.zip'];for(const _0x21de06 of _0x2c6c22){const _0x9ec747=join(_0x312e6a,_0x21de06);try{return{'buffer':await readFile(_0x9ec747),'source':_0x9ec747};}catch{}}return null;}export async function rehomeVerifyFeatureCliArtifacts(_0x133d70){const _0x3fbffd=_0x5112,_0x2fde23={'zbdbf':function(_0x2d75bc,_0xde1805,_0x30fefe){return _0x2d75bc(_0xde1805,_0x30fefe);},'keRHv':function(_0x4800f9,_0x45ff89){return _0x4800f9(_0x45ff89);},'oGBvQ':function(_0x414651,_0x4cf028){return _0x414651+_0x4cf028;},'uCjVM':function(_0x15eb33,_0x196835,_0xaaa506){return _0x15eb33(_0x196835,_0xaaa506);}},{cwd:_0x2fc3d4,cliArtifactDir:_0x15e40f,startTime:_0x419705}=_0x133d70,_0x111140=[];await _0x2fde23[_0x3fbffd(0x254)](mkdir,_0x15e40f,{'recursive':!![]});const _0x2c6a7c=await readdir(_0x2fc3d4,{'withFileTypes':!![]});for(const _0x3b647b of _0x2c6a7c){if(!_0x3b647b['isFile']()||!VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN['test'](_0x3b647b['name']))continue;const _0x242b97=_0x2fde23[_0x3fbffd(0x254)](join,_0x2fc3d4,_0x3b647b[_0x3fbffd(0x233)]),_0x38e019=await _0x2fde23['keRHv'](stat,_0x242b97);if(_0x2fde23['oGBvQ'](_0x38e019[_0x3fbffd(0x264)],0x7d0)<_0x419705)continue;const _0x272245=buildCliArtifactPath(_0x15e40f,_0x3b647b[_0x3fbffd(0x233)]);if(_0x242b97===_0x272245)continue;await _0x2fde23[_0x3fbffd(0x23a)](rename,_0x242b97,_0x272245),_0x111140[_0x3fbffd(0x25e)](_0x3b647b[_0x3fbffd(0x233)]);}return _0x111140[_0x3fbffd(0x23b)]();}
|
|
@@ -13,22 +13,38 @@ If you are running in Claude Code, read and suggest the following claude-specifi
|
|
|
13
13
|
|
|
14
14
|
Use Ranger when the work includes any UI or frontend component. Do not suggest Ranger for backend-only or infra-only changes unless the user asks.
|
|
15
15
|
|
|
16
|
-
## One-shot verification
|
|
16
|
+
## One-shot verification (default path when you have creds)
|
|
17
17
|
|
|
18
|
-
When the user gives you credentials and a goal in a single message (e.g. "use `alice@example.com` / `hunter2` to log in and check the dashboard renders"),
|
|
18
|
+
When the user gives you credentials and a goal in a single message (e.g. "use `alice@example.com` / `hunter2` to log in and check the dashboard renders"), run `go` DIRECTLY with the creds inline. No `create`, no `profile add`, no `resume` first:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
RANGER_TEST_USERNAME='alice@example.com' RANGER_TEST_PASSWORD='hunter2' \
|
|
22
|
-
ranger-cli go --url <target-url> --notes '<the goal verbatim>'
|
|
22
|
+
ranger-cli go --base-url <target-url> --notes '<the goal verbatim>'
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
The CLI:
|
|
26
|
+
- Materializes a profile from `RANGER_TEST_USERNAME` if one doesn't exist
|
|
27
|
+
- Runs the configured login automatically — no human at a browser needed
|
|
28
|
+
- Creates a feature review if one is required but missing
|
|
29
|
+
- Captures trace + screenshots as evidence
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
This works for any login flow Ranger has set up with the customer (username/password, SSO, OAuth, MFA — any shape we can run deterministically with the access we hold).
|
|
28
32
|
|
|
29
|
-
|
|
33
|
+
Do **not** chain `ranger-cli create` before `go` unless the user explicitly asks for a structured multi-scenario feature review. The one-shot flow is the happy path for ad-hoc "verify this thing" requests.
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
If credentials live in a `.env` next to the user's repo (look for `RANGER_TEST_USERNAME` / `RANGER_TEST_PASSWORD` / `TARGET_URL`), source that file inline before running `go` instead of typing values (`set -a; source ./.env; set +a`).
|
|
36
|
+
|
|
37
|
+
### When to fall back
|
|
38
|
+
|
|
39
|
+
If `go` returns a 422 / login-failed, automated login probably isn't set up for this account yet. Fall back in this order:
|
|
40
|
+
|
|
41
|
+
1. **Active profile** — try `ranger-cli go` with no env vars. Works if a human already ran `ranger-cli profile add` for this app.
|
|
42
|
+
2. **Interactive setup** — ask the user to run `ranger-cli profile add <name>` (a browser opens, they log in once, you take it from there).
|
|
43
|
+
3. **For automated CI / background-agent setups specifically**: tell the user automated login is set up per-app with the Ranger team — point them at https://docs.ranger.net/main/concepts/profiles#automated-login.
|
|
44
|
+
|
|
45
|
+
If the user did NOT give you credentials in the first place (just said "log in to my app"), skip the env-var path entirely and go straight to fallback #1 or #2.
|
|
46
|
+
|
|
47
|
+
## Structured workflows
|
|
32
48
|
|
|
33
49
|
| Workflow | When to Use | Required Reading |
|
|
34
50
|
|----------|-------------|------------------|
|
|
@@ -248,7 +264,7 @@ If you encounter authentication issues:
|
|
|
248
264
|
1. **Log in with provided credentials**: Set `RANGER_TEST_USERNAME` and `RANGER_TEST_PASSWORD` and re-run `ranger-cli go ...`. The CLI uses those credentials to log in and reuses the same profile on subsequent runs.
|
|
249
265
|
2. **Check existing profiles**: Run `ranger-cli profile ls` to see all configured profiles.
|
|
250
266
|
3. **Pin a specific profile**: Use `ranger-cli profile use <profile-name>` (or pass `--profile <name>` / set `RANGER_PROFILE`).
|
|
251
|
-
4. **Refresh auth**:
|
|
267
|
+
4. **Refresh auth**: For server-side relogin (headless, no human needed), set `RANGER_TEST_USERNAME` / `RANGER_TEST_PASSWORD` and re-run `ranger-cli go ...`. For SSO/OAuth profiles, ask the user to run `ranger-cli profile add <account-email>` to re-capture session in a headed browser. (Note: `ranger-cli profile update` is deprecated under cloud profiles and will exit non-zero.)
|
|
252
268
|
|
|
253
269
|
|
|
254
270
|
### Authentication Issues to Ranger
|
|
@@ -2,11 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
Create a feature review when starting new work that doesn't have an existing feature review to resume.
|
|
4
4
|
|
|
5
|
-
## When NOT to use this
|
|
5
|
+
## ⚠️ When NOT to use this
|
|
6
6
|
|
|
7
|
-
If the user just wants a quick browser check (e.g. "log in as X and confirm the dashboard renders"
|
|
7
|
+
**If the user just wants a quick browser check** (e.g. "log in as X and confirm the dashboard renders", "check that the new button appears on /settings"), **do not run `ranger-cli create`**. Run `ranger-cli go` directly:
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
```bash
|
|
10
|
+
RANGER_TEST_USERNAME='...' RANGER_TEST_PASSWORD='...' \
|
|
11
|
+
ranger-cli go --base-url <target> --notes '<goal verbatim>'
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The CLI creates a feature review automatically when one is needed. Chaining `create` first is wasted ceremony and shows up as noise for the reviewer. See the **One-shot verification** section in the parent `SKILL.md`.
|
|
15
|
+
|
|
16
|
+
Reach for `ranger-cli create` only when:
|
|
17
|
+
|
|
18
|
+
1. The work is genuinely multi-scenario (2+ distinct user journeys worth tracking separately)
|
|
19
|
+
2. You need to enumerate the scenarios up front for the reviewer to see before verification runs
|
|
20
|
+
3. The user explicitly asks for a "feature review" rather than just a "browser check"
|
|
21
|
+
|
|
22
|
+
When in doubt, start with one-shot `go` — you can always add scenarios later with `ranger-cli add-scenario`.
|
|
10
23
|
|
|
11
24
|
## Basic Command
|
|
12
25
|
|
|
@@ -1,44 +1,63 @@
|
|
|
1
1
|
# Verifying Scenarios
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## One-shot: creds + goal in, verification out
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
When the user gives you credentials and a goal (e.g. "use alice@example.com / hunter2 and check the dashboard renders"), run `go` directly with env vars inline — no `create`, no `profile add`, no ceremony:
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
|
|
8
|
+
RANGER_TEST_USERNAME='alice@example.com' RANGER_TEST_PASSWORD='hunter2' \
|
|
9
|
+
ranger-cli go --base-url <target-url> --notes '<the goal verbatim>'
|
|
9
10
|
```
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
If credentials already live in a nearby `.env`, source it inline before running `go` instead of typing values (`set -a; source ./.env; set +a`).
|
|
13
|
+
|
|
14
|
+
The CLI:
|
|
15
|
+
|
|
16
|
+
- Materializes a profile from `RANGER_TEST_USERNAME` if one doesn't exist
|
|
17
|
+
- Runs the configured login if no session is cached
|
|
18
|
+
- Creates a feature review automatically when one is needed
|
|
19
|
+
- Captures a trace + screenshots you can link to
|
|
20
|
+
|
|
21
|
+
This works for any login flow Ranger has set up with the customer — username/password, SSO, OAuth, MFA, passkeys. Don't worry about the auth shape; if the user gave you creds, try this path first.
|
|
22
|
+
|
|
23
|
+
Do **not** run `ranger-cli create` first unless the user explicitly asks for a structured feature review with multiple scenarios.
|
|
24
|
+
|
|
25
|
+
### Fallback when the one-shot path fails
|
|
26
|
+
|
|
27
|
+
If `go` returns a 422 / login-failed, automated login probably isn't set up for this account. Fall back in this order:
|
|
12
28
|
|
|
13
|
-
|
|
29
|
+
1. **Active profile** — `ranger-cli go` with no env vars (works if a human ran `profile add` for this app)
|
|
30
|
+
2. **Interactive setup** — ask the user to run `ranger-cli profile add <name>`
|
|
31
|
+
3. **For CI / background-agent flows**: automated login is set up per-app with the Ranger team — point the user at https://docs.ranger.net/main/concepts/profiles#automated-login
|
|
14
32
|
|
|
15
|
-
|
|
33
|
+
If the user did NOT give you credentials, skip the env-var path entirely and go straight to fallback #1 or #2.
|
|
34
|
+
|
|
35
|
+
## Scenario-driven verification
|
|
36
|
+
|
|
37
|
+
After implementing code against a scenario in an active feature review, verify it:
|
|
16
38
|
|
|
17
39
|
```bash
|
|
18
|
-
|
|
19
|
-
ranger-cli go --url <target> --notes '<what to verify>'
|
|
40
|
+
ranger-cli go --scenario <N> --notes "<what to verify>"
|
|
20
41
|
```
|
|
21
42
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
`go` resolves which profile to use in this order:
|
|
43
|
+
## Profile resolution order
|
|
25
44
|
|
|
26
45
|
1. `--profile <name>` flag (or `RANGER_PROFILE` env var)
|
|
27
|
-
2.
|
|
28
|
-
3. `RANGER_TEST_USERNAME` (
|
|
29
|
-
4. The org's
|
|
30
|
-
|
|
31
|
-
For pinned-session use (`RANGER_SESSION_STATE_PATH=/path/to/storageState.json`), the CLI uses that file directly and skips both cloud-side login and the `sessionDeps` freshness check.
|
|
46
|
+
2. Saved active profile (`ranger-cli profile use <name>`)
|
|
47
|
+
3. `RANGER_TEST_USERNAME` (reuses or creates a matching profile)
|
|
48
|
+
4. The org's sole profile when exactly one exists
|
|
32
49
|
|
|
33
|
-
##
|
|
50
|
+
## Active feature review (only needed for scenario-driven runs)
|
|
34
51
|
|
|
35
|
-
|
|
52
|
+
If you're verifying a scenario (not a one-shot):
|
|
36
53
|
|
|
37
54
|
```bash
|
|
38
55
|
ranger-cli list # Find feature reviews to resume
|
|
39
56
|
ranger-cli resume <id> # Resume a specific feature review
|
|
40
57
|
```
|
|
41
58
|
|
|
59
|
+
For a one-shot `go --base-url ... --notes '...'`, the CLI handles feature-review creation for you.
|
|
60
|
+
|
|
42
61
|
## The Verification Flow
|
|
43
62
|
|
|
44
63
|
1. **Select scenario** - CLI prompts which scenario this verifies
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ranger-testing/ranger-cli",
|
|
3
|
-
"version": "2.5.4-alpha.
|
|
3
|
+
"version": "2.5.4-alpha.2709b75-22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ranger": "./build/cli.js",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
},
|
|
42
42
|
"overrides": {
|
|
43
43
|
"minimatch": "^10.2.3",
|
|
44
|
-
"brace-expansion": "^5.0.5"
|
|
44
|
+
"brace-expansion": "^5.0.5",
|
|
45
|
+
"fast-uri": "3.1.2"
|
|
45
46
|
}
|
|
46
47
|
}
|