@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.
Files changed (48) hide show
  1. package/README.md +281 -0
  2. package/build/cli.js +168 -1
  3. package/build/cli.js.map +1 -0
  4. package/build/commands/addEnv.js +1 -103
  5. package/build/commands/addEnv.js.map +1 -0
  6. package/build/commands/authEncrypt.js +40 -0
  7. package/build/commands/authEncrypt.js.map +1 -0
  8. package/build/commands/clean.js +1 -0
  9. package/build/commands/clean.js.map +1 -0
  10. package/build/commands/config.js +100 -0
  11. package/build/commands/config.js.map +1 -0
  12. package/build/commands/dataMcpServer.js +1 -0
  13. package/build/commands/dataMcpServer.js.map +1 -0
  14. package/build/commands/index.js +6 -0
  15. package/build/commands/index.js.map +1 -0
  16. package/build/commands/skillup.js +112 -0
  17. package/build/commands/skillup.js.map +1 -0
  18. package/build/commands/start.js +1 -72
  19. package/build/commands/start.js.map +1 -0
  20. package/build/commands/status.js +221 -0
  21. package/build/commands/status.js.map +1 -0
  22. package/build/commands/update.js +127 -0
  23. package/build/commands/update.js.map +1 -0
  24. package/build/commands/updateEnv.js +1 -59
  25. package/build/commands/updateEnv.js.map +1 -0
  26. package/build/commands/useEnv.js +1 -28
  27. package/build/commands/useEnv.js.map +1 -0
  28. package/build/commands/utils/browserSessionsApi.js +1 -0
  29. package/build/commands/utils/browserSessionsApi.js.map +1 -0
  30. package/build/commands/utils/crypto.js +42 -0
  31. package/build/commands/utils/crypto.js.map +1 -0
  32. package/build/commands/utils/keychain.js +1 -0
  33. package/build/commands/utils/keychain.js.map +1 -0
  34. package/build/commands/utils/localAgentInstallationsApi.js +1 -0
  35. package/build/commands/utils/localAgentInstallationsApi.js.map +1 -0
  36. package/build/commands/utils/mcpConfig.js +1 -47
  37. package/build/commands/utils/mcpConfig.js.map +1 -0
  38. package/build/commands/utils/reportGenerator.js +130 -0
  39. package/build/commands/utils/reportGenerator.js.map +1 -0
  40. package/build/commands/utils/settings.js +246 -0
  41. package/build/commands/utils/settings.js.map +1 -0
  42. package/build/commands/utils/skills.js +1 -0
  43. package/build/commands/utils/skills.js.map +1 -0
  44. package/build/commands/verifyInBrowser.js +1 -0
  45. package/build/commands/verifyInBrowser.js.map +1 -0
  46. package/build/skills/bug-bash.md +313 -0
  47. package/build/skills/e2e-test-recommender.md +173 -0
  48. package/package.json +7 -4
