@ranger-testing/ranger-cli 2.5.4-alpha.78800d3-3 → 2.5.4-alpha.9360c2a-16
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/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 +36 -6
- package/build/skills/ranger/create.md +19 -0
- package/build/skills/ranger/verify.md +46 -7
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(_0x1c8c03,_0x33d803){const _0x2aa9ba=_0x1e08,_0x40e4fc=_0x1c8c03();while(!![]){try{const _0x4b38b7=-parseInt(_0x2aa9ba(0x223))/0x1+parseInt(_0x2aa9ba(0x1f1))/0x2+-parseInt(_0x2aa9ba(0x22d))/0x3*(parseInt(_0x2aa9ba(0x242))/0x4)+-parseInt(_0x2aa9ba(0x1fa))/0x5+-parseInt(_0x2aa9ba(0x1e5))/0x6+-parseInt(_0x2aa9ba(0x24d))/0x7+parseInt(_0x2aa9ba(0x211))/0x8;if(_0x4b38b7===_0x33d803)break;else _0x40e4fc['push'](_0x40e4fc['shift']());}catch(_0x454549){_0x40e4fc['push'](_0x40e4fc['shift']());}}}(_0x216d,0x7eb11));import{mkdir,readFile,readdir,rename,stat}from'fs/promises';function _0x216d(){const _0x56eec2=['pop','split','length','PzEQq','trim','):\x20\x22','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a6.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','76vzuBqx','canonicalFlow','dnVUH','short','tracing-stop','PostToolUse','snapshot','CTfIu','string','--filename=','ASjyw','1121582cESRFo','invocation','ZPBoy','\x20open`,\x20then\x20`','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a8.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','EyNVA','ePPhV','name','\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','(?:^|\x5cs)','check\x20','start\x20video\x20recording','...',']\x20**','stop\x20tracing','VGmkw','oystI','selector','target','ref\x20','IzRjb','`\x0a10.\x20Return\x20immediately\x20with\x20the\x20structured\x20output\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format.','ahBSV','\x20open\x20https://www.mozilla.org`\x0a2.\x20Run\x20`','-\x20[','nDNAh','DEBUG','replace','**\x20(','1455348QQjSuJ','trackPhaseError','00_mozilla-homepage.yml','uDNZy','\x0a\x0a##\x20Authentication\x0aBEFORE\x20starting\x20the\x20verification\x20task,\x20you\x20MUST\x20authenticate\x20using\x20these\x20steps:\x0a','[playwright-cli]\x20','IICUH','\x20>\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.','You\x20are\x20testing\x20browser\x20automation.\x20Your\x20task\x20is\x20simple:\x0a\x0aUse\x20Bash\x20and\x20Playwright\x20CLI\x20only.\x20The\x20browser\x20command\x20prefix\x20is:\x0a','(?:\x5cs+(?:\x22([^\x22]+)\x22|\x27([^\x27]+)\x27|(\x5cS+)))','press\x20','31460cqSDhc','iqdRH','02_state.yml','[ranger-verification-agent]\x20','\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','\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.','\x22,\x20\x22','phase','FNDCb','1908805jLXnGm','\x0a\x0a##\x20Additional\x20Notes\x0a','subcommand','notes','01_initial.yml','description','\x20tracing-start`,\x20then\x20`','unaddressedComments','screenshot','domRef','stringify','capture\x20snapshot','vgwPI','click','gHYdi','KZSXU','`\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`','capture\x20step\x20`','playwright_cli_close','Bash','tool_call','set','\x0a\x0a##\x20Browser\x20Command\x20Reference\x0aUse\x20Bash\x20to\x20run\x20Playwright\x20CLI\x20commands\x20with\x20this\x20exact\x20prefix:\x0a`','22546888eykDYN','02_button-clicked.png','trackPhaseEnd','TzDgj','bSBwz','trackPhaseStart','kjfMw','##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`','BAmIV','env','trace.trace.zip','log','trace.zip','fhAPh','run\x20custom\x20Playwright\x20code','numeric','OIYRH','\x0a\x0a##\x20Task\x20to\x20Execute\x0a','656883LtsNrO','commandArgs','twCAc','IUIqO','cKdjx','match','slice','FEWJA','toLocaleDateString','\x20snapshot\x20--filename\x20','137958ViFoqS','join','\x20video-start`\x0a4.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','cabIv','open\x20new\x20tab','hook_event_name','sFGoT','sDWgS','\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','03_result-visible.png','01_mozilla-homepage.png','capture\x20key\x20step\x20`','01_initial-state.png','tool_failure'];_0x216d=function(){return _0x56eec2;};return _0x216d();}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(_0x30fcbc,_0x3c3d20=PLAYWRIGHT_CLI_PREVIEW_LIMIT){const _0x6021a7=_0x1e08;return _0x30fcbc[_0x6021a7(0x23d)]>_0x3c3d20?_0x30fcbc[_0x6021a7(0x229)](0x0,_0x3c3d20)+_0x6021a7(0x259):_0x30fcbc;}function buildCliArtifactPath(_0x209009,_0x37d49d){const _0x25c4fe=_0x1e08,_0x495bbd={'IICUH':function(_0x57ca56,_0x1ff8a4,_0x1cdb45){return _0x57ca56(_0x1ff8a4,_0x1cdb45);}};return _0x495bbd[_0x25c4fe(0x1eb)](join,_0x209009,_0x37d49d);}function toStepDisplayName(_0x503e96){const _0xa3373e=_0x1e08,_0x4a4d32={'cKdjx':function(_0x5a2bd7,_0x32865a){return _0x5a2bd7(_0x32865a);}},_0x21ddf9=basename(_0x503e96)[_0xa3373e(0x1e3)](/\.(?:png|ya?ml)$/i,'')[_0xa3373e(0x1e3)](/^key_/i,'')['replace'](/^\d+_/,'')[_0xa3373e(0x1e3)](/-/g,'\x20');return{'name':_0x21ddf9,'isKeyStep':/^key_/i['test'](_0x4a4d32[_0xa3373e(0x227)](basename,_0x503e96))};}function extractShellValue(_0x3ca31f){if(!_0x3ca31f)return null;return _0x3ca31f[0x1]??_0x3ca31f[0x2]??_0x3ca31f[0x3]??null;}function extractFilenameOption(_0x2ea097){const _0x3e4615=_0x1e08;return extractShellValue(_0x2ea097[_0x3e4615(0x228)](/--filename(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/));}function extractFirstCommandArgument(_0x13e1dc,_0x27c346){const _0x4883f1=_0x1e08,_0x3ceac7={'YFsbQ':function(_0x5b47c7,_0x1f80f5){return _0x5b47c7(_0x1f80f5);}},_0x4010ff=_0x27c346['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');return _0x3ceac7['YFsbQ'](extractShellValue,_0x13e1dc['match'](new RegExp(_0x4883f1(0x256)+_0x4010ff+_0x4883f1(0x1ef))));}function formatCommandTarget(_0x584615){const _0xb225b2=_0x1e08;if(!_0x584615)return _0xb225b2(0x1da);if(/^e\d+$/i['test'](_0x584615))return _0xb225b2(0x1db)+_0x584615;return JSON[_0xb225b2(0x204)](truncatePreview(_0x584615,0x78));}function formatPlaywrightCliLog(_0x504db7,_0x53ae76){const _0x2ea5af=_0x1e08,_0xbd68eb={'iFCXd':'open\x20browser','sFGoT':'tracing-stop','QPeyF':_0x2ea5af(0x248),'TzDgj':function(_0x1fe3cb,_0x1d02ab){return _0x1fe3cb(_0x1d02ab);},'YZWIq':_0x2ea5af(0x205),'sFBRj':'capture\x20screenshot','twCAc':function(_0x2eb735,_0x5e2f14){return _0x2eb735(_0x5e2f14);},'gHYdi':function(_0x75dbee,_0x5d6cd4,_0x15ddfc){return _0x75dbee(_0x5d6cd4,_0x15ddfc);},'iqdRH':'press','FEWJA':function(_0x24ac16,_0x2c7442,_0x3e9f61){return _0x24ac16(_0x2c7442,_0x3e9f61);},'nDNAh':'tab-new','ikQbk':_0x2ea5af(0x231),'FNDCb':'select\x20tab'};switch(_0x53ae76){case'open':{const _0x591887=extractFirstCommandArgument(_0x504db7,_0x53ae76);return _0x591887?'open\x20'+_0x591887:_0xbd68eb['iFCXd'];}case'tracing-start':return'start\x20tracing';case _0xbd68eb[_0x2ea5af(0x233)]:return _0x2ea5af(0x1d6);case'video-start':return _0x2ea5af(0x258);case'video-stop':return'stop\x20video\x20recording';case _0xbd68eb['QPeyF']:{const _0xc303e7=_0xbd68eb[_0x2ea5af(0x214)](extractFilenameOption,_0x504db7);if(!_0xc303e7)return _0xbd68eb['YZWIq'];const {name:_0x172131}=toStepDisplayName(_0xc303e7);return'capture\x20snapshot\x20`'+_0x172131+'`';}case _0x2ea5af(0x202):{const _0x476da0=_0xbd68eb[_0x2ea5af(0x214)](extractFilenameOption,_0x504db7);if(!_0x476da0)return _0xbd68eb['sFBRj'];const {name:_0x3ae87d,isKeyStep:_0x3db849}=_0xbd68eb[_0x2ea5af(0x225)](toStepDisplayName,_0x476da0);return _0x3db849?_0x2ea5af(0x238)+_0x3ae87d+'`':_0x2ea5af(0x20b)+_0x3ae87d+'`';}case _0x2ea5af(0x207):return'click\x20'+formatCommandTarget(extractFirstCommandArgument(_0x504db7,_0x53ae76));case'check':return _0x2ea5af(0x257)+formatCommandTarget(_0xbd68eb[_0x2ea5af(0x208)](extractFirstCommandArgument,_0x504db7,_0x53ae76));case'fill':return'fill\x20'+formatCommandTarget(_0xbd68eb['gHYdi'](extractFirstCommandArgument,_0x504db7,_0x53ae76));case _0xbd68eb[_0x2ea5af(0x1f2)]:return _0x2ea5af(0x1f0)+formatCommandTarget(_0xbd68eb[_0x2ea5af(0x22a)](extractFirstCommandArgument,_0x504db7,_0x53ae76));case'run-code':return _0x2ea5af(0x21f);case _0xbd68eb[_0x2ea5af(0x1e1)]:{const _0x3d5a86=extractFirstCommandArgument(_0x504db7,_0x53ae76);return _0x3d5a86?'open\x20new\x20tab\x20'+_0x3d5a86:_0xbd68eb['ikQbk'];}case'tab-select':{const _0x3ba04a=extractFirstCommandArgument(_0x504db7,_0x53ae76);return _0x3ba04a?'select\x20tab\x20'+_0x3ba04a:_0xbd68eb[_0x2ea5af(0x1f9)];}default:return _0x53ae76;}}function extractPlaywrightCliToolDescription(_0xd59549){const _0x174965=_0x1e08,_0x315364={'vgwPI':function(_0x39ac4a,_0x575b0b){return _0x39ac4a!==_0x575b0b;},'obHOK':function(_0x182acf,_0x3417ed){return _0x182acf>_0x3417ed;}},_0xb0fc5a=_0xd59549['description'];if(_0x315364[_0x174965(0x206)](typeof _0xb0fc5a,_0x174965(0x24a)))return null;const _0x2a7b41=_0xb0fc5a[_0x174965(0x23f)]()['replace'](/\s+/g,'\x20');return _0x315364['obHOK'](_0x2a7b41[_0x174965(0x23d)],0x0)?_0x2a7b41:null;}export function formatPlaywrightCliConsoleLogMessage(_0x281293,_0x534d81,_0x46c06e){const _0xa5d24c=_0x1e08,_0x1a4583={'ASjyw':function(_0x45e9f8,_0x1456a5,_0xb9670e){return _0x45e9f8(_0x1456a5,_0xb9670e);}},_0x24b9c3=_0x1a4583[_0xa5d24c(0x24c)](formatPlaywrightCliLog,_0x534d81,_0x46c06e),_0x3efb8f=extractPlaywrightCliToolDescription(_0x281293);if(!_0x3efb8f)return _0xa5d24c(0x1ea)+_0x24b9c3;if(process[_0xa5d24c(0x21a)][_0xa5d24c(0x1e2)])return'[ranger-verification-agent]\x20'+_0x3efb8f+'\x20('+_0x24b9c3+')';return _0xa5d24c(0x1f4)+_0x3efb8f;}export function buildVerifyFeatureCliDebugPrompt(_0x146354,_0x485af3){const _0x510591=_0x1e08,_0x3f6c02={'KZSXU':_0x510591(0x1e7),'LJHsa':_0x510591(0x237),'bSBwz':function(_0x5cc083,_0x34d00e,_0x3f294e){return _0x5cc083(_0x34d00e,_0x3f294e);},'MnKvb':'03_learn-more.png','ZPBoy':function(_0x5076a6,_0x4505b6){return _0x5076a6(_0x4505b6);}},_0x3bc421=buildCliArtifactPath(_0x485af3,_0x3f6c02[_0x510591(0x209)]),_0x1f85c8=buildCliArtifactPath(_0x485af3,_0x3f6c02['LJHsa']),_0x7f646c=_0x3f6c02[_0x510591(0x215)](buildCliArtifactPath,_0x485af3,'02_learn-more.yml'),_0x2929e6=_0x3f6c02[_0x510591(0x215)](buildCliArtifactPath,_0x485af3,_0x3f6c02['MnKvb']),_0x233911=_0x3f6c02[_0x510591(0x24f)](quoteShellArg,_0x3bc421),_0x467b5b=quoteShellArg(_0x1f85c8),_0x8972ff=quoteShellArg(_0x7f646c),_0x55db02=_0x3f6c02[_0x510591(0x24f)](quoteShellArg,_0x2929e6);return _0x510591(0x1ee)+_0x146354+'\x0a\x0a1.\x20Run\x20`'+_0x146354+_0x510591(0x1df)+_0x146354+'\x20tracing-start`\x0a3.\x20Run\x20`'+_0x146354+_0x510591(0x22f)+_0x485af3+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a5.\x20Run\x20`'+_0x146354+'\x20snapshot\x20--filename\x20'+_0x233911+'`\x0a5.\x20Read\x20the\x20snapshot\x20file\x20to\x20find\x20the\x20\x22Learn\x20More\x22\x20link\x20reference\x0a6.\x20Run\x20`'+_0x146354+'\x20screenshot\x20--filename\x20'+_0x467b5b+'`\x0a7.\x20Click\x20the\x20\x22Learn\x20More\x22\x20link\x20with\x20Playwright\x20CLI\x0a8.\x20Run\x20`'+_0x146354+_0x510591(0x22c)+_0x8972ff+'`\x0a9.\x20Run\x20`'+_0x146354+'\x20screenshot\x20--filename\x20'+_0x55db02+_0x510591(0x1dd);}export function buildVerifyFeatureCliPrompt(_0x36eca0){const _0x1cb489=_0x1e08,_0x365dad={'tmWBJ':_0x1cb489(0x245),'IzRjb':_0x1cb489(0x220),'fhAPh':_0x1cb489(0x1ec),'dnVUH':'element','NLheP':function(_0xce214d,_0xcb0488,_0x5b5c7e){return _0xce214d(_0xcb0488,_0x5b5c7e);},'BAmIV':_0x1cb489(0x1f3),'iAmWa':function(_0x58677b,_0x1280d5,_0x2e0b37){return _0x58677b(_0x1280d5,_0x2e0b37);},'dSRrR':_0x1cb489(0x239),'ahBSV':function(_0x399f6e,_0x5dbfa2){return _0x399f6e(_0x5dbfa2);},'sBGFy':function(_0x18b17d,_0x4b1e1a,_0x57c162){return _0x18b17d(_0x4b1e1a,_0x57c162);},'JZgzA':_0x1cb489(0x212),'jgelH':function(_0xff750e,_0x2c1043,_0x2b9e75){return _0xff750e(_0x2c1043,_0x2b9e75);}},{checklistItem:_0x5f1381,itemFeedback:_0x3fc93f,taskDescription:_0xe9ad2e,cliCommandPrefix:_0x774c9a,cliArtifactDir:_0x2f77dc,isCdpMode:_0x4c158d,url:_0x27dbdd,cdpEndpoint:_0x4a97f1,loginInstructions:_0x152f3b}=_0x36eca0,_0x56cf90=buildCliArtifactPath(_0x2f77dc,_0x1cb489(0x1fe)),_0x12fb0e=_0x365dad['NLheP'](buildCliArtifactPath,_0x2f77dc,_0x365dad[_0x1cb489(0x219)]),_0x49331a=_0x365dad['NLheP'](buildCliArtifactPath,_0x2f77dc,'key_03_success-state.png'),_0xb23e2b=_0x365dad['iAmWa'](buildCliArtifactPath,_0x2f77dc,_0x365dad['dSRrR']),_0x1317b8=quoteShellArg(_0x56cf90),_0x58f5f6=quoteShellArg(_0x12fb0e),_0x5819ee=_0x365dad[_0x1cb489(0x1de)](quoteShellArg,_0x49331a),_0x59fdd9=quoteShellArg(_0xb23e2b),_0x2fe5e1=_0x5f1381['notes']?_0x1cb489(0x1fb)+_0x5f1381[_0x1cb489(0x1fd)]:'';let _0x221868='';if(_0x3fc93f&&_0x3fc93f[_0x1cb489(0x201)]['length']>0x0){const _0x20f5c9=_0x3fc93f['unaddressedComments']['map'](_0x85b4c0=>{const _0x5a202d=_0x1cb489,_0x124be4=new Date(_0x85b4c0['createdAt'])[_0x5a202d(0x22b)]('en-US',{'month':_0x365dad['tmWBJ'],'day':_0x365dad[_0x5a202d(0x1dc)]}),_0xb56985=_0x85b4c0['authorName']||_0x85b4c0['authorEmail']||'Reviewer',_0x44315b=_0x85b4c0['domRef']?'\x20(on\x20element:\x20<'+(_0x85b4c0['domRef'][_0x5a202d(0x1d9)][_0x5a202d(0x23c)](_0x365dad[_0x5a202d(0x21e)])[_0x5a202d(0x23b)]()?.['split'](':')[0x0]||_0x365dad[_0x5a202d(0x244)])+'>\x20\x22'+(_0x85b4c0[_0x5a202d(0x203)]['textContent']||'')['slice'](0x0,0x32)+'\x22)':'';return _0x5a202d(0x1e0)+_0x85b4c0['id']+_0x5a202d(0x1d5)+_0xb56985+_0x5a202d(0x1e4)+_0x124be4+_0x5a202d(0x240)+_0x85b4c0['content']+'\x22'+_0x44315b;})[_0x1cb489(0x22e)]('\x0a');_0x221868='\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'+_0x20f5c9;}const _0x1da03e=_0x3fc93f?.[_0x1cb489(0x243)]?'\x0a\x0a##\x20Expected\x20Flow\x20(from\x20previous\x20verification)\x0a'+_0x3fc93f[_0x1cb489(0x243)]:'',_0x2f25ba=_0x4c158d?'##\x20App\x20Context\x0aYou\x20are\x20connected\x20to\x20a\x20desktop\x20application\x20via\x20CDP\x20(Chrome\x20DevTools\x20Protocol)\x20at\x20'+_0x4a97f1+'.\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'+_0x27dbdd+'\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',_0x312942=_0x27dbdd?quoteShellArg(_0x27dbdd):'',_0x2fe5f9=_0x4c158d?_0x1cb489(0x218)+_0x774c9a+_0x1cb489(0x250)+_0x774c9a+_0x1cb489(0x200)+_0x774c9a+_0x1cb489(0x255)+_0x2f77dc+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`'+_0x774c9a+_0x1cb489(0x22c)+_0x1317b8+_0x1cb489(0x20a)+_0x774c9a+'\x20screenshot\x20--filename\x20'+_0x59fdd9+_0x1cb489(0x241)+_0x774c9a+_0x1cb489(0x1f5):'##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`'+_0x774c9a+'\x20open\x20'+_0x312942+'`,\x20then\x20`'+_0x774c9a+_0x1cb489(0x200)+_0x774c9a+_0x1cb489(0x255)+_0x2f77dc+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`'+_0x774c9a+'\x20snapshot\x20--filename\x20'+_0x1317b8+'`\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`'+_0x774c9a+'\x20screenshot\x20--filename\x20'+_0x59fdd9+_0x1cb489(0x251)+_0x774c9a+'\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',_0x16518e=_0x4c158d?'\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.':'\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.',_0x3ab943=_0x152f3b?_0x1cb489(0x1e9)+_0x152f3b+_0x1cb489(0x1ed):'';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'+_0x5f1381[_0x1cb489(0x1ff)]+_0x2fe5e1+_0x221868+_0x1da03e+_0x1cb489(0x222)+_0xe9ad2e+'\x0a\x0a'+_0x2f25ba+_0x3ab943+'\x0a\x0a'+_0x2fe5f9+_0x1cb489(0x210)+_0x774c9a+'`\x0a\x0a-\x20Write\x20all\x20artifacts\x20under\x20`'+_0x2f77dc+'`\x0a-\x20`snapshot\x20--filename\x20'+_0x58f5f6+'`\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'+_0x5819ee+'`\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`'+_0x2f77dc+'`:\x20\x22'+_0xb23e2b+_0x1cb489(0x1f7)+_0x365dad['sBGFy'](buildCliArtifactPath,_0x2f77dc,_0x365dad['JZgzA'])+_0x1cb489(0x1f7)+_0x365dad['jgelH'](buildCliArtifactPath,_0x2f77dc,_0x1cb489(0x236))+_0x1cb489(0x235)+buildCliArtifactPath(_0x2f77dc,'key_04_success-state.png')+'\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'+_0x16518e+_0x1cb489(0x1f6);}export function summarizeVerifyFeatureCliCommandAvailability(_0x4cbde0){const _0x36b6a2=_0x1e08,_0x1c49c7={'uDNZy':function(_0x42e297,_0x270407){return _0x42e297===_0x270407;}},_0x86b07a=[..._0x4cbde0['keys']()]['sort']();let _0x20a301=0x0;for(const _0x57130d of _0x4cbde0['values']()){_0x20a301+=_0x57130d;}return{'cliCommandCount':_0x20a301,'cliCommandsSeen':_0x86b07a,'noCliCommandsCalled':_0x1c49c7[_0x36b6a2(0x1e8)](_0x20a301,0x0)};}export function createVerifyFeatureCliHooks(_0x183793){const _0x2848b6=_0x1e08,_0x239eab={'VopSe':_0x2848b6(0x247),'VGmkw':function(_0x3969e2,_0x46c845){return _0x3969e2!==_0x46c845;},'oystI':function(_0x1749ad,_0x1c91db){return _0x1749ad(_0x1c91db);},'sDWgS':_0x2848b6(0x20e),'PzEQq':'playwright-cli','szGlt':function(_0x66910c,_0x7e914a){return _0x66910c(_0x7e914a);},'ePPhV':'PostToolUseFailure','EyNVA':_0x2848b6(0x20d),'dhVio':_0x2848b6(0x23a)},_0x1015af=new Map(),_0x1906fa=async _0x44e7a5=>{const _0x1a7a6b=_0x2848b6;if(_0x44e7a5[_0x1a7a6b(0x232)]!==_0x239eab['VopSe'])return{};const _0x6123a=_0x44e7a5;if(_0x239eab[_0x1a7a6b(0x1d7)](_0x6123a['tool_name'],'Bash'))return{};const _0x52219e=_0x6123a['tool_input'],_0x3c3460=_0x239eab['oystI'](extractBashCommand,_0x52219e);if(!_0x3c3460)return{};const _0x80a7ca=_0x239eab[_0x1a7a6b(0x1d8)](parsePlaywrightCliCommand,_0x3c3460);if(!_0x80a7ca)return{};return _0x1015af[_0x1a7a6b(0x20f)](_0x80a7ca,(_0x1015af['get'](_0x80a7ca)||0x0)+0x1),_0x183793[_0x1a7a6b(0x216)](_0x1a7a6b(0x20e),{'transport':'playwright-cli','toolName':_0x80a7ca}),_0x183793['trackPhaseEnd'](_0x239eab[_0x1a7a6b(0x234)],{'transport':_0x239eab[_0x1a7a6b(0x23e)],'toolName':_0x80a7ca,'bashCommandPreview':_0x239eab['szGlt'](truncatePreview,_0x3c3460)}),_0x239eab['VGmkw'](_0x80a7ca,'snapshot')&&console[_0x1a7a6b(0x21c)](formatPlaywrightCliConsoleLogMessage(_0x52219e,_0x3c3460,_0x80a7ca)),{};},_0x42d996=async _0x286a4b=>{const _0x50ed60=_0x2848b6;if(_0x286a4b['hook_event_name']!==_0x239eab[_0x50ed60(0x253)])return{};const _0x55392c=_0x286a4b;if(_0x55392c['tool_name']!==_0x239eab['EyNVA'])return{};return await _0x183793['trackPhaseError'](_0x239eab['dhVio'],_0x55392c['error'],{'transport':_0x239eab['PzEQq'],'toolName':_0x239eab[_0x50ed60(0x252)]}),{};};return{'postToolUseHook':_0x1906fa,'postToolUseFailureHook':_0x42d996,'commandCounts':_0x1015af};}function _0x1e08(_0x293d4c,_0x21afe3){_0x293d4c=_0x293d4c-0x1d5;const _0x216da3=_0x216d();let _0x1e081e=_0x216da3[_0x293d4c];return _0x1e081e;}async function runPlaywrightCliLifecycleCommand(_0x223e1f){const _0x4097c4=_0x1e08,_0x41c576={'OIYRH':function(_0x1e8d70,_0x3bbffa){return _0x1e8d70??_0x3bbffa;},'cDwZO':function(_0x19dbb,_0x3c36f2,_0x13d67d){return _0x19dbb(_0x3c36f2,_0x13d67d);}},{sessionId:_0x490f17,configPath:_0x4c9edb,commandArgs:_0x450984,env:_0x423d1e,telemetry:_0x54f9a7,phase:_0x52487f,metadata:_0x26ba2c,timeoutMs:_0x44b4e2}=_0x223e1f;_0x54f9a7['trackPhaseStart'](_0x52487f,_0x26ba2c);try{const _0xb73b60=await runPlaywrightCliCommand({'sessionId':_0x490f17,'configPath':_0x4c9edb,'commandArgs':_0x450984,'cwd':process['cwd'](),'env':_0x423d1e,'timeoutMs':_0x41c576[_0x4097c4(0x221)](_0x44b4e2,PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS)});_0x54f9a7[_0x4097c4(0x213)](_0x52487f,{..._0x26ba2c,'subcommand':_0xb73b60[_0x4097c4(0x24e)][_0x4097c4(0x1fc)],'stdoutPreview':truncatePreview(_0xb73b60['stdout'],0x7d0),'stderrPreview':_0x41c576['cDwZO'](truncatePreview,_0xb73b60['stderr'],0x7d0)});}catch(_0x53b314){await _0x54f9a7[_0x4097c4(0x1e6)](_0x52487f,_0x53b314,_0x26ba2c);throw _0x53b314;}}export async function finalizeVerifyFeatureCliSession(_0x11211b){const _0x576f4b=_0x1e08,_0x4bcb1f={'TwuEi':_0x576f4b(0x246),'kjfMw':'session-recording.webm'},{telemetry:_0x1418e3,sessionId:_0x20a06f,configPath:_0xc980bd,cliArtifactDir:_0x22a2ab,env:_0x391afc,transportMetadata:_0x3645ae}=_0x11211b,_0x349f30=[{'phase':'playwright_cli_tracing_stop','commandArgs':[_0x4bcb1f['TwuEi']]},{'phase':'playwright_cli_video_stop','commandArgs':['video-stop',_0x576f4b(0x24b)+buildCliArtifactPath(_0x22a2ab,_0x4bcb1f[_0x576f4b(0x217)])]},{'phase':_0x576f4b(0x20c),'commandArgs':['close']}];for(const _0x575738 of _0x349f30){try{await runPlaywrightCliLifecycleCommand({'sessionId':_0x20a06f,'configPath':_0xc980bd,'commandArgs':[..._0x575738[_0x576f4b(0x224)]],'env':_0x391afc,'telemetry':_0x1418e3,'phase':_0x575738[_0x576f4b(0x1f8)],'metadata':_0x3645ae});}catch{}}}export async function loadVerifyFeatureCliTraceUploadArtifact(_0x55775d){const _0x34844c=_0x1e08,_0x53ff10={'ytWkN':_0x34844c(0x21b)},_0x32f750=[_0x34844c(0x21d),_0x53ff10['ytWkN']];for(const _0x31f8a6 of _0x32f750){const _0x43b887=join(_0x55775d,_0x31f8a6);try{return{'buffer':await readFile(_0x43b887),'source':_0x43b887};}catch{}}return null;}export async function rehomeVerifyFeatureCliArtifacts(_0x180979){const _0x486ccc=_0x1e08,_0xf34b17={'cabIv':function(_0x313e9b,_0x2aa01a,_0x263a91){return _0x313e9b(_0x2aa01a,_0x263a91);},'IUIqO':function(_0x52a59a,_0x350fff){return _0x52a59a(_0x350fff);},'ZNzwj':function(_0x55225b,_0x98ba8){return _0x55225b+_0x98ba8;},'CTfIu':function(_0x295c2f,_0x2754dc){return _0x295c2f===_0x2754dc;}},{cwd:_0x34b79f,cliArtifactDir:_0x396cac,startTime:_0x1ebba2}=_0x180979,_0x1f5529=[];await _0xf34b17['cabIv'](mkdir,_0x396cac,{'recursive':!![]});const _0x1bc437=await _0xf34b17[_0x486ccc(0x230)](readdir,_0x34b79f,{'withFileTypes':!![]});for(const _0x41d72f of _0x1bc437){if(!_0x41d72f['isFile']()||!VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN['test'](_0x41d72f['name']))continue;const _0x1fbe8a=join(_0x34b79f,_0x41d72f['name']),_0xf8fbfe=await _0xf34b17[_0x486ccc(0x226)](stat,_0x1fbe8a);if(_0xf34b17['ZNzwj'](_0xf8fbfe['mtimeMs'],0x7d0)<_0x1ebba2)continue;const _0x12c1c5=_0xf34b17['cabIv'](buildCliArtifactPath,_0x396cac,_0x41d72f[_0x486ccc(0x254)]);if(_0xf34b17[_0x486ccc(0x249)](_0x1fbe8a,_0x12c1c5))continue;await rename(_0x1fbe8a,_0x12c1c5),_0x1f5529['push'](_0x41d72f['name']);}return _0x1f5529['sort']();}
|
|
1
|
+
(function(_0x50550b,_0x25137e){const _0x20d6a0=_0x5ecb,_0x371056=_0x50550b();while(!![]){try{const _0x55d15b=-parseInt(_0x20d6a0(0x1b1))/0x1*(-parseInt(_0x20d6a0(0x1bf))/0x2)+-parseInt(_0x20d6a0(0x179))/0x3+parseInt(_0x20d6a0(0x181))/0x4*(-parseInt(_0x20d6a0(0x16c))/0x5)+-parseInt(_0x20d6a0(0x1ac))/0x6+-parseInt(_0x20d6a0(0x14f))/0x7+parseInt(_0x20d6a0(0x194))/0x8+parseInt(_0x20d6a0(0x1bd))/0x9;if(_0x55d15b===_0x25137e)break;else _0x371056['push'](_0x371056['shift']());}catch(_0x483fb3){_0x371056['push'](_0x371056['shift']());}}}(_0x35e2,0x35cc2));function _0x5ecb(_0x29daa5,_0x457199){_0x29daa5=_0x29daa5-0x13f;const _0x35e261=_0x35e2();let _0x5ecb12=_0x35e261[_0x29daa5];return _0x5ecb12;}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(_0xbbf323,_0x481b6a=PLAYWRIGHT_CLI_PREVIEW_LIMIT){const _0x17c605=_0x5ecb,_0x399fab={'IYiqj':function(_0x7e5c25,_0x54214e){return _0x7e5c25>_0x54214e;},'LrTPo':'...'};return _0x399fab[_0x17c605(0x155)](_0xbbf323['length'],_0x481b6a)?_0xbbf323[_0x17c605(0x173)](0x0,_0x481b6a)+_0x399fab['LrTPo']:_0xbbf323;}function buildCliArtifactPath(_0x531878,_0x7dbf10){const _0x3ba12b=_0x5ecb,_0x51f90e={'soGKe':function(_0x1c0c0d,_0xf4e238,_0x5c50bf){return _0x1c0c0d(_0xf4e238,_0x5c50bf);}};return _0x51f90e[_0x3ba12b(0x150)](join,_0x531878,_0x7dbf10);}function toStepDisplayName(_0xfb69fa){const _0x1ba377=_0x5ecb,_0x3ed29b=basename(_0xfb69fa)['replace'](/\.(?:png|ya?ml)$/i,'')['replace'](/^key_/i,'')[_0x1ba377(0x1a3)](/^\d+_/,'')[_0x1ba377(0x1a3)](/-/g,'\x20');return{'name':_0x3ed29b,'isKeyStep':/^key_/i['test'](basename(_0xfb69fa))};}function extractShellValue(_0x779f1d){if(!_0x779f1d)return null;return _0x779f1d[0x1]??_0x779f1d[0x2]??_0x779f1d[0x3]??null;}function extractFilenameOption(_0x229823){const _0x4f60d6=_0x5ecb,_0x3781fb={'fqQLz':function(_0x2898c4,_0x3d22cd){return _0x2898c4(_0x3d22cd);}};return _0x3781fb[_0x4f60d6(0x18d)](extractShellValue,_0x229823[_0x4f60d6(0x185)](/--filename(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/));}function extractFirstCommandArgument(_0x4c67d1,_0x2eda2e){const _0x3c6358=_0x5ecb,_0x2a2e5f={'onuWp':'\x5c$&','HlsvJ':function(_0x4dc208,_0x43065e){return _0x4dc208(_0x43065e);}},_0xe3c87a=_0x2eda2e[_0x3c6358(0x1a3)](/[.*+?^${}()|[\]\\]/g,_0x2a2e5f[_0x3c6358(0x142)]);return _0x2a2e5f[_0x3c6358(0x1af)](extractShellValue,_0x4c67d1['match'](new RegExp('(?:^|\x5cs)'+_0xe3c87a+_0x3c6358(0x162))));}function formatCommandTarget(_0x40c0c5){const _0x59a973=_0x5ecb,_0xd98426={'vnzAs':_0x59a973(0x159),'poyuW':function(_0xe7ee7b,_0x251528,_0x2af954){return _0xe7ee7b(_0x251528,_0x2af954);}};if(!_0x40c0c5)return _0xd98426[_0x59a973(0x1c1)];if(/^e\d+$/i[_0x59a973(0x189)](_0x40c0c5))return _0x59a973(0x193)+_0x40c0c5;return JSON['stringify'](_0xd98426[_0x59a973(0x1b4)](truncatePreview,_0x40c0c5,0x78));}function formatPlaywrightCliLog(_0x53bbe5,_0x3fb8e9){const _0x1d5f8e=_0x5ecb,_0x17795a={'uwSUT':_0x1d5f8e(0x15f),'MlIzC':_0x1d5f8e(0x1b6),'YGsHM':_0x1d5f8e(0x1ad),'OOdEi':_0x1d5f8e(0x176),'wYkEp':_0x1d5f8e(0x183),'eVArN':_0x1d5f8e(0x14e),'bEVrq':function(_0x27309a,_0x5e8df9){return _0x27309a(_0x5e8df9);},'fWQox':'capture\x20screenshot','avmyl':function(_0x28725f,_0x5d22df){return _0x28725f(_0x5d22df);},'nVaVa':function(_0x88b64d,_0x4e662d,_0x21c1ac){return _0x88b64d(_0x4e662d,_0x21c1ac);},'ERsIC':function(_0x3ac4aa,_0x387a11,_0xb2521c){return _0x3ac4aa(_0x387a11,_0xb2521c);},'iNKnl':'fill','OQGlQ':_0x1d5f8e(0x1bb),'dmrFu':'run-code','odLyh':'select\x20tab'};switch(_0x3fb8e9){case'open':{const _0x55a770=extractFirstCommandArgument(_0x53bbe5,_0x3fb8e9);return _0x55a770?'open\x20'+_0x55a770:_0x17795a['uwSUT'];}case _0x17795a['MlIzC']:return'start\x20tracing';case'tracing-stop':return _0x17795a['YGsHM'];case _0x17795a['OOdEi']:return _0x17795a[_0x1d5f8e(0x145)];case _0x17795a[_0x1d5f8e(0x198)]:return _0x1d5f8e(0x1c4);case _0x1d5f8e(0x15b):{const _0x3e7cd8=_0x17795a[_0x1d5f8e(0x14d)](extractFilenameOption,_0x53bbe5);if(!_0x3e7cd8)return'capture\x20snapshot';const {name:_0x23a069}=toStepDisplayName(_0x3e7cd8);return'capture\x20snapshot\x20`'+_0x23a069+'`';}case'screenshot':{const _0x5ef841=extractFilenameOption(_0x53bbe5);if(!_0x5ef841)return _0x17795a['fWQox'];const {name:_0x374008,isKeyStep:_0x595feb}=_0x17795a[_0x1d5f8e(0x14d)](toStepDisplayName,_0x5ef841);return _0x595feb?'capture\x20key\x20step\x20`'+_0x374008+'`':'capture\x20step\x20`'+_0x374008+'`';}case'click':return _0x1d5f8e(0x195)+_0x17795a[_0x1d5f8e(0x16e)](formatCommandTarget,_0x17795a['nVaVa'](extractFirstCommandArgument,_0x53bbe5,_0x3fb8e9));case _0x1d5f8e(0x180):return'check\x20'+formatCommandTarget(_0x17795a['ERsIC'](extractFirstCommandArgument,_0x53bbe5,_0x3fb8e9));case _0x17795a[_0x1d5f8e(0x1a1)]:return _0x1d5f8e(0x191)+formatCommandTarget(extractFirstCommandArgument(_0x53bbe5,_0x3fb8e9));case _0x17795a[_0x1d5f8e(0x17b)]:return _0x1d5f8e(0x197)+_0x17795a['bEVrq'](formatCommandTarget,_0x17795a['nVaVa'](extractFirstCommandArgument,_0x53bbe5,_0x3fb8e9));case _0x17795a[_0x1d5f8e(0x1be)]:return'run\x20custom\x20Playwright\x20code';case'tab-new':{const _0x4dfdd3=extractFirstCommandArgument(_0x53bbe5,_0x3fb8e9);return _0x4dfdd3?_0x1d5f8e(0x1ae)+_0x4dfdd3:_0x1d5f8e(0x1c8);}case _0x1d5f8e(0x19f):{const _0x44b0dd=extractFirstCommandArgument(_0x53bbe5,_0x3fb8e9);return _0x44b0dd?_0x1d5f8e(0x15d)+_0x44b0dd:_0x17795a['odLyh'];}default:return _0x3fb8e9;}}function extractPlaywrightCliToolDescription(_0x14c197){const _0x578729=_0x5ecb,_0x5774fe={'MYNwL':function(_0xcee932,_0x36e11a){return _0xcee932!==_0x36e11a;}},_0x2e06b3=_0x14c197[_0x578729(0x199)];if(_0x5774fe['MYNwL'](typeof _0x2e06b3,_0x578729(0x169)))return null;const _0x3973b4=_0x2e06b3[_0x578729(0x18e)]()[_0x578729(0x1a3)](/\s+/g,'\x20');return _0x3973b4['length']>0x0?_0x3973b4:null;}export function formatPlaywrightCliConsoleLogMessage(_0x4f6627,_0x5394a6,_0x40272b){const _0x48c764=_0x5ecb,_0x23c48d=formatPlaywrightCliLog(_0x5394a6,_0x40272b),_0x68a15=extractPlaywrightCliToolDescription(_0x4f6627);if(!_0x68a15)return _0x48c764(0x1b3)+_0x23c48d;if(process['env'][_0x48c764(0x196)])return _0x48c764(0x13f)+_0x68a15+'\x20('+_0x23c48d+')';return'[ranger-verification-agent]\x20'+_0x68a15;}export function buildVerifyFeatureCliDebugPrompt(_0x5afebc,_0x4f5f79){const _0x10ab09=_0x5ecb,_0x50b5f4={'mexjq':function(_0x5bddab,_0x22fabb,_0x6490e9){return _0x5bddab(_0x22fabb,_0x6490e9);},'uRkyX':_0x10ab09(0x1a7),'rliYX':function(_0x11df99,_0x4ce6c7){return _0x11df99(_0x4ce6c7);}},_0x5a1ca6=buildCliArtifactPath(_0x4f5f79,'00_mozilla-homepage.yml'),_0x146222=_0x50b5f4['mexjq'](buildCliArtifactPath,_0x4f5f79,'01_mozilla-homepage.png'),_0xa2f9ca=_0x50b5f4[_0x10ab09(0x17d)](buildCliArtifactPath,_0x4f5f79,'02_learn-more.yml'),_0x2a37c3=buildCliArtifactPath(_0x4f5f79,_0x50b5f4['uRkyX']),_0x41c7c9=_0x50b5f4['rliYX'](quoteShellArg,_0x5a1ca6),_0x2120f3=_0x50b5f4['rliYX'](quoteShellArg,_0x146222),_0x1fb005=_0x50b5f4[_0x10ab09(0x187)](quoteShellArg,_0xa2f9ca),_0x715971=quoteShellArg(_0x2a37c3);return'You\x20are\x20testing\x20browser\x20automation.\x20Your\x20task\x20is\x20simple:\x0a\x0aUse\x20Bash\x20and\x20Playwright\x20CLI\x20only.\x20The\x20browser\x20command\x20prefix\x20is:\x0a'+_0x5afebc+_0x10ab09(0x16a)+_0x5afebc+'\x20open\x20https://www.mozilla.org`\x0a2.\x20Run\x20`'+_0x5afebc+_0x10ab09(0x165)+_0x5afebc+_0x10ab09(0x152)+_0x4f5f79+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a5.\x20Run\x20`'+_0x5afebc+'\x20snapshot\x20--filename\x20'+_0x41c7c9+'`\x0a5.\x20Read\x20the\x20snapshot\x20file\x20to\x20find\x20the\x20\x22Learn\x20More\x22\x20link\x20reference\x0a6.\x20Run\x20`'+_0x5afebc+_0x10ab09(0x18a)+_0x2120f3+_0x10ab09(0x19e)+_0x5afebc+'\x20snapshot\x20--filename\x20'+_0x1fb005+_0x10ab09(0x1ab)+_0x5afebc+_0x10ab09(0x18a)+_0x715971+_0x10ab09(0x177);}export function buildVerifyFeatureCliPrompt(_0x3ba76e){const _0x59e4ca=_0x5ecb,_0x135e9d={'HfyLX':function(_0x16fe4d,_0x884217,_0xed9441){return _0x16fe4d(_0x884217,_0xed9441);},'oTggG':function(_0x45f6a6,_0x4d79eb,_0x36aff6){return _0x45f6a6(_0x4d79eb,_0x36aff6);},'ojogm':function(_0x2e98e7,_0x35cf77,_0x1f3dfb){return _0x2e98e7(_0x35cf77,_0x1f3dfb);},'wnjAk':'01_initial-state.png','MmIwC':function(_0x106a80,_0x3e8a0b){return _0x106a80(_0x3e8a0b);},'EvFiW':function(_0x40a03b,_0x1ecf41){return _0x40a03b(_0x1ecf41);},'pOQOF':function(_0x1633a1,_0x424988){return _0x1633a1>_0x424988;},'FBHsE':'03_result-visible.png'},{checklistItem:_0x3d8a8b,itemFeedback:_0x3e2f7b,taskDescription:_0x455616,cliCommandPrefix:_0xb2721d,cliArtifactDir:_0x163ceb,isCdpMode:_0x23a7c4,url:_0x299032,cdpEndpoint:_0x1ee0be,loginInstructions:_0x200438}=_0x3ba76e,_0x5a2eee=_0x135e9d['HfyLX'](buildCliArtifactPath,_0x163ceb,'01_initial.yml'),_0x57f087=_0x135e9d[_0x59e4ca(0x15c)](buildCliArtifactPath,_0x163ceb,'02_state.yml'),_0x134d8f=_0x135e9d['oTggG'](buildCliArtifactPath,_0x163ceb,_0x59e4ca(0x16d)),_0x464da3=_0x135e9d[_0x59e4ca(0x14c)](buildCliArtifactPath,_0x163ceb,_0x135e9d['wnjAk']),_0x254bc7=_0x135e9d['MmIwC'](quoteShellArg,_0x5a2eee),_0x2eaf99=quoteShellArg(_0x57f087),_0x43a7a4=_0x135e9d[_0x59e4ca(0x1aa)](quoteShellArg,_0x134d8f),_0x7bc698=quoteShellArg(_0x464da3),_0x50304f=_0x3d8a8b[_0x59e4ca(0x186)]?_0x59e4ca(0x14b)+_0x3d8a8b['notes']:'';let _0x45ebf8='';if(_0x3e2f7b&&_0x135e9d['pOQOF'](_0x3e2f7b['unaddressedComments'][_0x59e4ca(0x140)],0x0)){const _0x487922=_0x3e2f7b[_0x59e4ca(0x171)][_0x59e4ca(0x1a2)](_0x2628b9=>{const _0x15651b=_0x59e4ca,_0x283e57=new Date(_0x2628b9['createdAt'])[_0x15651b(0x192)]('en-US',{'month':'short','day':'numeric'}),_0x14d7dc=_0x2628b9['authorName']||_0x2628b9['authorEmail']||'Reviewer',_0x6069e3=_0x2628b9['domRef']?'\x20(on\x20element:\x20<'+(_0x2628b9['domRef'][_0x15651b(0x166)]['split'](_0x15651b(0x147))[_0x15651b(0x1c7)]()?.[_0x15651b(0x163)](':')[0x0]||'element')+'>\x20\x22'+(_0x2628b9[_0x15651b(0x18c)]['textContent']||'')['slice'](0x0,0x32)+'\x22)':'';return'-\x20['+_0x2628b9['id']+_0x15651b(0x184)+_0x14d7dc+_0x15651b(0x175)+_0x283e57+_0x15651b(0x1c3)+_0x2628b9['content']+'\x22'+_0x6069e3;})['join']('\x0a');_0x45ebf8=_0x59e4ca(0x18f)+_0x487922;}const _0x192a36=_0x3e2f7b?.['canonicalFlow']?_0x59e4ca(0x1ba)+_0x3e2f7b['canonicalFlow']:'',_0x521964=_0x23a7c4?'##\x20App\x20Context\x0aYou\x20are\x20connected\x20to\x20a\x20desktop\x20application\x20via\x20CDP\x20(Chrome\x20DevTools\x20Protocol)\x20at\x20'+_0x1ee0be+'.\x0aThis\x20is\x20NOT\x20a\x20web\x20app\x20—\x20there\x20is\x20no\x20URL\x20to\x20navigate\x20to.\x20The\x20app\x20is\x20already\x20running\x20and\x20connected.':_0x59e4ca(0x17c)+_0x299032+_0x59e4ca(0x143),_0x2703b2=_0x299032?quoteShellArg(_0x299032):'',_0x170edb=_0x23a7c4?_0x59e4ca(0x190)+_0xb2721d+'\x20open`,\x20then\x20`'+_0xb2721d+_0x59e4ca(0x1c9)+_0xb2721d+'\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x163ceb+_0x59e4ca(0x188)+_0xb2721d+_0x59e4ca(0x1a9)+_0x254bc7+_0x59e4ca(0x16f)+_0xb2721d+_0x59e4ca(0x18a)+_0x7bc698+_0x59e4ca(0x1b8)+_0xb2721d+_0x59e4ca(0x1c0):_0x59e4ca(0x190)+_0xb2721d+_0x59e4ca(0x1b2)+_0x2703b2+_0x59e4ca(0x146)+_0xb2721d+'\x20tracing-start`,\x20then\x20`'+_0xb2721d+'\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x163ceb+_0x59e4ca(0x188)+_0xb2721d+'\x20snapshot\x20--filename\x20'+_0x254bc7+'`\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`'+_0xb2721d+_0x59e4ca(0x18a)+_0x7bc698+_0x59e4ca(0x157)+_0xb2721d+'\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',_0x98c25=_0x23a7c4?_0x59e4ca(0x164):'\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.',_0x5d2245=_0x200438?_0x59e4ca(0x19c)+_0x200438+_0x59e4ca(0x19d):'';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'+_0x3d8a8b[_0x59e4ca(0x199)]+_0x50304f+_0x45ebf8+_0x192a36+'\x0a\x0a##\x20Task\x20to\x20Execute\x0a'+_0x455616+'\x0a\x0a'+_0x521964+_0x5d2245+'\x0a\x0a'+_0x170edb+_0x59e4ca(0x17e)+_0xb2721d+'`\x0a\x0a-\x20Write\x20all\x20artifacts\x20under\x20`'+_0x163ceb+_0x59e4ca(0x19a)+_0x2eaf99+_0x59e4ca(0x15e)+_0x43a7a4+'`\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`'+_0x163ceb+'`:\x20\x22'+_0x464da3+'\x22,\x20\x22'+buildCliArtifactPath(_0x163ceb,_0x59e4ca(0x144))+'\x22,\x20\x22'+buildCliArtifactPath(_0x163ceb,_0x135e9d['FBHsE'])+'\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'+_0x135e9d[_0x59e4ca(0x15c)](buildCliArtifactPath,_0x163ceb,'key_04_success-state.png')+'\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'+_0x98c25+'\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(_0x45b949){const _0x548d27=_0x5ecb,_0x5884f3={'AiRrf':function(_0x4867ea,_0x309fa2){return _0x4867ea===_0x309fa2;}},_0x50b684=[..._0x45b949[_0x548d27(0x1c6)]()][_0x548d27(0x174)]();let _0xd4788f=0x0;for(const _0x2a49c7 of _0x45b949[_0x548d27(0x18b)]()){_0xd4788f+=_0x2a49c7;}return{'cliCommandCount':_0xd4788f,'cliCommandsSeen':_0x50b684,'noCliCommandsCalled':_0x5884f3[_0x548d27(0x160)](_0xd4788f,0x0)};}export function createVerifyFeatureCliHooks(_0x5ed140){const _0x2d03fa=_0x5ecb,_0x54a323={'mnATt':function(_0x2ee92b,_0x303c83){return _0x2ee92b!==_0x303c83;},'KhVDT':_0x2d03fa(0x1a4),'GyfVG':function(_0x143bdd,_0x249800){return _0x143bdd+_0x249800;},'ONHJJ':_0x2d03fa(0x158),'gUpoC':_0x2d03fa(0x1a5),'SABVr':function(_0x1fe427,_0x8e2167){return _0x1fe427(_0x8e2167);},'skqgs':function(_0x4087c2,_0x290040){return _0x4087c2!==_0x290040;},'UPXHH':_0x2d03fa(0x15b),'EClma':function(_0x15ac52,_0x232ab8,_0x1e62dd,_0x26917c){return _0x15ac52(_0x232ab8,_0x1e62dd,_0x26917c);},'ysVfG':'tool_failure'},_0x4b35cb=new Map(),_0x264efa=async _0x31a2ca=>{const _0x309d02=_0x2d03fa;if(_0x31a2ca['hook_event_name']!=='PostToolUse')return{};const _0x302eec=_0x31a2ca;if(_0x54a323[_0x309d02(0x182)](_0x302eec[_0x309d02(0x1bc)],_0x54a323[_0x309d02(0x1c2)]))return{};const _0x369e68=_0x302eec[_0x309d02(0x172)],_0x351533=extractBashCommand(_0x369e68);if(!_0x351533)return{};const _0x3cd54d=parsePlaywrightCliCommand(_0x351533);if(!_0x3cd54d)return{};return _0x4b35cb['set'](_0x3cd54d,_0x54a323[_0x309d02(0x153)](_0x4b35cb[_0x309d02(0x154)](_0x3cd54d)||0x0,0x1)),_0x5ed140[_0x309d02(0x1a0)](_0x54a323[_0x309d02(0x168)],{'transport':_0x54a323[_0x309d02(0x15a)],'toolName':_0x3cd54d}),_0x5ed140[_0x309d02(0x1b0)](_0x54a323[_0x309d02(0x168)],{'transport':_0x54a323['gUpoC'],'toolName':_0x3cd54d,'bashCommandPreview':_0x54a323[_0x309d02(0x19b)](truncatePreview,_0x351533)}),_0x54a323[_0x309d02(0x1b5)](_0x3cd54d,_0x54a323['UPXHH'])&&console['log'](_0x54a323[_0x309d02(0x1c5)](formatPlaywrightCliConsoleLogMessage,_0x369e68,_0x351533,_0x3cd54d)),{};},_0x514d50=async _0x278878=>{const _0x40f4ee=_0x2d03fa;if(_0x278878[_0x40f4ee(0x16b)]!=='PostToolUseFailure')return{};const _0x248bab=_0x278878;if(_0x248bab['tool_name']!=='Bash')return{};return await _0x5ed140['trackPhaseError'](_0x54a323[_0x40f4ee(0x151)],_0x248bab['error'],{'transport':_0x54a323[_0x40f4ee(0x15a)],'toolName':_0x54a323[_0x40f4ee(0x1c2)]}),{};};return{'postToolUseHook':_0x264efa,'postToolUseFailureHook':_0x514d50,'commandCounts':_0x4b35cb};}async function runPlaywrightCliLifecycleCommand(_0xc22edf){const _0x3cc5ad=_0x5ecb,_0x3d0725={'VUzAm':function(_0xee2545,_0x476ca0){return _0xee2545(_0x476ca0);},'hcywb':function(_0xbe5510,_0x35795f){return _0xbe5510??_0x35795f;},'DWAAr':function(_0x385c27,_0x1ba806,_0x1a396a){return _0x385c27(_0x1ba806,_0x1a396a);},'LVeuc':function(_0x259b3c,_0x543fa3,_0x26a04a){return _0x259b3c(_0x543fa3,_0x26a04a);}},{sessionId:_0x3742b5,configPath:_0x10219f,commandArgs:_0x3f37fd,env:_0x24fcf4,telemetry:_0x82635b,phase:_0x3422cc,metadata:_0x4da59e,timeoutMs:_0x198821}=_0xc22edf;_0x82635b['trackPhaseStart'](_0x3422cc,_0x4da59e);try{const _0x3e8f6d=await _0x3d0725['VUzAm'](runPlaywrightCliCommand,{'sessionId':_0x3742b5,'configPath':_0x10219f,'commandArgs':_0x3f37fd,'cwd':process['cwd'](),'env':_0x24fcf4,'timeoutMs':_0x3d0725[_0x3cc5ad(0x149)](_0x198821,PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS)});_0x82635b['trackPhaseEnd'](_0x3422cc,{..._0x4da59e,'subcommand':_0x3e8f6d['invocation'][_0x3cc5ad(0x148)],'stdoutPreview':_0x3d0725[_0x3cc5ad(0x1a8)](truncatePreview,_0x3e8f6d['stdout'],0x7d0),'stderrPreview':_0x3d0725['LVeuc'](truncatePreview,_0x3e8f6d[_0x3cc5ad(0x167)],0x7d0)});}catch(_0x45412d){await _0x82635b['trackPhaseError'](_0x3422cc,_0x45412d,_0x4da59e);throw _0x45412d;}}export async function finalizeVerifyFeatureCliSession(_0x2284bf){const _0x6a6b8a=_0x5ecb,_0x4a7a57={'guESn':_0x6a6b8a(0x156),'bbSGO':function(_0x59825c,_0x4d23a0,_0x28b87e){return _0x59825c(_0x4d23a0,_0x28b87e);},'qaZxn':_0x6a6b8a(0x14a),'JFcPV':function(_0x5ed647,_0x2ca0dc){return _0x5ed647(_0x2ca0dc);}},{telemetry:_0x1e3b82,sessionId:_0x40557b,configPath:_0x18915e,cliArtifactDir:_0x3634c7,env:_0x4cef7b,transportMetadata:_0x131423}=_0x2284bf,_0x2a36d6=[{'phase':_0x6a6b8a(0x17f),'commandArgs':[_0x6a6b8a(0x170)]},{'phase':_0x4a7a57[_0x6a6b8a(0x161)],'commandArgs':['video-stop','--filename='+_0x4a7a57['bbSGO'](buildCliArtifactPath,_0x3634c7,_0x6a6b8a(0x1b9))]},{'phase':'playwright_cli_close','commandArgs':[_0x4a7a57['qaZxn']]}];for(const _0x4270d3 of _0x2a36d6){try{await _0x4a7a57['JFcPV'](runPlaywrightCliLifecycleCommand,{'sessionId':_0x40557b,'configPath':_0x18915e,'commandArgs':[..._0x4270d3['commandArgs']],'env':_0x4cef7b,'telemetry':_0x1e3b82,'phase':_0x4270d3[_0x6a6b8a(0x178)],'metadata':_0x131423});}catch{}}}export async function loadVerifyFeatureCliTraceUploadArtifact(_0x1a1fdd){const _0xdf12b8=_0x5ecb,_0x31f4f2={'hayaK':'trace.zip','ovKtJ':'trace.trace.zip'},_0x1a5bd8=[_0x31f4f2['hayaK'],_0x31f4f2[_0xdf12b8(0x1ca)]];for(const _0x1afeb0 of _0x1a5bd8){const _0x5654a1=join(_0x1a1fdd,_0x1afeb0);try{return{'buffer':await readFile(_0x5654a1),'source':_0x5654a1};}catch{}}return null;}function _0x35e2(){const _0x282f47=['open\x20new\x20tab','\x20tracing-start`,\x20then\x20`','ovKtJ','[ranger-verification-agent]\x20','length','isFile','onuWp','\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','02_button-clicked.png','wYkEp','`,\x20then\x20`','\x20>\x20','subcommand','hcywb','close','\x0a\x0a##\x20Additional\x20Notes\x0a','ojogm','bEVrq','video-stop','2080610HjVqQQ','soGKe','ysVfG','\x20video-start`\x0a4.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','GyfVG','get','IYiqj','playwright_cli_video_stop','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a8.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','tool_call','target','gUpoC','snapshot','HfyLX','select\x20tab\x20','`\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','open\x20browser','AiRrf','guESn','(?:\x5cs+(?:\x22([^\x22]+)\x22|\x27([^\x27]+)\x27|(\x5cS+)))','split','\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.','\x20tracing-start`\x0a3.\x20Run\x20`','selector','stderr','ONHJJ','string','\x0a\x0a1.\x20Run\x20`','hook_event_name','955eBYqbY','key_03_success-state.png','avmyl','`\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`','tracing-stop','unaddressedComments','tool_input','slice','sort','**\x20(','video-start','`\x0a10.\x20Return\x20immediately\x20with\x20the\x20structured\x20output\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format.','phase','19140mxbjlS','mtimeMs','OQGlQ','CRITICAL\x20URL\x20REQUIREMENT:\x0aYour\x20base\x20URL\x20is:\x20','mexjq','\x0a\x0a##\x20Browser\x20Command\x20Reference\x0aUse\x20Bash\x20to\x20run\x20Playwright\x20CLI\x20commands\x20with\x20this\x20exact\x20prefix:\x0a`','playwright_cli_tracing_stop','check','8812ZSTUJW','mnATt','start\x20video\x20recording',']\x20**','match','notes','rliYX','`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`','test','\x20screenshot\x20--filename\x20','values','domRef','fqQLz','trim','\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','##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`','fill\x20','toLocaleDateString','ref\x20','372904bEPikj','click\x20','DEBUG','press\x20','eVArN','description','`\x0a-\x20`snapshot\x20--filename\x20','SABVr','\x0a\x0a##\x20Authentication\x0aBEFORE\x20starting\x20the\x20verification\x20task,\x20you\x20MUST\x20authenticate\x20using\x20these\x20steps:\x0a','\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.','`\x0a7.\x20Click\x20the\x20\x22Learn\x20More\x22\x20link\x20with\x20Playwright\x20CLI\x0a8.\x20Run\x20`','tab-select','trackPhaseStart','iNKnl','map','replace','Bash','playwright-cli','name','03_learn-more.png','DWAAr','\x20snapshot\x20--filename\x20','EvFiW','`\x0a9.\x20Run\x20`','760782PvFByY','stop\x20tracing','open\x20new\x20tab\x20','HlsvJ','trackPhaseEnd','3124DLqVTR','\x20open\x20','[playwright-cli]\x20','poyuW','skqgs','tracing-start','push','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a6.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','session-recording.webm','\x0a\x0a##\x20Expected\x20Flow\x20(from\x20previous\x20verification)\x0a','press','tool_name','5794137eNswZg','dmrFu','244kfGwbe','\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','vnzAs','KhVDT','):\x20\x22','stop\x20video\x20recording','EClma','keys','pop'];_0x35e2=function(){return _0x282f47;};return _0x35e2();}export async function rehomeVerifyFeatureCliArtifacts(_0x4fe039){const _0x4492dd=_0x5ecb,_0x42d940={'mrrEp':function(_0x1a5364,_0x278af3,_0x5059cc){return _0x1a5364(_0x278af3,_0x5059cc);},'YLCkF':function(_0x17876e,_0x2815b3){return _0x17876e<_0x2815b3;}},{cwd:_0x10d119,cliArtifactDir:_0x2ad662,startTime:_0x2467e2}=_0x4fe039,_0x423956=[];await mkdir(_0x2ad662,{'recursive':!![]});const _0x1c7c8a=await _0x42d940['mrrEp'](readdir,_0x10d119,{'withFileTypes':!![]});for(const _0x4084ae of _0x1c7c8a){if(!_0x4084ae[_0x4492dd(0x141)]()||!VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN[_0x4492dd(0x189)](_0x4084ae['name']))continue;const _0x421888=join(_0x10d119,_0x4084ae[_0x4492dd(0x1a6)]),_0x2cca0c=await stat(_0x421888);if(_0x42d940['YLCkF'](_0x2cca0c[_0x4492dd(0x17a)]+0x7d0,_0x2467e2))continue;const _0x6430af=buildCliArtifactPath(_0x2ad662,_0x4084ae[_0x4492dd(0x1a6)]);if(_0x421888===_0x6430af)continue;await rename(_0x421888,_0x6430af),_0x423956[_0x4492dd(0x1b7)](_0x4084ae['name']);}return _0x423956[_0x4492dd(0x174)]();}
|
|
@@ -7,15 +7,44 @@ description: "Ranger’s browser verification tooling that supplements a coding
|
|
|
7
7
|
|
|
8
8
|
Run Ranger commands using `ranger-cli <args>`.
|
|
9
9
|
|
|
10
|
-
**IMPORTANT: At the start of any session, run `ranger-cli update`
|
|
10
|
+
**IMPORTANT: At the start of any session, check that you have the latest CLI and skills. If you were installed from `@latest`, run `ranger-cli update`. If you are on a prerelease (e.g., `@alpha`, version contains `-alpha.`), do NOT run `ranger-cli update` — it will move you to `@latest` and off the prerelease track. Check with your team lead or re-install with `npm i -g @ranger-testing/ranger-cli@alpha` to stay current on that channel.**
|
|
11
11
|
|
|
12
12
|
If you are running in Claude Code, read and suggest the following claude-specific commands to the user: [claude.md](./claude.md).
|
|
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
|
-
|
|
16
|
+
## One-shot verification (default path when you have creds)
|
|
17
17
|
|
|
18
|
-
|
|
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
|
+
|
|
20
|
+
```bash
|
|
21
|
+
RANGER_TEST_USERNAME='alice@example.com' RANGER_TEST_PASSWORD='hunter2' \
|
|
22
|
+
ranger-cli go --base-url <target-url> --notes '<the goal verbatim>'
|
|
23
|
+
```
|
|
24
|
+
|
|
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
|
|
30
|
+
|
|
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).
|
|
32
|
+
|
|
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.
|
|
34
|
+
|
|
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
|
|
19
48
|
|
|
20
49
|
| Workflow | When to Use | Required Reading |
|
|
21
50
|
|----------|-------------|------------------|
|
|
@@ -232,9 +261,10 @@ When completing your work or ending the session, your final message to the user
|
|
|
232
261
|
|
|
233
262
|
If you encounter authentication issues:
|
|
234
263
|
|
|
235
|
-
1. **
|
|
236
|
-
2. **
|
|
237
|
-
3. **
|
|
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.
|
|
265
|
+
2. **Check existing profiles**: Run `ranger-cli profile ls` to see all configured profiles.
|
|
266
|
+
3. **Pin a specific profile**: Use `ranger-cli profile use <profile-name>` (or pass `--profile <name>` / set `RANGER_PROFILE`).
|
|
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.)
|
|
238
268
|
|
|
239
269
|
|
|
240
270
|
### Authentication Issues to Ranger
|
|
@@ -2,6 +2,25 @@
|
|
|
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
|
|
6
|
+
|
|
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
|
+
|
|
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`.
|
|
23
|
+
|
|
5
24
|
## Basic Command
|
|
6
25
|
|
|
7
26
|
```bash
|
|
@@ -1,24 +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
|
+
|
|
7
|
+
```bash
|
|
8
|
+
RANGER_TEST_USERNAME='alice@example.com' RANGER_TEST_PASSWORD='hunter2' \
|
|
9
|
+
ranger-cli go --base-url <target-url> --notes '<the goal verbatim>'
|
|
10
|
+
```
|
|
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:
|
|
28
|
+
|
|
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
|
|
32
|
+
|
|
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:
|
|
6
38
|
|
|
7
39
|
```bash
|
|
8
40
|
ranger-cli go --scenario <N> --notes "<what to verify>"
|
|
9
41
|
```
|
|
10
42
|
|
|
11
|
-
|
|
43
|
+
## Profile resolution order
|
|
12
44
|
|
|
13
|
-
|
|
45
|
+
1. `--profile <name>` flag (or `RANGER_PROFILE` env var)
|
|
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
|
|
14
49
|
|
|
15
|
-
|
|
50
|
+
## Active feature review (only needed for scenario-driven runs)
|
|
51
|
+
|
|
52
|
+
If you're verifying a scenario (not a one-shot):
|
|
16
53
|
|
|
17
54
|
```bash
|
|
18
55
|
ranger-cli list # Find feature reviews to resume
|
|
19
56
|
ranger-cli resume <id> # Resume a specific feature review
|
|
20
57
|
```
|
|
21
58
|
|
|
59
|
+
For a one-shot `go --base-url ... --notes '...'`, the CLI handles feature-review creation for you.
|
|
60
|
+
|
|
22
61
|
## The Verification Flow
|
|
23
62
|
|
|
24
63
|
1. **Select scenario** - CLI prompts which scenario this verifies
|
|
@@ -41,7 +80,7 @@ You do NOT need to manually include reviewer feedback in your `--notes` descript
|
|
|
41
80
|
|
|
42
81
|
| Option | Required | Description |
|
|
43
82
|
|--------|----------|-------------|
|
|
44
|
-
| `--profile` | No | Profile to use
|
|
83
|
+
| `--profile` | No | Profile to use. Equivalent to `RANGER_PROFILE` env var. Defaults to active profile, or to the user keyed by `RANGER_TEST_USERNAME` if set. |
|
|
45
84
|
| `--notes` | No | What to verify (defaults to scenario description) |
|
|
46
85
|
| `--scenario` | No | Scenario index to verify (skips selection prompt) |
|
|
47
86
|
| `--start-path` | No | Path to start on (appended to base URL, e.g., `/dashboard`) |
|
|
@@ -182,7 +221,7 @@ Always end the conversational turn by sharing the dashboard link whenever you ru
|
|
|
182
221
|
Run `ranger-cli list` to find feature reviews, then `ranger-cli resume <id>` to resume one.
|
|
183
222
|
|
|
184
223
|
### "No active profile"
|
|
185
|
-
|
|
224
|
+
Either set `RANGER_TEST_USERNAME` (and `RANGER_TEST_PASSWORD` for first-time login) and re-run, or pin one explicitly with `ranger-cli profile use <profile-name>`.
|
|
186
225
|
|
|
187
226
|
### Verification times out
|
|
188
227
|
The agent has 59 minutes max. For very long flows, break into smaller scenarios.
|
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.9360c2a-16",
|
|
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
|
}
|