nodebench-mcp 2.69.0 → 3.0.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.
Files changed (214) hide show
  1. package/README.md +95 -39
  2. package/dist/agents/alertRouter.d.ts +38 -0
  3. package/dist/agents/alertRouter.js +151 -0
  4. package/dist/agents/alertRouter.js.map +1 -0
  5. package/dist/agents/entityMemory.d.ts +40 -0
  6. package/dist/agents/entityMemory.js +64 -0
  7. package/dist/agents/entityMemory.js.map +1 -0
  8. package/dist/agents/subAgents.d.ts +35 -0
  9. package/dist/agents/subAgents.js +62 -0
  10. package/dist/agents/subAgents.js.map +1 -0
  11. package/dist/benchmarks/benchmarkRunner.js +14 -0
  12. package/dist/benchmarks/benchmarkRunner.js.map +1 -1
  13. package/dist/benchmarks/chainEval.js +107 -0
  14. package/dist/benchmarks/chainEval.js.map +1 -1
  15. package/dist/benchmarks/llmJudgeEval.js +85 -0
  16. package/dist/benchmarks/llmJudgeEval.js.map +1 -1
  17. package/dist/benchmarks/searchQualityEval.js +118 -5
  18. package/dist/benchmarks/searchQualityEval.js.map +1 -1
  19. package/dist/cli/search.d.ts +13 -0
  20. package/dist/cli/search.js +130 -0
  21. package/dist/cli/search.js.map +1 -0
  22. package/dist/db.d.ts +6 -2
  23. package/dist/db.js +470 -3
  24. package/dist/db.js.map +1 -1
  25. package/dist/index.js +349 -64
  26. package/dist/index.js.map +1 -1
  27. package/dist/profiler/behaviorStore.d.ts +97 -0
  28. package/dist/profiler/behaviorStore.js +276 -0
  29. package/dist/profiler/behaviorStore.js.map +1 -0
  30. package/dist/profiler/eventCollector.d.ts +119 -0
  31. package/dist/profiler/eventCollector.js +267 -0
  32. package/dist/profiler/eventCollector.js.map +1 -0
  33. package/dist/profiler/index.d.ts +15 -0
  34. package/dist/profiler/index.js +16 -0
  35. package/dist/profiler/index.js.map +1 -0
  36. package/dist/profiler/mcpProxy.d.ts +49 -0
  37. package/dist/profiler/mcpProxy.js +123 -0
  38. package/dist/profiler/mcpProxy.js.map +1 -0
  39. package/dist/profiler/modelRouter.d.ts +30 -0
  40. package/dist/profiler/modelRouter.js +99 -0
  41. package/dist/profiler/modelRouter.js.map +1 -0
  42. package/dist/profiler/otelReceiver.d.ts +17 -0
  43. package/dist/profiler/otelReceiver.js +62 -0
  44. package/dist/profiler/otelReceiver.js.map +1 -0
  45. package/dist/profiler/proofEngine.d.ts +41 -0
  46. package/dist/profiler/proofEngine.js +93 -0
  47. package/dist/profiler/proofEngine.js.map +1 -0
  48. package/dist/profiler/workflowTemplates.d.ts +41 -0
  49. package/dist/profiler/workflowTemplates.js +95 -0
  50. package/dist/profiler/workflowTemplates.js.map +1 -0
  51. package/dist/providers/localMemoryProvider.js +3 -2
  52. package/dist/providers/localMemoryProvider.js.map +1 -1
  53. package/dist/runtimeConfig.d.ts +11 -0
  54. package/dist/runtimeConfig.js +27 -0
  55. package/dist/runtimeConfig.js.map +1 -0
  56. package/dist/security/auditLog.js +8 -3
  57. package/dist/security/auditLog.js.map +1 -1
  58. package/dist/subconscious/blocks.d.ts +43 -0
  59. package/dist/subconscious/blocks.js +158 -0
  60. package/dist/subconscious/blocks.js.map +1 -0
  61. package/dist/subconscious/classifier.d.ts +22 -0
  62. package/dist/subconscious/classifier.js +118 -0
  63. package/dist/subconscious/classifier.js.map +1 -0
  64. package/dist/subconscious/graphEngine.d.ts +65 -0
  65. package/dist/subconscious/graphEngine.js +234 -0
  66. package/dist/subconscious/graphEngine.js.map +1 -0
  67. package/dist/subconscious/index.d.ts +19 -0
  68. package/dist/subconscious/index.js +20 -0
  69. package/dist/subconscious/index.js.map +1 -0
  70. package/dist/subconscious/tools.d.ts +5 -0
  71. package/dist/subconscious/tools.js +255 -0
  72. package/dist/subconscious/tools.js.map +1 -0
  73. package/dist/subconscious/whisperPolicy.d.ts +20 -0
  74. package/dist/subconscious/whisperPolicy.js +171 -0
  75. package/dist/subconscious/whisperPolicy.js.map +1 -0
  76. package/dist/sweep/engine.d.ts +27 -0
  77. package/dist/sweep/engine.js +244 -0
  78. package/dist/sweep/engine.js.map +1 -0
  79. package/dist/sweep/index.d.ts +9 -0
  80. package/dist/sweep/index.js +8 -0
  81. package/dist/sweep/index.js.map +1 -0
  82. package/dist/sweep/sources/github_trending.d.ts +6 -0
  83. package/dist/sweep/sources/github_trending.js +37 -0
  84. package/dist/sweep/sources/github_trending.js.map +1 -0
  85. package/dist/sweep/sources/hackernews.d.ts +7 -0
  86. package/dist/sweep/sources/hackernews.js +57 -0
  87. package/dist/sweep/sources/hackernews.js.map +1 -0
  88. package/dist/sweep/sources/openbb_finance.d.ts +9 -0
  89. package/dist/sweep/sources/openbb_finance.js +46 -0
  90. package/dist/sweep/sources/openbb_finance.js.map +1 -0
  91. package/dist/sweep/sources/producthunt.d.ts +6 -0
  92. package/dist/sweep/sources/producthunt.js +41 -0
  93. package/dist/sweep/sources/producthunt.js.map +1 -0
  94. package/dist/sweep/sources/web_signals.d.ts +7 -0
  95. package/dist/sweep/sources/web_signals.js +63 -0
  96. package/dist/sweep/sources/web_signals.js.map +1 -0
  97. package/dist/sweep/sources/yahoo_finance.d.ts +6 -0
  98. package/dist/sweep/sources/yahoo_finance.js +47 -0
  99. package/dist/sweep/sources/yahoo_finance.js.map +1 -0
  100. package/dist/sweep/types.d.ts +50 -0
  101. package/dist/sweep/types.js +9 -0
  102. package/dist/sweep/types.js.map +1 -0
  103. package/dist/sync/founderEpisodeStore.d.ts +98 -0
  104. package/dist/sync/founderEpisodeStore.js +230 -0
  105. package/dist/sync/founderEpisodeStore.js.map +1 -0
  106. package/dist/sync/hyperloopArchive.d.ts +51 -0
  107. package/dist/sync/hyperloopArchive.js +153 -0
  108. package/dist/sync/hyperloopArchive.js.map +1 -0
  109. package/dist/sync/hyperloopEval.d.ts +123 -0
  110. package/dist/sync/hyperloopEval.js +389 -0
  111. package/dist/sync/hyperloopEval.js.map +1 -0
  112. package/dist/sync/hyperloopEval.test.d.ts +4 -0
  113. package/dist/sync/hyperloopEval.test.js +60 -0
  114. package/dist/sync/hyperloopEval.test.js.map +1 -0
  115. package/dist/sync/protocol.d.ts +172 -0
  116. package/dist/sync/protocol.js +9 -0
  117. package/dist/sync/protocol.js.map +1 -0
  118. package/dist/sync/sessionMemory.d.ts +47 -0
  119. package/dist/sync/sessionMemory.js +138 -0
  120. package/dist/sync/sessionMemory.js.map +1 -0
  121. package/dist/sync/store.d.ts +384 -0
  122. package/dist/sync/store.js +1435 -0
  123. package/dist/sync/store.js.map +1 -0
  124. package/dist/sync/store.test.d.ts +4 -0
  125. package/dist/sync/store.test.js +43 -0
  126. package/dist/sync/store.test.js.map +1 -0
  127. package/dist/sync/syncBridgeClient.d.ts +30 -0
  128. package/dist/sync/syncBridgeClient.js +172 -0
  129. package/dist/sync/syncBridgeClient.js.map +1 -0
  130. package/dist/tools/autonomousDeliveryTools.d.ts +2 -0
  131. package/dist/tools/autonomousDeliveryTools.js +1104 -0
  132. package/dist/tools/autonomousDeliveryTools.js.map +1 -0
  133. package/dist/tools/claudeCodeIngestTools.d.ts +10 -0
  134. package/dist/tools/claudeCodeIngestTools.js +347 -0
  135. package/dist/tools/claudeCodeIngestTools.js.map +1 -0
  136. package/dist/tools/coreWorkflowTools.d.ts +2 -0
  137. package/dist/tools/coreWorkflowTools.js +488 -0
  138. package/dist/tools/coreWorkflowTools.js.map +1 -0
  139. package/dist/tools/deltaTools.d.ts +15 -0
  140. package/dist/tools/deltaTools.js +1522 -0
  141. package/dist/tools/deltaTools.js.map +1 -0
  142. package/dist/tools/entityLookupTools.d.ts +14 -0
  143. package/dist/tools/entityLookupTools.js +159 -0
  144. package/dist/tools/entityLookupTools.js.map +1 -0
  145. package/dist/tools/entityTemporalTools.d.ts +12 -0
  146. package/dist/tools/entityTemporalTools.js +330 -0
  147. package/dist/tools/entityTemporalTools.js.map +1 -0
  148. package/dist/tools/founderLocalPipeline.d.ts +215 -0
  149. package/dist/tools/founderLocalPipeline.js +1516 -2
  150. package/dist/tools/founderLocalPipeline.js.map +1 -1
  151. package/dist/tools/founderOperatingModel.d.ts +120 -0
  152. package/dist/tools/founderOperatingModel.js +469 -0
  153. package/dist/tools/founderOperatingModel.js.map +1 -0
  154. package/dist/tools/founderOperatingModelTools.d.ts +2 -0
  155. package/dist/tools/founderOperatingModelTools.js +169 -0
  156. package/dist/tools/founderOperatingModelTools.js.map +1 -0
  157. package/dist/tools/founderStrategicOpsTools.d.ts +2 -0
  158. package/dist/tools/founderStrategicOpsTools.js +1310 -0
  159. package/dist/tools/founderStrategicOpsTools.js.map +1 -0
  160. package/dist/tools/graphifyTools.d.ts +19 -0
  161. package/dist/tools/graphifyTools.js +375 -0
  162. package/dist/tools/graphifyTools.js.map +1 -0
  163. package/dist/tools/index.d.ts +3 -0
  164. package/dist/tools/index.js +4 -0
  165. package/dist/tools/index.js.map +1 -1
  166. package/dist/tools/monteCarloTools.d.ts +16 -0
  167. package/dist/tools/monteCarloTools.js +225 -0
  168. package/dist/tools/monteCarloTools.js.map +1 -0
  169. package/dist/tools/packetCompilerTools.d.ts +12 -0
  170. package/dist/tools/packetCompilerTools.js +322 -0
  171. package/dist/tools/packetCompilerTools.js.map +1 -0
  172. package/dist/tools/planSynthesisTools.d.ts +15 -0
  173. package/dist/tools/planSynthesisTools.js +455 -0
  174. package/dist/tools/planSynthesisTools.js.map +1 -0
  175. package/dist/tools/profilerTools.d.ts +20 -0
  176. package/dist/tools/profilerTools.js +364 -0
  177. package/dist/tools/profilerTools.js.map +1 -0
  178. package/dist/tools/savingsTools.d.ts +11 -0
  179. package/dist/tools/savingsTools.js +155 -0
  180. package/dist/tools/savingsTools.js.map +1 -0
  181. package/dist/tools/scenarioCompilerTools.d.ts +14 -0
  182. package/dist/tools/scenarioCompilerTools.js +290 -0
  183. package/dist/tools/scenarioCompilerTools.js.map +1 -0
  184. package/dist/tools/sharedContextTools.d.ts +2 -0
  185. package/dist/tools/sharedContextTools.js +423 -0
  186. package/dist/tools/sharedContextTools.js.map +1 -0
  187. package/dist/tools/sitemapTools.d.ts +15 -0
  188. package/dist/tools/sitemapTools.js +560 -0
  189. package/dist/tools/sitemapTools.js.map +1 -0
  190. package/dist/tools/sweepTools.d.ts +9 -0
  191. package/dist/tools/sweepTools.js +112 -0
  192. package/dist/tools/sweepTools.js.map +1 -0
  193. package/dist/tools/syncBridgeTools.d.ts +2 -0
  194. package/dist/tools/syncBridgeTools.js +258 -0
  195. package/dist/tools/syncBridgeTools.js.map +1 -0
  196. package/dist/tools/toolRegistry.js +1216 -49
  197. package/dist/tools/toolRegistry.js.map +1 -1
  198. package/dist/tools/workspaceTools.d.ts +19 -0
  199. package/dist/tools/workspaceTools.js +762 -0
  200. package/dist/tools/workspaceTools.js.map +1 -0
  201. package/dist/toolsetRegistry.js +88 -2
  202. package/dist/toolsetRegistry.js.map +1 -1
  203. package/package.json +36 -36
  204. package/rules/nodebench-agentic-reliability.md +32 -0
  205. package/rules/nodebench-analyst-diagnostic.md +25 -0
  206. package/rules/nodebench-auto-qa.md +31 -0
  207. package/rules/nodebench-completion-traceability.md +22 -0
  208. package/rules/nodebench-flywheel-continuous.md +25 -0
  209. package/rules/nodebench-pre-release-review.md +24 -0
  210. package/rules/nodebench-qa-dogfood.md +26 -0
  211. package/rules/nodebench-scenario-testing.md +30 -0
  212. package/rules/nodebench-self-direction.md +23 -0
  213. package/rules/nodebench-self-judge-loop.md +24 -0
  214. package/scripts/install.sh +215 -0