@@ -0,0 +1,246 @@
1
+ import { readFile, writeFile, mkdir, unlink } from 'fs/promises';
2
+ import { join, dirname } from 'path';
3
+ import { existsSync } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { randomUUID } from 'crypto';
6
+ import { decrypt } from './crypto.js';
7
+ import { getToken } from './keychain.js';
8
+ /**
9
+ * Clean up temporary files created during config building
10
+ * Ignores ENOENT errors (file already deleted)
11
+ */
12
+ export async function cleanupTempFiles(result) {
13
+ const filesToClean = [result.tempAuthPath, result.configPath].filter(Boolean);
14
+ await Promise.all(filesToClean.map((filePath) => unlink(filePath).catch((err) => {
15
+ // Ignore ENOENT (file doesn't exist), re-throw others
16
+ if (err.code !== 'ENOENT') {
17
+ console.warn(`Failed to clean up temp file ${filePath}:`, err.message);
18
+ }
19
+ })));
20
+ }
21
+ /**
22
+ * Get the path to the settings.json file for an environment
23
+ */
24
+ export function getSettingsPath(env) {
25
+ return join(process.cwd(), '.ranger', env, 'settings.json');
26
+ }
27
+ /**
28
+ * Load settings.json for an environment
29
+ */
30
+ export async function loadSettings(env) {
31
+ const settingsPath = getSettingsPath(env);
32
+ if (!existsSync(settingsPath)) {
33
+ return {};
34
+ }
35
+ try {
36
+ const content = await readFile(settingsPath, 'utf-8');
37
+ return JSON.parse(content);
38
+ }
39
+ catch {
40
+ return {};
41
+ }
42
+ }
43
+ /**
44
+ * Save settings.json for an environment
45
+ */
46
+ export async function saveSettings(env, settings) {
47
+ const settingsPath = getSettingsPath(env);
48
+ const envDir = dirname(settingsPath);
49
+ if (!existsSync(envDir)) {
50
+ await mkdir(envDir, { recursive: true });
51
+ }
52
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2));
53
+ }
54
+ /**
55
+ * Replace ${VAR_NAME} patterns with environment variable values
56
+ */
57
+ export function resolveEnvVars(obj) {
58
+ if (typeof obj === 'string') {
59
+ return obj.replace(/\$\{(\w+)\}/g, (_, varName) => {
60
+ const value = process.env[varName];
61
+ if (value === undefined) {
62
+ throw new Error(`Environment variable ${varName} is not set`);
63
+ }
64
+ return value;
65
+ });
66
+ }
67
+ if (Array.isArray(obj)) {
68
+ return obj.map(resolveEnvVars);
69
+ }
70
+ if (obj && typeof obj === 'object') {
71
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, resolveEnvVars(v)]));
72
+ }
73
+ return obj;
74
+ }
75
+ /**
76
+ * Build a full Playwright config from settings and write it to a temp file
77
+ * Returns paths to created temp files that should be cleaned up after use
78
+ */
79
+ export async function buildPlaywrightConfig(settings, env, sessionId) {
80
+ const envDir = join(process.cwd(), '.ranger', env);
81
+ // Auto-detect auth file (encrypted takes priority)
82
+ const encryptedAuthPath = join(envDir, 'auth.json.enc');
83
+ const plaintextAuthPath = join(envDir, 'auth.json');
84
+ let storageStatePath;
85
+ let tempAuthPath;
86
+ if (existsSync(encryptedAuthPath)) {
87
+ // Decrypt to temp file
88
+ try {
89
+ const token = process.env.RANGER_API_TOKEN || (await getToken());
90
+ if (!token) {
91
+ throw new Error('No API token found. Set RANGER_API_TOKEN env var or run ranger start <token>');
92
+ }
93
+ const encrypted = await readFile(encryptedAuthPath);
94
+ const decrypted = decrypt(encrypted, token);
95
+ tempAuthPath = join(tmpdir(), `ranger-auth-${Date.now()}.json`);
96
+ await writeFile(tempAuthPath, decrypted);
97
+ storageStatePath = tempAuthPath;
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : String(error);
101
+ throw new Error(`Failed to decrypt auth state: ${message}`);
102
+ }
103
+ }
104
+ else if (existsSync(plaintextAuthPath)) {
105
+ // Use plaintext for local dev (not a temp file, don't track for cleanup)
106
+ storageStatePath = plaintextAuthPath;
107
+ }
108
+ // Build the full Playwright config
109
+ const effectiveSessionId = sessionId || randomUUID();
110
+ const outputDir = join(process.cwd(), '.ranger', 'sessions', effectiveSessionId);
111
+ const config = {
112
+ name: env,
113
+ browser: {
114
+ isolated: true,
115
+ browserName: 'chromium',
116
+ launchOptions: {
117
+ headless: settings.headless ?? false,
118
+ },
119
+ contextOptions: {
120
+ permissions: ['clipboard-read', 'clipboard-write'],
121
+ userAgent: settings.userAgent || undefined,
122
+ extraHTTPHeaders: settings.headers || {},
123
+ storageState: storageStatePath,
124
+ },
125
+ },
126
+ capabilities: ['core', 'tabs', 'install', 'pdf', 'vision'],
127
+ imageResponses: 'allow',
128
+ saveTrace: true,
129
+ saveVideo: { width: 1280, height: 720 },
130
+ outputDir,
131
+ };
132
+ // Clean up undefined values from contextOptions
133
+ const contextOptions = config.browser;
134
+ const ctxOpts = contextOptions
135
+ .contextOptions;
136
+ if (ctxOpts.userAgent === undefined)
137
+ delete ctxOpts.userAgent;
138
+ if (ctxOpts.storageState === undefined)
139
+ delete ctxOpts.storageState;
140
+ // Write to temp file
141
+ const tempDir = join(tmpdir(), 'ranger-config');
142
+ if (!existsSync(tempDir)) {
143
+ await mkdir(tempDir, { recursive: true });
144
+ }
145
+ const tempConfigPath = join(tempDir, `${env}-${Date.now()}.json`);
146
+ await writeFile(tempConfigPath, JSON.stringify(config, null, 2));
147
+ return {
148
+ configPath: tempConfigPath,
149
+ tempAuthPath,
150
+ };
151
+ }
152
+ /**
153
+ * Get a nested value from an object using dot notation
154
+ * e.g., getNestedValue({ headers: { "X-Test": "1" } }, "headers.X-Test") => "1"
155
+ */
156
+ export function getNestedValue(obj, key) {
157
+ const parts = parseKeyPath(key);
158
+ let current = obj;
159
+ for (const part of parts) {
160
+ if (current === null ||
161
+ current === undefined ||
162
+ typeof current !== 'object') {
163
+ return undefined;
164
+ }
165
+ current = current[part];
166
+ }
167
+ return current;
168
+ }
169
+ /**
170
+ * Set a nested value in an object using dot notation
171
+ * e.g., setNestedValue({}, "headers.X-Test", "1") => { headers: { "X-Test": "1" } }
172
+ */
173
+ export function setNestedValue(obj, key, value) {
174
+ const parts = parseKeyPath(key);
175
+ let current = obj;
176
+ for (let i = 0; i < parts.length - 1; i++) {
177
+ const part = parts[i];
178
+ if (!(part in current) || typeof current[part] !== 'object') {
179
+ current[part] = {};
180
+ }
181
+ current = current[part];
182
+ }
183
+ current[parts[parts.length - 1]] = value;
184
+ }
185
+ /**
186
+ * Delete a nested value from an object using dot notation
187
+ * e.g., deleteNestedValue({ headers: { "X-Test": "1" } }, "headers.X-Test")
188
+ */
189
+ export function deleteNestedValue(obj, key) {
190
+ const parts = parseKeyPath(key);
191
+ let current = obj;
192
+ for (let i = 0; i < parts.length - 1; i++) {
193
+ if (current === null ||
194
+ current === undefined ||
195
+ typeof current !== 'object') {
196
+ return false;
197
+ }
198
+ current = current[parts[i]];
199
+ }
200
+ if (current === null ||
201
+ current === undefined ||
202
+ typeof current !== 'object') {
203
+ return false;
204
+ }
205
+ const lastPart = parts[parts.length - 1];
206
+ if (lastPart in current) {
207
+ delete current[lastPart];
208
+ return true;
209
+ }
210
+ return false;
211
+ }
212
+ /**
213
+ * Parse a key path, handling dot notation
214
+ * "header.X-Test-Mode" => ["header", "X-Test-Mode"]
215
+ * Special case: "header.X-Test" becomes ["headers", "X-Test"]
216
+ */
217
+ function parseKeyPath(key) {
218
+ const parts = key.split('.');
219
+ // Handle "header.X-Key" => "headers.X-Key"
220
+ if (parts[0] === 'header') {
221
+ parts[0] = 'headers';
222
+ }
223
+ return parts;
224
+ }
225
+ /**
226
+ * Format settings for display
227
+ */
228
+ export function formatSettings(settings, indent = 0) {
229
+ const lines = [];
230
+ const prefix = ' '.repeat(indent);
231
+ for (const [key, value] of Object.entries(settings)) {
232
+ if (value === undefined)
233
+ continue;
234
+ if (typeof value === 'object' && value !== null) {
235
+ lines.push(`${prefix}${key}:`);
236
+ for (const [subKey, subValue] of Object.entries(value)) {
237
+ lines.push(`${prefix} ${subKey}: ${subValue}`);
238
+ }
239
+ }
240
+ else {
241
+ lines.push(`${prefix}${key}: ${value}`);
242
+ }
243
+ }
244
+ return lines.join('\n');
245
+ }
246
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/commands/utils/settings.ts"],"names":[],"mappings":"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)