@ranger-testing/ranger-cli 1.0.4 → 1.0.6
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 -103
- 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 -59
- 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,MAA8B;IAE9B,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAChE,OAAO,CACE,CAAC;IAEd,MAAM,OAAO,CAAC,GAAG,CACb,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3B,sDAAsD;QACtD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CACR,gCAAgC,QAAQ,GAAG,EAC3C,GAAG,CAAC,OAAO,CACd,CAAC;QACN,CAAC;IACL,CAAC,CAAC,CACL,CACJ,CAAC;AACN,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC1C,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,GAAW,EACX,QAAkB;IAElB,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAErC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACvC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,aAAa,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,QAAkB,EAClB,GAAW,EACX,SAAkB;IAElB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAEnD,mDAAmD;IACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,gBAAoC,CAAC;IACzC,IAAI,YAAgC,CAAC;IAErC,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChC,uBAAuB;QACvB,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CACX,8EAA8E,CACjF,CAAC;YACN,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAE5C,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACzC,gBAAgB,GAAG,YAAY,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;SAAM,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvC,yEAAyE;QACzE,gBAAgB,GAAG,iBAAiB,CAAC;IACzC,CAAC;IAED,mCAAmC;IACnC,MAAM,kBAAkB,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAClB,OAAO,CAAC,GAAG,EAAE,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,CACrB,CAAC;IACF,MAAM,MAAM,GAA4B;QACpC,IAAI,EAAE,GAAG;QACT,OAAO,EAAE;YACL,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE;gBACX,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,KAAK;aACvC;YACD,cAAc,EAAE;gBACZ,WAAW,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;gBAClD,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,SAAS;gBAC1C,gBAAgB,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;gBACxC,YAAY,EAAE,gBAAgB;aACjC;SACJ;QACD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC1D,cAAc,EAAE,OAAO;QACvB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QACvC,SAAS;KACZ,CAAC;IAEF,gDAAgD;IAChD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAkC,CAAC;IACjE,MAAM,OAAO,GAAI,cAA0C;SACtD,cAAyC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC;IAC9D,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,YAAY,CAAC;IAEpE,qBAAqB;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO;QACH,UAAU,EAAE,cAAc;QAC1B,YAAY;KACf,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC1B,GAA4B,EAC5B,GAAW;IAEX,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,OAAO,GAAY,GAAG,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IACI,OAAO,KAAK,IAAI;YAChB,OAAO,KAAK,SAAS;YACrB,OAAO,OAAO,KAAK,QAAQ,EAC7B,CAAC;YACC,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC1B,GAA4B,EAC5B,GAAW,EACX,KAAc;IAEd,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,OAAO,GAA4B,GAAG,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAA4B,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC7B,GAA4B,EAC5B,GAAW;IAEX,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,OAAO,GAAY,GAAG,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IACI,OAAO,KAAK,IAAI;YAChB,OAAO,KAAK,SAAS;YACrB,OAAO,OAAO,KAAK,QAAQ,EAC7B,CAAC;YACC,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IACI,OAAO,KAAK,IAAI;QAChB,OAAO,KAAK,SAAS;QACrB,OAAO,OAAO,KAAK,QAAQ,EAC7B,CAAC;QACC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ,IAAK,OAAmC,EAAE,CAAC;QACnD,OAAQ,OAAmC,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7B,2CAA2C;IAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACxB,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,MAAM,GAAG,CAAC;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAElC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;YAC/B,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,KAAK,QAAQ,EAAE,CAAC,CAAC;YACpD,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(_0x355e95,_0x2f396e){const _0x3bb4f9=_0x1843,_0x5e859e=_0x355e95();while(!![]){try{const _0x365849=parseInt(_0x3bb4f9(0x15d))/0x1+-parseInt(_0x3bb4f9(0x16a))/0x2+-parseInt(_0x3bb4f9(0x163))/0x3+parseInt(_0x3bb4f9(0x15e))/0x4*(parseInt(_0x3bb4f9(0x171))/0x5)+-parseInt(_0x3bb4f9(0x160))/0x6*(-parseInt(_0x3bb4f9(0x16c))/0x7)+-parseInt(_0x3bb4f9(0x168))/0x8+-parseInt(_0x3bb4f9(0x174))/0x9*(-parseInt(_0x3bb4f9(0x16f))/0xa);if(_0x365849===_0x2f396e)break;else _0x5e859e['push'](_0x5e859e['shift']());}catch(_0xcc4d10){_0x5e859e['push'](_0x5e859e['shift']());}}}(_0x1d0b,0x46f3f));import{readFile,writeFile,mkdir}from'fs/promises';import{join,dirname}from'path';import{existsSync}from'fs';import{fileURLToPath}from'url';function _0x1d0b(){const _0x5022d1=['skills','3703408HrpwNj','\x20\x20Skill\x20file\x20not\x20found:\x20','1009782oiInJt','JrEIX','105ZOmZIn','zHHmP','PlXGO','40670VUwuie','SKILL.md','2381665rigNpo','trim','HmyiJ','342wfjvfc','374405PhxLmP','4DrGlQr','\x20\x20Location:\x20','129102bcWeLW','ogcsS','mmvGg','208797sdEmnW','match','utf-8','BxMYY'];_0x1d0b=function(){return _0x5022d1;};return _0x1d0b();}import{logLocalAgentInstallation}from'./localAgentInstallationsApi.js';const __filename=fileURLToPath(import.meta.url),__dirname=dirname(__filename);export async function installSkill(_0x1cd5a3,_0xa6dedd){const _0x3216a4=_0x1843,_0x1d0f57={'HmyiJ':'.claude','BxMYY':_0x3216a4(0x167),'PlXGO':function(_0x587a20,_0x4eaa38,_0x377698){return _0x587a20(_0x4eaa38,_0x377698);},'zHHmP':function(_0x2ee178,_0x2d1e7e,_0x1299df){return _0x2ee178(_0x2d1e7e,_0x1299df);},'JrEIX':function(_0x95ab0b,_0x5eaf42,_0x51d353,_0x39f61e){return _0x95ab0b(_0x5eaf42,_0x51d353,_0x39f61e);},'mmvGg':_0x3216a4(0x165)},_0x283eb9=join(getSourceSkillsDir(),_0x1cd5a3+'.md');if(!existsSync(_0x283eb9))return console['warn'](_0x3216a4(0x169)+_0x283eb9),![];const _0x1065c4=await readFile(_0x283eb9,'utf-8'),{name:_0x5abab5}=parseFrontmatter(_0x1065c4),_0x1c53d8=join(process['cwd'](),_0x1d0f57[_0x3216a4(0x173)],_0x1d0f57[_0x3216a4(0x166)],_0x1cd5a3);await _0x1d0f57[_0x3216a4(0x16e)](mkdir,_0x1c53d8,{'recursive':!![]});const _0x4374d5=_0x1d0f57[_0x3216a4(0x16d)](join,_0x1c53d8,_0x3216a4(0x170));return await _0x1d0f57[_0x3216a4(0x16b)](writeFile,_0x4374d5,_0x1065c4,_0x1d0f57[_0x3216a4(0x162)]),console['log']('\x20\x20Installed\x20skill:\x20'+_0x5abab5),console['log'](_0x3216a4(0x15f)+_0x4374d5),_0x1d0f57['JrEIX'](logLocalAgentInstallation,_0x1cd5a3,{'skillDisplayName':_0x5abab5},_0xa6dedd)['catch'](()=>{}),!![];}function _0x1843(_0x53d731,_0x22aea3){_0x53d731=_0x53d731-0x15d;const _0x1d0beb=_0x1d0b();let _0x184320=_0x1d0beb[_0x53d731];return _0x184320;}function getSourceSkillsDir(){const _0x20a217=_0x1843,_0x54ec0a={'PMJeY':function(_0x4fd1f3,_0x358f07,_0x36f024,_0x3fa4b8,_0x20d5db){return _0x4fd1f3(_0x358f07,_0x36f024,_0x3fa4b8,_0x20d5db);},'ogcsS':_0x20a217(0x167)},_0x1b5531=[_0x54ec0a['PMJeY'](join,__dirname,'..','..',_0x54ec0a[_0x20a217(0x161)]),join(__dirname,'..','..','..',_0x54ec0a[_0x20a217(0x161)])];for(const _0x5da3c0 of _0x1b5531){if(existsSync(_0x5da3c0))return _0x5da3c0;}return _0x1b5531[0x0];}function parseFrontmatter(_0x768849){const _0x43ff09=_0x1843,_0x24a385={'crByE':'Invalid\x20skill\x20frontmatter'},_0x436c22=_0x768849[_0x43ff09(0x164)](/^---\n([\s\S]+?)\n---/);if(!_0x436c22)throw new Error(_0x24a385['crByE']);const _0x12c08d=_0x436c22[0x1],_0x26e2f7=_0x12c08d[_0x43ff09(0x164)](/name:\s*(.+)/),_0x389c2d=_0x12c08d['match'](/description:\s*"?(.+?)"?\n/);return{'name':_0x26e2f7?.[0x1][_0x43ff09(0x172)]()||'','description':_0x389c2d?.[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(_0x5d0675,_0x52ce7f){const _0x2fe8a9=_0x5230,_0x3382a6=_0x5d0675();while(!![]){try{const _0x4cfd12=parseInt(_0x2fe8a9(0xab))/0x1+parseInt(_0x2fe8a9(0xf6))/0x2+parseInt(_0x2fe8a9(0xd4))/0x3*(parseInt(_0x2fe8a9(0xf7))/0x4)+-parseInt(_0x2fe8a9(0x8c))/0x5*(-parseInt(_0x2fe8a9(0xfa))/0x6)+parseInt(_0x2fe8a9(0x83))/0x7*(parseInt(_0x2fe8a9(0xa9))/0x8)+parseInt(_0x2fe8a9(0xcc))/0x9+-parseInt(_0x2fe8a9(0x7d))/0xa;if(_0x4cfd12===_0x52ce7f)break;else _0x3382a6['push'](_0x3382a6['shift']());}catch(_0x13458d){_0x3382a6['push'](_0x3382a6['shift']());}}}(_0x4913,0x54568));const _0x283f7c=(function(){let _0x3cb64b=!![];return function(_0x1e6642,_0x52b048){const _0x4ac4bd=_0x3cb64b?function(){const _0x428d35=_0x5230;if(_0x52b048){const _0x275596=_0x52b048[_0x428d35(0xe9)](_0x1e6642,arguments);return _0x52b048=null,_0x275596;}}:function(){};return _0x3cb64b=![],_0x4ac4bd;};}()),_0x1241c1=_0x283f7c(this,function(){const _0xd62dc6=_0x5230,_0x149140={'rNiOm':'(((.+)+)+)+$'};return _0x1241c1[_0xd62dc6(0x97)]()[_0xd62dc6(0xcd)](_0x149140[_0xd62dc6(0xdc)])['toString']()[_0xd62dc6(0xe5)](_0x1241c1)[_0xd62dc6(0xcd)](_0x149140['rNiOm']);});_0x1241c1();function _0x5230(_0x3270ce,_0x2ba37f){_0x3270ce=_0x3270ce-0x7b;const _0x1f4605=_0x4913();let _0x1241c1=_0x1f4605[_0x3270ce];if(_0x5230['WtDCXD']===undefined){var _0x283f7c=function(_0xb69c0b){const _0x34f134='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x8cc4ab='',_0x220920='',_0x41bb03=_0x8cc4ab+_0x283f7c;for(let _0x68da97=0x0,_0x4fb517,_0x1519a1,_0x5ae8e3=0x0;_0x1519a1=_0xb69c0b['charAt'](_0x5ae8e3++);~_0x1519a1&&(_0x4fb517=_0x68da97%0x4?_0x4fb517*0x40+_0x1519a1:_0x1519a1,_0x68da97++%0x4)?_0x8cc4ab+=_0x41bb03['charCodeAt'](_0x5ae8e3+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x4fb517>>(-0x2*_0x68da97&0x6)):_0x68da97:0x0){_0x1519a1=_0x34f134['indexOf'](_0x1519a1);}for(let _0x5f5172=0x0,_0x26622a=_0x8cc4ab['length'];_0x5f5172<_0x26622a;_0x5f5172++){_0x220920+='%'+('00'+_0x8cc4ab['charCodeAt'](_0x5f5172)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x220920);};_0x5230['SmqiDG']=_0x283f7c,_0x5230['xrYdAu']={},_0x5230['WtDCXD']=!![];}const _0x491397=_0x1f4605[0x0],_0x52307b=_0x3270ce+_0x491397,_0xbcb9ba=_0x5230['xrYdAu'][_0x52307b];if(!_0xbcb9ba){const _0x23c483=function(_0x2670f4){this['pgNJQZ']=_0x2670f4,this['ipHeWY']=[0x1,0x0,0x0],this['FBLTiR']=function(){return'newState';},this['pDyKiM']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['WjEKkk']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x23c483['prototype']['eupLgr']=function(){const _0x384a41=new RegExp(this['pDyKiM']+this['WjEKkk']),_0x4829a2=_0x384a41['test'](this['FBLTiR']['toString']())?--this['ipHeWY'][0x1]:--this['ipHeWY'][0x0];return this['BWkXCB'](_0x4829a2);},_0x23c483['prototype']['BWkXCB']=function(_0x52b40c){if(!Boolean(~_0x52b40c))return _0x52b40c;return this['bkAafb'](this['pgNJQZ']);},_0x23c483['prototype']['bkAafb']=function(_0x3978d4){for(let _0x578e00=0x0,_0x600f99=this['ipHeWY']['length'];_0x578e00<_0x600f99;_0x578e00++){this['ipHeWY']['push'](Math['round'](Math['random']())),_0x600f99=this['ipHeWY']['length'];}return _0x3978d4(this['ipHeWY'][0x0]);},new _0x23c483(_0x5230)['eupLgr'](),_0x1241c1=_0x5230['SmqiDG'](_0x1241c1),_0x5230['xrYdAu'][_0x52307b]=_0x1241c1;}else _0x1241c1=_0xbcb9ba;return _0x1241c1;}import{query}from'@anthropic-ai/claude-agent-sdk';import{join,dirname}from'path';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';async function zipDirectory(_0x4ac9e0){const _0x293d5f=_0x5230,_0x156a3d={'PHIUR':function(_0x4f4116,_0x45e346,_0x31264c,_0x27f6b7){return _0x4f4116(_0x45e346,_0x31264c,_0x27f6b7);},'ZeGFT':_0x293d5f(0x9a),'TIjTr':'pipe','lNees':function(_0x3da6fb,_0x5d82fe,_0x27094a){return _0x3da6fb(_0x5d82fe,_0x27094a);}},_0x118a09=_0x156a3d[_0x293d5f(0xb6)](join,_0x4ac9e0,'..',_0x156a3d[_0x293d5f(0xef)]);execSync('cd\x20\x22'+_0x4ac9e0+_0x293d5f(0xd7)+_0x118a09+_0x293d5f(0xd9),{'stdio':_0x156a3d[_0x293d5f(0xe3)]});const _0xdfd63c=await readFile(_0x118a09);return _0x156a3d[_0x293d5f(0xa3)](execSync,_0x293d5f(0xf1)+_0x118a09+'\x22',{'stdio':_0x156a3d[_0x293d5f(0xe3)]}),_0xdfd63c;}function getTraceDirectory(_0xb2c54c){const _0x3b6ac5=_0x5230,_0x16872b={'cPFxS':function(_0x2df56c,_0x2c81c0,_0x285b50,_0x52070f,_0x330f20){return _0x2df56c(_0x2c81c0,_0x285b50,_0x52070f,_0x330f20);},'FSwTj':_0x3b6ac5(0x80)};return _0x16872b[_0x3b6ac5(0x93)](join,process[_0x3b6ac5(0x91)](),_0x3b6ac5(0xfe),_0x16872b[_0x3b6ac5(0xc9)],_0xb2c54c);}function getConversationFilePath(_0x406de8){const _0xd00c31=_0x5230,_0x192327={'cuOPG':function(_0x4c058f){return _0x4c058f();}};return join(_0x192327['cuOPG'](tmpdir),_0xd00c31(0xb5),_0x406de8,_0xd00c31(0x9d));}export async function verifyInBrowser(_0x40d48c,_0x106460){const _0x3c0771=_0x5230,_0x4ef637={'sFSmG':function(_0x45c06b,_0x3fb42e){return _0x45c06b(_0x3fb42e);},'ObXig':'uRJuX','McuCv':_0x3c0771(0x105),'uiTaw':function(_0x2a9937,_0x2e1ff0,_0x308b96){return _0x2a9937(_0x2e1ff0,_0x308b96);},'vSrgm':function(_0x14360e,_0x3d4b99){return _0x14360e===_0x3d4b99;},'yBABN':'success','MdKOF':function(_0x1f089e,_0x14b0dd){return _0x1f089e!==_0x14b0dd;},'hGGYZ':'Unknown\x20error','jsDlE':function(_0x290a6b,_0x515b02){return _0x290a6b+_0x515b02;},'NKhZC':function(_0x250699,_0x4c2f33,_0x166133,_0x4a8715){return _0x250699(_0x4c2f33,_0x166133,_0x4a8715);},'lhQDu':_0x3c0771(0xdd),'VGSag':'result','PDflm':function(_0x550e39,_0x1bbf42){return _0x550e39!==_0x1bbf42;},'JBwzo':_0x3c0771(0x95),'JFdZP':_0x3c0771(0x8f),'besKZ':_0x3c0771(0xd1),'NBwCg':function(_0x36b679,_0x23a699,_0x32dc4d,_0x3343c5,_0x4ada7b){return _0x36b679(_0x23a699,_0x32dc4d,_0x3343c5,_0x4ada7b);},'gZoyl':_0x3c0771(0xfe),'pyPAo':_0x3c0771(0x80),'hEaOl':_0x3c0771(0xd0),'mxWzw':function(_0x5d0a7a,_0x202323){return _0x5d0a7a(_0x202323);},'eDZcL':'AOxvE','fMSoj':function(_0x40a2f4,_0xa28042){return _0x40a2f4(_0xa28042);},'Vgbbn':function(_0x555c30){return _0x555c30();},'avgkm':function(_0x121882,_0x2abdd9,_0x44dd02,_0x5b545d){return _0x121882(_0x2abdd9,_0x44dd02,_0x5b545d);},'sxSbi':_0x3c0771(0x103),'tIXzu':_0x3c0771(0x104),'chVHb':_0x3c0771(0xc2),'YQYEB':_0x3c0771(0xc3),'FVFsE':_0x3c0771(0x7e),'EsZDw':_0x3c0771(0xff),'AGeas':_0x3c0771(0xa5),'FAUAm':_0x3c0771(0xb8),'ImekH':'MINOR','tBsVl':_0x3c0771(0xed),'xUUTH':_0x3c0771(0xee),'NBAxd':function(_0x22f6df,_0x1b22db){return _0x22f6df(_0x1b22db);},'ZoVsk':_0x3c0771(0xc8),'MkIId':_0x3c0771(0xa8),'awDiJ':_0x3c0771(0xbb),'sZtjH':function(_0x4e0b0c,_0x5916f9){return _0x4e0b0c(_0x5916f9);},'iSxJv':function(_0x1fea40,_0x58948f){return _0x1fea40*_0x58948f;},'JNhkj':_0x3c0771(0x7b),'DaFBT':_0x3c0771(0xb0),'xgZHp':function(_0x45db3d,_0x4ec45b){return _0x45db3d instanceof _0x4ec45b;},'WdsZv':function(_0x5ecc6f,_0x3a9219){return _0x5ecc6f(_0x3a9219);},'UEIkh':function(_0x3ef922,_0x1b0d86){return _0x3ef922-_0x1b0d86;},'LReOr':function(_0x21bcee,_0x39123e){return _0x21bcee(_0x39123e);},'XTBRo':function(_0x3e8cd4,_0xb73d1b){return _0x3e8cd4(_0xb73d1b);},'AHkyg':function(_0x590032,_0x28a85b){return _0x590032>_0x28a85b;},'kpyMX':_0x3c0771(0xaf),'wgKkI':_0x3c0771(0x98),'STEXz':function(_0x3af6be,_0x48e9ca,_0x475dd6){return _0x3af6be(_0x48e9ca,_0x475dd6);},'liEtT':'ejpnR','gKsqT':function(_0x186b12,_0x191e06){return _0x186b12!==_0x191e06;},'ahhdg':_0x3c0771(0x99),'FVBlB':function(_0x375fac,_0x20fab9){return _0x375fac(_0x20fab9);},'aWCVF':function(_0x1f30b5,_0x3f2e2a,_0x1668e7){return _0x1f30b5(_0x3f2e2a,_0x1668e7);},'YIvwJ':function(_0x5d5895,_0x268dd9,_0x5a11c1){return _0x5d5895(_0x268dd9,_0x5a11c1);},'YBdAb':_0x3c0771(0x84),'FXhen':_0x3c0771(0xe6),'OjoIv':function(_0xec573a,_0xa70e44){return _0xec573a(_0xa70e44);},'XkVay':function(_0x2e27b5,_0x15adb6){return _0x2e27b5!==_0x15adb6;},'isBUO':'xijYp','WOacP':function(_0x4a1df6,_0xb857aa){return _0x4a1df6(_0xb857aa);},'UFVmO':function(_0x3ebefb,_0x7ea468){return _0x3ebefb&&_0x7ea468;},'cOjlu':_0x3c0771(0xa7),'ZyLDn':_0x3c0771(0x108),'UEgZk':'No\x20result\x20received\x20from\x20agent','SRHXX':_0x3c0771(0xc7),'UlmNg':function(_0x314b78,_0x3354c7){return _0x314b78(_0x3354c7);}},_0x28bba4=join(process[_0x3c0771(0x91)](),_0x4ef637[_0x3c0771(0x8a)],_0x4ef637['hEaOl']);if(!_0x4ef637[_0x3c0771(0xa0)](existsSync,_0x28bba4))throw new Error(_0x4ef637[_0x3c0771(0xe4)]);const _0x35d81c=await readFile(_0x28bba4,_0x4ef637[_0x3c0771(0xdf)])[_0x3c0771(0xe1)](_0x25c546=>_0x25c546[_0x3c0771(0xa6)]()),_0x594c3e=join(process[_0x3c0771(0x91)](),_0x4ef637[_0x3c0771(0x8a)],_0x35d81c);if(!existsSync(_0x594c3e)){if(_0x4ef637[_0x3c0771(0xb9)](_0x4ef637[_0x3c0771(0xd5)],_0x3c0771(0x100)))throw new Error(_0x3c0771(0x102)+_0x594c3e+_0x3c0771(0xf9)+_0x35d81c);else throw new _0x1e7ea9('Environment\x20not\x20found\x20at\x20'+_0x2a3a86+_0x3c0771(0xf9)+_0x100446);}const _0x1f454a=await _0x4ef637[_0x3c0771(0xd2)](loadSettings,_0x35d81c),_0x3eabd9=resolveEnvVars(_0x1f454a),_0x3ce62b=await _0x4ef637[_0x3c0771(0xba)](getToken);if(!_0x3ce62b)throw new Error(_0x4ef637['JFdZP']);const _0x29f426=await createBrowserSession({'environmentName':_0x35d81c,'settings':_0x3eabd9,'task':_0x106460,'url':_0x40d48c});console['log']('Browser\x20session\x20created:\x20'+_0x29f426['id']);const _0x117bcd=await _0x4ef637[_0x3c0771(0xbc)](buildPlaywrightConfig,_0x3eabd9,_0x35d81c,_0x29f426?.['id']),_0x491481={'command':_0x4ef637[_0x3c0771(0x9b)],'args':['@ranger-testing/playwright','run-mcp-server',_0x4ef637[_0x3c0771(0xf3)],_0x117bcd[_0x3c0771(0xbe)]]},_0x4076e6=Date[_0x3c0771(0xb3)](),_0x2d911c='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'+_0x106460+_0x3c0771(0xe8)+_0x40d48c,_0x224ff4={'type':_0x3c0771(0xff),'properties':{'success':{'type':_0x4ef637[_0x3c0771(0xfc)]},'summary':{'type':_0x4ef637['YQYEB']},'issues':{'type':_0x4ef637[_0x3c0771(0xf0)],'items':{'type':_0x4ef637[_0x3c0771(0xa2)],'properties':{'severity':{'type':'string','enum':[_0x4ef637[_0x3c0771(0xbf)],_0x4ef637[_0x3c0771(0x7f)],_0x4ef637[_0x3c0771(0x92)]]},'description':{'type':_0x4ef637[_0x3c0771(0xec)]},'screenshot':{'type':'string'}},'required':[_0x4ef637['tBsVl'],_0x3c0771(0xeb)]}},'screenshots':{'type':_0x4ef637[_0x3c0771(0xf0)],'items':{'type':_0x3c0771(0xc3)}}},'required':[_0x4ef637[_0x3c0771(0xcf)],_0x4ef637[_0x3c0771(0xad)]]},_0x10c306=_0x4ef637[_0x3c0771(0xea)](query,{'prompt':_0x2d911c,'options':{'cwd':process[_0x3c0771(0x91)](),'model':_0x4ef637[_0x3c0771(0xd3)],'mcpServers':{'ranger-browser':_0x491481},'tools':[_0x4ef637[_0x3c0771(0xfd)]],'permissionMode':'bypassPermissions','allowDangerouslySkipPermissions':!![],'outputFormat':{'type':_0x4ef637[_0x3c0771(0xe7)],'schema':_0x224ff4},'maxTurns':0x14}});let _0x3494fe=null,_0x13ccc8=null;const _0x5d0c25=_0x4ef637[_0x3c0771(0xc6)](getConversationFilePath,_0x29f426['id']),_0x508a01=_0x4ef637['sZtjH'](dirname,_0x5d0c25);await _0x4ef637['uiTaw'](mkdir,_0x508a01,{'recursive':!![]});const _0x5de8d0=_0x4ef637[_0x3c0771(0x87)](0x3b,0x3c)*0x3e8,_0x64dade=new Promise((_0x44cb9c,_0x18fbb9)=>{const _0x46299b=_0x3c0771,_0x2490c2={'FvTar':function(_0x49d0d5,_0x2ea915){const _0x2e2be7=_0x5230;return _0x4ef637[_0x2e2be7(0xc6)](_0x49d0d5,_0x2ea915);}};_0x4ef637[_0x46299b(0xf5)]===_0x4ef637['McuCv']?_0x5bd21a=_0x3c7e07[_0x46299b(0xd6)]?.[_0x46299b(0xc5)](',\x20')||'Unknown\x20error':_0x4ef637[_0x46299b(0xaa)](setTimeout,()=>{const _0x10301b=_0x46299b;_0x2490c2[_0x10301b(0x8e)](_0x18fbb9,new Error(_0x10301b(0x95)));},_0x5de8d0);});try{try{if(_0x4ef637['JNhkj']!==_0x4ef637[_0x3c0771(0xde)]){if(_0x4ef637[_0x3c0771(0xfb)](_0xfd626d[_0x3c0771(0x88)],_0x4ef637['yBABN'])&&_0x49e164[_0x3c0771(0xb2)])_0x1bc973=_0xf3d80b['structured_output'];else _0x4ef637[_0x3c0771(0xb9)](_0x295219[_0x3c0771(0x88)],_0x4ef637[_0x3c0771(0xcf)])&&(_0x5a6d19=_0x467815[_0x3c0771(0xd6)]?.[_0x3c0771(0xc5)](',\x20')||_0x4ef637[_0x3c0771(0x85)]);}else await Promise[_0x3c0771(0xf8)]([((async()=>{const _0xcf3b33=_0x3c0771;for await(const _0x33576d of _0x10c306){try{const _0x1591e8=_0x4ef637['jsDlE'](JSON['stringify'](_0x33576d),'\x0a');await _0x4ef637['NKhZC'](appendFile,_0x5d0c25,_0x1591e8,_0x4ef637[_0xcf3b33(0xdf)]);}catch{}if(_0x33576d['type']===_0x4ef637['VGSag']){if(_0x4ef637[_0xcf3b33(0xfb)](_0x33576d[_0xcf3b33(0x88)],_0xcf3b33(0x7c))&&_0x33576d['structured_output'])_0x3494fe=_0x33576d[_0xcf3b33(0xb2)];else _0x4ef637[_0xcf3b33(0x94)](_0x33576d[_0xcf3b33(0x88)],_0x4ef637['yBABN'])&&(_0x13ccc8=_0x33576d[_0xcf3b33(0xd6)]?.[_0xcf3b33(0xc5)](',\x20')||_0x4ef637[_0xcf3b33(0x85)]);}}})()),_0x64dade]);}catch(_0x36988e){if(_0x4ef637['DaFBT']===_0x3c0771(0xe2)){const _0x24eb12={'ibUlI':function(_0x1c2838,_0x8adc4f){return _0x1c2838(_0x8adc4f);}};_0x4ce568(()=>{_0x24eb12['ibUlI'](_0x1568a9,new _0x11967a('Agent\x20execution\x20timed\x20out\x20after\x2059\x20minutes'));},_0x44bd47);}else _0x13ccc8=_0x4ef637[_0x3c0771(0x109)](_0x36988e,Error)?_0x36988e[_0x3c0771(0x101)]:_0x4ef637[_0x3c0771(0xcb)](String,_0x36988e);}const _0x15d8f9=_0x4ef637['UEIkh'](Date[_0x3c0771(0xb3)](),_0x4076e6);try{const _0xbe1f05=_0x4ef637[_0x3c0771(0x82)](getTraceDirectory,_0x29f426['id']);if(_0x4ef637[_0x3c0771(0x107)](existsSync,_0xbe1f05)){const _0x1cd31f=await _0x4ef637[_0x3c0771(0x96)](readdir,_0xbe1f05);if(_0x4ef637[_0x3c0771(0xf4)](_0x1cd31f[_0x3c0771(0xc1)],0x0)){if(_0x4ef637['MdKOF'](_0x4ef637['kpyMX'],_0x4ef637['wgKkI'])){const _0x452174=await _0x4ef637[_0x3c0771(0xa0)](zipDirectory,_0xbe1f05);await _0x4ef637[_0x3c0771(0xb7)](uploadTrace,_0x29f426['traceUploadUrl'],_0x452174);}else _0x4ef637[_0x3c0771(0xc6)](_0x3a133d,new _0x382125(_0x4ef637['JBwzo']));}}if(_0x4ef637[_0x3c0771(0x107)](existsSync,_0x5d0c25)){if(_0x4ef637[_0x3c0771(0xfb)](_0x4ef637['liEtT'],_0x4ef637[_0x3c0771(0x106)]))try{if(_0x4ef637[_0x3c0771(0x8d)](_0x4ef637[_0x3c0771(0xac)],_0x3c0771(0x9c))){const _0xc014be=await _0x4ef637[_0x3c0771(0x86)](readFile,_0x5d0c25);await _0x4ef637[_0x3c0771(0xb1)](uploadConversation,_0x29f426[_0x3c0771(0x89)],_0xc014be);const _0x54f0c1=dirname(_0x5d0c25);await _0x4ef637['YIvwJ'](rm,_0x54f0c1,{'recursive':!![],'force':!![]});}else throw new _0x1d64ab(_0x4ef637[_0x3c0771(0xda)]);}catch{}else throw new _0x3e83a6('Verification\x20failed:\x20'+_0x13db45);}const _0x464a41=_0x3494fe,_0xbbc25f={'status':_0x13ccc8?_0x4ef637[_0x3c0771(0xa4)]:_0x4ef637[_0x3c0771(0xd8)],'durationMs':_0x15d8f9,'agentResponse':_0x464a41?.[_0x3c0771(0xee)]||_0x13ccc8||undefined,'errorMessage':_0x13ccc8||undefined},_0x2265a9=await updateBrowserSession(_0x29f426['id'],_0xbbc25f),_0x4194bb=_0x4ef637[_0x3c0771(0xdb)](buildTraceViewerUrl,_0x2265a9['traceUrl']);if(_0x464a41){if(_0x4ef637[_0x3c0771(0xc4)](_0x4ef637[_0x3c0771(0x81)],_0x3c0771(0xca)))throw new _0x2311d9(_0x4ef637[_0x3c0771(0xe4)]);else _0x464a41[_0x3c0771(0x9e)]=_0x4194bb,_0x464a41[_0x3c0771(0x90)]=_0x29f426['id'],_0x464a41[_0x3c0771(0xc0)]=_0x4ef637[_0x3c0771(0xe0)](getTraceDirectory,_0x29f426['id']),_0x464a41[_0x3c0771(0x9f)]=_0x15d8f9,_0x464a41[_0x3c0771(0xbd)]=_0x106460,_0x464a41['url']=_0x40d48c;}}catch{}if(_0x4ef637[_0x3c0771(0xce)](_0x13ccc8,!_0x3494fe)){if(_0x4ef637[_0x3c0771(0xb9)](_0x4ef637[_0x3c0771(0xae)],_0x4ef637[_0x3c0771(0xae)]))_0x36304e=_0x513fd2[_0x3c0771(0xb2)];else throw new Error('Verification\x20failed:\x20'+_0x13ccc8);}if(!_0x3494fe){if('mRwnq'!==_0x4ef637['ZyLDn'])throw new Error(_0x4ef637[_0x3c0771(0xf2)]);else{const _0x33ef6c=_0x2d3131[_0x3c0771(0xe9)](_0x1a018c,arguments);return _0x58ca4f=null,_0x33ef6c;}}return _0x3494fe;}finally{if(_0x4ef637['XkVay'](_0x4ef637[_0x3c0771(0xa1)],_0x4ef637[_0x3c0771(0xa1)]))return _0x4ef637[_0x3c0771(0xb4)](_0xf2a08c,_0x3d2eeb[_0x3c0771(0x91)](),_0x4ef637[_0x3c0771(0x8a)],_0x4ef637[_0x3c0771(0x8b)],_0x8c7f11);else await _0x4ef637['UlmNg'](cleanupTempFiles,_0x117bcd);}}function _0x4913(){const _0x32ae51=['yxzNA20','DgfZAW','y29UzMLNugf0Aa','quDLyxm','C2vZC2LVBKrPCG','BgvUz3rO','yM9VBgvHBG','C3rYAw5N','wgTwyxK','AM9PBG','C0ztBuC','DxvHA1e','y2XHDwrLlw9WDxmTnc01','rLn3vgO','EgLQwxa','v2rZwNy','mZi4nJC2nen0whDJuW','C2vHCMnO','vuzwBu8','EujbqK4','ywn0AxzLlwvUDI50Ehq','tM8Gywn0AxzLigvUDMLYB25Tzw50lIbsDw46ihjHBMDLCIb1C2uGpgvUDI1Uyw1LpG','zK1tB2O','wM9wC2S','mJaWndi5n3nsExryDa','zurAy0W','zxjYB3jZ','iIaMjIb6AxaGlxiGiG','rLHOzw4','iIaU','sKzKwLa','t2PVsxy','CK5Pt20','DxrMltG','sK5OA2O','BgHrrhu','v09Hy1a','DgHLBG','rgnfq2W','veLQvhi','yMvZs1O','y29UC3rYDwn0B3i','y29TCgXLDgvK','yxDeAuO','cLvstdOG','yxbWBhK','tKjbEgq','zgvZy3jPChrPB24','wvfzrui','C2v2zxjPDhK','C3vTBwfYEq','wMvhrLq','rLzgC0u','CM0GiG','vuvNwMS','DeLyENu','quHREwC','t2jyAwC','mJCYnJe4rNLwt0nL','nhjgAezIzW','CMfJzq','lIbsDw46ihjHBMDLCIbHzgqGzw52ia','mtu3oti2CgzVAxjf','DLnYz20','y2Hwsgi','twTjswq','lNjHBMDLCG','B2jQzwn0','y0v0s1O','BwvZC2fNzq','rw52AxjVBM1LBNqGBM90igzVDw5Kigf0ia','BNb4','ls1JB25MAwC','v1LoCLC','BgLfDfq','wfrcuM8','CNbiwva','EgDAsha','D2POEfq','C3vJy2vZCW','mJa1ntiWmdbnve95v00','yxjYyxK','rKfvqw0','C2vZC2LVBNm','Axncvu8','tfjLt3i','nde3odKWouz0u0jIwq','zMfPBgvK','AeDhwvO','rLzcBei','Avn4sNy','C3vIDhLWzq','y29UDMvYC2f0Aw9UvxbSB2fKvxjS','z1PVEwW','ChLqqw8','ndv1qu11ze4','z0TZCvq','rNzuyxi','tM8GqvbjihrVA2vUignVBMzPz3vYzwqUifj1BJOGCMfUz2vYihn0yxj0idX0B2TLBJ4','C2vZC2LVBKLK','y3DK','sw1LA0G','y1bgEfm','uerMBg0','qwDLBNqGzxHLy3v0Aw9UihrPBwvKig91DcbHzNrLCIa1osbTAw51DgvZ','C1P0AKG','Dg9tDhjPBMC','sg54suu','B1vjBK0','DhjHy2uTDxbSB2fKlNPPCa','C3HtyMK','sLjxvfy','y29UDMvYC2f0Aw9UlMPZB25S','DhjHy2vwAwv3zxjvCMW','zhvYyxrPB25nCW','BxHxENC','u1jiwfG','rxnArhC','Be5Lzxm','wujKqwi','qKXpq0TfuG','DhjPBq','Aujnwhu','BwnWx19Yyw5NzxiTyNjVD3nLCL9FkG','oe9xuNPmAa','DwLuyxC','mZK3mty4yMLttvHN','ywHOzgC','EfvvveG','y09QBhu','tevszM8','v3rRBha','yvDdvKy','C3rYDwn0DxjLzf9VDxrWDxq','BM93','tKj3q2C','CMfUz2vYlwjYB3DZzxiTC2vZC2LVBNm','ueHjvvi','u1rfwhO','tufkt1i','twrlt0y','vMDIyM4','ANnVBL9Zy2HLBwe'];_0x4913=function(){return _0x32ae51;};return _0x4913();}
|
|
@@ -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)
|