@@ -0,0 +1,560 @@
1
+ /**
2
+ * Sitemap Tools — Interactive site map with stateful drill-down + diff crawl + test suggestion
3
+ *
4
+ * Provides retention.sh-style interactive site exploration:
5
+ * site_map({ url }) → crawl, store session
6
+ * site_map({ action: 'overview' }) → navigation graph
7
+ * site_map({ action: 'screen', index: N }) → drill into page
8
+ * site_map({ action: 'screenshot', index: N }) → return screenshot
9
+ * site_map({ action: 'findings' }) → QA findings
10
+ *
11
+ * diff_crawl({ url }) → baseline or compare
12
+ * suggest_tests({ session_id }) → generate test cases from crawl
13
+ */
14
+ const MAX_SESSIONS = 20;
15
+ const SESSION_TTL_MS = 10 * 60 * 1000; // 10 minutes
16
+ const sessions = new Map();
17
+ function evictStaleSessions() {
18
+ const now = Date.now();
19
+ for (const [id, session] of sessions) {
20
+ if (now - session.crawledAt > SESSION_TTL_MS) {
21
+ sessions.delete(id);
22
+ }
23
+ }
24
+ // Hard cap
25
+ while (sessions.size > MAX_SESSIONS) {
26
+ const oldest = sessions.keys().next().value;
27
+ if (oldest)
28
+ sessions.delete(oldest);
29
+ }
30
+ }
31
+ function genSessionId() {
32
+ return `sm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
33
+ }
34
+ // ─── Lightweight crawler (no external deps) ───────────────────────────────────
35
+ async function crawlSite(baseUrl, maxPages = 30) {
36
+ const visited = new Set();
37
+ const pages = [];
38
+ const queue = [baseUrl];
39
+ const { URL } = await import("node:url");
40
+ const baseHost = new URL(baseUrl).hostname;
41
+ while (queue.length > 0 && pages.length < maxPages) {
42
+ const url = queue.shift();
43
+ const normalized = url.split("#")[0].split("?")[0]; // strip hash/query for dedup
44
+ if (visited.has(normalized))
45
+ continue;
46
+ visited.add(normalized);
47
+ try {
48
+ const controller = new AbortController();
49
+ const timeout = setTimeout(() => controller.abort(), 10_000);
50
+ const res = await fetch(url, {
51
+ signal: controller.signal,
52
+ headers: { "User-Agent": "NodeBench-SiteMap/1.0" },
53
+ redirect: "follow",
54
+ });
55
+ clearTimeout(timeout);
56
+ const contentType = res.headers.get("content-type") || "";
57
+ if (!contentType.includes("text/html")) {
58
+ pages.push({ url, title: "(non-HTML)", status: res.status, interactiveElements: 0, outgoingLinks: [], consoleErrors: [] });
59
+ continue;
60
+ }
61
+ // Read body with size cap (2MB)
62
+ const MAX_BODY = 2 * 1024 * 1024;
63
+ const body = await res.text();
64
+ const truncated = body.length > MAX_BODY ? body.slice(0, MAX_BODY) : body;
65
+ // Extract title
66
+ const titleMatch = truncated.match(/<title[^>]*>([^<]*)<\/title>/i);
67
+ const title = titleMatch ? titleMatch[1].trim() : "(no title)";
68
+ // Extract links
69
+ const linkRegex = /href=["']([^"'#]+)["']/gi;
70
+ const links = [];
71
+ let match;
72
+ while ((match = linkRegex.exec(truncated)) !== null) {
73
+ try {
74
+ const resolved = new URL(match[1], url).href;
75
+ if (new URL(resolved).hostname === baseHost && !visited.has(resolved.split("#")[0].split("?")[0])) {
76
+ links.push(resolved);
77
+ queue.push(resolved);
78
+ }
79
+ }
80
+ catch { /* invalid URL */ }
81
+ }
82
+ // Count interactive elements
83
+ const interactiveRegex = /<(button|input|select|textarea|a\s)/gi;
84
+ let interactiveCount = 0;
85
+ while (interactiveRegex.exec(truncated))
86
+ interactiveCount++;
87
+ pages.push({
88
+ url,
89
+ title,
90
+ status: res.status,
91
+ interactiveElements: interactiveCount,
92
+ outgoingLinks: links.slice(0, 50),
93
+ consoleErrors: [],
94
+ });
95
+ }
96
+ catch (e) {
97
+ pages.push({
98
+ url,
99
+ title: "(fetch failed)",
100
+ status: 0,
101
+ interactiveElements: 0,
102
+ outgoingLinks: [],
103
+ consoleErrors: [e.message],
104
+ });
105
+ }
106
+ }
107
+ return pages;
108
+ }
109
+ function analyzeFindings(pages) {
110
+ const findings = [];
111
+ // Check for failed pages
112
+ for (let i = 0; i < pages.length; i++) {
113
+ if (pages[i].status === 0) {
114
+ findings.push({ severity: "error", message: `Page unreachable: ${pages[i].url}`, pageIndex: i });
115
+ }
116
+ else if (pages[i].status >= 400) {
117
+ findings.push({ severity: "error", message: `HTTP ${pages[i].status}: ${pages[i].url}`, pageIndex: i });
118
+ }
119
+ }
120
+ // Check for pages with no interactive elements
121
+ for (let i = 0; i < pages.length; i++) {
122
+ if (pages[i].interactiveElements === 0 && pages[i].status === 200) {
123
+ findings.push({ severity: "warning", message: `No interactive elements: ${pages[i].url}`, pageIndex: i });
124
+ }
125
+ }
126
+ // Check for console errors
127
+ for (let i = 0; i < pages.length; i++) {
128
+ if (pages[i].consoleErrors.length > 0) {
129
+ findings.push({ severity: "warning", message: `Console errors on ${pages[i].url}: ${pages[i].consoleErrors.join("; ")}`, pageIndex: i });
130
+ }
131
+ }
132
+ // SPA detection
133
+ const allSamePath = pages.every(p => new URL(p.url).pathname === new URL(pages[0].url).pathname);
134
+ if (pages.length === 1 || allSamePath) {
135
+ findings.push({ severity: "info", message: "Single-page app detected — install NodeBench locally for deeper SPA crawling" });
136
+ }
137
+ return findings;
138
+ }
139
+ // ─── Diff crawl baseline storage ──────────────────────────────────────────────
140
+ const MAX_BASELINES = 10;
141
+ const baselines = new Map();
142
+ function evictStaleBaselines() {
143
+ while (baselines.size > MAX_BASELINES) {
144
+ const oldest = baselines.keys().next().value;
145
+ if (oldest)
146
+ baselines.delete(oldest);
147
+ }
148
+ }
149
+ // ─── Tools ────────────────────────────────────────────────────────────────────
150
+ export const sitemapTools = [
151
+ // ── site_map ──────────────────────────────────────────────────────────
152
+ {
153
+ name: "site_map",
154
+ description: "Interactive site map with stateful drill-down. First call with { url } to crawl. Then use { action: 'overview' | 'screen' | 'screenshot' | 'findings' } to explore. Returns session_id for subsequent calls.",
155
+ inputSchema: {
156
+ type: "object",
157
+ properties: {
158
+ url: {
159
+ type: "string",
160
+ description: "URL to crawl (initial call only)",
161
+ },
162
+ session_id: {
163
+ type: "string",
164
+ description: "Session ID from previous site_map call",
165
+ },
166
+ action: {
167
+ type: "string",
168
+ enum: ["overview", "screen", "screenshot", "findings"],
169
+ description: "Drill-down action (requires session_id)",
170
+ },
171
+ index: {
172
+ type: "number",
173
+ description: "Page index for 'screen' and 'screenshot' actions",
174
+ },
175
+ max_pages: {
176
+ type: "number",
177
+ description: "Maximum pages to crawl (default: 30, max: 50)",
178
+ },
179
+ },
180
+ },
181
+ annotations: { readOnlyHint: true, openWorldHint: true },
182
+ handler: async (args) => {
183
+ evictStaleSessions();
184
+ // ── Initial crawl ──
185
+ if (args.url && !args.action) {
186
+ const maxPages = Math.min(args.max_pages ?? 30, 50);
187
+ const pages = await crawlSite(args.url, maxPages);
188
+ const findings = analyzeFindings(pages);
189
+ const session = {
190
+ id: genSessionId(),
191
+ baseUrl: args.url,
192
+ pages,
193
+ crawledAt: Date.now(),
194
+ findings,
195
+ };
196
+ sessions.set(session.id, session);
197
+ return {
198
+ session_id: session.id,
199
+ screensCount: pages.length,
200
+ elementsCount: pages.reduce((s, p) => s + p.interactiveElements, 0),
201
+ findingsCount: findings.length,
202
+ screens: pages.map((p, i) => ({
203
+ index: i,
204
+ path: new URL(p.url).pathname,
205
+ title: p.title,
206
+ elements: p.interactiveElements,
207
+ status: p.status,
208
+ })),
209
+ next: [
210
+ `site_map({ session_id: '${session.id}', action: 'overview' })`,
211
+ `site_map({ session_id: '${session.id}', action: 'screen', index: 0 })`,
212
+ `site_map({ session_id: '${session.id}', action: 'findings' })`,
213
+ ],
214
+ };
215
+ }
216
+ // ── Drill-down requires session ──
217
+ const session = sessions.get(args.session_id ?? "");
218
+ if (!session) {
219
+ return { error: "Session not found or expired. Call site_map({ url }) first to crawl." };
220
+ }
221
+ switch (args.action) {
222
+ case "overview": {
223
+ // Navigation graph
224
+ const graph = {};
225
+ for (const page of session.pages) {
226
+ const path = new URL(page.url).pathname;
227
+ graph[path] = page.outgoingLinks.map(l => {
228
+ try {
229
+ return new URL(l).pathname;
230
+ }
231
+ catch {
232
+ return l;
233
+ }
234
+ });
235
+ }
236
+ return {
237
+ session_id: session.id,
238
+ baseUrl: session.baseUrl,
239
+ pageCount: session.pages.length,
240
+ navigationGraph: graph,
241
+ next: [
242
+ `site_map({ session_id: '${session.id}', action: 'screen', index: 0 })`,
243
+ `site_map({ session_id: '${session.id}', action: 'findings' })`,
244
+ ],
245
+ };
246
+ }
247
+ case "screen": {
248
+ const idx = args.index ?? 0;
249
+ if (idx < 0 || idx >= session.pages.length) {
250
+ return { error: `Index ${idx} out of range (0-${session.pages.length - 1})` };
251
+ }
252
+ const page = session.pages[idx];
253
+ return {
254
+ index: idx,
255
+ url: page.url,
256
+ title: page.title,
257
+ status: page.status,
258
+ interactiveElements: page.interactiveElements,
259
+ outgoingLinks: page.outgoingLinks.length,
260
+ consoleErrors: page.consoleErrors,
261
+ hasScreenshot: !!page.screenshot,
262
+ next: [
263
+ `site_map({ session_id: '${session.id}', action: 'screenshot', index: ${idx} })`,
264
+ `site_map({ session_id: '${session.id}', action: 'findings' })`,
265
+ `site_map({ session_id: '${session.id}', action: 'overview' })`,
266
+ ],
267
+ };
268
+ }
269
+ case "screenshot": {
270
+ const idx = args.index ?? 0;
271
+ if (idx < 0 || idx >= session.pages.length) {
272
+ return { error: `Index ${idx} out of range (0-${session.pages.length - 1})` };
273
+ }
274
+ const page = session.pages[idx];
275
+ if (page.screenshot) {
276
+ return {
277
+ index: idx,
278
+ url: page.url,
279
+ screenshot: page.screenshot,
280
+ note: "Screenshot available (base64 JPEG)",
281
+ };
282
+ }
283
+ return {
284
+ index: idx,
285
+ url: page.url,
286
+ note: "Screenshot not available — this lightweight crawler does not capture screenshots. Use capture_responsive_suite({ url }) for visual capture, or install Playwright for full browser rendering.",
287
+ suggestion: `capture_responsive_suite({ url: '${page.url}' })`,
288
+ };
289
+ }
290
+ case "findings": {
291
+ return {
292
+ session_id: session.id,
293
+ totalFindings: session.findings.length,
294
+ errors: session.findings.filter(f => f.severity === "error"),
295
+ warnings: session.findings.filter(f => f.severity === "warning"),
296
+ info: session.findings.filter(f => f.severity === "info"),
297
+ next: [
298
+ `site_map({ session_id: '${session.id}', action: 'overview' })`,
299
+ `suggest_tests({ session_id: '${session.id}' })`,
300
+ `diff_crawl({ url: '${session.baseUrl}' })`,
301
+ ],
302
+ };
303
+ }
304
+ default:
305
+ return { error: `Unknown action: ${args.action}. Use: overview, screen, screenshot, findings` };
306
+ }
307
+ },
308
+ },
309
+ // ── diff_crawl ────────────────────────────────────────────────────────
310
+ {
311
+ name: "diff_crawl",
312
+ description: "Before/after site comparison. First call captures baseline. Second call diffs against baseline. Shows added/removed/changed pages.",
313
+ inputSchema: {
314
+ type: "object",
315
+ properties: {
316
+ url: {
317
+ type: "string",
318
+ description: "URL to crawl and compare",
319
+ },
320
+ baseline_id: {
321
+ type: "string",
322
+ description: "Baseline session ID to compare against (omit to capture new baseline)",
323
+ },
324
+ max_pages: {
325
+ type: "number",
326
+ description: "Maximum pages to crawl (default: 30, max: 50)",
327
+ },
328
+ },
329
+ required: ["url"],
330
+ },
331
+ annotations: { readOnlyHint: true, openWorldHint: true },
332
+ handler: async (args) => {
333
+ evictStaleBaselines();
334
+ const maxPages = Math.min(args.max_pages ?? 30, 50);
335
+ // If no baseline, capture one
336
+ if (!args.baseline_id) {
337
+ const pages = await crawlSite(args.url, maxPages);
338
+ const findings = analyzeFindings(pages);
339
+ const session = {
340
+ id: genSessionId(),
341
+ baseUrl: args.url,
342
+ pages,
343
+ crawledAt: Date.now(),
344
+ findings,
345
+ };
346
+ baselines.set(session.id, session);
347
+ sessions.set(session.id, session); // also accessible via site_map
348
+ return {
349
+ status: "baseline_captured",
350
+ baseline_id: session.id,
351
+ pageCount: pages.length,
352
+ findingsCount: findings.length,
353
+ instruction: `Make your changes, then run: diff_crawl({ url: '${args.url}', baseline_id: '${session.id}' })`,
354
+ };
355
+ }
356
+ // Diff against baseline
357
+ const baseline = baselines.get(args.baseline_id) || sessions.get(args.baseline_id);
358
+ if (!baseline) {
359
+ return { error: "Baseline not found or expired. Run diff_crawl({ url }) first to capture." };
360
+ }
361
+ const currentPages = await crawlSite(args.url, maxPages);
362
+ const currentFindings = analyzeFindings(currentPages);
363
+ // Compute diffs
364
+ const baseUrls = new Set(baseline.pages.map(p => p.url));
365
+ const currUrls = new Set(currentPages.map(p => p.url));
366
+ const added = currentPages.filter(p => !baseUrls.has(p.url));
367
+ const removed = baseline.pages.filter(p => !currUrls.has(p.url));
368
+ // Changed pages (same URL, different content)
369
+ const changed = [];
370
+ for (const curr of currentPages) {
371
+ const base = baseline.pages.find(p => p.url === curr.url);
372
+ if (base) {
373
+ const titleChanged = base.title !== curr.title;
374
+ const elementsChanged = curr.interactiveElements - base.interactiveElements;
375
+ const statusChanged = base.status !== curr.status;
376
+ if (titleChanged || elementsChanged !== 0 || statusChanged) {
377
+ changed.push({ url: curr.url, titleChanged, elementsChanged, statusChanged });
378
+ }
379
+ }
380
+ }
381
+ // New findings
382
+ const baselineFindingSet = new Set(baseline.findings.map(f => f.message));
383
+ const newFindings = currentFindings.filter(f => !baselineFindingSet.has(f.message));
384
+ const resolvedFindings = baseline.findings.filter(f => !currentFindings.some(cf => cf.message === f.message));
385
+ // Store current as new session
386
+ const session = {
387
+ id: genSessionId(),
388
+ baseUrl: args.url,
389
+ pages: currentPages,
390
+ crawledAt: Date.now(),
391
+ findings: currentFindings,
392
+ };
393
+ sessions.set(session.id, session);
394
+ return {
395
+ session_id: session.id,
396
+ baseline_id: args.baseline_id,
397
+ summary: {
398
+ baselinePages: baseline.pages.length,
399
+ currentPages: currentPages.length,
400
+ added: added.length,
401
+ removed: removed.length,
402
+ changed: changed.length,
403
+ newFindings: newFindings.length,
404
+ resolvedFindings: resolvedFindings.length,
405
+ },
406
+ added: added.map(p => ({ url: p.url, title: p.title })),
407
+ removed: removed.map(p => ({ url: p.url, title: p.title })),
408
+ changed,
409
+ newFindings,
410
+ resolvedFindings,
411
+ next: [
412
+ `site_map({ session_id: '${session.id}', action: 'findings' })`,
413
+ `suggest_tests({ session_id: '${session.id}' })`,
414
+ ],
415
+ };
416
+ },
417
+ },
418
+ // ── suggest_tests ─────────────────────────────────────────────────────
419
+ {
420
+ name: "suggest_tests",
421
+ description: "Generate scenario-based test suggestions from a site_map or diff_crawl session. Analyzes crawl findings and generates actionable test cases.",
422
+ inputSchema: {
423
+ type: "object",
424
+ properties: {
425
+ session_id: {
426
+ type: "string",
427
+ description: "Session ID from site_map or diff_crawl",
428
+ },
429
+ },
430
+ required: ["session_id"],
431
+ },
432
+ annotations: { readOnlyHint: true },
433
+ handler: async (args) => {
434
+ const session = sessions.get(args.session_id);
435
+ if (!session) {
436
+ return { error: "Session not found or expired. Run site_map({ url }) first." };
437
+ }
438
+ const tests = [];
439
+ // Generate tests from findings
440
+ for (const finding of session.findings) {
441
+ if (finding.severity === "error") {
442
+ if (finding.message.includes("unreachable")) {
443
+ tests.push({
444
+ name: `Test: Page availability — ${finding.message.split(": ")[1] || ""}`,
445
+ persona: "First-time visitor",
446
+ goal: "Access all pages without errors",
447
+ steps: [
448
+ `Navigate to ${session.pages[finding.pageIndex ?? 0]?.url || session.baseUrl}`,
449
+ "Wait for page load",
450
+ "Check HTTP status",
451
+ ],
452
+ assertions: [
453
+ "Status code is 200",
454
+ "Page content renders (not blank)",
455
+ "No console errors",
456
+ ],
457
+ category: "availability",
458
+ });
459
+ }
460
+ if (finding.message.includes("HTTP 4") || finding.message.includes("HTTP 5")) {
461
+ tests.push({
462
+ name: `Test: Error handling — ${finding.message}`,
463
+ persona: "Returning user with bookmarked link",
464
+ goal: "See helpful error page, not blank screen",
465
+ steps: [
466
+ `Navigate to failing URL`,
467
+ "Observe error handling",
468
+ ],
469
+ assertions: [
470
+ "Error page renders with helpful message",
471
+ "Navigation back to home is available",
472
+ "No raw error stack traces visible",
473
+ ],
474
+ category: "error_handling",
475
+ });
476
+ }
477
+ }
478
+ if (finding.severity === "warning" && finding.message.includes("No interactive elements")) {
479
+ tests.push({
480
+ name: `Test: Page interactivity — ${session.pages[finding.pageIndex ?? 0]?.title || "Unknown"}`,
481
+ persona: "Power user exploring features",
482
+ goal: "Find actionable content on every page",
483
+ steps: [
484
+ `Navigate to ${session.pages[finding.pageIndex ?? 0]?.url || ""}`,
485
+ "Look for buttons, links, or forms",
486
+ "Tab through page",
487
+ ],
488
+ assertions: [
489
+ "At least one interactive element exists",
490
+ "All interactive elements are keyboard accessible",
491
+ "Page has a clear call-to-action",
492
+ ],
493
+ category: "interactivity",
494
+ });
495
+ }
496
+ }
497
+ // Generate structural tests from crawl data
498
+ // Navigation completeness
499
+ const orphanPages = session.pages.filter((p, i) => i > 0 && !session.pages.some((other, j) => j !== i && other.outgoingLinks.includes(p.url)));
500
+ if (orphanPages.length > 0) {
501
+ tests.push({
502
+ name: "Test: Navigation completeness — orphan pages",
503
+ persona: "New user exploring via navigation",
504
+ goal: "Reach all pages through navigation links",
505
+ steps: [
506
+ "Start at home page",
507
+ "Click through all navigation links",
508
+ "Check if all pages are reachable",
509
+ ],
510
+ assertions: orphanPages.map(p => `Page ${new URL(p.url).pathname} is reachable from navigation`),
511
+ category: "navigation",
512
+ });
513
+ }
514
+ // Cross-page consistency
515
+ if (session.pages.length > 1) {
516
+ tests.push({
517
+ name: "Test: Cross-page consistency",
518
+ persona: "Quality reviewer",
519
+ goal: "Verify consistent layout and branding across all pages",
520
+ steps: session.pages.slice(0, 5).map(p => `Visit ${new URL(p.url).pathname}`),
521
+ assertions: [
522
+ "Header/navigation is consistent across pages",
523
+ "Footer is consistent across pages",
524
+ "Font and color scheme is consistent",
525
+ "No broken images or missing assets",
526
+ ],
527
+ category: "consistency",
528
+ });
529
+ }
530
+ // Mobile responsiveness
531
+ tests.push({
532
+ name: "Test: Mobile responsiveness",
533
+ persona: "Mobile user on iPhone 14",
534
+ goal: "Use the site comfortably on mobile",
535
+ steps: [
536
+ "Set viewport to 375x812",
537
+ ...session.pages.slice(0, 3).map(p => `Navigate to ${new URL(p.url).pathname}`),
538
+ ],
539
+ assertions: [
540
+ "No horizontal overflow",
541
+ "Touch targets >= 44px",
542
+ "Text is readable without zooming",
543
+ "Navigation is accessible (hamburger menu or bottom nav)",
544
+ ],
545
+ category: "responsive",
546
+ });
547
+ return {
548
+ session_id: args.session_id,
549
+ testCount: tests.length,
550
+ tests,
551
+ categories: [...new Set(tests.map(t => t.category))],
552
+ next: [
553
+ `site_map({ session_id: '${args.session_id}', action: 'overview' })`,
554
+ `diff_crawl({ url: '${session.baseUrl}' })`,
555
+ ],
556
+ };
557
+ },
558
+ },
559
+ ];
560
+ //# sourceMappingURL=sitemapTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemapTools.js","sourceRoot":"","sources":["../../src/tools/sitemapTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * sweepTools.ts — MCP tools for the Live Signal Sweep Engine.
3
+ *
4
+ * Exposes sweep, delta, and recommendation capabilities as MCP tools
5
+ * so Claude Code / Cursor / any MCP client can run sweeps and get
6
+ * real-time market intelligence.
7
+ */
8
+ import type { McpTool } from "../types.js";
9
+ export declare const sweepTools: McpTool[];