@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.
- package/README.md +281 -0
- package/build/cli.js +168 -1
- package/build/cli.js.map +1 -0
- package/build/commands/addEnv.js +1 -110
- package/build/commands/addEnv.js.map +1 -0
- package/build/commands/authEncrypt.js +40 -0
- package/build/commands/authEncrypt.js.map +1 -0
- package/build/commands/clean.js +1 -0
- package/build/commands/clean.js.map +1 -0
- package/build/commands/config.js +100 -0
- package/build/commands/config.js.map +1 -0
- package/build/commands/dataMcpServer.js +1 -0
- package/build/commands/dataMcpServer.js.map +1 -0
- package/build/commands/index.js +6 -0
- package/build/commands/index.js.map +1 -0
- package/build/commands/skillup.js +112 -0
- package/build/commands/skillup.js.map +1 -0
- package/build/commands/start.js +1 -72
- package/build/commands/start.js.map +1 -0
- package/build/commands/status.js +221 -0
- package/build/commands/status.js.map +1 -0
- package/build/commands/update.js +127 -0
- package/build/commands/update.js.map +1 -0
- package/build/commands/updateEnv.js +1 -64
- package/build/commands/updateEnv.js.map +1 -0
- package/build/commands/useEnv.js +1 -28
- package/build/commands/useEnv.js.map +1 -0
- package/build/commands/utils/browserSessionsApi.js +1 -0
- package/build/commands/utils/browserSessionsApi.js.map +1 -0
- package/build/commands/utils/crypto.js +42 -0
- package/build/commands/utils/crypto.js.map +1 -0
- package/build/commands/utils/keychain.js +1 -0
- package/build/commands/utils/keychain.js.map +1 -0
- package/build/commands/utils/localAgentInstallationsApi.js +1 -0
- package/build/commands/utils/localAgentInstallationsApi.js.map +1 -0
- package/build/commands/utils/mcpConfig.js +1 -47
- package/build/commands/utils/mcpConfig.js.map +1 -0
- package/build/commands/utils/reportGenerator.js +130 -0
- package/build/commands/utils/reportGenerator.js.map +1 -0
- package/build/commands/utils/settings.js +246 -0
- package/build/commands/utils/settings.js.map +1 -0
- package/build/commands/utils/skills.js +1 -0
- package/build/commands/utils/skills.js.map +1 -0
- package/build/commands/verifyInBrowser.js +1 -0
- package/build/commands/verifyInBrowser.js.map +1 -0
- package/build/skills/bug-bash.md +313 -0
- package/build/skills/e2e-test-recommender.md +173 -0
- 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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EACH,QAAQ,EACR,OAAO,EAEP,UAAU,EACV,KAAK,EACL,EAAE,GACL,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EACH,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,gBAAgB,GAGnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAoB/C;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,OAAe;IACvC,wCAAwC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,OAAO,gBAAgB,UAAU,KAAK,EAAE;QACpD,KAAK,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1C,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,SAAiB;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,SAAiB;IAC9C,OAAO,IAAI,CACP,MAAM,EAAE,EACR,yBAAyB,EACzB,SAAS,EACT,oBAAoB,CACvB,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,GAAW,EACX,IAAY;IAEZ,yDAAyD;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACvE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAChE,CAAC,CAAC,IAAI,EAAE,CACX,CAAC;IAEF,+CAA+C;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACX,4BAA4B,MAAM,yBAAyB,SAAS,EAAE,CACzE,CAAC;IACN,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAE/C,4CAA4C;IAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAa,CAAC;IAE9D,6CAA6C;IAC7C,iFAAiF;IACjF,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC;QAC9C,eAAe,EAAE,SAAS;QAC1B,QAAQ,EAAE,gBAA2C;QACrD,IAAI;QACJ,GAAG;KACN,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;IAE7D,6EAA6E;IAC7E,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAC5C,gBAAgB,EAChB,SAAS,EACT,cAAc,EAAE,EAAE,CACrB,CAAC;IAEF,MAAM,gBAAgB,GAAG;QACrB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACF,4BAA4B;YAC5B,gBAAgB;YAChB,UAAU;YACV,YAAY,CAAC,UAAU;SAC1B;KACJ,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,+BAA+B;IAC/B,MAAM,gBAAgB,GAAG;;;;;;;;;aAShB,IAAI;OACV,GAAG,EAAE,CAAC;IAET,iDAAiD;IACjD,MAAM,YAAY,GAAG;QACjB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,MAAM,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,QAAQ,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;yBACtC;wBACD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACjC;oBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;iBACxC;aACJ;YACD,WAAW,EAAE;gBACT,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC5B;SACJ;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KACnC,CAAC;IAEF,0CAA0C;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC;QACjB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE;YACL,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,iBAAiB,EAAE,4DAA4D;YACtF,UAAU,EAAE;gBACR,gBAAgB,EAAE,gBAAgB;aACrC;YACD,KAAK,EAAE,CAAC,wBAAwB,CAAC,EAAE,oCAAoC;YACvE,cAAc,EAAE,mBAAmB,EAAE,sBAAsB;YAC3D,+BAA+B,EAAE,IAAI;YACrC,YAAY,EAAE;gBACV,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,YAAY;aACvB;YACD,QAAQ,EAAE,EAAE,EAAE,iCAAiC;SAClD;KACJ,CAAC,CAAC;IAEH,sDAAsD;IACtD,IAAI,WAAW,GAA8B,IAAI,CAAC;IAClD,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,4DAA4D;IAC5D,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,kEAAkE;IAClE,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAChD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACnD,UAAU,CAAC,GAAG,EAAE;YACZ,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACpE,CAAC,EAAE,UAAU,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACD,IAAI,CAAC;YACD,2CAA2C;YAC3C,MAAM,OAAO,CAAC,IAAI,CAAC;gBACf,CAAC,KAAK,IAAI,EAAE;oBACR,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;wBACjC,uDAAuD;wBACvD,IAAI,CAAC;4BACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;4BAChD,MAAM,UAAU,CACZ,oBAAoB,EACpB,QAAQ,EACR,OAAO,CACV,CAAC;wBACN,CAAC;wBAAC,MAAM,CAAC;4BACL,8CAA8C;wBAClD,CAAC;wBAED,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC5B,IACI,OAAO,CAAC,OAAO,KAAK,SAAS;gCAC7B,OAAO,CAAC,iBAAiB,EAC3B,CAAC;gCACC,WAAW;oCACP,OAAO,CAAC,iBAAuC,CAAC;4BACxD,CAAC;iCAAM,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gCACvC,UAAU;oCACN,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;wCAC1B,eAAe,CAAC;4BACxB,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC,EAAE;gBACJ,cAAc;aACjB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE1C,2DAA2D;QAC3D,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACtD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;oBACjD,MAAM,WAAW,CACb,cAAc,CAAC,cAAc,EAC7B,WAAW,CACd,CAAC;gBACN,CAAC;YACL,CAAC;YAED,wCAAwC;YACxC,IAAI,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACD,MAAM,kBAAkB,GACpB,MAAM,QAAQ,CAAC,oBAAoB,CAAC,CAAC;oBACzC,MAAM,kBAAkB,CACpB,cAAc,CAAC,qBAAqB,EACpC,kBAAkB,CACrB,CAAC;oBAEF,kEAAkE;oBAClE,MAAM,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;oBACtD,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,CAAC;gBAAC,MAAM,CAAC;oBACL,wDAAwD;gBAC5D,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,6DAA6D;YAC7D,MAAM,MAAM,GAAG,WAAwC,CAAC;YACxD,MAAM,UAAU,GAAG;gBACf,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAE9B;gBACd,UAAU;gBACV,aAAa,EAAE,MAAM,EAAE,OAAO,IAAI,UAAU,IAAI,SAAS;gBACzD,YAAY,EAAE,UAAU,IAAI,SAAS;aACxC,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAC7C,cAAc,CAAC,EAAE,EACjB,UAAU,CACb,CAAC;YAEF,yBAAyB;YACzB,MAAM,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAEpE,IAAI,MAAM,EAAE,CAAC;gBACT,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;gBACvC,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACzD,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;gBAC/B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACnB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;YACrB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,wCAAwC;QAC5C,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;YAAS,CAAC;QACP,6DAA6D;QAC7D,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;AACL,CAAC"}
|
|
@@ -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)
|