whisker-ux 0.1.0

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/dist/report.js ADDED
@@ -0,0 +1,144 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ export async function writeReport(report, sessionLog, outputDir) {
4
+ // Ensure output directories exist
5
+ const screenshotDir = path.join(outputDir, "screenshots");
6
+ // Clear existing screenshots from previous runs
7
+ if (fs.existsSync(screenshotDir)) {
8
+ const existingFiles = fs.readdirSync(screenshotDir);
9
+ for (const file of existingFiles) {
10
+ if (file.endsWith(".png")) {
11
+ fs.unlinkSync(path.join(screenshotDir, file));
12
+ }
13
+ }
14
+ }
15
+ fs.mkdirSync(screenshotDir, { recursive: true });
16
+ // Write report.json
17
+ const jsonPath = path.join(outputDir, "report.json");
18
+ fs.writeFileSync(jsonPath, JSON.stringify(report, null, 2));
19
+ // Write screenshots
20
+ for (const step of sessionLog.steps) {
21
+ const filename = `step-${String(step.stepNumber).padStart(3, "0")}.png`;
22
+ const filepath = path.join(screenshotDir, filename);
23
+ fs.writeFileSync(filepath, Buffer.from(step.screenshotBase64, "base64"));
24
+ }
25
+ // Generate and write report.md
26
+ const markdown = generateMarkdown(report, outputDir);
27
+ const markdownPath = path.join(outputDir, "report.md");
28
+ fs.writeFileSync(markdownPath, markdown);
29
+ return { markdownPath, jsonPath, screenshotDir };
30
+ }
31
+ function generateMarkdown(report, outputDir) {
32
+ const lines = [];
33
+ lines.push("# Whisker Usability Test Report");
34
+ lines.push("");
35
+ lines.push(`**Task:** ${report.metadata.task}`);
36
+ lines.push(`**URL:** ${report.metadata.url}`);
37
+ if (report.metadata.persona) {
38
+ lines.push(`**Persona:** ${report.metadata.persona}`);
39
+ }
40
+ lines.push(`**Date:** ${report.metadata.timestamp}`);
41
+ lines.push(`**Duration:** ${(report.metadata.duration / 1000).toFixed(1)} seconds`);
42
+ lines.push(`**Steps taken:** ${report.metadata.totalSteps}`);
43
+ lines.push(`**Task completed:** ${report.taskCompleted ? "Yes" : "No"}`);
44
+ lines.push("");
45
+ lines.push("## Summary");
46
+ lines.push("");
47
+ lines.push(report.summary);
48
+ lines.push("");
49
+ if (report.taskCompletionNotes) {
50
+ lines.push("## Task Completion");
51
+ lines.push("");
52
+ lines.push(report.taskCompletionNotes);
53
+ lines.push("");
54
+ }
55
+ // Group findings by severity
56
+ const bySeverity = {
57
+ critical: report.findings.filter((f) => f.severity === "critical"),
58
+ major: report.findings.filter((f) => f.severity === "major"),
59
+ minor: report.findings.filter((f) => f.severity === "minor"),
60
+ suggestion: report.findings.filter((f) => f.severity === "suggestion"),
61
+ };
62
+ const totalFindings = report.findings.length;
63
+ lines.push(`## Findings (${totalFindings} total)`);
64
+ lines.push("");
65
+ if (totalFindings === 0) {
66
+ lines.push("No issues found during this test session.");
67
+ lines.push("");
68
+ }
69
+ for (const [severity, findings] of Object.entries(bySeverity)) {
70
+ if (findings.length === 0)
71
+ continue;
72
+ const severityLabel = {
73
+ critical: "🔴 P0 Critical",
74
+ major: "🟠 P1 Major",
75
+ minor: "🟡 P2 Minor",
76
+ suggestion: "💡 P3 Suggestion",
77
+ }[severity];
78
+ lines.push(`### ${severityLabel} (${findings.length})`);
79
+ lines.push("");
80
+ for (const finding of findings) {
81
+ lines.push(`#### ${finding.id}: ${finding.title}`);
82
+ lines.push("");
83
+ lines.push(`**Category:** ${finding.category}`);
84
+ lines.push("");
85
+ lines.push(finding.description);
86
+ lines.push("");
87
+ if (finding.stepsToReproduce && finding.stepsToReproduce.length > 0) {
88
+ lines.push("**Steps to reproduce:**");
89
+ for (let i = 0; i < finding.stepsToReproduce.length; i++) {
90
+ lines.push(`${i + 1}. ${finding.stepsToReproduce[i]}`);
91
+ }
92
+ lines.push("");
93
+ }
94
+ if (finding.screenshotStepNumber) {
95
+ const screenshotPath = `screenshots/step-${String(finding.screenshotStepNumber).padStart(3, "0")}.png`;
96
+ lines.push(`**Screenshot:** [Step ${finding.screenshotStepNumber}](${screenshotPath})`);
97
+ lines.push("");
98
+ }
99
+ if (finding.suggestedFix) {
100
+ lines.push(`**Suggested fix:** ${finding.suggestedFix}`);
101
+ lines.push("");
102
+ }
103
+ if (finding.grepPatterns && finding.grepPatterns.length > 0) {
104
+ lines.push("**Search patterns:**");
105
+ lines.push("```");
106
+ for (const pattern of finding.grepPatterns) {
107
+ lines.push(`grep -r "${pattern}" src/`);
108
+ }
109
+ lines.push("```");
110
+ lines.push("");
111
+ }
112
+ }
113
+ }
114
+ if (report.consoleErrors.length > 0) {
115
+ lines.push("## Console Errors");
116
+ lines.push("");
117
+ lines.push("The following JavaScript errors were detected:");
118
+ lines.push("");
119
+ lines.push("```");
120
+ for (const err of report.consoleErrors) {
121
+ lines.push(err);
122
+ }
123
+ lines.push("```");
124
+ lines.push("");
125
+ }
126
+ if (report.networkFailures.length > 0) {
127
+ lines.push("## Network Failures");
128
+ lines.push("");
129
+ lines.push("The following network requests failed:");
130
+ lines.push("");
131
+ for (const fail of report.networkFailures) {
132
+ lines.push(`- \`${fail.method} ${fail.url}\` → ${fail.status} ${fail.statusText}`);
133
+ }
134
+ lines.push("");
135
+ }
136
+ lines.push("---");
137
+ lines.push("");
138
+ lines.push(`*Generated by Whisker v0.1.0 using ${report.metadata.modelUsed}*`);
139
+ return lines.join("\n");
140
+ }
141
+ function capitalize(s) {
142
+ return s.charAt(0).toUpperCase() + s.slice(1);
143
+ }
144
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export interface WhiskerConfig {
2
+ task: string;
3
+ url: string;
4
+ persona?: string;
5
+ maxSteps: number;
6
+ viewport: {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ outputDir: string;
11
+ }
12
+ export interface ComputerAction {
13
+ action: string;
14
+ coordinate?: [number, number];
15
+ start_coordinate?: [number, number];
16
+ text?: string;
17
+ scroll_direction?: "up" | "down" | "left" | "right";
18
+ scroll_amount?: number;
19
+ }
20
+ export interface SessionStep {
21
+ stepNumber: number;
22
+ action: ComputerAction;
23
+ screenshotBase64: string;
24
+ timestamp: number;
25
+ }
26
+ export interface NetworkFailure {
27
+ url: string;
28
+ method: string;
29
+ status: number;
30
+ statusText: string;
31
+ timestamp: number;
32
+ }
33
+ export interface SessionLog {
34
+ config: WhiskerConfig;
35
+ steps: SessionStep[];
36
+ observations: string[];
37
+ consoleErrors: string[];
38
+ networkFailures: NetworkFailure[];
39
+ startTime: number;
40
+ endTime: number;
41
+ }
42
+ export interface Finding {
43
+ id: string;
44
+ severity: "critical" | "major" | "minor" | "suggestion";
45
+ category: "bug" | "ux-friction" | "accessibility" | "performance" | "visual" | "copy";
46
+ title: string;
47
+ description: string;
48
+ stepsToReproduce?: string[];
49
+ screenshotStepNumber?: number;
50
+ suggestedFix?: string;
51
+ grepPatterns?: string[];
52
+ }
53
+ export interface WhiskerReport {
54
+ metadata: {
55
+ task: string;
56
+ url: string;
57
+ persona?: string;
58
+ timestamp: string;
59
+ duration: number;
60
+ totalSteps: number;
61
+ modelUsed: string;
62
+ };
63
+ summary: string;
64
+ findings: Finding[];
65
+ consoleErrors: string[];
66
+ networkFailures: NetworkFailure[];
67
+ taskCompleted: boolean;
68
+ taskCompletionNotes: string;
69
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ export declare function printBanner(): void;
2
+ export declare function printConfig(task: string, url: string, persona?: string, maxSteps?: number, viewport?: string): void;
3
+ export declare function printTestStart(): void;
4
+ export declare function startSpinner(message: string): void;
5
+ export declare function stopSpinner(completedMessage?: string): void;
6
+ export declare function clearSpinner(): void;
7
+ export declare function startWaitingSpinner(): void;
8
+ export declare function printStep(message: string): void;
9
+ export declare function printStepComplete(message: string): void;
10
+ export declare function printPhaseStart(phase: string): void;
11
+ export declare function printPhaseComplete(phase: string): void;
12
+ export declare function printThinking(text: string): void;
13
+ export declare function printResults(taskCompleted: boolean, summary: string, findings: Array<{
14
+ severity: string;
15
+ id: string;
16
+ title: string;
17
+ description: string;
18
+ }>, outputDir: string, _absoluteOutputDir?: string): void;
19
+ export declare function printError(message: string): void;
package/dist/ui.js ADDED
@@ -0,0 +1,297 @@
1
+ // ANSI color codes - no dependencies needed
2
+ const colors = {
3
+ reset: "\x1b[0m",
4
+ bold: "\x1b[1m",
5
+ dim: "\x1b[2m",
6
+ // Colors
7
+ red: "\x1b[31m",
8
+ green: "\x1b[32m",
9
+ yellow: "\x1b[33m",
10
+ blue: "\x1b[34m",
11
+ magenta: "\x1b[35m",
12
+ cyan: "\x1b[36m",
13
+ white: "\x1b[37m",
14
+ gray: "\x1b[90m",
15
+ // Bright colors
16
+ brightRed: "\x1b[91m",
17
+ brightGreen: "\x1b[92m",
18
+ brightYellow: "\x1b[93m",
19
+ brightCyan: "\x1b[96m",
20
+ brightWhite: "\x1b[97m",
21
+ };
22
+ const c = colors;
23
+ // Braille dots spinner frames
24
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
25
+ let spinnerInterval = null;
26
+ let spinnerFrame = 0;
27
+ // Cool cat ASCII art
28
+ const CAT_NORMAL = [
29
+ ` _._ _,-'"\"\`-._`,
30
+ `(,-.\`._,'( |\\\`-/|`,
31
+ ` \`-.-' \\ )-\`( , o o)`,
32
+ ` \`- \\\`_\`"'-`,
33
+ ];
34
+ // Box width
35
+ const BOX_WIDTH = 70;
36
+ // Section divider - dotted line same width as box
37
+ const DIVIDER = `${c.dim}${"· ".repeat(35)}${c.reset}`;
38
+ // In-box divider (fits inside the box borders)
39
+ const BOX_DIVIDER = `· `.repeat(33);
40
+ export function printBanner() {
41
+ // Banner is now printed by printConfig which includes everything in one box
42
+ }
43
+ export function printConfig(task, url, persona, maxSteps, viewport) {
44
+ const version = "v0.1.0";
45
+ console.log("");
46
+ // Top border
47
+ console.log(`${c.dim}╭${"─".repeat(BOX_WIDTH - 2)}╮${c.reset}`);
48
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
49
+ // Title
50
+ const title = "WHISKER";
51
+ const titleLine = ` ${c.brightWhite}${c.bold}${title}${c.reset} ${c.dim}${version}${c.reset}`;
52
+ const titlePadding = BOX_WIDTH - 2 - 2 - title.length - 1 - version.length;
53
+ console.log(`${c.dim}│${c.reset}${titleLine}${" ".repeat(titlePadding)}${c.dim}│${c.reset}`);
54
+ // Subtitle
55
+ const subtitle = "AI-Powered Usability Testing";
56
+ const subtitlePadding = BOX_WIDTH - 4 - subtitle.length;
57
+ console.log(`${c.dim}│${c.reset} ${c.dim}${subtitle}${c.reset}${" ".repeat(subtitlePadding)}${c.dim}│${c.reset}`);
58
+ // Extra blank line before cat
59
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
60
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
61
+ // Cat
62
+ for (const line of CAT_NORMAL) {
63
+ const rightPadding = BOX_WIDTH - 4 - line.length;
64
+ console.log(`${c.dim}│${c.reset} ${c.white}${line}${c.reset}${" ".repeat(Math.max(0, rightPadding))}${c.dim}│${c.reset}`);
65
+ }
66
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
67
+ // Dotted divider inside box
68
+ const dividerPadding = BOX_WIDTH - 4 - BOX_DIVIDER.length;
69
+ console.log(`${c.dim}│${c.reset} ${c.dim}${BOX_DIVIDER}${c.reset}${" ".repeat(Math.max(0, dividerPadding))}${c.dim}│${c.reset}`);
70
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
71
+ // Config items (no title)
72
+ const printConfigLine = (label, value) => {
73
+ const labelPad = 12 - label.length; // Space between label: and value
74
+ const maxValueLen = BOX_WIDTH - 4 - label.length - 1 - labelPad; // Available space for value
75
+ let displayValue = value;
76
+ if (value.length > maxValueLen) {
77
+ displayValue = value.slice(0, maxValueLen - 3) + "...";
78
+ }
79
+ const visibleLen = 2 + label.length + 1 + labelPad + displayValue.length;
80
+ const rightPad = BOX_WIDTH - 2 - visibleLen;
81
+ console.log(`${c.dim}│${c.reset} ${c.dim}${label}:${c.reset}${" ".repeat(labelPad)}${c.white}${displayValue}${c.reset}${" ".repeat(Math.max(0, rightPad))}${c.dim}│${c.reset}`);
82
+ };
83
+ printConfigLine("Task", task);
84
+ printConfigLine("URL", url);
85
+ if (persona) {
86
+ printConfigLine("Persona", persona);
87
+ }
88
+ if (maxSteps) {
89
+ printConfigLine("Max steps", String(maxSteps));
90
+ }
91
+ if (viewport) {
92
+ printConfigLine("Viewport", viewport);
93
+ }
94
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
95
+ console.log(`${c.dim}╰${"─".repeat(BOX_WIDTH - 2)}╯${c.reset}`);
96
+ console.log("");
97
+ console.log("");
98
+ console.log(DIVIDER);
99
+ console.log("");
100
+ console.log("");
101
+ }
102
+ export function printTestStart() {
103
+ console.log(`${c.brightWhite}${c.bold}Running Test${c.reset}`);
104
+ console.log("");
105
+ }
106
+ // Start spinner with a message
107
+ export function startSpinner(message) {
108
+ stopSpinnerSilent(); // Clear any existing spinner without printing
109
+ spinnerFrame = 0;
110
+ const paddedMessage = message.padEnd(70); // Pad to ensure we overwrite old content
111
+ process.stdout.write(`${c.dim}${SPINNER_FRAMES[spinnerFrame]} ${paddedMessage}${c.reset}`);
112
+ spinnerInterval = setInterval(() => {
113
+ spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;
114
+ process.stdout.write(`\r${c.dim}${SPINNER_FRAMES[spinnerFrame]} ${paddedMessage}${c.reset}`);
115
+ }, 80);
116
+ }
117
+ // Stop spinner silently (no output)
118
+ function stopSpinnerSilent() {
119
+ if (spinnerInterval) {
120
+ clearInterval(spinnerInterval);
121
+ spinnerInterval = null;
122
+ }
123
+ }
124
+ // Stop spinner and show completion
125
+ export function stopSpinner(completedMessage) {
126
+ stopSpinnerSilent();
127
+ if (completedMessage) {
128
+ const paddedMessage = completedMessage.padEnd(70); // Pad to overwrite spinner text
129
+ process.stdout.write(`\r${c.brightWhite}✓${c.reset} ${c.dim}${paddedMessage}${c.reset}\n`);
130
+ }
131
+ else {
132
+ process.stdout.write(`\r\x1b[K`); // Just clear the line
133
+ }
134
+ }
135
+ // Clear current spinner line without completion message
136
+ export function clearSpinner() {
137
+ stopSpinnerSilent();
138
+ process.stdout.write(`\r\x1b[K`); // Clear the line
139
+ }
140
+ // Show waiting spinner (no message, just spinner)
141
+ export function startWaitingSpinner() {
142
+ stopSpinnerSilent();
143
+ spinnerFrame = 0;
144
+ process.stdout.write(`${c.dim}${SPINNER_FRAMES[spinnerFrame]}${c.reset}`);
145
+ spinnerInterval = setInterval(() => {
146
+ spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;
147
+ process.stdout.write(`\r${c.dim}${SPINNER_FRAMES[spinnerFrame]}${c.reset}`);
148
+ }, 80);
149
+ }
150
+ export function printStep(message) {
151
+ console.log(`${c.dim}${message}${c.reset}`);
152
+ }
153
+ export function printStepComplete(message) {
154
+ console.log(`${c.brightWhite}✓${c.reset} ${c.dim}${message}${c.reset}`);
155
+ }
156
+ // Keep for compatibility
157
+ export function printPhaseStart(phase) {
158
+ console.log(`${c.brightWhite}${c.bold}${phase}${c.reset}`);
159
+ console.log("");
160
+ }
161
+ export function printPhaseComplete(phase) {
162
+ console.log(`${c.dim}${phase} complete${c.reset}`);
163
+ }
164
+ export function printThinking(text) {
165
+ const lines = text.split("\n");
166
+ for (const line of lines) {
167
+ if (line.trim()) {
168
+ console.log(`${c.dim}${line.trim()}${c.reset}`);
169
+ }
170
+ }
171
+ }
172
+ function wrapText(text, maxWidth) {
173
+ const words = text.split(" ");
174
+ const lines = [];
175
+ let currentLine = "";
176
+ for (const word of words) {
177
+ if ((currentLine + " " + word).trim().length <= maxWidth) {
178
+ currentLine = (currentLine + " " + word).trim();
179
+ }
180
+ else {
181
+ if (currentLine)
182
+ lines.push(currentLine);
183
+ currentLine =
184
+ word.length > maxWidth ? word.slice(0, maxWidth - 3) + "..." : word;
185
+ }
186
+ }
187
+ if (currentLine)
188
+ lines.push(currentLine);
189
+ return lines;
190
+ }
191
+ export function printResults(taskCompleted, summary, findings, outputDir, _absoluteOutputDir) {
192
+ console.log("");
193
+ console.log("");
194
+ console.log(DIVIDER);
195
+ console.log("");
196
+ console.log("");
197
+ // Task status in a box with summary - no cat
198
+ const innerWidth = BOX_WIDTH - 6; // Account for border and padding (│ content │)
199
+ const statusText = taskCompleted ? "TASK COMPLETED" : "TASK NOT COMPLETED";
200
+ const statusColor = taskCompleted ? c.brightWhite : c.red;
201
+ // Top border
202
+ console.log(`${c.dim}╭${"─".repeat(BOX_WIDTH - 2)}╮${c.reset}`);
203
+ // Empty line
204
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
205
+ // Status text left aligned with padding
206
+ const statusLine = ` ${statusColor}${c.bold}${statusText}${c.reset}`;
207
+ const statusPadding = BOX_WIDTH - 2 - 2 - statusText.length;
208
+ console.log(`${c.dim}│${c.reset}${statusLine}${" ".repeat(statusPadding)}${c.dim}│${c.reset}`);
209
+ // Empty line
210
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
211
+ // Summary text wrapped and left aligned
212
+ const summaryLines = wrapText(summary, innerWidth);
213
+ for (const line of summaryLines) {
214
+ const rightPad = BOX_WIDTH - 4 - line.length;
215
+ console.log(`${c.dim}│${c.reset} ${c.dim}${line}${c.reset}${" ".repeat(Math.max(0, rightPad))}${c.dim}│${c.reset}`);
216
+ }
217
+ // Empty line
218
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
219
+ // Bottom border
220
+ console.log(`${c.dim}╰${"─".repeat(BOX_WIDTH - 2)}╯${c.reset}`);
221
+ console.log("");
222
+ console.log("");
223
+ // Findings
224
+ console.log(DIVIDER);
225
+ console.log("");
226
+ console.log("");
227
+ if (findings.length > 0) {
228
+ console.log(`${c.brightWhite}${c.bold}FINDINGS${c.reset}`);
229
+ console.log("");
230
+ for (const finding of findings) {
231
+ const label = severityLabel(finding.severity);
232
+ console.log(`${label} ${c.white}${c.bold}${finding.id}:${c.reset} ${c.white}${finding.title}${c.reset}`);
233
+ console.log(`${c.dim}${finding.description}${c.reset}`);
234
+ console.log("");
235
+ }
236
+ }
237
+ else {
238
+ console.log(`${c.brightWhite}${c.bold}FINDINGS${c.reset}`);
239
+ console.log("");
240
+ console.log(`${c.dim}No issues found${c.reset}`);
241
+ console.log("");
242
+ }
243
+ // Output files
244
+ console.log("");
245
+ console.log(DIVIDER);
246
+ console.log("");
247
+ console.log("");
248
+ console.log(`${c.brightWhite}${c.bold}OUTPUT FILES${c.reset}`);
249
+ console.log("");
250
+ console.log(`${c.dim}Report:${c.reset} ${outputDir}/report.md`);
251
+ console.log(`${c.dim}JSON:${c.reset} ${outputDir}/report.json`);
252
+ console.log(`${c.dim}Screenshots:${c.reset} ${outputDir}/screenshots/`);
253
+ console.log("");
254
+ console.log(`${c.dim}Tip: Cmd/Ctrl+click to open files${c.reset}`);
255
+ console.log(`${c.dim}AI agents: Read report.json for structured findings${c.reset}`);
256
+ console.log("");
257
+ }
258
+ export function printError(message) {
259
+ stopSpinnerSilent(); // Make sure spinner is stopped
260
+ console.log("");
261
+ const innerWidth = BOX_WIDTH - 6;
262
+ console.log(`${c.dim}╭${"─".repeat(BOX_WIDTH - 2)}╮${c.reset}`);
263
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
264
+ const errorText = "ERROR";
265
+ const errorLine = ` ${c.red}${c.bold}${errorText}${c.reset}`;
266
+ const errorPadding = BOX_WIDTH - 2 - 2 - errorText.length;
267
+ console.log(`${c.dim}│${c.reset}${errorLine}${" ".repeat(errorPadding)}${c.dim}│${c.reset}`);
268
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
269
+ for (const line of CAT_NORMAL) {
270
+ const rightPadding = BOX_WIDTH - 4 - line.length;
271
+ console.log(`${c.dim}│${c.reset} ${c.white}${line}${c.reset}${" ".repeat(Math.max(0, rightPadding))}${c.dim}│${c.reset}`);
272
+ }
273
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
274
+ const msgLines = wrapText(message, innerWidth);
275
+ for (const line of msgLines) {
276
+ const rightPad = BOX_WIDTH - 4 - line.length;
277
+ console.log(`${c.dim}│${c.reset} ${c.red}${line}${c.reset}${" ".repeat(Math.max(0, rightPad))}${c.dim}│${c.reset}`);
278
+ }
279
+ console.log(`${c.dim}│${c.reset}${" ".repeat(BOX_WIDTH - 2)}${c.dim}│${c.reset}`);
280
+ console.log(`${c.dim}╰${"─".repeat(BOX_WIDTH - 2)}╯${c.reset}`);
281
+ console.log("");
282
+ }
283
+ function severityLabel(severity) {
284
+ switch (severity) {
285
+ case "critical":
286
+ return `${c.red}[P0]${c.reset}`;
287
+ case "major":
288
+ return `${c.yellow}[P1]${c.reset}`;
289
+ case "minor":
290
+ return `${c.magenta}[P2]${c.reset}`;
291
+ case "suggestion":
292
+ return `${c.dim}[P3]${c.reset}`;
293
+ default:
294
+ return `${c.dim}[${severity.toUpperCase()}]${c.reset}`;
295
+ }
296
+ }
297
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "whisker-ux",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered usability testing CLI using Claude computer use",
5
+ "type": "module",
6
+ "bin": {
7
+ "whisker": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "start": "tsx src/cli.ts",
19
+ "typecheck": "tsc --noEmit",
20
+ "prepublishOnly": "npm run build",
21
+ "postinstall": "npx playwright install chromium"
22
+ },
23
+ "keywords": [
24
+ "usability",
25
+ "testing",
26
+ "ux",
27
+ "ai",
28
+ "claude",
29
+ "anthropic",
30
+ "computer-use",
31
+ "playwright",
32
+ "automation",
33
+ "accessibility",
34
+ "qa"
35
+ ],
36
+ "author": "Eric Li",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/ericli/whisker-ux.git"
41
+ },
42
+ "homepage": "https://github.com/ericli/whisker-ux#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/ericli/whisker-ux/issues"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "dependencies": {
50
+ "@anthropic-ai/sdk": "^0.39.0",
51
+ "commander": "^13.1.0",
52
+ "playwright": "^1.50.0"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.12.0",
56
+ "tsx": "^4.19.0",
57
+ "typescript": "^5.7.0"
58
+ }
59
+ }