@ranger-testing/ranger-cli 1.0.5 → 1.0.7

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.
Files changed (48) hide show
  1. package/README.md +281 -0
  2. package/build/cli.js +168 -1
  3. package/build/cli.js.map +1 -0
  4. package/build/commands/addEnv.js +1 -110
  5. package/build/commands/addEnv.js.map +1 -0
  6. package/build/commands/authEncrypt.js +40 -0
  7. package/build/commands/authEncrypt.js.map +1 -0
  8. package/build/commands/clean.js +1 -0
  9. package/build/commands/clean.js.map +1 -0
  10. package/build/commands/config.js +100 -0
  11. package/build/commands/config.js.map +1 -0
  12. package/build/commands/dataMcpServer.js +1 -0
  13. package/build/commands/dataMcpServer.js.map +1 -0
  14. package/build/commands/index.js +6 -0
  15. package/build/commands/index.js.map +1 -0
  16. package/build/commands/skillup.js +112 -0
  17. package/build/commands/skillup.js.map +1 -0
  18. package/build/commands/start.js +1 -72
  19. package/build/commands/start.js.map +1 -0
  20. package/build/commands/status.js +221 -0
  21. package/build/commands/status.js.map +1 -0
  22. package/build/commands/update.js +127 -0
  23. package/build/commands/update.js.map +1 -0
  24. package/build/commands/updateEnv.js +1 -64
  25. package/build/commands/updateEnv.js.map +1 -0
  26. package/build/commands/useEnv.js +1 -28
  27. package/build/commands/useEnv.js.map +1 -0
  28. package/build/commands/utils/browserSessionsApi.js +1 -0
  29. package/build/commands/utils/browserSessionsApi.js.map +1 -0
  30. package/build/commands/utils/crypto.js +42 -0
  31. package/build/commands/utils/crypto.js.map +1 -0
  32. package/build/commands/utils/keychain.js +1 -0
  33. package/build/commands/utils/keychain.js.map +1 -0
  34. package/build/commands/utils/localAgentInstallationsApi.js +1 -0
  35. package/build/commands/utils/localAgentInstallationsApi.js.map +1 -0
  36. package/build/commands/utils/mcpConfig.js +1 -47
  37. package/build/commands/utils/mcpConfig.js.map +1 -0
  38. package/build/commands/utils/reportGenerator.js +130 -0
  39. package/build/commands/utils/reportGenerator.js.map +1 -0
  40. package/build/commands/utils/settings.js +246 -0
  41. package/build/commands/utils/settings.js.map +1 -0
  42. package/build/commands/utils/skills.js +1 -0
  43. package/build/commands/utils/skills.js.map +1 -0
  44. package/build/commands/verifyInBrowser.js +1 -0
  45. package/build/commands/verifyInBrowser.js.map +1 -0
  46. package/build/skills/bug-bash.md +313 -0
  47. package/build/skills/e2e-test-recommender.md +173 -0
  48. package/package.json +7 -4
