nodebench-mcp 2.18.4 → 2.19.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.
@@ -0,0 +1,526 @@
1
+ /**
2
+ * UI/UX Full Dive Tools — Parallel subagent swarm for comprehensive UI traversal.
3
+ *
4
+ * Architecture:
5
+ * - Main agent starts a dive session and registers top-level page components.
6
+ * - Subagents claim individual components via start_component_flow (isolated context).
7
+ * - Each subagent logs interactions and tags bugs within its component scope.
8
+ * - The component tree builds up hierarchically (page → section → element).
9
+ * - get_dive_tree produces an XML-like overview of the entire app structure.
10
+ * - get_dive_report generates a final report with Mermaid diagram, bug summary,
11
+ * and per-component interaction traces.
12
+ *
13
+ * Designed for use with Claude Code subagents, Windsurf, or any MCP client that
14
+ * supports parallel tool invocation. Each subagent only needs the session_id and
15
+ * its assigned component_id to operate independently.
16
+ */
17
+ import { getDb, genId } from "../db.js";
18
+ function buildTreeXml(components, bugs, parentId = null, indent = 0) {
19
+ const children = components.filter(c => c.parent_id === parentId);
20
+ if (children.length === 0)
21
+ return "";
22
+ const pad = " ".repeat(indent);
23
+ let xml = "";
24
+ for (const c of children) {
25
+ const cBugs = bugs.filter(b => b.component_id === c.id);
26
+ const bugAttr = cBugs.length > 0 ? ` bugs="${cBugs.length}"` : "";
27
+ const statusAttr = ` status="${c.status}"`;
28
+ const agentAttr = c.agent_id ? ` agent="${c.agent_id}"` : "";
29
+ const interactionAttr = c.interaction_count > 0 ? ` interactions="${c.interaction_count}"` : "";
30
+ const childXml = buildTreeXml(components, bugs, c.id, indent + 1);
31
+ const bugXml = cBugs.map(b => `${pad} <bug severity="${b.severity}" category="${b.category}" status="${b.status}">${b.title}</bug>`).join("\n");
32
+ const hasChildren = childXml || bugXml;
33
+ if (hasChildren) {
34
+ xml += `${pad}<${c.component_type} name="${c.name}" id="${c.id}"${statusAttr}${agentAttr}${interactionAttr}${bugAttr}>\n`;
35
+ if (bugXml)
36
+ xml += bugXml + "\n";
37
+ if (childXml)
38
+ xml += childXml;
39
+ xml += `${pad}</${c.component_type}>\n`;
40
+ }
41
+ else {
42
+ xml += `${pad}<${c.component_type} name="${c.name}" id="${c.id}"${statusAttr}${agentAttr}${interactionAttr}${bugAttr} />\n`;
43
+ }
44
+ }
45
+ return xml;
46
+ }
47
+ function buildMermaidDiagram(components, bugs) {
48
+ if (components.length === 0)
49
+ return "graph TD\n empty[No components registered]";
50
+ let mermaid = "graph TD\n";
51
+ const sanitize = (s) => s.replace(/["\[\](){}]/g, "").replace(/\s+/g, "_");
52
+ for (const c of components) {
53
+ const cBugs = bugs.filter(b => b.component_id === c.id);
54
+ const label = cBugs.length > 0
55
+ ? `${c.name} [${c.status}] 🐛${cBugs.length}`
56
+ : `${c.name} [${c.status}]`;
57
+ const style = c.status === "completed"
58
+ ? ":::completed"
59
+ : cBugs.some(b => b.severity === "critical")
60
+ ? ":::critical"
61
+ : cBugs.length > 0
62
+ ? ":::hasBugs"
63
+ : "";
64
+ mermaid += ` ${sanitize(c.id)}["${label}"]${style}\n`;
65
+ if (c.parent_id) {
66
+ mermaid += ` ${sanitize(c.parent_id)} --> ${sanitize(c.id)}\n`;
67
+ }
68
+ }
69
+ mermaid += "\n classDef completed fill:#d4edda,stroke:#28a745\n";
70
+ mermaid += " classDef critical fill:#f8d7da,stroke:#dc3545\n";
71
+ mermaid += " classDef hasBugs fill:#fff3cd,stroke:#ffc107\n";
72
+ return mermaid;
73
+ }
74
+ // ── Tools ────────────────────────────────────────────────────────────────
75
+ export const uiUxDiveTools = [
76
+ // 1. Start a dive session
77
+ {
78
+ name: "start_ui_dive",
79
+ description: "Initialize a UI/UX Full Dive session for comprehensive app traversal. Creates a session that tracks all components, interactions, and bugs. The main agent should call this first, then register_component for each top-level page/section discovered. Subagents can then claim individual components via start_component_flow for isolated parallel traversal. Returns the session_id needed by all subsequent tools.",
80
+ inputSchema: {
81
+ type: "object",
82
+ properties: {
83
+ appUrl: {
84
+ type: "string",
85
+ description: "URL of the application to dive into (e.g. http://localhost:3000, https://app.example.com)",
86
+ },
87
+ appName: {
88
+ type: "string",
89
+ description: "Human-readable name (e.g. 'NodeBench AI Dashboard')",
90
+ },
91
+ agentCount: {
92
+ type: "number",
93
+ description: "Number of parallel subagents planned (default: 1, set higher for parallel swarm)",
94
+ },
95
+ metadata: {
96
+ type: "object",
97
+ description: "Optional JSON metadata (e.g. { viewport: '1280x720', auth: 'guest' })",
98
+ },
99
+ },
100
+ required: ["appUrl"],
101
+ },
102
+ handler: async (args) => {
103
+ const { appUrl, appName, agentCount, metadata } = args;
104
+ const db = getDb();
105
+ const id = genId("dive");
106
+ db.prepare("INSERT INTO ui_dive_sessions (id, app_url, app_name, agent_count, metadata) VALUES (?, ?, ?, ?, ?)").run(id, appUrl, appName ?? null, agentCount ?? 1, metadata ? JSON.stringify(metadata) : null);
107
+ return {
108
+ sessionId: id,
109
+ appUrl,
110
+ appName: appName ?? null,
111
+ agentCount: agentCount ?? 1,
112
+ status: "active",
113
+ _hint: `Session created. Now register top-level components with register_component({ sessionId: "${id}", name: "...", componentType: "page" }). For parallel swarm: assign each subagent a component via start_component_flow.`,
114
+ _workflow: [
115
+ "1. Navigate to appUrl and identify top-level pages/sections",
116
+ "2. register_component for each (componentType: 'page')",
117
+ "3. For each page, register child sections/forms/modals",
118
+ "4. Assign subagents: start_component_flow({ componentId, agentId })",
119
+ "5. Each subagent: log_interaction + tag_ui_bug within their component",
120
+ "6. Each subagent: end_component_flow when done",
121
+ "7. Main agent: get_dive_tree for full overview, get_dive_report for final report",
122
+ ],
123
+ };
124
+ },
125
+ },
126
+ // 2. Register a component in the tree
127
+ {
128
+ name: "register_component",
129
+ description: "Register a UI component in the dive tree. Components form a hierarchy: page → section → form/modal/list → button/input/link. Set parentId to nest under an existing component (null for top-level). The main agent registers the initial tree, then subagents can add child components they discover during traversal. Returns the component_id for use in start_component_flow and log_interaction.",
130
+ inputSchema: {
131
+ type: "object",
132
+ properties: {
133
+ sessionId: { type: "string", description: "Dive session ID from start_ui_dive" },
134
+ name: { type: "string", description: "Component name (e.g. 'Login Form', 'Navigation Bar', 'Settings Modal')" },
135
+ componentType: {
136
+ type: "string",
137
+ description: "Type: page, section, form, modal, menu, list, card, button, input, link, table, tab, drawer, dialog, toast, tooltip, dropdown, sidebar, header, footer, hero, chart, media",
138
+ },
139
+ parentId: { type: "string", description: "Parent component ID (null/omit for top-level page)" },
140
+ selector: { type: "string", description: "CSS selector or data-testid for identification (e.g. '[data-testid=login-form]', '#nav-bar')" },
141
+ metadata: { type: "object", description: "Optional JSON (e.g. { route: '/settings', requiresAuth: true })" },
142
+ },
143
+ required: ["sessionId", "name", "componentType"],
144
+ },
145
+ handler: async (args) => {
146
+ const { sessionId, name, componentType, parentId, selector, metadata } = args;
147
+ const db = getDb();
148
+ // Validate session exists
149
+ const session = db.prepare("SELECT id, status FROM ui_dive_sessions WHERE id = ?").get(sessionId);
150
+ if (!session)
151
+ return { error: true, message: `Session not found: ${sessionId}` };
152
+ if (session.status !== "active")
153
+ return { error: true, message: `Session is ${session.status}, not active` };
154
+ // Validate parent if provided
155
+ if (parentId) {
156
+ const parent = db.prepare("SELECT id FROM ui_dive_components WHERE id = ? AND session_id = ?").get(parentId, sessionId);
157
+ if (!parent)
158
+ return { error: true, message: `Parent component not found: ${parentId}` };
159
+ }
160
+ const id = genId("comp");
161
+ db.prepare("INSERT INTO ui_dive_components (id, session_id, parent_id, name, component_type, selector, metadata) VALUES (?, ?, ?, ?, ?, ?, ?)").run(id, sessionId, parentId ?? null, name, componentType, selector ?? null, metadata ? JSON.stringify(metadata) : null);
162
+ // Set as root if first top-level component
163
+ if (!parentId) {
164
+ const rootCheck = db.prepare("SELECT root_component_id FROM ui_dive_sessions WHERE id = ?").get(sessionId);
165
+ if (!rootCheck.root_component_id) {
166
+ db.prepare("UPDATE ui_dive_sessions SET root_component_id = ? WHERE id = ?").run(id, sessionId);
167
+ }
168
+ }
169
+ const siblingCount = db.prepare("SELECT COUNT(*) as c FROM ui_dive_components WHERE session_id = ? AND parent_id IS ?").get(sessionId, parentId ?? null);
170
+ return {
171
+ componentId: id,
172
+ name,
173
+ componentType,
174
+ parentId: parentId ?? null,
175
+ selector: selector ?? null,
176
+ siblingCount: siblingCount.c,
177
+ status: "pending",
178
+ _hint: `Component registered. Claim it for traversal: start_component_flow({ componentId: "${id}", agentId: "agent_1" }). Or register child components under it.`,
179
+ };
180
+ },
181
+ },
182
+ // 3. Start a component flow (claim for subagent)
183
+ {
184
+ name: "start_component_flow",
185
+ description: "Claim a component for traversal by a specific subagent. Marks it as 'in_progress' and assigns the agent_id. This provides context isolation — each subagent works on its own component independently. The subagent should then log_interaction for each step and tag_ui_bug for any issues found. Call end_component_flow when done.",
186
+ inputSchema: {
187
+ type: "object",
188
+ properties: {
189
+ componentId: { type: "string", description: "Component ID from register_component" },
190
+ agentId: { type: "string", description: "Unique agent identifier (e.g. 'agent_1', 'nav_agent', 'form_tester')" },
191
+ },
192
+ required: ["componentId"],
193
+ },
194
+ handler: async (args) => {
195
+ const { componentId, agentId } = args;
196
+ const db = getDb();
197
+ const comp = db.prepare("SELECT c.*, s.app_url, s.app_name FROM ui_dive_components c JOIN ui_dive_sessions s ON c.session_id = s.id WHERE c.id = ?").get(componentId);
198
+ if (!comp)
199
+ return { error: true, message: `Component not found: ${componentId}` };
200
+ if (comp.status === "in_progress") {
201
+ return { error: true, message: `Component already claimed by agent '${comp.agent_id}'. Use a different component or wait.` };
202
+ }
203
+ if (comp.status === "completed") {
204
+ return { error: true, message: `Component already completed. Register a new component for additional testing.` };
205
+ }
206
+ const aid = agentId ?? `agent_${Date.now()}`;
207
+ db.prepare("UPDATE ui_dive_components SET status = 'in_progress', agent_id = ? WHERE id = ?").run(aid, componentId);
208
+ // Get children for context
209
+ const children = db.prepare("SELECT id, name, component_type, status FROM ui_dive_components WHERE parent_id = ?").all(componentId);
210
+ return {
211
+ claimed: true,
212
+ componentId,
213
+ agentId: aid,
214
+ component: {
215
+ name: comp.name,
216
+ type: comp.component_type,
217
+ selector: comp.selector,
218
+ parentId: comp.parent_id,
219
+ },
220
+ app: { url: comp.app_url, name: comp.app_name },
221
+ children: children.map(ch => ({ id: ch.id, name: ch.name, type: ch.component_type, status: ch.status })),
222
+ _hint: `Component claimed. Now interact with it: log_interaction({ componentId: "${componentId}", action: "click", target: "...", result: "success", observation: "..." }). Tag bugs with tag_ui_bug. Call end_component_flow when done.`,
223
+ };
224
+ },
225
+ },
226
+ // 4. Log an interaction
227
+ {
228
+ name: "log_interaction",
229
+ description: "Log a single interaction step within a component flow. Each interaction records what action was taken, what happened, and any observations. Actions: click, type, hover, scroll, navigate, submit, drag, keypress, swipe, focus, blur, resize, wait, assert. Interactions are auto-numbered sequentially within each component.",
230
+ inputSchema: {
231
+ type: "object",
232
+ properties: {
233
+ componentId: { type: "string", description: "Component ID being tested" },
234
+ action: {
235
+ type: "string",
236
+ description: "Interaction type: click, type, hover, scroll, navigate, submit, drag, keypress, swipe, focus, blur, resize, wait, assert",
237
+ },
238
+ target: { type: "string", description: "What was interacted with (e.g. 'Submit button', 'Email input field', 'Dropdown menu')" },
239
+ inputValue: { type: "string", description: "What was typed/selected/entered (for type, submit, select actions)" },
240
+ result: {
241
+ type: "string",
242
+ description: "Outcome: success, error, unexpected, timeout, crash, no_response, partial",
243
+ },
244
+ observation: {
245
+ type: "string",
246
+ description: "What happened after the interaction (e.g. 'Form submitted, redirected to dashboard', 'Error toast appeared: Invalid email')",
247
+ },
248
+ durationMs: { type: "number", description: "How long the interaction took in ms (optional)" },
249
+ screenshotRef: { type: "string", description: "Reference to a screenshot capture (optional)" },
250
+ },
251
+ required: ["componentId", "action", "result"],
252
+ },
253
+ handler: async (args) => {
254
+ const { componentId, action, target, inputValue, result, observation, durationMs, screenshotRef } = args;
255
+ const db = getDb();
256
+ const comp = db.prepare("SELECT id, session_id, status, interaction_count FROM ui_dive_components WHERE id = ?").get(componentId);
257
+ if (!comp)
258
+ return { error: true, message: `Component not found: ${componentId}` };
259
+ const seqNum = comp.interaction_count + 1;
260
+ const id = genId("int");
261
+ db.prepare(`INSERT INTO ui_dive_interactions (id, session_id, component_id, action, target, input_value, result, observation, screenshot_ref, duration_ms, sequence_num)
262
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, comp.session_id, componentId, action, target ?? null, inputValue ?? null, result, observation ?? null, screenshotRef ?? null, durationMs ?? null, seqNum);
263
+ db.prepare("UPDATE ui_dive_components SET interaction_count = ? WHERE id = ?").run(seqNum, componentId);
264
+ return {
265
+ interactionId: id,
266
+ sequenceNum: seqNum,
267
+ action,
268
+ target: target ?? null,
269
+ result,
270
+ _hint: result !== "success"
271
+ ? `Non-success result (${result}). Consider tagging a bug: tag_ui_bug({ componentId: "${componentId}", interactionId: "${id}", severity: "...", category: "functional", title: "..." })`
272
+ : `Interaction #${seqNum} logged. Continue testing or call end_component_flow when done.`,
273
+ };
274
+ },
275
+ },
276
+ // 5. End a component flow
277
+ {
278
+ name: "end_component_flow",
279
+ description: "Complete a component's traversal flow. Marks it as 'completed' with a summary. Call this after all interactions and bug tagging for a component are done. The summary should capture key findings, overall health, and any patterns observed.",
280
+ inputSchema: {
281
+ type: "object",
282
+ properties: {
283
+ componentId: { type: "string", description: "Component ID to complete" },
284
+ summary: {
285
+ type: "string",
286
+ description: "Summary of findings (e.g. 'Login form works correctly. Found 1 accessibility issue with missing aria-label on password field.')",
287
+ },
288
+ },
289
+ required: ["componentId", "summary"],
290
+ },
291
+ handler: async (args) => {
292
+ const { componentId, summary } = args;
293
+ const db = getDb();
294
+ const comp = db.prepare("SELECT id, session_id, name, interaction_count, bug_count FROM ui_dive_components WHERE id = ?").get(componentId);
295
+ if (!comp)
296
+ return { error: true, message: `Component not found: ${componentId}` };
297
+ db.prepare("UPDATE ui_dive_components SET status = 'completed', summary = ?, completed_at = datetime('now') WHERE id = ?").run(summary, componentId);
298
+ // Check session progress
299
+ const total = db.prepare("SELECT COUNT(*) as c FROM ui_dive_components WHERE session_id = ?").get(comp.session_id);
300
+ const completed = db.prepare("SELECT COUNT(*) as c FROM ui_dive_components WHERE session_id = ? AND status = 'completed'").get(comp.session_id);
301
+ const totalBugs = db.prepare("SELECT COUNT(*) as c FROM ui_dive_bugs WHERE session_id = ?").get(comp.session_id);
302
+ return {
303
+ completed: true,
304
+ componentId,
305
+ name: comp.name,
306
+ interactionCount: comp.interaction_count,
307
+ bugCount: comp.bug_count,
308
+ summary,
309
+ sessionProgress: {
310
+ completedComponents: completed.c,
311
+ totalComponents: total.c,
312
+ remainingComponents: total.c - completed.c,
313
+ totalBugsFound: totalBugs.c,
314
+ },
315
+ _hint: completed.c === total.c
316
+ ? `All components completed! Generate the final report: get_dive_report({ sessionId: "${comp.session_id}" })`
317
+ : `${total.c - completed.c} components remaining. Continue with the next component or get_dive_tree for current state.`,
318
+ };
319
+ },
320
+ },
321
+ // 6. Tag a bug
322
+ {
323
+ name: "tag_ui_bug",
324
+ description: "Tag a bug to a specific component (and optionally a specific interaction). Bugs are categorized by severity (critical/high/medium/low) and category (visual, functional, accessibility, performance, responsive, ux, content, security). Each bug is linked to its component in the tree for precise debugging.",
325
+ inputSchema: {
326
+ type: "object",
327
+ properties: {
328
+ componentId: { type: "string", description: "Component where the bug was found" },
329
+ interactionId: { type: "string", description: "Specific interaction that triggered the bug (optional)" },
330
+ severity: { type: "string", description: "Bug severity: critical, high, medium, low" },
331
+ category: {
332
+ type: "string",
333
+ description: "Bug category: visual (layout/styling), functional (broken behavior), accessibility (a11y), performance (slow/laggy), responsive (breakpoint issues), ux (confusing/poor UX), content (text/copy issues), security (auth/data exposure)",
334
+ },
335
+ title: { type: "string", description: "Short bug title (e.g. 'Submit button unresponsive on mobile')" },
336
+ description: { type: "string", description: "Detailed description of the bug" },
337
+ expected: { type: "string", description: "What should happen" },
338
+ actual: { type: "string", description: "What actually happens" },
339
+ screenshotRef: { type: "string", description: "Reference to a screenshot showing the bug (optional)" },
340
+ },
341
+ required: ["componentId", "severity", "category", "title"],
342
+ },
343
+ handler: async (args) => {
344
+ const { componentId, interactionId, severity, category, title, description, expected, actual, screenshotRef } = args;
345
+ const db = getDb();
346
+ const comp = db.prepare("SELECT id, session_id, bug_count FROM ui_dive_components WHERE id = ?").get(componentId);
347
+ if (!comp)
348
+ return { error: true, message: `Component not found: ${componentId}` };
349
+ const id = genId("bug");
350
+ db.prepare(`INSERT INTO ui_dive_bugs (id, session_id, component_id, interaction_id, severity, category, title, description, expected, actual, screenshot_ref)
351
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, comp.session_id, componentId, interactionId ?? null, severity, category, title, description ?? null, expected ?? null, actual ?? null, screenshotRef ?? null);
352
+ const newBugCount = comp.bug_count + 1;
353
+ db.prepare("UPDATE ui_dive_components SET bug_count = ? WHERE id = ?").run(newBugCount, componentId);
354
+ const sessionBugs = db.prepare("SELECT severity, COUNT(*) as c FROM ui_dive_bugs WHERE session_id = ? GROUP BY severity").all(comp.session_id);
355
+ return {
356
+ bugId: id,
357
+ severity,
358
+ category,
359
+ title,
360
+ componentBugCount: newBugCount,
361
+ sessionBugSummary: Object.fromEntries(sessionBugs.map(b => [b.severity, b.c])),
362
+ _hint: `Bug tagged. Continue testing this component or call end_component_flow when done.`,
363
+ };
364
+ },
365
+ },
366
+ // 7. Get the component tree
367
+ {
368
+ name: "get_dive_tree",
369
+ description: "Get the full XML-like component tree for a dive session. Shows all registered components in their hierarchy with status, agent assignments, interaction counts, and bug counts. Also returns a Mermaid diagram for visual rendering. Use this for a quick overview of app structure and dive progress.",
370
+ inputSchema: {
371
+ type: "object",
372
+ properties: {
373
+ sessionId: { type: "string", description: "Dive session ID" },
374
+ format: {
375
+ type: "string",
376
+ description: "Output format: 'xml' (default — XML-like tree), 'mermaid' (Mermaid flowchart), 'both' (both formats)",
377
+ },
378
+ },
379
+ required: ["sessionId"],
380
+ },
381
+ handler: async (args) => {
382
+ const { sessionId, format } = args;
383
+ const db = getDb();
384
+ const session = db.prepare("SELECT * FROM ui_dive_sessions WHERE id = ?").get(sessionId);
385
+ if (!session)
386
+ return { error: true, message: `Session not found: ${sessionId}` };
387
+ const components = db.prepare("SELECT * FROM ui_dive_components WHERE session_id = ? ORDER BY created_at").all(sessionId);
388
+ const bugs = db.prepare("SELECT * FROM ui_dive_bugs WHERE session_id = ? ORDER BY created_at").all(sessionId);
389
+ const fmt = format ?? "both";
390
+ const completed = components.filter(c => c.status === "completed").length;
391
+ const inProgress = components.filter(c => c.status === "in_progress").length;
392
+ const pending = components.filter(c => c.status === "pending").length;
393
+ const result = {
394
+ session: {
395
+ id: session.id,
396
+ appUrl: session.app_url,
397
+ appName: session.app_name,
398
+ status: session.status,
399
+ },
400
+ stats: {
401
+ totalComponents: components.length,
402
+ completed,
403
+ inProgress,
404
+ pending,
405
+ totalBugs: bugs.length,
406
+ bugsBySeverity: Object.fromEntries(["critical", "high", "medium", "low"]
407
+ .map(s => [s, bugs.filter(b => b.severity === s).length])
408
+ .filter(([, c]) => c > 0)),
409
+ },
410
+ };
411
+ if (fmt === "xml" || fmt === "both") {
412
+ const xml = `<app name="${session.app_name ?? session.app_url}" url="${session.app_url}">\n${buildTreeXml(components, bugs, null, 1)}</app>`;
413
+ result.xmlTree = xml;
414
+ }
415
+ if (fmt === "mermaid" || fmt === "both") {
416
+ result.mermaidDiagram = buildMermaidDiagram(components, bugs);
417
+ }
418
+ return result;
419
+ },
420
+ },
421
+ // 8. Generate final report
422
+ {
423
+ name: "get_dive_report",
424
+ description: "Generate a comprehensive UI/UX Full Dive report for a session. Includes: executive summary, component tree, all bugs grouped by severity, per-component interaction traces, Mermaid diagram, and actionable recommendations. Optionally marks the session as completed. This is the final deliverable after all subagents have finished their traversals.",
425
+ inputSchema: {
426
+ type: "object",
427
+ properties: {
428
+ sessionId: { type: "string", description: "Dive session ID" },
429
+ completeSession: { type: "boolean", description: "Mark the session as completed (default: true)" },
430
+ },
431
+ required: ["sessionId"],
432
+ },
433
+ handler: async (args) => {
434
+ const { sessionId, completeSession } = args;
435
+ const db = getDb();
436
+ const session = db.prepare("SELECT * FROM ui_dive_sessions WHERE id = ?").get(sessionId);
437
+ if (!session)
438
+ return { error: true, message: `Session not found: ${sessionId}` };
439
+ const components = db.prepare("SELECT * FROM ui_dive_components WHERE session_id = ? ORDER BY created_at").all(sessionId);
440
+ const bugs = db.prepare("SELECT b.*, c.name as component_name, c.component_type FROM ui_dive_bugs b JOIN ui_dive_components c ON b.component_id = c.id WHERE b.session_id = ? ORDER BY CASE b.severity WHEN 'critical' THEN 1 WHEN 'high' THEN 2 WHEN 'medium' THEN 3 WHEN 'low' THEN 4 END, b.created_at").all(sessionId);
441
+ const interactions = db.prepare("SELECT i.*, c.name as component_name FROM ui_dive_interactions i JOIN ui_dive_components c ON i.component_id = c.id WHERE i.session_id = ? ORDER BY c.id, i.sequence_num").all(sessionId);
442
+ // Mark session complete
443
+ if (completeSession !== false) {
444
+ db.prepare("UPDATE ui_dive_sessions SET status = 'completed', completed_at = datetime('now') WHERE id = ?").run(sessionId);
445
+ }
446
+ // Build per-component summaries
447
+ const componentDetails = components.map(c => {
448
+ const cBugs = bugs.filter((b) => b.component_id === c.id);
449
+ const cInteractions = interactions.filter((i) => i.component_id === c.id);
450
+ return {
451
+ id: c.id,
452
+ name: c.name,
453
+ type: c.component_type,
454
+ status: c.status,
455
+ agent: c.agent_id,
456
+ summary: c.summary,
457
+ interactionCount: cInteractions.length,
458
+ bugs: cBugs.map((b) => ({
459
+ id: b.id,
460
+ severity: b.severity,
461
+ category: b.category,
462
+ title: b.title,
463
+ description: b.description,
464
+ expected: b.expected,
465
+ actual: b.actual,
466
+ })),
467
+ interactions: cInteractions.map((i) => ({
468
+ seq: i.sequence_num,
469
+ action: i.action,
470
+ target: i.target,
471
+ result: i.result,
472
+ observation: i.observation,
473
+ })),
474
+ };
475
+ });
476
+ const completed = components.filter(c => c.status === "completed").length;
477
+ const criticalBugs = bugs.filter((b) => b.severity === "critical").length;
478
+ const highBugs = bugs.filter((b) => b.severity === "high").length;
479
+ const healthScore = components.length > 0
480
+ ? Math.max(0, Math.round(100 - (criticalBugs * 25) - (highBugs * 10) - (bugs.length * 2)))
481
+ : 0;
482
+ const xmlTree = `<app name="${session.app_name ?? session.app_url}" url="${session.app_url}">\n${buildTreeXml(components, bugs, null, 1)}</app>`;
483
+ const mermaid = buildMermaidDiagram(components, bugs);
484
+ return {
485
+ report: {
486
+ title: `UI/UX Full Dive Report: ${session.app_name ?? session.app_url}`,
487
+ appUrl: session.app_url,
488
+ sessionId,
489
+ createdAt: session.created_at,
490
+ completedAt: new Date().toISOString(),
491
+ healthScore,
492
+ healthGrade: healthScore >= 90 ? "A" : healthScore >= 75 ? "B" : healthScore >= 60 ? "C" : healthScore >= 40 ? "D" : "F",
493
+ },
494
+ summary: {
495
+ totalComponents: components.length,
496
+ completedComponents: completed,
497
+ totalInteractions: interactions.length,
498
+ totalBugs: bugs.length,
499
+ bugsBySeverity: {
500
+ critical: criticalBugs,
501
+ high: highBugs,
502
+ medium: bugs.filter((b) => b.severity === "medium").length,
503
+ low: bugs.filter((b) => b.severity === "low").length,
504
+ },
505
+ bugsByCategory: Object.fromEntries([...new Set(bugs.map((b) => b.category))].map(cat => [
506
+ cat,
507
+ bugs.filter((b) => b.category === cat).length,
508
+ ])),
509
+ agentsUsed: [...new Set(components.filter(c => c.agent_id).map(c => c.agent_id))],
510
+ },
511
+ xmlTree,
512
+ mermaidDiagram: mermaid,
513
+ components: componentDetails,
514
+ recommendations: [
515
+ ...(criticalBugs > 0 ? [`FIX IMMEDIATELY: ${criticalBugs} critical bug(s) found — these block usability.`] : []),
516
+ ...(highBugs > 0 ? [`HIGH PRIORITY: ${highBugs} high-severity bug(s) should be fixed before next release.`] : []),
517
+ ...(completed < components.length ? [`${components.length - completed} component(s) not fully tested — consider re-running the dive.`] : []),
518
+ ...(interactions.length === 0 ? ["No interactions logged — ensure subagents are calling log_interaction during traversal."] : []),
519
+ ...(bugs.some((b) => b.category === "accessibility") ? ["Accessibility issues found — run an a11y audit with axe-core or lighthouse."] : []),
520
+ ...(bugs.some((b) => b.category === "responsive") ? ["Responsive issues found — test with capture_responsive_suite across breakpoints."] : []),
521
+ ],
522
+ };
523
+ },
524
+ },
525
+ ];
526
+ //# sourceMappingURL=uiUxDiveTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiUxDiveTools.js","sourceRoot":"","sources":["../../src/tools/uiUxDiveTools.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ import { emailTools } from "./tools/emailTools.js";
38
38
  import { rssTools } from "./tools/rssTools.js";
39
39
  import { architectTools } from "./tools/architectTools.js";
40
40
  import { toonTools } from "./tools/toonTools.js";
41
+ import { uiUxDiveTools } from "./tools/uiUxDiveTools.js";
41
42
  export const TOOLSET_MAP = {
42
43
  verification: verificationTools,
43
44
  eval: evalTools,
@@ -73,6 +74,7 @@ export const TOOLSET_MAP = {
73
74
  email: emailTools,
74
75
  rss: rssTools,
75
76
  architect: architectTools,
77
+ ui_ux_dive: uiUxDiveTools,
76
78
  };
77
79
  // Pre-computed tool name → toolset name lookup
78
80
  export const TOOL_TO_TOOLSET = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"toolsetRegistry.js","sourceRoot":"","sources":["../src/toolsetRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolsetRegistry.js","sourceRoot":"","sources":["../src/toolsetRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,YAAY,EAAE,iBAAiB;IAC/B,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,gBAAgB;IAC9B,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,UAAU;IACjB,UAAU,EAAE,cAAc;IAC1B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,cAAc;IAC1B,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,kBAAkB;IACxB,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,kBAAkB;IAC5B,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,gBAAgB,EAAE,oBAAoB;IACtC,iBAAiB,EAAE,qBAAqB;IACxC,UAAU,EAAE,cAAc;IAC1B,WAAW,EAAE,gBAAgB;IAC7B,SAAS,EAAE,uBAAuB;IAClC,cAAc,EAAE,kBAAkB;IAClC,YAAY,EAAE,gBAAgB;IAC9B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,YAAY;IACrB,YAAY,EAAE,gBAAgB;IAC9B,GAAG,EAAE,QAAQ;IACb,YAAY,EAAE,gBAAgB;IAC9B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,QAAQ;IACb,SAAS,EAAE,cAAc;IACzB,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF,+CAA+C;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebench-mcp",
3
- "version": "2.18.4",
3
+ "version": "2.19.0",
4
4
  "description": "Make AI agents catch the bugs they normally ship. 175 MCP tools across 34 domains: AI Flywheel methodology (6-phase verification + eval-driven development), structured research, 3-layer testing, quality gates, persistent knowledge, LLM calling, security analysis, visual regression, academic writing, local file parsing, flicker detection, Figma flow analysis, contract compliance scoring, TOON encoding (~40% token savings), pattern mining, git workflow compliance, SEO audit, voice bridge, agent mailbox, progressive discovery with 8-mode hybrid search + neural embeddings (local HuggingFace / Google / OpenAI fallback), model-tier complexity routing, agent contract (front-door + anti-rationalization), session memory, 6 GAIA media solvers, adaptive architect (structural code analysis + concept verification + implementation planning), email (SMTP/IMAP send+read+draft+setup wizard), RSS/Atom feed monitoring with research digest pipeline scaffolding, Agent-as-a-Graph bipartite embedding search (arxiv:2511.18194) with type-conditioned wRRF, MCP annotations (category/phase/complexity), critter intentionality checkpoint. Default: 39 tools (complete AI Flywheel, ~76% fewer). Full: 175 tools.",
5
5
  "type": "module",
6
6
  "bin": {