@ranger-testing/ranger-cli 2.5.4-alpha.071b7bd-1 → 2.5.4-alpha.152f635-21
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 -0
- 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 -0
- package/build/commands/utils/cloudProfileSession.js +1 -0
- 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 -0
- 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 -0
- 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 -0
- package/build/commands/utils/rangerConfig.js +1 -1
- package/build/commands/utils/rangerRoot.js +1 -1
- package/build/commands/utils/resolveProfileContext.js +1 -0
- package/build/commands/utils/resolveProfileUrl.js +1 -0
- 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 +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(_0xd11e83,_0x15ae2d){const _0xefe01c=_0x421c,_0xf2479b=_0xd11e83();while(!![]){try{const _0x223f50=parseInt(_0xefe01c(0x236))/0x1+-parseInt(_0xefe01c(0x1db))/0x2*(-parseInt(_0xefe01c(0x201))/0x3)+parseInt(_0xefe01c(0x234))/0x4+parseInt(_0xefe01c(0x252))/0x5*(parseInt(_0xefe01c(0x214))/0x6)+-parseInt(_0xefe01c(0x1f3))/0x7+-parseInt(_0xefe01c(0x20a))/0x8*(parseInt(_0xefe01c(0x262))/0x9)+-parseInt(_0xefe01c(0x22a))/0xa;if(_0x223f50===_0x15ae2d)break;else _0xf2479b['push'](_0xf2479b['shift']());}catch(_0x17199f){_0xf2479b['push'](_0xf2479b['shift']());}}}(_0x4b14,0x6c444));function _0x421c(_0x53d2b8,_0x3da4a8){_0x53d2b8=_0x53d2b8-0x1db;const _0x4b1465=_0x4b14();let _0x421c9f=_0x4b1465[_0x53d2b8];return _0x421c9f;}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(_0x4ae1fa,_0x5c51ae=PLAYWRIGHT_CLI_PREVIEW_LIMIT){const _0x43bfbd=_0x421c,_0x32c443={'AardL':_0x43bfbd(0x1f7)};return _0x4ae1fa[_0x43bfbd(0x250)]>_0x5c51ae?_0x4ae1fa[_0x43bfbd(0x256)](0x0,_0x5c51ae)+_0x32c443[_0x43bfbd(0x1e7)]:_0x4ae1fa;}function buildCliArtifactPath(_0x2ece33,_0x1c06c9){return join(_0x2ece33,_0x1c06c9);}function toStepDisplayName(_0x220f6c){const _0x403843=_0x421c,_0x390d91={'QGakz':function(_0xbaea00,_0x52bf5d){return _0xbaea00(_0x52bf5d);}},_0x3494df=basename(_0x220f6c)[_0x403843(0x217)](/\.(?:png|ya?ml)$/i,'')[_0x403843(0x217)](/^key_/i,'')[_0x403843(0x217)](/^\d+_/,'')['replace'](/-/g,'\x20');return{'name':_0x3494df,'isKeyStep':/^key_/i[_0x403843(0x25c)](_0x390d91['QGakz'](basename,_0x220f6c))};}function extractShellValue(_0x2017f2){if(!_0x2017f2)return null;return _0x2017f2[0x1]??_0x2017f2[0x2]??_0x2017f2[0x3]??null;}function extractFilenameOption(_0x5af635){const _0x272bfd={'AjHkb':function(_0x2388bb,_0x1a46b7){return _0x2388bb(_0x1a46b7);}};return _0x272bfd['AjHkb'](extractShellValue,_0x5af635['match'](/--filename(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/));}function extractFirstCommandArgument(_0x419532,_0x11dbc6){const _0x12f785=_0x421c,_0x2aebc4={'hYxNc':function(_0x245246,_0x95f96e){return _0x245246(_0x95f96e);}},_0x24101a=_0x11dbc6[_0x12f785(0x217)](/[.*+?^${}()|[\]\\]/g,_0x12f785(0x206));return _0x2aebc4['hYxNc'](extractShellValue,_0x419532[_0x12f785(0x21b)](new RegExp('(?:^|\x5cs)'+_0x24101a+_0x12f785(0x25a))));}function formatCommandTarget(_0x42f9bf){const _0x1d1470=_0x421c,_0x5f3da8={'RInvV':function(_0x3b85c1,_0x5621a7,_0x1805a2){return _0x3b85c1(_0x5621a7,_0x1805a2);}};if(!_0x42f9bf)return'target';if(/^e\d+$/i['test'](_0x42f9bf))return _0x1d1470(0x24a)+_0x42f9bf;return JSON[_0x1d1470(0x253)](_0x5f3da8[_0x1d1470(0x212)](truncatePreview,_0x42f9bf,0x78));}function formatPlaywrightCliLog(_0x5f1f3b,_0x4b4b55){const _0x429863=_0x421c,_0xbd108c={'eViEb':function(_0x1b84f4,_0x596512,_0x56f1c4){return _0x1b84f4(_0x596512,_0x56f1c4);},'CyCdd':_0x429863(0x241),'wcPxN':_0x429863(0x202),'BoGjY':_0x429863(0x224),'abuMp':'stop\x20tracing','hFvBM':_0x429863(0x242),'wrrGE':'stop\x20video\x20recording','mJHlu':function(_0x270432,_0x1942fd){return _0x270432(_0x1942fd);},'difUh':_0x429863(0x259),'sugri':function(_0x290d03,_0x3f1d6f){return _0x290d03(_0x3f1d6f);},'HKCCX':'click','GTqtp':function(_0x4e6cb9,_0x2d8b22){return _0x4e6cb9(_0x2d8b22);},'JWnlE':_0x429863(0x1dc),'NkkLF':function(_0x36062a,_0x162779,_0x245b0f){return _0x36062a(_0x162779,_0x245b0f);},'YZoPE':function(_0x1418e7,_0x4d75bd){return _0x1418e7(_0x4d75bd);},'HIlpu':'tab-new','GOBFX':'select\x20tab'};switch(_0x4b4b55){case'open':{const _0x391a52=_0xbd108c[_0x429863(0x226)](extractFirstCommandArgument,_0x5f1f3b,_0x4b4b55);return _0x391a52?_0x429863(0x1ef)+_0x391a52:_0x429863(0x229);}case _0xbd108c['CyCdd']:return _0xbd108c['wcPxN'];case _0xbd108c['BoGjY']:return _0xbd108c[_0x429863(0x1f2)];case'video-start':return'start\x20video\x20recording';case _0xbd108c['hFvBM']:return _0xbd108c[_0x429863(0x209)];case _0x429863(0x25e):{const _0x15e8db=extractFilenameOption(_0x5f1f3b);if(!_0x15e8db)return'capture\x20snapshot';const {name:_0x328184}=_0xbd108c['mJHlu'](toStepDisplayName,_0x15e8db);return'capture\x20snapshot\x20`'+_0x328184+'`';}case _0xbd108c[_0x429863(0x203)]:{const _0x146c6f=_0xbd108c['mJHlu'](extractFilenameOption,_0x5f1f3b);if(!_0x146c6f)return'capture\x20screenshot';const {name:_0x28f17d,isKeyStep:_0x1f44d0}=_0xbd108c[_0x429863(0x20b)](toStepDisplayName,_0x146c6f);return _0x1f44d0?_0x429863(0x219)+_0x28f17d+'`':_0x429863(0x247)+_0x28f17d+'`';}case _0xbd108c['HKCCX']:return _0x429863(0x22e)+_0xbd108c['GTqtp'](formatCommandTarget,extractFirstCommandArgument(_0x5f1f3b,_0x4b4b55));case'check':return _0x429863(0x1ec)+formatCommandTarget(_0xbd108c[_0x429863(0x226)](extractFirstCommandArgument,_0x5f1f3b,_0x4b4b55));case _0xbd108c['JWnlE']:return'fill\x20'+formatCommandTarget(_0xbd108c[_0x429863(0x216)](extractFirstCommandArgument,_0x5f1f3b,_0x4b4b55));case'press':return _0x429863(0x22d)+_0xbd108c[_0x429863(0x255)](formatCommandTarget,_0xbd108c['eViEb'](extractFirstCommandArgument,_0x5f1f3b,_0x4b4b55));case _0x429863(0x211):return _0x429863(0x23a);case _0xbd108c[_0x429863(0x218)]:{const _0x561f6c=extractFirstCommandArgument(_0x5f1f3b,_0x4b4b55);return _0x561f6c?'open\x20new\x20tab\x20'+_0x561f6c:_0x429863(0x249);}case'tab-select':{const _0x13b7fd=_0xbd108c[_0x429863(0x226)](extractFirstCommandArgument,_0x5f1f3b,_0x4b4b55);return _0x13b7fd?'select\x20tab\x20'+_0x13b7fd:_0xbd108c['GOBFX'];}default:return _0x4b4b55;}}function extractPlaywrightCliToolDescription(_0x11adf7){const _0x2b8b64=_0x421c,_0x185804=_0x11adf7['description'];if(typeof _0x185804!=='string')return null;const _0x55760a=_0x185804[_0x2b8b64(0x1fb)]()['replace'](/\s+/g,'\x20');return _0x55760a[_0x2b8b64(0x250)]>0x0?_0x55760a:null;}export function formatPlaywrightCliConsoleLogMessage(_0x330311,_0x421f1c,_0xc49bad){const _0xa6b3e9=_0x421c,_0x9496d4={'PHjYA':function(_0x1925bf,_0x4d33c4,_0x180b41){return _0x1925bf(_0x4d33c4,_0x180b41);}},_0x1a40eb=_0x9496d4['PHjYA'](formatPlaywrightCliLog,_0x421f1c,_0xc49bad),_0xbc5552=extractPlaywrightCliToolDescription(_0x330311);if(!_0xbc5552)return _0xa6b3e9(0x20f)+_0x1a40eb;if(process['env'][_0xa6b3e9(0x263)])return'[ranger-verification-agent]\x20'+_0xbc5552+'\x20('+_0x1a40eb+')';return'[ranger-verification-agent]\x20'+_0xbc5552;}export function buildVerifyFeatureCliDebugPrompt(_0x2cd93c,_0x5e4d99){const _0x4012f8=_0x421c,_0x3a88f4={'NJzvX':'00_mozilla-homepage.yml','dSXSO':function(_0x4ba7cf,_0x3428ba,_0x1c2026){return _0x4ba7cf(_0x3428ba,_0x1c2026);},'kliHt':'02_learn-more.yml','qldKC':function(_0x1082a8,_0x2225f4,_0xdc59b3){return _0x1082a8(_0x2225f4,_0xdc59b3);},'KKNuy':function(_0x1506da,_0x4b2f65){return _0x1506da(_0x4b2f65);}},_0x2bf79e=buildCliArtifactPath(_0x5e4d99,_0x3a88f4['NJzvX']),_0x3f4ee7=_0x3a88f4['dSXSO'](buildCliArtifactPath,_0x5e4d99,_0x4012f8(0x23d)),_0x597d25=_0x3a88f4[_0x4012f8(0x221)](buildCliArtifactPath,_0x5e4d99,_0x3a88f4[_0x4012f8(0x1f0)]),_0x31c989=_0x3a88f4['qldKC'](buildCliArtifactPath,_0x5e4d99,_0x4012f8(0x215)),_0x7e0e03=quoteShellArg(_0x2bf79e),_0x51db0d=quoteShellArg(_0x3f4ee7),_0x3578c7=quoteShellArg(_0x597d25),_0x55fa23=_0x3a88f4['KKNuy'](quoteShellArg,_0x31c989);return'You\x20are\x20testing\x20browser\x20automation.\x20Your\x20task\x20is\x20simple:\x0a\x0aUse\x20Bash\x20and\x20Playwright\x20CLI\x20only.\x20The\x20browser\x20command\x20prefix\x20is:\x0a'+_0x2cd93c+'\x0a\x0a1.\x20Run\x20`'+_0x2cd93c+_0x4012f8(0x248)+_0x2cd93c+_0x4012f8(0x1e6)+_0x2cd93c+_0x4012f8(0x1e9)+_0x5e4d99+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a5.\x20Run\x20`'+_0x2cd93c+'\x20snapshot\x20--filename\x20'+_0x7e0e03+'`\x0a5.\x20Read\x20the\x20snapshot\x20file\x20to\x20find\x20the\x20\x22Learn\x20More\x22\x20link\x20reference\x0a6.\x20Run\x20`'+_0x2cd93c+'\x20screenshot\x20--filename\x20'+_0x51db0d+_0x4012f8(0x205)+_0x2cd93c+'\x20snapshot\x20--filename\x20'+_0x3578c7+'`\x0a9.\x20Run\x20`'+_0x2cd93c+_0x4012f8(0x1e3)+_0x55fa23+_0x4012f8(0x235);}export function buildVerifyFeatureCliPrompt(_0x2eeba0){const _0x855f08=_0x421c,_0x328faf={'mJjWl':'en-US','MIRJy':'numeric','aZGhJ':_0x855f08(0x222),'xUGaS':_0x855f08(0x246),'HiRXK':'02_state.yml','rzYcE':'key_03_success-state.png','NobEc':function(_0x3e7174,_0x58889f){return _0x3e7174(_0x58889f);},'hjSCk':function(_0x381e2e,_0x15016c,_0x5a07dd){return _0x381e2e(_0x15016c,_0x5a07dd);},'WMgyu':_0x855f08(0x213)},{checklistItem:_0x138d56,itemFeedback:_0x499db7,taskDescription:_0x446a51,cliCommandPrefix:_0x4a3043,cliArtifactDir:_0x280fff,isCdpMode:_0x2fca04,url:_0x44305f,cdpEndpoint:_0x57b378,loginInstructions:_0x4de534}=_0x2eeba0,_0x3b1d52=buildCliArtifactPath(_0x280fff,_0x328faf['xUGaS']),_0x2bd3cc=buildCliArtifactPath(_0x280fff,_0x328faf[_0x855f08(0x1e0)]),_0x546799=buildCliArtifactPath(_0x280fff,_0x328faf[_0x855f08(0x21e)]),_0xaf980c=buildCliArtifactPath(_0x280fff,_0x855f08(0x233)),_0x4dbc7d=_0x328faf[_0x855f08(0x227)](quoteShellArg,_0x3b1d52),_0x475d71=quoteShellArg(_0x2bd3cc),_0x4f16e0=_0x328faf[_0x855f08(0x227)](quoteShellArg,_0x546799),_0x337c8a=quoteShellArg(_0xaf980c),_0x4dd92c=_0x138d56[_0x855f08(0x22c)]?_0x855f08(0x264)+_0x138d56['notes']:'';let _0x1f7c11='';if(_0x499db7&&_0x499db7[_0x855f08(0x1f8)]['length']>0x0){const _0x1ce249=_0x499db7[_0x855f08(0x1f8)]['map'](_0x4eb8e2=>{const _0x5f0eed=_0x855f08,_0x57d76d=new Date(_0x4eb8e2[_0x5f0eed(0x230)])[_0x5f0eed(0x21f)](_0x328faf['mJjWl'],{'month':'short','day':_0x328faf['MIRJy']}),_0x5079e5=_0x4eb8e2[_0x5f0eed(0x20e)]||_0x4eb8e2[_0x5f0eed(0x207)]||_0x5f0eed(0x260),_0x3e0c16=_0x4eb8e2[_0x5f0eed(0x210)]?'\x20(on\x20element:\x20<'+(_0x4eb8e2['domRef'][_0x5f0eed(0x1fd)]['split'](_0x328faf['aZGhJ'])['pop']()?.[_0x5f0eed(0x1ea)](':')[0x0]||'element')+_0x5f0eed(0x237)+(_0x4eb8e2[_0x5f0eed(0x210)]['textContent']||'')[_0x5f0eed(0x256)](0x0,0x32)+'\x22)':'';return _0x5f0eed(0x23f)+_0x4eb8e2['id']+_0x5f0eed(0x21c)+_0x5079e5+'**\x20('+_0x57d76d+_0x5f0eed(0x22b)+_0x4eb8e2[_0x5f0eed(0x200)]+'\x22'+_0x3e0c16;})['join']('\x0a');_0x1f7c11='\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'+_0x1ce249;}const _0x27fd2a=_0x499db7?.['canonicalFlow']?_0x855f08(0x225)+_0x499db7[_0x855f08(0x267)]:'',_0x1faa28=_0x2fca04?_0x855f08(0x208)+_0x57b378+'.\x0aThis\x20is\x20NOT\x20a\x20web\x20app\x20—\x20there\x20is\x20no\x20URL\x20to\x20navigate\x20to.\x20The\x20app\x20is\x20already\x20running\x20and\x20connected.':_0x855f08(0x23c)+_0x44305f+_0x855f08(0x1dd),_0x352c44=_0x44305f?quoteShellArg(_0x44305f):'',_0x205686=_0x2fca04?_0x855f08(0x22f)+_0x4a3043+_0x855f08(0x220)+_0x4a3043+_0x855f08(0x1ed)+_0x4a3043+_0x855f08(0x1f6)+_0x280fff+_0x855f08(0x25d)+_0x4a3043+_0x855f08(0x24d)+_0x4dbc7d+'`\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`'+_0x4a3043+'\x20screenshot\x20--filename\x20'+_0x337c8a+_0x855f08(0x1f5)+_0x4a3043+_0x855f08(0x20d):_0x855f08(0x22f)+_0x4a3043+_0x855f08(0x24f)+_0x352c44+_0x855f08(0x24b)+_0x4a3043+_0x855f08(0x1ed)+_0x4a3043+_0x855f08(0x1f6)+_0x280fff+_0x855f08(0x25d)+_0x4a3043+_0x855f08(0x24d)+_0x4dbc7d+_0x855f08(0x1fe)+_0x4a3043+_0x855f08(0x1e3)+_0x337c8a+'`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a8.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`'+_0x4a3043+_0x855f08(0x1e5),_0x4f3138=_0x2fca04?'\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.':_0x855f08(0x251),_0x353496=_0x4de534?'\x0a\x0a##\x20Authentication\x0aBEFORE\x20starting\x20the\x20verification\x20task,\x20you\x20MUST\x20authenticate\x20using\x20these\x20steps:\x0a'+_0x4de534+_0x855f08(0x1f1):'';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'+_0x138d56['description']+_0x4dd92c+_0x1f7c11+_0x27fd2a+'\x0a\x0a##\x20Task\x20to\x20Execute\x0a'+_0x446a51+'\x0a\x0a'+_0x1faa28+_0x353496+'\x0a\x0a'+_0x205686+_0x855f08(0x261)+_0x4a3043+'`\x0a\x0a-\x20Write\x20all\x20artifacts\x20under\x20`'+_0x280fff+'`\x0a-\x20`snapshot\x20--filename\x20'+_0x475d71+'`\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'+_0x4f16e0+'`\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`'+_0x280fff+_0x855f08(0x20c)+_0xaf980c+_0x855f08(0x23e)+_0x328faf[_0x855f08(0x1df)](buildCliArtifactPath,_0x280fff,_0x855f08(0x231))+'\x22,\x20\x22'+_0x328faf[_0x855f08(0x1df)](buildCliArtifactPath,_0x280fff,_0x328faf['WMgyu'])+'\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(_0x280fff,_0x855f08(0x1ee))+'\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'+_0x4f3138+_0x855f08(0x269);}export function summarizeVerifyFeatureCliCommandAvailability(_0x3a6501){const _0x4b7f5e=_0x421c,_0x173a87={'ryQUk':function(_0x5b4b05,_0x1af4c){return _0x5b4b05===_0x1af4c;}},_0x39480b=[..._0x3a6501[_0x4b7f5e(0x1e1)]()]['sort']();let _0x2f1759=0x0;for(const _0x199503 of _0x3a6501['values']()){_0x2f1759+=_0x199503;}return{'cliCommandCount':_0x2f1759,'cliCommandsSeen':_0x39480b,'noCliCommandsCalled':_0x173a87[_0x4b7f5e(0x243)](_0x2f1759,0x0)};}export function createVerifyFeatureCliHooks(_0x2ff677){const _0x409505=_0x421c,_0x2fdd3b={'fXPOS':'PostToolUse','GRqUW':function(_0x8a3b57,_0x1c944c){return _0x8a3b57+_0x1c944c;},'oMvkC':_0x409505(0x1e8),'OztzJ':'tool_call','zanNQ':function(_0x210dcd,_0x367815){return _0x210dcd(_0x367815);},'zMWqz':function(_0x470e6d,_0x3c1130){return _0x470e6d!==_0x3c1130;},'tuNWa':_0x409505(0x254),'prktP':function(_0x4a4411,_0x2ab1cd){return _0x4a4411!==_0x2ab1cd;},'yivVb':'Bash'},_0x4c23a2=new Map(),_0xd2e6e5=async _0x39f49f=>{const _0x48ff8c=_0x409505;if(_0x39f49f['hook_event_name']!==_0x2fdd3b['fXPOS'])return{};const _0x43d23d=_0x39f49f;if(_0x43d23d[_0x48ff8c(0x232)]!=='Bash')return{};const _0x4a6224=_0x43d23d[_0x48ff8c(0x1eb)],_0x586c39=extractBashCommand(_0x4a6224);if(!_0x586c39)return{};const _0x8748d3=parsePlaywrightCliCommand(_0x586c39);if(!_0x8748d3)return{};return _0x4c23a2['set'](_0x8748d3,_0x2fdd3b['GRqUW'](_0x4c23a2[_0x48ff8c(0x24c)](_0x8748d3)||0x0,0x1)),_0x2ff677[_0x48ff8c(0x258)]('tool_call',{'transport':_0x2fdd3b[_0x48ff8c(0x1fa)],'toolName':_0x8748d3}),_0x2ff677['trackPhaseEnd'](_0x2fdd3b[_0x48ff8c(0x1e4)],{'transport':_0x2fdd3b[_0x48ff8c(0x1fa)],'toolName':_0x8748d3,'bashCommandPreview':_0x2fdd3b['zanNQ'](truncatePreview,_0x586c39)}),_0x2fdd3b[_0x48ff8c(0x240)](_0x8748d3,_0x48ff8c(0x25e))&&console[_0x48ff8c(0x24e)](formatPlaywrightCliConsoleLogMessage(_0x4a6224,_0x586c39,_0x8748d3)),{};},_0xc212b1=async _0x5695f4=>{const _0x454796=_0x409505;if(_0x5695f4['hook_event_name']!==_0x2fdd3b['tuNWa'])return{};const _0x11d029=_0x5695f4;if(_0x2fdd3b[_0x454796(0x21a)](_0x11d029[_0x454796(0x232)],_0x2fdd3b[_0x454796(0x239)]))return{};return await _0x2ff677['trackPhaseError']('tool_failure',_0x11d029['error'],{'transport':_0x2fdd3b['oMvkC'],'toolName':_0x454796(0x245)}),{};};return{'postToolUseHook':_0xd2e6e5,'postToolUseFailureHook':_0xc212b1,'commandCounts':_0x4c23a2};}async function runPlaywrightCliLifecycleCommand(_0x3a13a7){const _0x189831=_0x421c,_0x4dbc5d={'vasrE':function(_0x5e0935,_0x3892bc){return _0x5e0935(_0x3892bc);},'nshha':function(_0x2e5498,_0x14508c){return _0x2e5498??_0x14508c;}},{sessionId:_0x20e57c,configPath:_0x17a60e,commandArgs:_0x1aafac,env:_0x12e0e9,telemetry:_0xb3829b,phase:_0x3635a3,metadata:_0x18d2b3,timeoutMs:_0x1ad3c4}=_0x3a13a7;_0xb3829b['trackPhaseStart'](_0x3635a3,_0x18d2b3);try{const _0x5edfb5=await _0x4dbc5d[_0x189831(0x1f9)](runPlaywrightCliCommand,{'sessionId':_0x20e57c,'configPath':_0x17a60e,'commandArgs':_0x1aafac,'cwd':process[_0x189831(0x21d)](),'env':_0x12e0e9,'timeoutMs':_0x4dbc5d[_0x189831(0x268)](_0x1ad3c4,PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS)});_0xb3829b[_0x189831(0x244)](_0x3635a3,{..._0x18d2b3,'subcommand':_0x5edfb5[_0x189831(0x25b)]['subcommand'],'stdoutPreview':truncatePreview(_0x5edfb5[_0x189831(0x25f)],0x7d0),'stderrPreview':truncatePreview(_0x5edfb5['stderr'],0x7d0)});}catch(_0x41c1ac){await _0xb3829b[_0x189831(0x228)](_0x3635a3,_0x41c1ac,_0x18d2b3);throw _0x41c1ac;}}export async function finalizeVerifyFeatureCliSession(_0x518d7a){const _0x485f9a=_0x421c,_0xe0ce07={'VAhSX':'playwright_cli_tracing_stop','cFIdj':'tracing-stop','FJEzu':function(_0x32661c,_0x4108ce,_0x45f8e7){return _0x32661c(_0x4108ce,_0x45f8e7);},'vNGoq':'session-recording.webm','BYpqX':_0x485f9a(0x223)},{telemetry:_0x100986,sessionId:_0x1cde0e,configPath:_0x5aa928,cliArtifactDir:_0x38d66e,env:_0x290dea,transportMetadata:_0x3c3807}=_0x518d7a,_0x7370d2=[{'phase':_0xe0ce07['VAhSX'],'commandArgs':[_0xe0ce07['cFIdj']]},{'phase':_0x485f9a(0x1fc),'commandArgs':[_0x485f9a(0x242),_0x485f9a(0x1de)+_0xe0ce07['FJEzu'](buildCliArtifactPath,_0x38d66e,_0xe0ce07['vNGoq'])]},{'phase':_0xe0ce07[_0x485f9a(0x238)],'commandArgs':[_0x485f9a(0x23b)]}];for(const _0x3079cf of _0x7370d2){try{await runPlaywrightCliLifecycleCommand({'sessionId':_0x1cde0e,'configPath':_0x5aa928,'commandArgs':[..._0x3079cf[_0x485f9a(0x1f4)]],'env':_0x290dea,'telemetry':_0x100986,'phase':_0x3079cf[_0x485f9a(0x1e2)],'metadata':_0x3c3807});}catch{}}}export async function loadVerifyFeatureCliTraceUploadArtifact(_0x466571){const _0x392640={'rhGXr':'trace.zip','fHOXv':'trace.trace.zip','bHoVn':function(_0x261e63,_0x5a7c24,_0x4c5508){return _0x261e63(_0x5a7c24,_0x4c5508);}},_0x257ea5=[_0x392640['rhGXr'],_0x392640['fHOXv']];for(const _0x26b145 of _0x257ea5){const _0x42b4d5=_0x392640['bHoVn'](join,_0x466571,_0x26b145);try{return{'buffer':await readFile(_0x42b4d5),'source':_0x42b4d5};}catch{}}return null;}export async function rehomeVerifyFeatureCliArtifacts(_0xfefd80){const _0x2b75f1=_0x421c,_0x57e1aa={'ufnsj':function(_0x315e63,_0x1334f7,_0x3d0743){return _0x315e63(_0x1334f7,_0x3d0743);},'RNRnS':function(_0x410649,_0x79912a){return _0x410649(_0x79912a);},'Ylykl':function(_0x266dda,_0x5a8930){return _0x266dda<_0x5a8930;}},{cwd:_0xdddfc1,cliArtifactDir:_0x17f1a6,startTime:_0x5107e2}=_0xfefd80,_0x25eec7=[];await _0x57e1aa['ufnsj'](mkdir,_0x17f1a6,{'recursive':!![]});const _0x2e1ce9=await readdir(_0xdddfc1,{'withFileTypes':!![]});for(const _0x5b0f28 of _0x2e1ce9){if(!_0x5b0f28['isFile']()||!VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN[_0x2b75f1(0x25c)](_0x5b0f28[_0x2b75f1(0x1ff)]))continue;const _0x1b0707=_0x57e1aa[_0x2b75f1(0x257)](join,_0xdddfc1,_0x5b0f28[_0x2b75f1(0x1ff)]),_0x36bd4b=await _0x57e1aa['RNRnS'](stat,_0x1b0707);if(_0x57e1aa['Ylykl'](_0x36bd4b[_0x2b75f1(0x266)]+0x7d0,_0x5107e2))continue;const _0x2abc9b=buildCliArtifactPath(_0x17f1a6,_0x5b0f28['name']);if(_0x1b0707===_0x2abc9b)continue;await rename(_0x1b0707,_0x2abc9b),_0x25eec7[_0x2b75f1(0x265)](_0x5b0f28['name']);}return _0x25eec7[_0x2b75f1(0x204)]();}function _0x4b14(){const _0x3b85f3=['open\x20new\x20tab','ref\x20','`,\x20then\x20`','get','\x20snapshot\x20--filename\x20','log','\x20open\x20','length','\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.','178015UqEsWi','stringify','PostToolUseFailure','YZoPE','slice','ufnsj','trackPhaseStart','screenshot','(?:\x5cs+(?:\x22([^\x22]+)\x22|\x27([^\x27]+)\x27|(\x5cS+)))','invocation','test','`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`','snapshot','stdout','Reviewer','\x0a\x0a##\x20Browser\x20Command\x20Reference\x0aUse\x20Bash\x20to\x20run\x20Playwright\x20CLI\x20commands\x20with\x20this\x20exact\x20prefix:\x0a`','36uwnvfE','DEBUG','\x0a\x0a##\x20Additional\x20Notes\x0a','push','mtimeMs','canonicalFlow','nshha','\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.','4YSKrBN','fill','\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','--filename=','hjSCk','HiRXK','keys','phase','\x20screenshot\x20--filename\x20','OztzJ','\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','\x20tracing-start`\x0a3.\x20Run\x20`','AardL','playwright-cli','\x20video-start`\x0a4.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','split','tool_input','check\x20','\x20tracing-start`,\x20then\x20`','key_04_success-state.png','open\x20','kliHt','\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.','abuMp','757001KVDDyg','commandArgs','`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a6.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`','\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','...','unaddressedComments','vasrE','oMvkC','trim','playwright_cli_video_stop','selector','`\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`','name','content','215814bgACYq','start\x20tracing','difUh','sort','`\x0a7.\x20Click\x20the\x20\x22Learn\x20More\x22\x20link\x20with\x20Playwright\x20CLI\x0a8.\x20Run\x20`','\x5c$&','authorEmail','##\x20App\x20Context\x0aYou\x20are\x20connected\x20to\x20a\x20desktop\x20application\x20via\x20CDP\x20(Chrome\x20DevTools\x20Protocol)\x20at\x20','wrrGE','1331392XGxIjT','sugri','`:\x20\x22','\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','authorName','[playwright-cli]\x20','domRef','run-code','RInvV','03_result-visible.png','18iSCRNY','03_learn-more.png','NkkLF','replace','HIlpu','capture\x20key\x20step\x20`','prktP','match',']\x20**','cwd','rzYcE','toLocaleDateString','\x20open`,\x20then\x20`','dSXSO','\x20>\x20','playwright_cli_close','tracing-stop','\x0a\x0a##\x20Expected\x20Flow\x20(from\x20previous\x20verification)\x0a','eViEb','NobEc','trackPhaseError','open\x20browser','1895590gVHZHK','):\x20\x22','notes','press\x20','click\x20','##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`','createdAt','02_button-clicked.png','tool_name','01_initial-state.png','3427856ldVuRJ','`\x0a10.\x20Return\x20immediately\x20with\x20the\x20structured\x20output\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format.','299209HnGfnn','>\x20\x22','BYpqX','yivVb','run\x20custom\x20Playwright\x20code','close','CRITICAL\x20URL\x20REQUIREMENT:\x0aYour\x20base\x20URL\x20is:\x20','01_mozilla-homepage.png','\x22,\x20\x22','-\x20[','zMWqz','tracing-start','video-stop','ryQUk','trackPhaseEnd','Bash','01_initial.yml','capture\x20step\x20`','\x20open\x20https://www.mozilla.org`\x0a2.\x20Run\x20`'];_0x4b14=function(){return _0x3b85f3;};return _0x4b14();}
|
|
1
|
+
(function(_0x1c0216,_0x2f19e3){const _0x4d41a7=_0x3db8,_0x4b813a=_0x1c0216();while(!![]){try{const _0x5d91b0=parseInt(_0x4d41a7(0x15a))/0x1+parseInt(_0x4d41a7(0x188))/0x2+parseInt(_0x4d41a7(0x116))/0x3*(-parseInt(_0x4d41a7(0x182))/0x4)+parseInt(_0x4d41a7(0x18a))/0x5*(-parseInt(_0x4d41a7(0x112))/0x6)+parseInt(_0x4d41a7(0x163))/0x7+parseInt(_0x4d41a7(0x12a))/0x8*(parseInt(_0x4d41a7(0x123))/0x9)+parseInt(_0x4d41a7(0x12d))/0xa;if(_0x5d91b0===_0x2f19e3)break;else _0x4b813a['push'](_0x4b813a['shift']());}catch(_0x434dcd){_0x4b813a['push'](_0x4b813a['shift']());}}}(_0x218a,0x7c9eb));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(_0x569337,_0x25920c=PLAYWRIGHT_CLI_PREVIEW_LIMIT){const _0x457637=_0x3db8,_0x55b831={'gEbAP':function(_0x465da1,_0x2cbf2a){return _0x465da1+_0x2cbf2a;}};return _0x569337['length']>_0x25920c?_0x55b831['gEbAP'](_0x569337[_0x457637(0x129)](0x0,_0x25920c),_0x457637(0x150)):_0x569337;}function buildCliArtifactPath(_0x11c362,_0x2b0a6f){return join(_0x11c362,_0x2b0a6f);}function toStepDisplayName(_0x4d9f1e){const _0x58a415=_0x3db8,_0x2cd5a7={'LulbW':function(_0x4427b0,_0x2d316b){return _0x4427b0(_0x2d316b);}},_0x10df28=basename(_0x4d9f1e)[_0x58a415(0x133)](/\.(?:png|ya?ml)$/i,'')['replace'](/^key_/i,'')['replace'](/^\d+_/,'')[_0x58a415(0x133)](/-/g,'\x20');return{'name':_0x10df28,'isKeyStep':/^key_/i[_0x58a415(0x109)](_0x2cd5a7['LulbW'](basename,_0x4d9f1e))};}function _0x218a(){const _0x4eb0f1=['content','lEsKv','fill','`\x0a10.\x20Return\x20immediately\x20with\x20the\x20structured\x20output\x0a\x0aReturn\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format.','FdOJM','PicCP','12194OcSKAl','get','\x20open\x20','run\x20custom\x20Playwright\x20code','xjiUV','IiZek','\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','PostToolUse','MQFfR','2980082AYGTuv','tracing-start','sort','`\x0a\x0a-\x20Write\x20all\x20artifacts\x20under\x20`','short','RDVNR','SzMTB','pop','capture\x20step\x20`','session-recording.webm','tracing-stop','JLTAc','open','unaddressedComments','PEbMo','##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`','GwOxH','wjRMq','YtZNc','pGdbL','\x22,\x20\x22','trace.zip','-\x20[','capture\x20screenshot','`\x0a7.\x20Click\x20the\x20\x22Learn\x20More\x22\x20link\x20with\x20Playwright\x20CLI\x0a8.\x20Run\x20`','Reviewer','open\x20','ref\x20','NnkYU','`\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','`\x0a5.\x20Read\x20the\x20snapshot\x20file\x20to\x20find\x20the\x20\x22Learn\x20More\x22\x20link\x20reference\x0a6.\x20Run\x20`','29644WkhSWh','match','\x20open`,\x20then\x20`','aVPIq','isFile','SwBsY','157906qdXqeO','\x20tracing-start`,\x20then\x20`','5pEFQPZ','`:\x20\x22','open\x20new\x20tab','(?:^|\x5cs)','\x20snapshot\x20--filename\x20','phase','check','00_mozilla-homepage.yml','\x20video-start`\x0a4.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`','createdAt','UHBxu','\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.','commandArgs','key_04_success-state.png','test','VPGXA','capture\x20snapshot',']\x20**','tool_failure','fill\x20','\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','playwright-cli','\x0a\x0a##\x20Browser\x20Command\x20Reference\x0aUse\x20Bash\x20to\x20run\x20Playwright\x20CLI\x20commands\x20with\x20this\x20exact\x20prefix:\x0a`','4175088myEUol','tab-new','log','toocH','246jGeDfc','[playwright-cli]\x20','aruDE','`,\x20then\x20`','map','trim','cXVxC','KicDs','zfYmF','CTNGV','notes','\x0a\x0a##\x20Authentication\x0aBEFORE\x20starting\x20the\x20verification\x20task,\x20you\x20MUST\x20authenticate\x20using\x20these\x20steps:\x0a','\x20screenshot\x20--filename\x20','90avavFc','name','tool_call','tool_name','YOXyC','split','slice','50824EpLLgQ','authorName','capture\x20key\x20step\x20`','12335900gFKXfv','domRef','start\x20tracing','trackPhaseStart','`\x0a-\x20`snapshot\x20--filename\x20','press','replace','trace.trace.zip','zIaUi','set','PostToolUseFailure','`\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`','.\x0aThis\x20is\x20NOT\x20a\x20web\x20app\x20—\x20there\x20is\x20no\x20URL\x20to\x20navigate\x20to.\x20The\x20app\x20is\x20already\x20running\x20and\x20connected.','cwd','[ranger-verification-agent]\x20','02_learn-more.yml','):\x20\x22','numeric','check\x20','video-stop','kCfcK','press\x20','\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.','push','trackPhaseEnd','`\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`','click','element','`\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`','`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`','RLABE','stringify','LJUhe','tab-select','canonicalFlow','...','select\x20tab\x20','IVZwH','03_learn-more.png'];_0x218a=function(){return _0x4eb0f1;};return _0x218a();}function extractShellValue(_0x268984){if(!_0x268984)return null;return _0x268984[0x1]??_0x268984[0x2]??_0x268984[0x3]??null;}function extractFilenameOption(_0x198579){return extractShellValue(_0x198579['match'](/--filename(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/));}function extractFirstCommandArgument(_0x211e4c,_0x312a02){const _0xc82802=_0x3db8,_0x135669={'SzMTB':'\x5c$&','XzKFO':function(_0x48da2b,_0x170ed5){return _0x48da2b(_0x170ed5);}},_0x594828=_0x312a02['replace'](/[.*+?^${}()|[\]\\]/g,_0x135669[_0xc82802(0x169)]);return _0x135669['XzKFO'](extractShellValue,_0x211e4c[_0xc82802(0x183)](new RegExp(_0xc82802(0x18d)+_0x594828+'(?:\x5cs+(?:\x22([^\x22]+)\x22|\x27([^\x27]+)\x27|(\x5cS+)))')));}function formatCommandTarget(_0xd345bc){const _0x416e46=_0x3db8,_0x35b61f={'Mmmnv':function(_0x16c6f6,_0x398aa3,_0x3048d5){return _0x16c6f6(_0x398aa3,_0x3048d5);}};if(!_0xd345bc)return'target';if(/^e\d+$/i[_0x416e46(0x109)](_0xd345bc))return _0x416e46(0x17e)+_0xd345bc;return JSON[_0x416e46(0x14c)](_0x35b61f['Mmmnv'](truncatePreview,_0xd345bc,0x78));}function _0x3db8(_0x95e992,_0x41f106){_0x95e992=_0x95e992-0x103;const _0x218aeb=_0x218a();let _0x3db8da=_0x218aeb[_0x95e992];return _0x3db8da;}function formatPlaywrightCliLog(_0x4d4088,_0x561ff8){const _0x26a541=_0x3db8,_0x5d4851={'PEbMo':function(_0x3bb7ec,_0x2d1486,_0x2ff4e9){return _0x3bb7ec(_0x2d1486,_0x2ff4e9);},'MOLAT':_0x26a541(0x164),'lEsKv':'video-start','YOXyC':'snapshot','SrSnB':function(_0x583420,_0x52f009){return _0x583420(_0x52f009);},'bnbfy':_0x26a541(0x10b),'NnkYU':_0x26a541(0x147),'kKKWF':function(_0x467b98,_0x3431b8,_0x1d69f7){return _0x467b98(_0x3431b8,_0x1d69f7);},'CTNGV':_0x26a541(0x190),'Zhyjf':function(_0x549e60,_0x155a6b,_0x9d3867){return _0x549e60(_0x155a6b,_0x9d3867);},'IiZek':'run-code','ElMUm':_0x26a541(0x15d),'RLABE':_0x26a541(0x18c),'GwOxH':_0x26a541(0x14e),'xVndT':'select\x20tab'};switch(_0x561ff8){case _0x26a541(0x16f):{const _0x5d3c08=_0x5d4851[_0x26a541(0x171)](extractFirstCommandArgument,_0x4d4088,_0x561ff8);return _0x5d3c08?_0x26a541(0x17d)+_0x5d3c08:'open\x20browser';}case _0x5d4851['MOLAT']:return _0x26a541(0x12f);case _0x26a541(0x16d):return'stop\x20tracing';case _0x5d4851[_0x26a541(0x155)]:return'start\x20video\x20recording';case _0x26a541(0x140):return'stop\x20video\x20recording';case _0x5d4851[_0x26a541(0x127)]:{const _0x111414=_0x5d4851['SrSnB'](extractFilenameOption,_0x4d4088);if(!_0x111414)return _0x5d4851['bnbfy'];const {name:_0x34e732}=_0x5d4851['SrSnB'](toStepDisplayName,_0x111414);return'capture\x20snapshot\x20`'+_0x34e732+'`';}case'screenshot':{const _0x225d06=extractFilenameOption(_0x4d4088);if(!_0x225d06)return _0x26a541(0x17a);const {name:_0x5f5c0f,isKeyStep:_0x5d1f73}=toStepDisplayName(_0x225d06);return _0x5d1f73?_0x26a541(0x12c)+_0x5f5c0f+'`':_0x26a541(0x16b)+_0x5f5c0f+'`';}case _0x5d4851[_0x26a541(0x17f)]:return'click\x20'+formatCommandTarget(_0x5d4851['kKKWF'](extractFirstCommandArgument,_0x4d4088,_0x561ff8));case _0x5d4851[_0x26a541(0x11f)]:return _0x26a541(0x13f)+formatCommandTarget(_0x5d4851['Zhyjf'](extractFirstCommandArgument,_0x4d4088,_0x561ff8));case _0x26a541(0x156):return _0x26a541(0x10e)+formatCommandTarget(extractFirstCommandArgument(_0x4d4088,_0x561ff8));case _0x26a541(0x132):return _0x26a541(0x142)+formatCommandTarget(extractFirstCommandArgument(_0x4d4088,_0x561ff8));case _0x5d4851[_0x26a541(0x15f)]:return _0x5d4851['ElMUm'];case _0x26a541(0x113):{const _0x18845c=extractFirstCommandArgument(_0x4d4088,_0x561ff8);return _0x18845c?'open\x20new\x20tab\x20'+_0x18845c:_0x5d4851[_0x26a541(0x14b)];}case _0x5d4851[_0x26a541(0x173)]:{const _0x464eae=_0x5d4851['kKKWF'](extractFirstCommandArgument,_0x4d4088,_0x561ff8);return _0x464eae?_0x26a541(0x151)+_0x464eae:_0x5d4851['xVndT'];}default:return _0x561ff8;}}function extractPlaywrightCliToolDescription(_0x7fdb52){const _0x3b32dc=_0x3db8,_0xe2a0c4={'ZgrHe':function(_0x219534,_0x3fec52){return _0x219534!==_0x3fec52;},'pGdbL':'string','RwJeT':function(_0x5d4912,_0x2862e8){return _0x5d4912>_0x2862e8;}},_0x5cfdc1=_0x7fdb52['description'];if(_0xe2a0c4['ZgrHe'](typeof _0x5cfdc1,_0xe2a0c4[_0x3b32dc(0x176)]))return null;const _0x43fc49=_0x5cfdc1[_0x3b32dc(0x11b)]()['replace'](/\s+/g,'\x20');return _0xe2a0c4['RwJeT'](_0x43fc49['length'],0x0)?_0x43fc49:null;}export function formatPlaywrightCliConsoleLogMessage(_0xd8b6c4,_0x557e60,_0x231b29){const _0x210d3f=_0x3db8,_0x2cfa3f=formatPlaywrightCliLog(_0x557e60,_0x231b29),_0x213010=extractPlaywrightCliToolDescription(_0xd8b6c4);if(!_0x213010)return _0x210d3f(0x117)+_0x2cfa3f;if(process['env']['DEBUG'])return _0x210d3f(0x13b)+_0x213010+'\x20('+_0x2cfa3f+')';return'[ranger-verification-agent]\x20'+_0x213010;}export function buildVerifyFeatureCliDebugPrompt(_0x544748,_0xb1108){const _0x445db1=_0x3db8,_0x4ffd49={'kCfcK':function(_0xf2bc38,_0xeb7ef9,_0x45b1ab){return _0xf2bc38(_0xeb7ef9,_0x45b1ab);},'QMlPS':_0x445db1(0x191),'YtZNc':function(_0x208aba,_0x1be5a1,_0x33631b){return _0x208aba(_0x1be5a1,_0x33631b);},'IVZwH':function(_0x4e6d6b,_0x1d063e){return _0x4e6d6b(_0x1d063e);},'SwBsY':function(_0x1e3a5c,_0x589fce){return _0x1e3a5c(_0x589fce);}},_0x3b74ad=_0x4ffd49[_0x445db1(0x141)](buildCliArtifactPath,_0xb1108,_0x4ffd49['QMlPS']),_0x323777=buildCliArtifactPath(_0xb1108,'01_mozilla-homepage.png'),_0x567d29=_0x4ffd49[_0x445db1(0x175)](buildCliArtifactPath,_0xb1108,_0x445db1(0x13c)),_0xe2dd3a=_0x4ffd49['kCfcK'](buildCliArtifactPath,_0xb1108,_0x445db1(0x153)),_0x550216=_0x4ffd49[_0x445db1(0x152)](quoteShellArg,_0x3b74ad),_0x278ec7=_0x4ffd49[_0x445db1(0x187)](quoteShellArg,_0x323777),_0x3b621c=quoteShellArg(_0x567d29),_0x41dd58=_0x4ffd49['SwBsY'](quoteShellArg,_0xe2dd3a);return'You\x20are\x20testing\x20browser\x20automation.\x20Your\x20task\x20is\x20simple:\x0a\x0aUse\x20Bash\x20and\x20Playwright\x20CLI\x20only.\x20The\x20browser\x20command\x20prefix\x20is:\x0a'+_0x544748+'\x0a\x0a1.\x20Run\x20`'+_0x544748+'\x20open\x20https://www.mozilla.org`\x0a2.\x20Run\x20`'+_0x544748+'\x20tracing-start`\x0a3.\x20Run\x20`'+_0x544748+_0x445db1(0x103)+_0xb1108+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a5.\x20Run\x20`'+_0x544748+_0x445db1(0x18e)+_0x550216+_0x445db1(0x181)+_0x544748+'\x20screenshot\x20--filename\x20'+_0x278ec7+_0x445db1(0x17b)+_0x544748+_0x445db1(0x18e)+_0x3b621c+'`\x0a9.\x20Run\x20`'+_0x544748+_0x445db1(0x122)+_0x41dd58+_0x445db1(0x157);}export function buildVerifyFeatureCliPrompt(_0x3dddda){const _0xd061e3=_0x3db8,_0x5400e5={'diSHY':_0xd061e3(0x13e),'VPGXA':'\x20>\x20','EDLha':function(_0x1c92e0,_0x24d9ce,_0x4c7a4a){return _0x1c92e0(_0x24d9ce,_0x4c7a4a);},'eMEdB':'key_03_success-state.png','sXvgZ':function(_0x18c2d1,_0x180c15){return _0x18c2d1(_0x180c15);},'gRYjJ':function(_0x55694a,_0x523a00,_0x5333f9){return _0x55694a(_0x523a00,_0x5333f9);},'BfMgj':'03_result-visible.png','UCbZV':_0xd061e3(0x108)},{checklistItem:_0x18f36e,itemFeedback:_0x72693,taskDescription:_0x261daf,cliCommandPrefix:_0x24c2e3,cliArtifactDir:_0x4fd721,isCdpMode:_0x569c48,url:_0x5d0615,cdpEndpoint:_0xa14002,loginInstructions:_0x4a424e}=_0x3dddda,_0x4c121d=_0x5400e5['EDLha'](buildCliArtifactPath,_0x4fd721,'01_initial.yml'),_0x571bde=buildCliArtifactPath(_0x4fd721,'02_state.yml'),_0x219eb8=_0x5400e5['EDLha'](buildCliArtifactPath,_0x4fd721,_0x5400e5['eMEdB']),_0x268a4a=buildCliArtifactPath(_0x4fd721,'01_initial-state.png'),_0x2ed033=quoteShellArg(_0x4c121d),_0x3faa48=quoteShellArg(_0x571bde),_0x282ba6=quoteShellArg(_0x219eb8),_0x162995=_0x5400e5['sXvgZ'](quoteShellArg,_0x268a4a),_0x50e80e=_0x18f36e['notes']?'\x0a\x0a##\x20Additional\x20Notes\x0a'+_0x18f36e[_0xd061e3(0x120)]:'';let _0x3fb455='';if(_0x72693&&_0x72693['unaddressedComments']['length']>0x0){const _0x5a9229=_0x72693[_0xd061e3(0x170)][_0xd061e3(0x11a)](_0xb0e927=>{const _0xe064a8=_0xd061e3,_0x35a98d=new Date(_0xb0e927[_0xe064a8(0x104)])['toLocaleDateString']('en-US',{'month':_0xe064a8(0x167),'day':_0x5400e5['diSHY']}),_0x3e7256=_0xb0e927[_0xe064a8(0x12b)]||_0xb0e927['authorEmail']||_0xe064a8(0x17c),_0x4a904d=_0xb0e927[_0xe064a8(0x12e)]?'\x20(on\x20element:\x20<'+(_0xb0e927['domRef']['selector'][_0xe064a8(0x128)](_0x5400e5[_0xe064a8(0x10a)])[_0xe064a8(0x16a)]()?.['split'](':')[0x0]||_0xe064a8(0x148))+'>\x20\x22'+(_0xb0e927['domRef']['textContent']||'')[_0xe064a8(0x129)](0x0,0x32)+'\x22)':'';return _0xe064a8(0x179)+_0xb0e927['id']+_0xe064a8(0x10c)+_0x3e7256+'**\x20('+_0x35a98d+_0xe064a8(0x13d)+_0xb0e927[_0xe064a8(0x154)]+'\x22'+_0x4a904d;})['join']('\x0a');_0x3fb455=_0xd061e3(0x10f)+_0x5a9229;}const _0x4d45dd=_0x72693?.[_0xd061e3(0x14f)]?'\x0a\x0a##\x20Expected\x20Flow\x20(from\x20previous\x20verification)\x0a'+_0x72693['canonicalFlow']:'',_0x335426=_0x569c48?'##\x20App\x20Context\x0aYou\x20are\x20connected\x20to\x20a\x20desktop\x20application\x20via\x20CDP\x20(Chrome\x20DevTools\x20Protocol)\x20at\x20'+_0xa14002+_0xd061e3(0x139):'CRITICAL\x20URL\x20REQUIREMENT:\x0aYour\x20base\x20URL\x20is:\x20'+_0x5d0615+'\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',_0x41ef14=_0x5d0615?quoteShellArg(_0x5d0615):'',_0x32267b=_0x569c48?_0xd061e3(0x172)+_0x24c2e3+_0xd061e3(0x184)+_0x24c2e3+_0xd061e3(0x189)+_0x24c2e3+'\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x4fd721+_0xd061e3(0x14a)+_0x24c2e3+'\x20snapshot\x20--filename\x20'+_0x2ed033+_0xd061e3(0x138)+_0x24c2e3+_0xd061e3(0x122)+_0x162995+'`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a6.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`'+_0x24c2e3+'\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':'##\x20Instructions\x0a1.\x20Use\x20Bash\x20plus\x20Playwright\x20CLI\x20only.\x20Do\x20NOT\x20call\x20MCP\x20browser\x20tools.\x0a2.\x20Start\x20by\x20running\x20`'+_0x24c2e3+_0xd061e3(0x15c)+_0x41ef14+_0xd061e3(0x119)+_0x24c2e3+'\x20tracing-start`,\x20then\x20`'+_0x24c2e3+'\x20video-start`.\x0a3.\x20Save\x20every\x20snapshot\x20and\x20screenshot\x20under\x20`'+_0x4fd721+'`\x20using\x20absolute\x20paths\x20only.\x20Do\x20not\x20use\x20relative\x20filenames.\x0a4.\x20Take\x20a\x20snapshot\x20with\x20`'+_0x24c2e3+_0xd061e3(0x18e)+_0x2ed033+_0xd061e3(0x146)+_0x24c2e3+_0xd061e3(0x122)+_0x162995+'`\x20style\x20absolute\x20paths\x20at\x20key\x20moments.\x0a8.\x20If\x20you\x20need\x20waits\x20or\x20custom\x20assertions,\x20use\x20`'+_0x24c2e3+'\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',_0xafdbb5=_0x569c48?'\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.':_0xd061e3(0x106),_0x2ba9a0=_0x4a424e?_0xd061e3(0x121)+_0x4a424e+'\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'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'+_0x18f36e['description']+_0x50e80e+_0x3fb455+_0x4d45dd+'\x0a\x0a##\x20Task\x20to\x20Execute\x0a'+_0x261daf+'\x0a\x0a'+_0x335426+_0x2ba9a0+'\x0a\x0a'+_0x32267b+_0xd061e3(0x111)+_0x24c2e3+_0xd061e3(0x166)+_0x4fd721+_0xd061e3(0x131)+_0x3faa48+_0xd061e3(0x180)+_0x282ba6+_0xd061e3(0x149)+_0x4fd721+_0xd061e3(0x18b)+_0x268a4a+_0xd061e3(0x177)+buildCliArtifactPath(_0x4fd721,'02_button-clicked.png')+_0xd061e3(0x177)+_0x5400e5['gRYjJ'](buildCliArtifactPath,_0x4fd721,_0x5400e5['BfMgj'])+'\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(_0x4fd721,_0x5400e5['UCbZV'])+_0xd061e3(0x160)+_0xafdbb5+_0xd061e3(0x143);}export function summarizeVerifyFeatureCliCommandAvailability(_0x5de1a9){const _0x86ebd7=_0x3db8,_0x450668=[..._0x5de1a9['keys']()][_0x86ebd7(0x165)]();let _0x321d3c=0x0;for(const _0x925aa of _0x5de1a9['values']()){_0x321d3c+=_0x925aa;}return{'cliCommandCount':_0x321d3c,'cliCommandsSeen':_0x450668,'noCliCommandsCalled':_0x321d3c===0x0};}export function createVerifyFeatureCliHooks(_0x3f1956){const _0x252c7c=_0x3db8,_0x2051c0={'Xaxpt':_0x252c7c(0x161),'QLJqj':function(_0x104499,_0x4ef398){return _0x104499!==_0x4ef398;},'PicCP':_0x252c7c(0x110),'cXVxC':function(_0x1c26c4,_0x335a84){return _0x1c26c4!==_0x335a84;},'xjiUV':function(_0x1ce802,_0x3a808b,_0x2b1970,_0x109452){return _0x1ce802(_0x3a808b,_0x2b1970,_0x109452);},'KicDs':_0x252c7c(0x137),'LJUhe':_0x252c7c(0x10d),'aruDE':'Bash'},_0x5987b2=new Map(),_0x31054b=async _0xadb939=>{const _0x5545c0=_0x252c7c;if(_0xadb939['hook_event_name']!==_0x2051c0['Xaxpt'])return{};const _0x1d5270=_0xadb939;if(_0x2051c0['QLJqj'](_0x1d5270[_0x5545c0(0x126)],'Bash'))return{};const _0x2b5801=_0x1d5270['tool_input'],_0x4df085=extractBashCommand(_0x2b5801);if(!_0x4df085)return{};const _0x395e70=parsePlaywrightCliCommand(_0x4df085);if(!_0x395e70)return{};return _0x5987b2[_0x5545c0(0x136)](_0x395e70,(_0x5987b2[_0x5545c0(0x15b)](_0x395e70)||0x0)+0x1),_0x3f1956['trackPhaseStart'](_0x5545c0(0x125),{'transport':_0x2051c0[_0x5545c0(0x159)],'toolName':_0x395e70}),_0x3f1956['trackPhaseEnd']('tool_call',{'transport':'playwright-cli','toolName':_0x395e70,'bashCommandPreview':truncatePreview(_0x4df085)}),_0x2051c0[_0x5545c0(0x11c)](_0x395e70,'snapshot')&&console[_0x5545c0(0x114)](_0x2051c0[_0x5545c0(0x15e)](formatPlaywrightCliConsoleLogMessage,_0x2b5801,_0x4df085,_0x395e70)),{};},_0x3cfa81=async _0x31e271=>{const _0x33227c=_0x252c7c;if(_0x31e271['hook_event_name']!==_0x2051c0[_0x33227c(0x11d)])return{};const _0x1e8d6e=_0x31e271;if(_0x2051c0['cXVxC'](_0x1e8d6e['tool_name'],'Bash'))return{};return await _0x3f1956['trackPhaseError'](_0x2051c0[_0x33227c(0x14d)],_0x1e8d6e['error'],{'transport':_0x33227c(0x110),'toolName':_0x2051c0[_0x33227c(0x118)]}),{};};return{'postToolUseHook':_0x31054b,'postToolUseFailureHook':_0x3cfa81,'commandCounts':_0x5987b2};}async function runPlaywrightCliLifecycleCommand(_0x590253){const _0x3f1146=_0x3db8,_0x41c821={'zIaUi':function(_0x1c8fc5,_0x1ba157){return _0x1c8fc5??_0x1ba157;}},{sessionId:_0x898356,configPath:_0x2746e0,commandArgs:_0x598b38,env:_0x779ff3,telemetry:_0x21619b,phase:_0x4c1d70,metadata:_0x456e56,timeoutMs:_0x11fe0d}=_0x590253;_0x21619b[_0x3f1146(0x130)](_0x4c1d70,_0x456e56);try{const _0x3843e8=await runPlaywrightCliCommand({'sessionId':_0x898356,'configPath':_0x2746e0,'commandArgs':_0x598b38,'cwd':process[_0x3f1146(0x13a)](),'env':_0x779ff3,'timeoutMs':_0x41c821[_0x3f1146(0x135)](_0x11fe0d,PLAYWRIGHT_CLI_COMMAND_TIMEOUT_MS)});_0x21619b[_0x3f1146(0x145)](_0x4c1d70,{..._0x456e56,'subcommand':_0x3843e8['invocation']['subcommand'],'stdoutPreview':truncatePreview(_0x3843e8['stdout'],0x7d0),'stderrPreview':truncatePreview(_0x3843e8['stderr'],0x7d0)});}catch(_0x224ffa){await _0x21619b['trackPhaseError'](_0x4c1d70,_0x224ffa,_0x456e56);throw _0x224ffa;}}export async function finalizeVerifyFeatureCliSession(_0x9a881a){const _0x27de4b=_0x3db8,_0x384c2d={'JLTAc':'playwright_cli_video_stop','aVPIq':_0x27de4b(0x140),'wjRMq':function(_0x2fb7a7,_0x5bc6a1,_0x5f411d){return _0x2fb7a7(_0x5bc6a1,_0x5f411d);},'lApEZ':'playwright_cli_close','JtRRA':function(_0x5ab1cf,_0x26645d){return _0x5ab1cf(_0x26645d);}},{telemetry:_0x226223,sessionId:_0x4f4b0b,configPath:_0x329d19,cliArtifactDir:_0x463cbe,env:_0x2cfd0e,transportMetadata:_0x581c8a}=_0x9a881a,_0x4c1309=[{'phase':'playwright_cli_tracing_stop','commandArgs':['tracing-stop']},{'phase':_0x384c2d[_0x27de4b(0x16e)],'commandArgs':[_0x384c2d[_0x27de4b(0x185)],'--filename='+_0x384c2d[_0x27de4b(0x174)](buildCliArtifactPath,_0x463cbe,_0x27de4b(0x16c))]},{'phase':_0x384c2d['lApEZ'],'commandArgs':['close']}];for(const _0x434d20 of _0x4c1309){try{await _0x384c2d['JtRRA'](runPlaywrightCliLifecycleCommand,{'sessionId':_0x4f4b0b,'configPath':_0x329d19,'commandArgs':[..._0x434d20[_0x27de4b(0x107)]],'env':_0x2cfd0e,'telemetry':_0x226223,'phase':_0x434d20[_0x27de4b(0x18f)],'metadata':_0x581c8a});}catch{}}}export async function loadVerifyFeatureCliTraceUploadArtifact(_0x2f50da){const _0x2c863e=_0x3db8,_0x14a6e2={'MQFfR':function(_0x2771a1,_0x12f79c,_0x5aa292){return _0x2771a1(_0x12f79c,_0x5aa292);},'toocH':function(_0x53f0b0,_0x1802fc){return _0x53f0b0(_0x1802fc);}},_0x1dae97=[_0x2c863e(0x178),_0x2c863e(0x134)];for(const _0x352012 of _0x1dae97){const _0x4c991a=_0x14a6e2[_0x2c863e(0x162)](join,_0x2f50da,_0x352012);try{return{'buffer':await _0x14a6e2[_0x2c863e(0x115)](readFile,_0x4c991a),'source':_0x4c991a};}catch{}}return null;}export async function rehomeVerifyFeatureCliArtifacts(_0x233b0c){const _0x3d075f=_0x3db8,_0x4ffac9={'iejJe':function(_0x141b49,_0x386c57){return _0x141b49(_0x386c57);},'RDVNR':function(_0x5a5b45,_0x1bd2f0){return _0x5a5b45<_0x1bd2f0;},'FdOJM':function(_0x40daf9,_0x21a47a){return _0x40daf9+_0x21a47a;},'UHBxu':function(_0x263fb8,_0x5e7ed4){return _0x263fb8===_0x5e7ed4;},'zfYmF':function(_0x494d11,_0xb2eee9,_0x596f83){return _0x494d11(_0xb2eee9,_0x596f83);}},{cwd:_0xeb9cb2,cliArtifactDir:_0x3c7d70,startTime:_0x573dbc}=_0x233b0c,_0x285a35=[];await mkdir(_0x3c7d70,{'recursive':!![]});const _0x545fc8=await readdir(_0xeb9cb2,{'withFileTypes':!![]});for(const _0x30b7ff of _0x545fc8){if(!_0x30b7ff[_0x3d075f(0x186)]()||!VERIFY_FEATURE_CLI_ARTIFACT_FILE_PATTERN[_0x3d075f(0x109)](_0x30b7ff[_0x3d075f(0x124)]))continue;const _0x1091f8=join(_0xeb9cb2,_0x30b7ff[_0x3d075f(0x124)]),_0x24551f=await _0x4ffac9['iejJe'](stat,_0x1091f8);if(_0x4ffac9[_0x3d075f(0x168)](_0x4ffac9[_0x3d075f(0x158)](_0x24551f['mtimeMs'],0x7d0),_0x573dbc))continue;const _0x260766=buildCliArtifactPath(_0x3c7d70,_0x30b7ff['name']);if(_0x4ffac9[_0x3d075f(0x105)](_0x1091f8,_0x260766))continue;await _0x4ffac9[_0x3d075f(0x11e)](rename,_0x1091f8,_0x260766),_0x285a35[_0x3d075f(0x144)](_0x30b7ff[_0x3d075f(0x124)]);}return _0x285a35['sort']();}
|
|
@@ -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.152f635-21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ranger": "./build/cli.js",
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"obfuscate": "node scripts/obfuscate.cjs",
|
|
13
13
|
"dev": "tsx src/cli.ts",
|
|
14
14
|
"check-playwright-version": "node scripts/check-playwright-version.cjs",
|
|
15
|
-
"postinstall": "node scripts/postinstall.js"
|
|
15
|
+
"postinstall": "node scripts/postinstall.js",
|
|
16
|
+
"test": "jest --config jest.config.cjs"
|
|
16
17
|
},
|
|
17
18
|
"files": [
|
|
18
19
|
"build",
|
|
@@ -29,14 +30,18 @@
|
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"@types/inquirer": "^9.0.7",
|
|
33
|
+
"@types/jest": "^29.5.0",
|
|
32
34
|
"@types/node": "^22.0.0",
|
|
33
35
|
"@types/yargs": "^17.0.32",
|
|
36
|
+
"jest": "^29.7.0",
|
|
34
37
|
"javascript-obfuscator": "^4.1.1",
|
|
38
|
+
"ts-jest": "^29.1.0",
|
|
35
39
|
"tsx": "^4.20.6",
|
|
36
40
|
"typescript": "^5.0.0"
|
|
37
41
|
},
|
|
38
42
|
"overrides": {
|
|
39
43
|
"minimatch": "^10.2.3",
|
|
40
|
-
"brace-expansion": "^5.0.5"
|
|
44
|
+
"brace-expansion": "^5.0.5",
|
|
45
|
+
"fast-uri": "3.1.2"
|
|
41
46
|
}
|
|
42
47
|
}
|