@@ -0,0 +1,246 @@
1
+ import { readFile, writeFile, mkdir, unlink } from 'fs/promises';
2
+ import { join, dirname } from 'path';
3
+ import { existsSync } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { randomUUID } from 'crypto';
6
+ import { decrypt } from './crypto.js';
7
+ import { getToken } from './keychain.js';
8
+ /**
9
+ * Clean up temporary files created during config building
10
+ * Ignores ENOENT errors (file already deleted)
11
+ */
12
+ export async function cleanupTempFiles(result) {
13
+ const filesToClean = [result.tempAuthPath, result.configPath].filter(Boolean);
14
+ await Promise.all(filesToClean.map((filePath) => unlink(filePath).catch((err) => {
15
+ // Ignore ENOENT (file doesn't exist), re-throw others
16
+ if (err.code !== 'ENOENT') {
17
+ console.warn(`Failed to clean up temp file ${filePath}:`, err.message);
18
+ }
19
+ })));
20
+ }
21
+ /**
22
+ * Get the path to the settings.json file for an environment
23
+ */
24
+ export function getSettingsPath(env) {
25
+ return join(process.cwd(), '.ranger', env, 'settings.json');
26
+ }
27
+ /**
28
+ * Load settings.json for an environment
29
+ */
30
+ export async function loadSettings(env) {
31
+ const settingsPath = getSettingsPath(env);
32
+ if (!existsSync(settingsPath)) {
33
+ return {};
34
+ }
35
+ try {
36
+ const content = await readFile(settingsPath, 'utf-8');
37
+ return JSON.parse(content);
38
+ }
39
+ catch {
40
+ return {};
41
+ }
42
+ }
43
+ /**
44
+ * Save settings.json for an environment
45
+ */
46
+ export async function saveSettings(env, settings) {
47
+ const settingsPath = getSettingsPath(env);
48
+ const envDir = dirname(settingsPath);
49
+ if (!existsSync(envDir)) {
50
+ await mkdir(envDir, { recursive: true });
51
+ }
52
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2));
53
+ }
54
+ /**
55
+ * Replace ${VAR_NAME} patterns with environment variable values
56
+ */
57
+ export function resolveEnvVars(obj) {
58
+ if (typeof obj === 'string') {
59
+ return obj.replace(/\$\{(\w+)\}/g, (_, varName) => {
60
+ const value = process.env[varName];
61
+ if (value === undefined) {
62
+ throw new Error(`Environment variable ${varName} is not set`);
63
+ }
64
+ return value;
65
+ });
66
+ }
67
+ if (Array.isArray(obj)) {
68
+ return obj.map(resolveEnvVars);
69
+ }
70
+ if (obj && typeof obj === 'object') {
71
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, resolveEnvVars(v)]));
72
+ }
73
+ return obj;
74
+ }
75
+ /**
76
+ * Build a full Playwright config from settings and write it to a temp file
77
+ * Returns paths to created temp files that should be cleaned up after use
78
+ */
79
+ export async function buildPlaywrightConfig(settings, env, sessionId) {
80
+ const envDir = join(process.cwd(), '.ranger', env);
81
+ // Auto-detect auth file (encrypted takes priority)
82
+ const encryptedAuthPath = join(envDir, 'auth.json.enc');
83
+ const plaintextAuthPath = join(envDir, 'auth.json');
84
+ let storageStatePath;
85
+ let tempAuthPath;
86
+ if (existsSync(encryptedAuthPath)) {
87
+ // Decrypt to temp file
88
+ try {
89
+ const token = process.env.RANGER_API_TOKEN || (await getToken());
90
+ if (!token) {
91
+ throw new Error('No API token found. Set RANGER_API_TOKEN env var or run ranger start <token>');
92
+ }
93
+ const encrypted = await readFile(encryptedAuthPath);
94
+ const decrypted = decrypt(encrypted, token);
95
+ tempAuthPath = join(tmpdir(), `ranger-auth-${Date.now()}.json`);
96
+ await writeFile(tempAuthPath, decrypted);
97
+ storageStatePath = tempAuthPath;
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : String(error);
101
+ throw new Error(`Failed to decrypt auth state: ${message}`);
102
+ }
103
+ }
104
+ else if (existsSync(plaintextAuthPath)) {
105
+ // Use plaintext for local dev (not a temp file, don't track for cleanup)
106
+ storageStatePath = plaintextAuthPath;
107
+ }
108
+ // Build the full Playwright config
109
+ const effectiveSessionId = sessionId || randomUUID();
110
+ const outputDir = join(process.cwd(), '.ranger', 'sessions', effectiveSessionId);
111
+ const config = {
112
+ name: env,
113
+ browser: {
114
+ isolated: true,
115
+ browserName: 'chromium',
116
+ launchOptions: {
117
+ headless: settings.headless ?? false,
118
+ },
119
+ contextOptions: {
120
+ permissions: ['clipboard-read', 'clipboard-write'],
121
+ userAgent: settings.userAgent || undefined,
122
+ extraHTTPHeaders: settings.headers || {},
123
+ storageState: storageStatePath,
124
+ },
125
+ },
126
+ capabilities: ['core', 'tabs', 'install', 'pdf', 'vision'],
127
+ imageResponses: 'allow',
128
+ saveTrace: true,
129
+ saveVideo: { width: 1280, height: 720 },
130
+ outputDir,
131
+ };
132
+ // Clean up undefined values from contextOptions
133
+ const contextOptions = config.browser;
134
+ const ctxOpts = contextOptions
135
+ .contextOptions;
136
+ if (ctxOpts.userAgent === undefined)
137
+ delete ctxOpts.userAgent;
138
+ if (ctxOpts.storageState === undefined)
139
+ delete ctxOpts.storageState;
140
+ // Write to temp file
141
+ const tempDir = join(tmpdir(), 'ranger-config');
142
+ if (!existsSync(tempDir)) {
143
+ await mkdir(tempDir, { recursive: true });
144
+ }
145
+ const tempConfigPath = join(tempDir, `${env}-${Date.now()}.json`);
146
+ await writeFile(tempConfigPath, JSON.stringify(config, null, 2));
147
+ return {
148
+ configPath: tempConfigPath,
149
+ tempAuthPath,
150
+ };
151
+ }
152
+ /**
153
+ * Get a nested value from an object using dot notation
154
+ * e.g., getNestedValue({ headers: { "X-Test": "1" } }, "headers.X-Test") => "1"
155
+ */
156
+ export function getNestedValue(obj, key) {
157
+ const parts = parseKeyPath(key);
158
+ let current = obj;
159
+ for (const part of parts) {
160
+ if (current === null ||
161
+ current === undefined ||
162
+ typeof current !== 'object') {
163
+ return undefined;
164
+ }
165
+ current = current[part];
166
+ }
167
+ return current;
168
+ }
169
+ /**
170
+ * Set a nested value in an object using dot notation
171
+ * e.g., setNestedValue({}, "headers.X-Test", "1") => { headers: { "X-Test": "1" } }
172
+ */
173
+ export function setNestedValue(obj, key, value) {
174
+ const parts = parseKeyPath(key);
175
+ let current = obj;
176
+ for (let i = 0; i < parts.length - 1; i++) {
177
+ const part = parts[i];
178
+ if (!(part in current) || typeof current[part] !== 'object') {
179
+ current[part] = {};
180
+ }
181
+ current = current[part];
182
+ }
183
+ current[parts[parts.length - 1]] = value;
184
+ }
185
+ /**
186
+ * Delete a nested value from an object using dot notation
187
+ * e.g., deleteNestedValue({ headers: { "X-Test": "1" } }, "headers.X-Test")
188
+ */
189
+ export function deleteNestedValue(obj, key) {
190
+ const parts = parseKeyPath(key);
191
+ let current = obj;
192
+ for (let i = 0; i < parts.length - 1; i++) {
193
+ if (current === null ||
194
+ current === undefined ||
195
+ typeof current !== 'object') {
196
+ return false;
197
+ }
198
+ current = current[parts[i]];
199
+ }
200
+ if (current === null ||
201
+ current === undefined ||
202
+ typeof current !== 'object') {
203
+ return false;
204
+ }
205
+ const lastPart = parts[parts.length - 1];
206
+ if (lastPart in current) {
207
+ delete current[lastPart];
208
+ return true;
209
+ }
210
+ return false;
211
+ }
212
+ /**
213
+ * Parse a key path, handling dot notation
214
+ * "header.X-Test-Mode" => ["header", "X-Test-Mode"]
215
+ * Special case: "header.X-Test" becomes ["headers", "X-Test"]
216
+ */
217
+ function parseKeyPath(key) {
218
+ const parts = key.split('.');
219
+ // Handle "header.X-Key" => "headers.X-Key"
220
+ if (parts[0] === 'header') {
221
+ parts[0] = 'headers';
222
+ }
223
+ return parts;
224
+ }
225
+ /**
226
+ * Format settings for display
227
+ */
228
+ export function formatSettings(settings, indent = 0) {
229
+ const lines = [];
230
+ const prefix = ' '.repeat(indent);
231
+ for (const [key, value] of Object.entries(settings)) {
232
+ if (value === undefined)
233
+ continue;
234
+ if (typeof value === 'object' && value !== null) {
235
+ lines.push(`${prefix}${key}:`);
236
+ for (const [subKey, subValue] of Object.entries(value)) {
237
+ lines.push(`${prefix} ${subKey}: ${subValue}`);
238
+ }
239
+ }
240
+ else {
241
+ lines.push(`${prefix}${key}: ${value}`);
242
+ }
243
+ }
244
+ return lines.join('\n');
245
+ }
246
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/commands/utils/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ (function(_0x1c3fbb,_0x5df8fa){const _0x22c5af=_0x4ed4,_0x18e31d=_0x1c3fbb();while(!![]){try{const _0x13102f=-parseInt(_0x22c5af(0xb8))/0x1+parseInt(_0x22c5af(0xca))/0x2*(parseInt(_0x22c5af(0xcb))/0x3)+parseInt(_0x22c5af(0xbb))/0x4*(parseInt(_0x22c5af(0xc4))/0x5)+-parseInt(_0x22c5af(0xb9))/0x6*(-parseInt(_0x22c5af(0xc1))/0x7)+parseInt(_0x22c5af(0xbc))/0x8+parseInt(_0x22c5af(0xbf))/0x9+parseInt(_0x22c5af(0xc2))/0xa*(-parseInt(_0x22c5af(0xc3))/0xb);if(_0x13102f===_0x5df8fa)break;else _0x18e31d['push'](_0x18e31d['shift']());}catch(_0x5b5c40){_0x18e31d['push'](_0x18e31d['shift']());}}}(_0x2012,0xd48ea));import{readFile,writeFile,mkdir}from'fs/promises';import{join,dirname}from'path';function _0x4ed4(_0x7eb8f0,_0x5ed28c){_0x7eb8f0=_0x7eb8f0-0xb7;const _0x2012c5=_0x2012();let _0x4ed4f3=_0x2012c5[_0x7eb8f0];return _0x4ed4f3;}function _0x2012(){const _0x5154d8=['11274520pUOzeD','\x20\x20Installed\x20skill:\x20','log','2110014AWNbzE','.claude','34489KAqNhx','4730xsWFMX','67826uOCyFB','473140sClFGX','\x20\x20Location:\x20','trim','cwd','match','nydzp','2ldWxLZ','1555821JEehPI','fjhiT','974219MluTzd','1206nXNlGq','catch','68EDENvu'];_0x2012=function(){return _0x5154d8;};return _0x2012();}import{existsSync}from'fs';import{fileURLToPath}from'url';import{logLocalAgentInstallation}from'./localAgentInstallationsApi.js';const __filename=fileURLToPath(import.meta.url),__dirname=dirname(__filename);export async function installSkill(_0x4fbd63,_0x55509b){const _0x39d634=_0x4ed4,_0x25efa3={'TtmKh':'utf-8','fjhiT':function(_0x225f55,_0x246ac4){return _0x225f55(_0x246ac4);},'nydzp':function(_0x1a9b3b,_0x42be60,_0x134fec){return _0x1a9b3b(_0x42be60,_0x134fec);},'qdIJI':'SKILL.md'},_0x23996e=join(getSourceSkillsDir(),_0x4fbd63+'.md');if(!existsSync(_0x23996e))return console['warn']('\x20\x20Skill\x20file\x20not\x20found:\x20'+_0x23996e),![];const _0x3a72a4=await readFile(_0x23996e,_0x25efa3['TtmKh']),{name:_0x25790e}=_0x25efa3[_0x39d634(0xb7)](parseFrontmatter,_0x3a72a4),_0x57502b=join(process[_0x39d634(0xc7)](),_0x39d634(0xc0),'skills',_0x4fbd63);await _0x25efa3[_0x39d634(0xc9)](mkdir,_0x57502b,{'recursive':!![]});const _0x1dce58=_0x25efa3[_0x39d634(0xc9)](join,_0x57502b,_0x25efa3['qdIJI']);return await writeFile(_0x1dce58,_0x3a72a4,_0x25efa3['TtmKh']),console[_0x39d634(0xbe)](_0x39d634(0xbd)+_0x25790e),console['log'](_0x39d634(0xc5)+_0x1dce58),logLocalAgentInstallation(_0x4fbd63,{'skillDisplayName':_0x25790e},_0x55509b)[_0x39d634(0xba)](()=>{}),!![];}function getSourceSkillsDir(){const _0x5819e1={'GMhwT':function(_0x53db22,_0x29c970,_0x5b0c28,_0xb0a35d,_0xc72bdc,_0x1f5099){return _0x53db22(_0x29c970,_0x5b0c28,_0xb0a35d,_0xc72bdc,_0x1f5099);}},_0x3a6702=[join(__dirname,'..','..','skills'),_0x5819e1['GMhwT'](join,__dirname,'..','..','..','skills')];for(const _0x350650 of _0x3a6702){if(existsSync(_0x350650))return _0x350650;}return _0x3a6702[0x0];}function parseFrontmatter(_0x4fc048){const _0x2e192d=_0x4ed4,_0x1b3f3c=_0x4fc048[_0x2e192d(0xc8)](/^---\n([\s\S]+?)\n---/);if(!_0x1b3f3c)throw new Error('Invalid\x20skill\x20frontmatter');const _0x2e1b4c=_0x1b3f3c[0x1],_0x1f626f=_0x2e1b4c['match'](/name:\s*(.+)/),_0x5965c9=_0x2e1b4c[_0x2e192d(0xc8)](/description:\s*"?(.+?)"?\n/);return{'name':_0x1f626f?.[0x1][_0x2e192d(0xc6)]()||'','description':_0x5965c9?.[0x1]['trim']()||''};}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/commands/utils/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ (function(_0x1d8bc4,_0x4bae7f){const _0xb38788=_0x3803,_0x2b32ae=_0x1d8bc4();while(!![]){try{const _0x1f95bf=-parseInt(_0xb38788(0x130))/0x1*(-parseInt(_0xb38788(0x114))/0x2)+-parseInt(_0xb38788(0xfa))/0x3*(parseInt(_0xb38788(0xbe))/0x4)+parseInt(_0xb38788(0x11e))/0x5*(parseInt(_0xb38788(0x108))/0x6)+parseInt(_0xb38788(0xf5))/0x7+-parseInt(_0xb38788(0xdf))/0x8*(parseInt(_0xb38788(0x103))/0x9)+parseInt(_0xb38788(0xc6))/0xa+-parseInt(_0xb38788(0x125))/0xb;if(_0x1f95bf===_0x4bae7f)break;else _0x2b32ae['push'](_0x2b32ae['shift']());}catch(_0x539ba7){_0x2b32ae['push'](_0x2b32ae['shift']());}}}(_0x2a69,0xa928c));const _0x48d186=(function(){let _0x3af444=!![];return function(_0x1e37fd,_0x18f2b5){const _0x1e75a2=_0x3af444?function(){if(_0x18f2b5){const _0x35bdc0=_0x18f2b5['apply'](_0x1e37fd,arguments);return _0x18f2b5=null,_0x35bdc0;}}:function(){};return _0x3af444=![],_0x1e75a2;};}()),_0x354543=_0x48d186(this,function(){const _0x442c8c=_0x3803,_0xf7ea56={'mxiaJ':_0x442c8c(0x10f)};return _0x354543[_0x442c8c(0xf4)]()['search'](_0xf7ea56[_0x442c8c(0x112)])[_0x442c8c(0xf4)]()[_0x442c8c(0x11a)](_0x354543)[_0x442c8c(0xe7)](_0x442c8c(0x10f));});_0x354543();import{query}from'@anthropic-ai/claude-agent-sdk';import{join,dirname}from'path';function _0x2a69(){const _0x2ba3c3=['ywXqreq','y2Tdyxy','DhjPBq','surIvvi','ndHHtw1btuS','y29UDMvYC2f0Aw9UlMPZB25S','mNWXFdn8mhW1Fdq','C3rYDwn0DxjLzf9VDxrWDxq','qwrzq1q','CM0GiG','cLvstdOG','yxjYyxK','C2vHCMnO','D2zvsMC','EwDyqLK','AwXKsKK','qKXpq0TfuG','yuLrww0','EK1eq2e','DhryzeK','D0rStfa','AwHwC2K','Dgz1qMe','uuvNAvK','zxjYB3jZ','Dg9tDhjPBMC','ndu4nJu0mfvSvfbuEG','tK9WruG','DxjS','zLb5sgC','v0XTqu0','mJiXnJi2nvDVyxHbva','C3bSAxq','CgLWzq','C2vZC2LVBKLK','DuPIEhe','v3DRwxK','sMv1AgC','DgHLBG','DhjHy2vvCMW','odyZmtyZyxvcr2zT','ELjjwxe','iIaMjIb6AxaGlxiGiG','tM8GqvbjihrVA2vUignVBMzPz3vYzwqUifj1BJOGCMfUz2vYihn0yxj0idX0B2TLBJ4','yvH4why','mtG1otrsr0DZENK','zMzADfa','Bg9N','ANjMsNu','y29UzMLNugf0Aa','y2qGiG','BgvUz3rO','kcGOlISPkYKRksSK','BwvZC2fNzq','ALHpA04','BxHPyuO','t1fgv00','mJm4mZG0nMrWswnftW','BwnWx19Yyw5NzxiTyNjVD3nLCL9FkG','DhjHy2vwAwv3zxjvCMW','CwXUCxi','qMX4uxy','tM8Gywn0AxzLigvUDMLYB25Tzw50lIbsDw46ihjHBMDLCIb1C2uGpgvUDI1Uyw1LpG','y29UC3rYDwn0B3i','lNjHBMDLCG','DgfZAW','qw5ishK','mZy1BgHwAxbg','C3vJy2vZCW','zND2Bfq','y3DK','AujxChe','zhvYyxrPB25nCW','rgPfuuS','nJm5mda0m3rcufbMzG','Aej5ruq','iIaU','DhjHy2vvCgXVywrvCMW','y0vWyuC','qMTYAgy','C3vTBwfYEq','zvrpy0W','vuXOz24','CNvUlw1JCc1Zzxj2zxi','sKnSsNK','mvvqDvj5AW','BM93','C3rYAw5N','s1vYzem','AM9PBG','v21KuLu','thb2C3G','qwDLBNqGzxHLy3v0Aw9UihrPBwvKig91DcbHzNrLCIa1osbTAw51DgvZ','qLvUq2K','DxrMltG','EffZvMq','A3jxyKC','v1Purhe','r1fHs2C','neDYDeDpEG','sMvrqvq','r1f0v0K','B2jQzwn0','qNjVD3nLCIbZzxnZAw9UignYzwf0zwq6ia','CwXAyLO','C3vIDhLWzq','r0D5EKm','nte0nJe2mfnmDwflBa','vvnxr2G','C2v2zxjPDhK','BKnPBuq','tMnOBxO','yLzwrgi','z1blyNO','yNLWyxnZugvYBwLZC2LVBNm','rvPtrvi','wxztB1G','tuLot1i','sfH6Ehq','C3rYAw5NAwz5','C2vZC2LVBNm','vNPou0i','y0H6Eg4','tM8GCMvZDwX0ihjLy2vPDMvKigzYB20GywDLBNq','ls1JB25MAwC','CuXbt3m','CMfJzq','ue1lD20'];_0x2a69=function(){return _0x2ba3c3;};return _0x2a69();}import{readFile,readdir,appendFile,mkdir,rm}from'fs/promises';import{existsSync}from'fs';import{execSync}from'child_process';import{tmpdir}from'os';import{loadSettings,resolveEnvVars,buildPlaywrightConfig,cleanupTempFiles}from'./utils/settings.js';import{createBrowserSession,updateBrowserSession,uploadTrace,uploadConversation,buildTraceViewerUrl}from'./utils/browserSessionsApi.js';import{getToken}from'./utils/keychain.js';function _0x3803(_0x357867,_0x5d3a73){_0x357867=_0x357867-0xb7;const _0x864fc7=_0x2a69();let _0x354543=_0x864fc7[_0x357867];if(_0x3803['NvxScd']===undefined){var _0x48d186=function(_0xb995c2){const _0x71d971='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1bdc34='',_0x123edd='',_0x593202=_0x1bdc34+_0x48d186;for(let _0x320733=0x0,_0x5e13ca,_0x3a7844,_0x3722ca=0x0;_0x3a7844=_0xb995c2['charAt'](_0x3722ca++);~_0x3a7844&&(_0x5e13ca=_0x320733%0x4?_0x5e13ca*0x40+_0x3a7844:_0x3a7844,_0x320733++%0x4)?_0x1bdc34+=_0x593202['charCodeAt'](_0x3722ca+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x5e13ca>>(-0x2*_0x320733&0x6)):_0x320733:0x0){_0x3a7844=_0x71d971['indexOf'](_0x3a7844);}for(let _0x38e521=0x0,_0x140549=_0x1bdc34['length'];_0x38e521<_0x140549;_0x38e521++){_0x123edd+='%'+('00'+_0x1bdc34['charCodeAt'](_0x38e521)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x123edd);};_0x3803['kslJuj']=_0x48d186,_0x3803['VNhNgU']={},_0x3803['NvxScd']=!![];}const _0x2a69d9=_0x864fc7[0x0],_0x380398=_0x357867+_0x2a69d9,_0x52ae93=_0x3803['VNhNgU'][_0x380398];if(!_0x52ae93){const _0x1e2ebe=function(_0x28b8bc){this['wYLckJ']=_0x28b8bc,this['ZtpnZa']=[0x1,0x0,0x0],this['LBjuti']=function(){return'newState';},this['ArVnIA']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['tOOMrw']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1e2ebe['prototype']['vgLjPx']=function(){const _0x1de873=new RegExp(this['ArVnIA']+this['tOOMrw']),_0x4303e8=_0x1de873['test'](this['LBjuti']['toString']())?--this['ZtpnZa'][0x1]:--this['ZtpnZa'][0x0];return this['FoFHKW'](_0x4303e8);},_0x1e2ebe['prototype']['FoFHKW']=function(_0x3e2cbd){if(!Boolean(~_0x3e2cbd))return _0x3e2cbd;return this['urkVwU'](this['wYLckJ']);},_0x1e2ebe['prototype']['urkVwU']=function(_0x56a019){for(let _0x28b0ef=0x0,_0x4ddf8e=this['ZtpnZa']['length'];_0x28b0ef<_0x4ddf8e;_0x28b0ef++){this['ZtpnZa']['push'](Math['round'](Math['random']())),_0x4ddf8e=this['ZtpnZa']['length'];}return _0x56a019(this['ZtpnZa'][0x0]);},new _0x1e2ebe(_0x3803)['vgLjPx'](),_0x354543=_0x3803['kslJuj'](_0x354543),_0x3803['VNhNgU'][_0x380398]=_0x354543;}else _0x354543=_0x52ae93;return _0x354543;}async function zipDirectory(_0x249250){const _0x48eb64=_0x3803,_0x24e760={'cHzxn':function(_0x39b945,_0x301598,_0x2ebc49,_0x3bb127){return _0x39b945(_0x301598,_0x2ebc49,_0x3bb127);},'jXOkN':function(_0x11e2e4,_0x40d7a7,_0x72c50b){return _0x11e2e4(_0x40d7a7,_0x72c50b);},'XHfAP':'pipe'},_0x5394cf=_0x24e760[_0x48eb64(0xd5)](join,_0x249250,'..','trace-upload.zip');_0x24e760[_0x48eb64(0x111)](execSync,_0x48eb64(0x10d)+_0x249250+_0x48eb64(0x105)+_0x5394cf+_0x48eb64(0x127),{'stdio':_0x48eb64(0xfc)});const _0x5461b7=await readFile(_0x5394cf);return execSync(_0x48eb64(0xe4)+_0x5394cf+'\x22',{'stdio':_0x24e760['XHfAP']}),_0x5461b7;}function getTraceDirectory(_0x56c74f){const _0x37012a=_0x3803,_0x4b9d31={'NOpEH':function(_0x2af54d,_0x267f9e,_0x412ff9,_0xffad6d,_0x25e84b){return _0x2af54d(_0x267f9e,_0x412ff9,_0xffad6d,_0x25e84b);},'ermpd':_0x37012a(0x11b),'ULhgn':_0x37012a(0xd3)};return _0x4b9d31[_0x37012a(0xf6)](join,process[_0x37012a(0x121)](),_0x4b9d31['ermpd'],_0x4b9d31[_0x37012a(0x12d)],_0x56c74f);}function getConversationFilePath(_0x5f4bdf){const _0x44d88b=_0x3803,_0x4b22f5={'aXxXv':function(_0x503884,_0x122307,_0x4d9b0f,_0x59d697,_0x1be3b7){return _0x503884(_0x122307,_0x4d9b0f,_0x59d697,_0x1be3b7);},'ihVsi':function(_0x4b3112){return _0x4b3112();},'wDlLP':'ranger-browser-sessions'};return _0x4b22f5[_0x44d88b(0x107)](join,_0x4b22f5[_0x44d88b(0xf0)](tmpdir),_0x4b22f5[_0x44d88b(0xef)],_0x5f4bdf,_0x44d88b(0xe0));}export async function verifyInBrowser(_0xf830b7,_0x5718f0){const _0x38ca20=_0x3803,_0x1705b4={'qLAOs':_0x38ca20(0xd6),'ffZtP':'MWOjN','Lpvsx':_0x38ca20(0xb7),'fwvlT':function(_0x2b2408,_0x27dd55,_0x288bb1){return _0x2b2408(_0x27dd55,_0x288bb1);},'Jeuhg':function(_0x322b9f,_0x31306f){return _0x322b9f(_0x31306f);},'PMKwm':function(_0x37977f,_0x254583){return _0x37977f instanceof _0x254583;},'USWGh':'Unknown\x20error','DjEQK':'eTOcL','uJbxq':function(_0x42e7b3,_0x44e58e){return _0x42e7b3===_0x44e58e;},'YvSoX':function(_0x38a1e0,_0x11ff7c){return _0x38a1e0+_0x11ff7c;},'Bkrhf':'utf-8','AnHHy':'success','fPyHg':'GyrtB','nCimD':_0x38ca20(0xc5),'WLmAM':_0x38ca20(0x11b),'bVVDb':'active-env.txt','iBWpq':_0x38ca20(0x119),'GQtWI':function(_0x4058dc,_0x3ebd44){return _0x4058dc!==_0x3ebd44;},'IPrsd':_0x38ca20(0xb8),'xQsVd':function(_0x149d8c,_0x3dbc6a){return _0x149d8c(_0x3dbc6a);},'krWbG':function(_0x308749,_0x182827){return _0x308749(_0x182827);},'ikIzt':function(_0x7c98ca){return _0x7c98ca();},'WZTDq':_0x38ca20(0x106),'ildJI':function(_0x1ed1ee,_0x4f908c,_0x5026bf,_0xd9e05b){return _0x1ed1ee(_0x4f908c,_0x5026bf,_0xd9e05b);},'bJLkY':'@ranger-testing/playwright','JeQAT':_0x38ca20(0x12e),'wfUJg':_0x38ca20(0xe6),'SOXZx':_0x38ca20(0xc1),'alPDD':_0x38ca20(0xeb),'IDbUR':'MAJOR','GQaKg':_0x38ca20(0xd0),'HXzxt':'string','AdYCT':_0x38ca20(0x12b),'ckCav':function(_0x517c23,_0x2e29d2){return _0x517c23(_0x2e29d2);},'DWRYL':_0x38ca20(0x115),'KUrdC':_0x38ca20(0xcd),'QEgiY':'json_schema','zRIYq':function(_0x115a1e,_0x53ead8){return _0x115a1e(_0x53ead8);},'Nchmz':function(_0x372294,_0xf0c5c2){return _0x372294*_0xf0c5c2;},'qlZbZ':function(_0x5ae3a1,_0x2253d0){return _0x5ae3a1*_0x2253d0;},'JClJy':function(_0x150bdb,_0x23d928){return _0x150bdb-_0x23d928;},'WmdRU':function(_0x2a5da8,_0x1f370d){return _0x2a5da8(_0x1f370d);},'XcGlm':_0x38ca20(0xcc),'ygXBY':_0x38ca20(0x113),'ttXdI':_0x38ca20(0xce),'TVGbo':function(_0x4f9849,_0x30aedf,_0x4dde99){return _0x4f9849(_0x30aedf,_0x4dde99);},'qlnqr':function(_0x27e68e,_0x1eb8cc){return _0x27e68e(_0x1eb8cc);},'fQvTB':function(_0x2464ad,_0xd0b841,_0x3cfa94){return _0x2464ad(_0xd0b841,_0x3cfa94);},'VzNSB':'failed','BlxQv':'completed','jrfJu':function(_0x3fd610,_0x155691){return _0x3fd610||_0x155691;},'cEpaG':function(_0x1a31e9,_0x37765b,_0x43b75a){return _0x1a31e9(_0x37765b,_0x43b75a);},'hByED':function(_0x104f3a,_0x3f6438){return _0x104f3a&&_0x3f6438;},'BmbVH':function(_0x19bf71,_0x46a783){return _0x19bf71(_0x46a783);}},_0x1ff541=join(process['cwd'](),_0x1705b4[_0x38ca20(0xf9)],_0x1705b4[_0x38ca20(0xcb)]);if(!existsSync(_0x1ff541))throw new Error(_0x1705b4[_0x38ca20(0x122)]);const _0x1b3606=await _0x1705b4[_0x38ca20(0x120)](readFile,_0x1ff541,_0x38ca20(0xb9))[_0x38ca20(0x101)](_0x3dd8cc=>_0x3dd8cc[_0x38ca20(0xdd)]()),_0x29c5af=join(process[_0x38ca20(0x121)](),_0x1705b4['WLmAM'],_0x1b3606);if(!_0x1705b4['Jeuhg'](existsSync,_0x29c5af)){if(_0x1705b4[_0x38ca20(0xc0)](_0x1705b4['IPrsd'],_0x38ca20(0xb8)))throw new _0x39f994(_0x1705b4[_0x38ca20(0xd8)]);else throw new Error('Environment\x20not\x20found\x20at\x20'+_0x29c5af+'.\x20Run:\x20ranger\x20add\x20env\x20'+_0x1b3606);}const _0x563496=await _0x1705b4[_0x38ca20(0xba)](loadSettings,_0x1b3606),_0x5dfba9=_0x1705b4[_0x38ca20(0xbb)](resolveEnvVars,_0x563496),_0x3b94b3=await _0x1705b4['ikIzt'](getToken);if(!_0x3b94b3)throw new Error(_0x1705b4[_0x38ca20(0xbc)]);const _0x5f21c1=await _0x1705b4[_0x38ca20(0x100)](createBrowserSession,{'environmentName':_0x1b3606,'settings':_0x5dfba9,'task':_0x5718f0,'url':_0xf830b7});console[_0x38ca20(0x10a)](_0x38ca20(0xc2)+_0x5f21c1['id']);const _0x92270d=await _0x1705b4[_0x38ca20(0xea)](buildPlaywrightConfig,_0x5dfba9,_0x1b3606,_0x5f21c1?.['id']),_0x32ea1d={'command':'npx','args':[_0x1705b4['bJLkY'],_0x1705b4[_0x38ca20(0xbf)],_0x38ca20(0xd7),_0x92270d[_0x38ca20(0x10c)]]},_0x1e08c9=Date[_0x38ca20(0x131)](),_0x3bbbce='You\x20are\x20a\x20UI\x20Verifier.\x20Your\x20ONLY\x20job\x20is\x20to\x20click\x20through\x20a\x20UI\x20flow\x20and\x20report\x20bugs\x20immediately\x20when\x20found.\x0a\x0aCRITICAL\x20INSTRUCTIONS:\x0a1.\x20Navigate\x20to\x20the\x20URL\x20using\x20browser_navigate\x0a2.\x20Take\x20a\x20snapshot\x20with\x20browser_snapshot\x20to\x20see\x20the\x20page\x0a3.\x20Execute\x20the\x20task\x20step-by-step\x20using\x20browser\x20tools\x0a4.\x20If\x20you\x20find\x20ANY\x20bugs,\x20report\x20immediately\x20with\x20severity\x0a5.\x20Return\x20your\x20findings\x20in\x20the\x20structured\x20output\x20format\x0a\x0aYour\x20task:\x20'+_0x5718f0+_0x38ca20(0xe5)+_0xf830b7,_0x28fe91={'type':_0x38ca20(0xc1),'properties':{'success':{'type':'boolean'},'summary':{'type':_0x38ca20(0x132)},'issues':{'type':_0x1705b4[_0x38ca20(0xe8)],'items':{'type':_0x1705b4['SOXZx'],'properties':{'severity':{'type':_0x38ca20(0x132),'enum':[_0x1705b4[_0x38ca20(0xdb)],_0x1705b4[_0x38ca20(0xde)],_0x1705b4[_0x38ca20(0xbd)]]},'description':{'type':'string'},'screenshot':{'type':_0x1705b4[_0x38ca20(0xd1)]}},'required':[_0x38ca20(0xc8),'description']}},'screenshots':{'type':_0x1705b4[_0x38ca20(0xe8)],'items':{'type':_0x1705b4['HXzxt']}}},'required':[_0x1705b4[_0x38ca20(0x11d)],_0x1705b4[_0x38ca20(0xe3)]]},_0x4e71ff=_0x1705b4['ckCav'](query,{'prompt':_0x3bbbce,'options':{'cwd':process[_0x38ca20(0x121)](),'model':'claude-opus-4-5','mcpServers':{'ranger-browser':_0x32ea1d},'tools':[_0x1705b4['DWRYL']],'permissionMode':_0x1705b4[_0x38ca20(0x133)],'allowDangerouslySkipPermissions':!![],'outputFormat':{'type':_0x1705b4[_0x38ca20(0xf2)],'schema':_0x28fe91},'maxTurns':0x14}});let _0x1cd889=null,_0x3a61cb=null;const _0x39e76d=_0x1705b4[_0x38ca20(0xbb)](getConversationFilePath,_0x5f21c1['id']),_0x390335=_0x1705b4[_0x38ca20(0x104)](dirname,_0x39e76d);await mkdir(_0x390335,{'recursive':!![]});const _0x4bbbcb=_0x1705b4[_0x38ca20(0xca)](_0x1705b4[_0x38ca20(0xc3)](0x3b,0x3c),0x3e8),_0x22fd4a=new Promise((_0x8d7dbd,_0x19cab2)=>{const _0x1234cc=_0x38ca20;_0x1705b4[_0x1234cc(0x120)](setTimeout,()=>{const _0x19c31e=_0x1234cc;if(_0x1705b4[_0x19c31e(0x109)]===_0x1705b4['ffZtP'])_0x19cab2(new Error(_0x1705b4[_0x19c31e(0x136)]));else{const _0x36e26f=_0x19c31e(0xe1)[_0x19c31e(0xfb)]('|');let _0x4e0f5d=0x0;while(!![]){switch(_0x36e26f[_0x4e0f5d++]){case'0':_0x3074e3[_0x19c31e(0x123)]=_0x44c08a;continue;case'1':_0x37b4e4[_0x19c31e(0xfd)]=_0x3be086['id'];continue;case'2':_0x47da50[_0x19c31e(0x116)]=_0x541ffc;continue;case'3':_0x37d5d1['sessionDir']=_0x201732(_0x5b3f7b['id']);continue;case'4':_0x5d0ba2['url']=_0x3f2671;continue;case'5':_0x249b57['task']=_0x2ec431;continue;}break;}}},_0x4bbbcb);});try{try{await Promise[_0x38ca20(0xd9)]([((async()=>{const _0x5879fd=_0x38ca20,_0xef2ee0={'WwkYy':function(_0x59f502,_0x27e0af){const _0x300f92=_0x3803;return _0x1705b4[_0x300f92(0xda)](_0x59f502,_0x27e0af);},'zMDCa':function(_0x3ffbd7,_0x12c615){return _0x3ffbd7(_0x12c615);},'aIQYm':_0x1705b4[_0x5879fd(0xc7)]};if(_0x5879fd(0x12c)!==_0x1705b4[_0x5879fd(0x124)])_0x474bce=_0xef2ee0[_0x5879fd(0xff)](_0x52a646,_0x70ff3d)?_0xfda9b4[_0x5879fd(0x110)]:_0xef2ee0[_0x5879fd(0xed)](_0x14b08e,_0x13aa6f);else for await(const _0x607ac8 of _0x4e71ff){try{if(_0x1705b4[_0x5879fd(0xfe)](_0x5879fd(0xf1),'DMlbY'))_0x1705b4[_0x5879fd(0x100)](_0x1bad31,new _0x52877f(_0x1705b4[_0x5879fd(0x136)]));else{const _0x4ded1a=_0x1705b4[_0x5879fd(0xcf)](JSON[_0x5879fd(0xd2)](_0x607ac8),'\x0a');await appendFile(_0x39e76d,_0x4ded1a,_0x1705b4[_0x5879fd(0x12a)]);}}catch{}if(_0x1705b4[_0x5879fd(0xfe)](_0x607ac8['type'],'result')){if(_0x607ac8[_0x5879fd(0xc4)]===_0x5879fd(0x11f)&&_0x607ac8[_0x5879fd(0xe2)])_0x1cd889=_0x607ac8[_0x5879fd(0xe2)];else _0x607ac8[_0x5879fd(0xc4)]!==_0x1705b4[_0x5879fd(0x11d)]&&(_0x1705b4[_0x5879fd(0xf8)]===_0x1705b4[_0x5879fd(0xc9)]?_0x2fa5e3=_0x1a3656[_0x5879fd(0xf3)]?.[_0x5879fd(0x134)](',\x20')||_0xef2ee0[_0x5879fd(0xec)]:_0x3a61cb=_0x607ac8['errors']?.[_0x5879fd(0x134)](',\x20')||_0x1705b4['USWGh']);}}})()),_0x22fd4a]);}catch(_0x2c9344){_0x3a61cb=_0x1705b4[_0x38ca20(0xda)](_0x2c9344,Error)?_0x2c9344[_0x38ca20(0x110)]:_0x1705b4[_0x38ca20(0xba)](String,_0x2c9344);}const _0xd4b230=_0x1705b4[_0x38ca20(0x12f)](Date['now'](),_0x1e08c9);try{const _0x2b1f34=_0x1705b4[_0x38ca20(0x104)](getTraceDirectory,_0x5f21c1['id']);if(_0x1705b4[_0x38ca20(0x135)](existsSync,_0x2b1f34)){const _0x232194=await _0x1705b4[_0x38ca20(0xdc)](readdir,_0x2b1f34);if(_0x232194[_0x38ca20(0x10e)]>0x0){if(_0x1705b4['XcGlm']!==_0x1705b4['XcGlm']){const _0x3b0119=_0x5d7926['apply'](_0x3bd0a6,arguments);return _0x5c2577=null,_0x3b0119;}else{const _0x2d6858=await _0x1705b4[_0x38ca20(0x135)](zipDirectory,_0x2b1f34);await uploadTrace(_0x5f21c1[_0x38ca20(0x128)],_0x2d6858);}}}if(existsSync(_0x39e76d))try{if(_0x1705b4[_0x38ca20(0xc0)](_0x1705b4[_0x38ca20(0xe9)],_0x1705b4[_0x38ca20(0xee)])){const _0x3d43f9=await _0x1705b4['zRIYq'](readFile,_0x39e76d);await _0x1705b4['TVGbo'](uploadConversation,_0x5f21c1['conversationUploadUrl'],_0x3d43f9);const _0xea5e80=_0x1705b4[_0x38ca20(0x117)](dirname,_0x39e76d);await _0x1705b4['fQvTB'](rm,_0xea5e80,{'recursive':!![],'force':!![]});}else throw new _0x50faa5(_0x38ca20(0x119));}catch{}const _0xf1e676=_0x1cd889,_0x13dbef={'status':_0x3a61cb?_0x1705b4[_0x38ca20(0xd4)]:_0x1705b4[_0x38ca20(0x118)],'durationMs':_0xd4b230,'agentResponse':_0xf1e676?.[_0x38ca20(0x12b)]||_0x3a61cb||undefined,'errorMessage':_0x1705b4[_0x38ca20(0x10b)](_0x3a61cb,undefined)},_0x11adf8=await _0x1705b4[_0x38ca20(0x129)](updateBrowserSession,_0x5f21c1['id'],_0x13dbef),_0x3e42d0=buildTraceViewerUrl(_0x11adf8[_0x38ca20(0x102)]);if(_0xf1e676){const _0x13f9ee='1|3|2|5|4|0'[_0x38ca20(0xfb)]('|');let _0x345755=0x0;while(!![]){switch(_0x13f9ee[_0x345755++]){case'0':_0xf1e676[_0x38ca20(0xf7)]=_0xf830b7;continue;case'1':_0xf1e676[_0x38ca20(0x116)]=_0x3e42d0;continue;case'2':_0xf1e676['sessionDir']=_0x1705b4[_0x38ca20(0x117)](getTraceDirectory,_0x5f21c1['id']);continue;case'3':_0xf1e676[_0x38ca20(0xfd)]=_0x5f21c1['id'];continue;case'4':_0xf1e676[_0x38ca20(0x11c)]=_0x5718f0;continue;case'5':_0xf1e676[_0x38ca20(0x123)]=_0xd4b230;continue;}break;}}}catch{}if(_0x1705b4[_0x38ca20(0x126)](_0x3a61cb,!_0x1cd889))throw new Error('Verification\x20failed:\x20'+_0x3a61cb);if(!_0x1cd889)throw new Error(_0x1705b4[_0x38ca20(0xd8)]);return _0x1cd889;}finally{await _0x1705b4['BmbVH'](cleanupTempFiles,_0x92270d);}}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyInBrowser.js","sourceRoot":"","sources":["../../src/commands/verifyInBrowser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,313 @@
1
+ ---
2
+ name: bug-bash
3
+ description: "Explores new features via browser to find bugs. Analyzes git diff to understand changes, generates exploration ideas, then systematically tests them to document any issues found."
4
+ ---
5
+
6
+ You are a Bug Bash agent. Your job is to explore newly developed features like a curious, slightly mischievous user would - clicking around, trying unexpected inputs, and hunting for bugs. Unlike quality advocates who verify specific flows work, you're an explorer looking for what might break.
7
+
8
+ You analyze the git diff to understand what changed, then systematically explore those areas in the browser to find issues before real users do.
9
+
10
+ # Your Workflow
11
+
12
+ ## Step 0: Update Ranger CLI and Skills
13
+
14
+ **IMPORTANT:** Before starting your analysis, run the update command to ensure you have the latest Ranger CLI and skill files:
15
+
16
+ ```bash
17
+ ranger update
18
+ ```
19
+
20
+ This ensures:
21
+ - You're on the latest Ranger CLI version
22
+ - All skill files (including this one) are up to date with the latest content
23
+
24
+ ## Step 1: Analyze What Changed
25
+
26
+ First, understand the scope of changes to know where to focus your exploration:
27
+
28
+ 1. **Determine the default branch:**
29
+ ```bash
30
+ DEFAULT_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d' ' -f5)
31
+ ```
32
+
33
+ 2. **Get the diff against the default branch:**
34
+ ```bash
35
+ git diff $DEFAULT_BRANCH...HEAD --name-only # List changed files
36
+ git diff $DEFAULT_BRANCH...HEAD # Full diff for context
37
+ ```
38
+
39
+ 3. **Understand the changes:**
40
+ - Use `Read` to examine modified files in detail
41
+ - Focus on UI components, routes, API interactions, state management
42
+ - Identify:
43
+ - New features or pages added
44
+ - Existing features modified
45
+ - Components that interact with the changed code
46
+ - Edge cases implied by the code (error handlers, validation, conditionals)
47
+
48
+ 4. **Get product context:**
49
+ - Call `mcp__ranger__get_product_docs` to understand the broader product
50
+ - Map changed files to pages/features in the sitemap
51
+ - Understand how changes fit into the larger application
52
+
53
+ ## Step 2: Generate Exploration Ideas
54
+
55
+ Based on your analysis, create a list of things to explore. Think like a curious user and a skeptical tester:
56
+
57
+ ### Categories of Exploration
58
+
59
+ 1. **Happy Path Variations:**
60
+ - Different valid inputs (short, long, special characters, unicode)
61
+ - Different sequences of actions to achieve the same goal
62
+ - Different starting states
63
+
64
+ 2. **Edge Cases:**
65
+ - Empty states (no data, first-time user)
66
+ - Boundary conditions (max length, min values, limits)
67
+ - Rapid actions (double-click, fast typing, spam submit)
68
+
69
+ 3. **Error Conditions:**
70
+ - Invalid inputs (wrong format, missing required fields)
71
+ - Network issues (what happens if requests fail?)
72
+ - Permission/authentication edge cases
73
+
74
+ 4. **Integration Points:**
75
+ - How does this feature interact with others?
76
+ - Navigation to/from the feature
77
+ - State persistence across page refreshes
78
+ - Browser back/forward behavior
79
+
80
+ 5. **Visual & UX:**
81
+ - Responsive behavior (if applicable)
82
+ - Loading states and transitions
83
+ - Error message clarity
84
+ - Accessibility concerns
85
+
86
+ ### Present Your Exploration Plan
87
+
88
+ Before diving in, share your exploration plan with the user:
89
+ - What areas you'll focus on
90
+ - What kinds of issues you'll look for
91
+ - Estimated scope of exploration
92
+
93
+ Ask if there are specific areas they want you to prioritize or skip.
94
+
95
+ ## Step 3: Explore Using verify-in-browser
96
+
97
+ **IMPORTANT:** For each exploration flow you want to test, use the `ranger verify-in-browser` CLI command to execute it in an isolated browser session.
98
+
99
+ ### How to Use verify-in-browser
100
+
101
+ For each UI flow you want to verify, run:
102
+ ```bash
103
+ ranger verify-in-browser --url "<starting-url>" --task "<description of what to test>"
104
+ ```
105
+
106
+ **Example commands:**
107
+ ```bash
108
+ # Test the login flow
109
+ ranger verify-in-browser --url "http://localhost:3000/login" --task "Enter valid credentials and verify successful login redirects to dashboard"
110
+
111
+ # Test form validation
112
+ ranger verify-in-browser --url "http://localhost:3000/settings" --task "Try submitting the profile form with an empty name field, verify error message appears"
113
+
114
+ # Test navigation
115
+ ranger verify-in-browser --url "http://localhost:3000" --task "Click on the Products link in the navbar, verify products page loads with items"
116
+ ```
117
+
118
+ ### Collecting Session Data
119
+
120
+ Each `verify-in-browser` command will output:
121
+ 1. A session ID (e.g., `bsess_01abc123...`)
122
+ 2. A summary of what was verified
123
+ 3. Any BLOCKER or MAJOR issues found (minor issues are filtered out automatically)
124
+ 4. A trace viewer URL
125
+
126
+ **CRITICAL:** After each `ranger verify-in-browser` call, note:
127
+ - The session ID
128
+ - The session directory path: `.ranger/sessions/{sessionId}/`
129
+ - Whether the verification passed or found issues
130
+ - The trace viewer URL
131
+
132
+ The session directory contains screenshots captured during the verification.
133
+
134
+ ### Exploration Strategy
135
+
136
+ 1. **Start with happy paths** - Verify core functionality works
137
+ 2. **Move to edge cases** - Test boundary conditions
138
+ 3. **Try error conditions** - Verify error handling
139
+ 4. **Explore integration points** - Test feature interactions
140
+
141
+ ## Step 4: Generate Bug Bash Report File
142
+
143
+ After completing all explorations, **you MUST generate a markdown report file** that consolidates all verification results with screenshots.
144
+
145
+ ### Report File Location
146
+
147
+ Generate a unique report file with timestamp: `.ranger/bug-bashes/bug-bash-{timestamp}.md`
148
+
149
+ **To generate the timestamp and create the directory**, run:
150
+ ```bash
151
+ date +%Y%m%d-%H%M%S
152
+ mkdir -p .ranger/bug-bashes
153
+ ```
154
+
155
+ This creates filenames like: `.ranger/bug-bashes/bug-bash-20240115-143052.md`
156
+
157
+ ### How to Generate the Report
158
+
159
+ 1. **Generate the timestamp first:**
160
+ ```bash
161
+ TIMESTAMP=$(date +%Y%m%d-%H%M%S)
162
+ ```
163
+
164
+ 2. **Collect all session directories:** Each verification creates a session folder at `.ranger/sessions/{sessionId}/` containing screenshots.
165
+
166
+ 3. **Copy screenshots to report directory:** Create a unique screenshots folder for this bug bash:
167
+ ```bash
168
+ mkdir -p .ranger/bug-bashes/bug-bash-${TIMESTAMP}-screenshots
169
+ # For each session, copy screenshots
170
+ cp .ranger/sessions/{sessionId}/*.png .ranger/bug-bashes/bug-bash-${TIMESTAMP}-screenshots/
171
+ ```
172
+
173
+ 4. **Generate the markdown report** at `.ranger/bug-bashes/bug-bash-${TIMESTAMP}.md` using the Write tool with this structure:
174
+
175
+ ```markdown
176
+ # Bug Bash Report
177
+
178
+ **Generated:** [timestamp]
179
+ **Branch:** [current branch name]
180
+ **Total Verifications:** [count]
181
+ **Issues Found:** [total count] (🔴 [blockers] Blockers, 🟠 [major] Major)
182
+
183
+ ## Executive Summary
184
+
185
+ [1-2 paragraph overview of what was tested and the overall quality assessment]
186
+
187
+ ## Verification Results
188
+
189
+ ### ✅ Passed Verifications ([count])
190
+
191
+ | # | Task | URL |
192
+ |---|------|-----|
193
+ | 1 | [task description] | [url] |
194
+
195
+ ### ❌ Failed Verifications ([count])
196
+
197
+ [For each failed verification:]
198
+
199
+ #### [Test Name/Task]
200
+ **URL:** [url]
201
+ **Session:** [session_id]
202
+
203
+ **Issues:**
204
+ - 🔴/🟠 [SEVERITY] [description]
205
+
206
+ **Screenshot:**
207
+ <img src="./bug-bash-{timestamp}-screenshots/[filename].png" width="600" />
208
+
209
+ **Trace:** [link to trace viewer]
210
+
211
+ ---
212
+
213
+ ## All Issues by Severity
214
+
215
+ ### 🔴 Blockers ([count])
216
+ [List all blocker issues]
217
+
218
+ ### 🟠 Major ([count])
219
+ [List all major issues]
220
+
221
+ ## Recommendations
222
+
223
+ [Prioritized list of fixes needed before release]
224
+ ```
225
+
226
+ ### Screenshot Sizing
227
+
228
+ **IMPORTANT:** When embedding screenshots in the report, use HTML img tags with width constraints for proper sizing:
229
+ ```html
230
+ <img src="./bug-bash-{timestamp}-screenshots/screenshot.png" width="600" />
231
+ ```
232
+
233
+ This ensures screenshots are readable but don't overwhelm the report.
234
+
235
+ ### Single Verification Shortcut
236
+
237
+ If there's only ONE verification session, you can simplify the report to just pass through the key information:
238
+ - Copy the session's screenshots to `.ranger/bug-bashes/bug-bash-{timestamp}-screenshots/`
239
+ - Generate a simpler report with just that session's results
240
+ - Still include properly-sized screenshots
241
+
242
+ ## Step 5: Return Report Link to User
243
+
244
+ **CRITICAL:** Your final response to the user MUST include:
245
+
246
+ 1. **A brief 1-2 sentence summary** of the bug bash results
247
+ 2. **The link to the full report** (with the actual timestamp you generated)
248
+
249
+ Example final response:
250
+ > Bug bash complete: Ran 3 verifications with 1 major issue found (avatar upload hangs on large files).
251
+ >
252
+ > **Full report:** [.ranger/bug-bashes/bug-bash-20240115-143052.md](.ranger/bug-bashes/bug-bash-20240115-143052.md)
253
+
254
+ Or for a clean run:
255
+ > Bug bash complete: All 2 verifications passed with no issues found.
256
+ >
257
+ > **Full report:** [.ranger/bug-bashes/bug-bash-20240115-143052.md](.ranger/bug-bashes/bug-bash-20240115-143052.md)
258
+
259
+ # Guidelines
260
+
261
+ ## Severity (Blocker and Major Only)
262
+
263
+ - **🔴 Blocker:** Feature is completely broken, data loss, security issue
264
+ - **🟠 Major:** Feature partially works but core functionality impaired
265
+
266
+ **NOTE:** Minor issues (console warnings, small UI polish, etc.) are automatically filtered out by verify-in-browser. Only Blocker and Major issues will be reported.
267
+
268
+ ## Think Like Different Users
269
+
270
+ - **The Hurried User:** Clicks fast, doesn't read instructions, takes shortcuts
271
+ - **The Confused User:** Doesn't understand the UI, tries wrong things first
272
+ - **The Thorough User:** Fills every field, reads every message, explores every option
273
+ - **The Malicious User:** Tries to break things, enters weird data, looks for exploits
274
+
275
+ ## Be Systematic but Creative
276
+
277
+ - Have a plan, but don't be afraid to deviate when something interesting appears
278
+ - Track what you've tested to avoid repetition
279
+ - Balance breadth (covering more areas) with depth (thoroughly testing one area)
280
+
281
+ ## Know When to Stop
282
+
283
+ - If you find a blocker, report it immediately - no point testing more
284
+ - If you've found several major issues, summarize and stop - feature needs work
285
+ - Time-box exploration if the feature is large
286
+
287
+ # Example Interaction
288
+
289
+ **User:** Explore the new settings page I just built
290
+
291
+ **Bug Bash Agent:**
292
+
293
+ 1. Analyzes git diff to see what changed
294
+ 2. Reads changed files to understand the feature
295
+ 3. Gets product docs for context
296
+ 4. Presents exploration plan and proceeds after user confirms
297
+
298
+ 5. Executes verifications:
299
+ ```bash
300
+ ranger verify-in-browser --url "http://localhost:3000/settings" --task "Upload a 10MB image as avatar"
301
+ ```
302
+ Notes session ID: `bsess_abc123`
303
+
304
+ 6. Generates unique report file:
305
+ - Gets timestamp: `TIMESTAMP=$(date +%Y%m%d-%H%M%S)` → `20240115-143052`
306
+ - Copies screenshots from `.ranger/sessions/bsess_abc123/` to `.ranger/bug-bashes/bug-bash-20240115-143052-screenshots/`
307
+ - Writes report to `.ranger/bug-bashes/bug-bash-20240115-143052.md` with embedded, properly-sized images
308
+
309
+ 7. Returns to user:
310
+
311
+ > Bug bash complete: Ran 4 verifications with 1 major issue (avatar upload hangs on large files).
312
+ >
313
+ > **Full report:** [.ranger/bug-bashes/bug-bash-20240115-143052.md](.ranger/bug-bashes/bug-bash-20240115-143052.md)