webmcp-cli 1.2.2 → 1.2.3

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 (330) hide show
  1. package/dist/analysis/form-to-tool-mapper.d.ts +61 -0
  2. package/dist/analysis/form-to-tool-mapper.js +360 -0
  3. package/dist/analysis/form-to-tool-mapper.js.map +1 -0
  4. package/dist/analysis/index.d.ts +84 -0
  5. package/dist/analysis/index.js +81 -0
  6. package/dist/analysis/index.js.map +1 -0
  7. package/dist/analysis/missing-tool-analyzer.d.ts +35 -0
  8. package/dist/analysis/missing-tool-analyzer.js +617 -0
  9. package/dist/analysis/missing-tool-analyzer.js.map +1 -0
  10. package/dist/audit/run-multi-page-audit.d.ts +34 -0
  11. package/dist/audit/run-multi-page-audit.js +233 -0
  12. package/dist/audit/run-multi-page-audit.js.map +1 -0
  13. package/dist/cli/commands/potential.d.ts +8 -0
  14. package/dist/cli/commands/potential.js +323 -0
  15. package/dist/cli/commands/potential.js.map +1 -0
  16. package/dist/cli/commands/report.d.ts +12 -0
  17. package/dist/cli/commands/report.js +89 -0
  18. package/dist/cli/commands/report.js.map +1 -0
  19. package/dist/cli/index.js +35 -0
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/config/defaults.d.ts +36 -0
  22. package/dist/config/defaults.js +33 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/index.d.ts +7 -0
  25. package/dist/config/index.js +7 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/config/loader.d.ts +22 -0
  28. package/dist/config/loader.js +91 -0
  29. package/dist/config/loader.js.map +1 -0
  30. package/dist/config/schema.d.ts +280 -0
  31. package/dist/config/schema.js +42 -0
  32. package/dist/config/schema.js.map +1 -0
  33. package/dist/core/types/audit.d.ts +1 -1
  34. package/dist/core/types/index.d.ts +1 -0
  35. package/dist/core/types/index.js +1 -0
  36. package/dist/core/types/index.js.map +1 -1
  37. package/dist/core/types/recon.d.ts +265 -0
  38. package/dist/core/types/recon.js +5 -0
  39. package/dist/core/types/recon.js.map +1 -0
  40. package/dist/core/types/rule.d.ts +1 -1
  41. package/dist/core/types/rule.js +7 -5
  42. package/dist/core/types/rule.js.map +1 -1
  43. package/dist/crawler/depth-crawler.d.ts +29 -0
  44. package/dist/crawler/depth-crawler.js +212 -0
  45. package/dist/crawler/depth-crawler.js.map +1 -0
  46. package/dist/crawler/index.d.ts +2 -0
  47. package/dist/crawler/index.js +3 -0
  48. package/dist/crawler/index.js.map +1 -0
  49. package/dist/crawler/link-extractor.d.ts +1 -0
  50. package/dist/crawler/link-extractor.js +49 -0
  51. package/dist/crawler/link-extractor.js.map +1 -0
  52. package/dist/generators/index.d.ts +10 -0
  53. package/dist/generators/index.js +8 -0
  54. package/dist/generators/index.js.map +1 -0
  55. package/dist/generators/report-html.d.ts +12 -0
  56. package/dist/generators/report-html.js +470 -0
  57. package/dist/generators/report-html.js.map +1 -0
  58. package/dist/generators/report-json.d.ts +95 -0
  59. package/dist/generators/report-json.js +144 -0
  60. package/dist/generators/report-json.js.map +1 -0
  61. package/dist/generators/report-manager.d.ts +31 -0
  62. package/dist/generators/report-manager.js +208 -0
  63. package/dist/generators/report-manager.js.map +1 -0
  64. package/dist/generators/tool-code-generator.d.ts +31 -0
  65. package/dist/generators/tool-code-generator.js +201 -0
  66. package/dist/generators/tool-code-generator.js.map +1 -0
  67. package/dist/potential/ai-recommender.d.ts +33 -0
  68. package/dist/potential/ai-recommender.js +414 -0
  69. package/dist/potential/ai-recommender.js.map +1 -0
  70. package/dist/potential/analyzer.d.ts +32 -0
  71. package/dist/potential/analyzer.js +383 -0
  72. package/dist/potential/analyzer.js.map +1 -0
  73. package/dist/potential/index.d.ts +3 -0
  74. package/dist/potential/index.js +4 -0
  75. package/dist/potential/index.js.map +1 -0
  76. package/dist/potential/prompts.d.ts +20 -0
  77. package/dist/potential/prompts.js +42 -0
  78. package/dist/potential/prompts.js.map +1 -0
  79. package/dist/potential/types.d.ts +40 -0
  80. package/dist/potential/types.js +2 -0
  81. package/dist/potential/types.js.map +1 -0
  82. package/dist/recon/index.d.ts +20 -0
  83. package/dist/recon/index.js +143 -0
  84. package/dist/recon/index.js.map +1 -0
  85. package/dist/recon/manifest.d.ts +16 -0
  86. package/dist/recon/manifest.js +108 -0
  87. package/dist/recon/manifest.js.map +1 -0
  88. package/dist/recon/meta-extractor.d.ts +11 -0
  89. package/dist/recon/meta-extractor.js +276 -0
  90. package/dist/recon/meta-extractor.js.map +1 -0
  91. package/dist/recon/robots.d.ts +16 -0
  92. package/dist/recon/robots.js +158 -0
  93. package/dist/recon/robots.js.map +1 -0
  94. package/dist/recon/route-discovery.d.ts +25 -0
  95. package/dist/recon/route-discovery.js +303 -0
  96. package/dist/recon/route-discovery.js.map +1 -0
  97. package/dist/recon/sitemap.d.ts +12 -0
  98. package/dist/recon/sitemap.js +177 -0
  99. package/dist/recon/sitemap.js.map +1 -0
  100. package/dist/rules/accessibility/AXE-001.d.ts +9 -0
  101. package/dist/rules/accessibility/AXE-001.js +109 -0
  102. package/dist/rules/accessibility/AXE-001.js.map +1 -0
  103. package/dist/rules/accessibility/AXE-002.d.ts +8 -0
  104. package/dist/rules/accessibility/AXE-002.js +85 -0
  105. package/dist/rules/accessibility/AXE-002.js.map +1 -0
  106. package/dist/rules/accessibility/AXE-003.d.ts +8 -0
  107. package/dist/rules/accessibility/AXE-003.js +94 -0
  108. package/dist/rules/accessibility/AXE-003.js.map +1 -0
  109. package/dist/rules/accessibility/AXE-004.d.ts +8 -0
  110. package/dist/rules/accessibility/AXE-004.js +101 -0
  111. package/dist/rules/accessibility/AXE-004.js.map +1 -0
  112. package/dist/rules/accessibility/AXE-005.d.ts +9 -0
  113. package/dist/rules/accessibility/AXE-005.js +89 -0
  114. package/dist/rules/accessibility/AXE-005.js.map +1 -0
  115. package/dist/rules/best-practices/BP-004.d.ts +9 -0
  116. package/dist/rules/best-practices/BP-004.js +96 -0
  117. package/dist/rules/best-practices/BP-004.js.map +1 -0
  118. package/dist/rules/best-practices/BP-005.d.ts +8 -0
  119. package/dist/rules/best-practices/BP-005.js +94 -0
  120. package/dist/rules/best-practices/BP-005.js.map +1 -0
  121. package/dist/rules/best-practices/BP-006.d.ts +8 -0
  122. package/dist/rules/best-practices/BP-006.js +80 -0
  123. package/dist/rules/best-practices/BP-006.js.map +1 -0
  124. package/dist/rules/best-practices/BP-007.d.ts +8 -0
  125. package/dist/rules/best-practices/BP-007.js +92 -0
  126. package/dist/rules/best-practices/BP-007.js.map +1 -0
  127. package/dist/rules/best-practices/BP-008.d.ts +12 -0
  128. package/dist/rules/best-practices/BP-008.js +86 -0
  129. package/dist/rules/best-practices/BP-008.js.map +1 -0
  130. package/dist/rules/best-practices/BP-009.d.ts +9 -0
  131. package/dist/rules/best-practices/BP-009.js +77 -0
  132. package/dist/rules/best-practices/BP-009.js.map +1 -0
  133. package/dist/rules/best-practices/BP-010.d.ts +8 -0
  134. package/dist/rules/best-practices/BP-010.js +85 -0
  135. package/dist/rules/best-practices/BP-010.js.map +1 -0
  136. package/dist/rules/coverage/COV-002.d.ts +8 -0
  137. package/dist/rules/coverage/COV-002.js +68 -0
  138. package/dist/rules/coverage/COV-002.js.map +1 -0
  139. package/dist/rules/coverage/COV-003.d.ts +8 -0
  140. package/dist/rules/coverage/COV-003.js +68 -0
  141. package/dist/rules/coverage/COV-003.js.map +1 -0
  142. package/dist/rules/coverage/COV-004.d.ts +8 -0
  143. package/dist/rules/coverage/COV-004.js +89 -0
  144. package/dist/rules/coverage/COV-004.js.map +1 -0
  145. package/dist/rules/coverage/COV-005.d.ts +8 -0
  146. package/dist/rules/coverage/COV-005.js +67 -0
  147. package/dist/rules/coverage/COV-005.js.map +1 -0
  148. package/dist/rules/coverage/COV-006.d.ts +9 -0
  149. package/dist/rules/coverage/COV-006.js +76 -0
  150. package/dist/rules/coverage/COV-006.js.map +1 -0
  151. package/dist/rules/coverage/COV-007.d.ts +8 -0
  152. package/dist/rules/coverage/COV-007.js +67 -0
  153. package/dist/rules/coverage/COV-007.js.map +1 -0
  154. package/dist/rules/coverage/COV-008.d.ts +9 -0
  155. package/dist/rules/coverage/COV-008.js +87 -0
  156. package/dist/rules/coverage/COV-008.js.map +1 -0
  157. package/dist/rules/coverage/COV-009.d.ts +8 -0
  158. package/dist/rules/coverage/COV-009.js +73 -0
  159. package/dist/rules/coverage/COV-009.js.map +1 -0
  160. package/dist/rules/coverage/COV-010.d.ts +9 -0
  161. package/dist/rules/coverage/COV-010.js +82 -0
  162. package/dist/rules/coverage/COV-010.js.map +1 -0
  163. package/dist/rules/description/DESC-001.d.ts +9 -0
  164. package/dist/rules/description/DESC-001.js +88 -0
  165. package/dist/rules/description/DESC-001.js.map +1 -0
  166. package/dist/rules/description/DESC-002.d.ts +10 -0
  167. package/dist/rules/description/DESC-002.js +99 -0
  168. package/dist/rules/description/DESC-002.js.map +1 -0
  169. package/dist/rules/description/DESC-006.d.ts +9 -0
  170. package/dist/rules/description/DESC-006.js +78 -0
  171. package/dist/rules/description/DESC-006.js.map +1 -0
  172. package/dist/rules/description/DESC-007.d.ts +9 -0
  173. package/dist/rules/description/DESC-007.js +70 -0
  174. package/dist/rules/description/DESC-007.js.map +1 -0
  175. package/dist/rules/description/DESC-008.d.ts +9 -0
  176. package/dist/rules/description/DESC-008.js +70 -0
  177. package/dist/rules/description/DESC-008.js.map +1 -0
  178. package/dist/rules/description/DESC-009.d.ts +8 -0
  179. package/dist/rules/description/DESC-009.js +55 -0
  180. package/dist/rules/description/DESC-009.js.map +1 -0
  181. package/dist/rules/description/DESC-010.d.ts +9 -0
  182. package/dist/rules/description/DESC-010.js +92 -0
  183. package/dist/rules/description/DESC-010.js.map +1 -0
  184. package/dist/rules/description/DESC-011.d.ts +9 -0
  185. package/dist/rules/description/DESC-011.js +81 -0
  186. package/dist/rules/description/DESC-011.js.map +1 -0
  187. package/dist/rules/description/DESC-012.d.ts +9 -0
  188. package/dist/rules/description/DESC-012.js +98 -0
  189. package/dist/rules/description/DESC-012.js.map +1 -0
  190. package/dist/rules/implementation/IMP-002.d.ts +9 -0
  191. package/dist/rules/implementation/IMP-002.js +59 -0
  192. package/dist/rules/implementation/IMP-002.js.map +1 -0
  193. package/dist/rules/implementation/IMP-006.d.ts +9 -0
  194. package/dist/rules/implementation/IMP-006.js +48 -0
  195. package/dist/rules/implementation/IMP-006.js.map +1 -0
  196. package/dist/rules/implementation/IMP-008.d.ts +9 -0
  197. package/dist/rules/implementation/IMP-008.js +46 -0
  198. package/dist/rules/implementation/IMP-008.js.map +1 -0
  199. package/dist/rules/implementation/IMP-009.d.ts +9 -0
  200. package/dist/rules/implementation/IMP-009.js +48 -0
  201. package/dist/rules/implementation/IMP-009.js.map +1 -0
  202. package/dist/rules/implementation/IMP-010.d.ts +9 -0
  203. package/dist/rules/implementation/IMP-010.js +66 -0
  204. package/dist/rules/implementation/IMP-010.js.map +1 -0
  205. package/dist/rules/implementation/IMP-011.d.ts +9 -0
  206. package/dist/rules/implementation/IMP-011.js +82 -0
  207. package/dist/rules/implementation/IMP-011.js.map +1 -0
  208. package/dist/rules/implementation/IMP-012.d.ts +9 -0
  209. package/dist/rules/implementation/IMP-012.js +88 -0
  210. package/dist/rules/implementation/IMP-012.js.map +1 -0
  211. package/dist/rules/implementation/IMP-014.d.ts +9 -0
  212. package/dist/rules/implementation/IMP-014.js +58 -0
  213. package/dist/rules/implementation/IMP-014.js.map +1 -0
  214. package/dist/rules/implementation/IMP-015.d.ts +9 -0
  215. package/dist/rules/implementation/IMP-015.js +64 -0
  216. package/dist/rules/implementation/IMP-015.js.map +1 -0
  217. package/dist/rules/implementation/IMP-016.d.ts +9 -0
  218. package/dist/rules/implementation/IMP-016.js +52 -0
  219. package/dist/rules/implementation/IMP-016.js.map +1 -0
  220. package/dist/rules/implementation/IMP-017.d.ts +8 -0
  221. package/dist/rules/implementation/IMP-017.js +51 -0
  222. package/dist/rules/implementation/IMP-017.js.map +1 -0
  223. package/dist/rules/implementation/IMP-018.d.ts +8 -0
  224. package/dist/rules/implementation/IMP-018.js +52 -0
  225. package/dist/rules/implementation/IMP-018.js.map +1 -0
  226. package/dist/rules/implementation/IMP-019.d.ts +8 -0
  227. package/dist/rules/implementation/IMP-019.js +53 -0
  228. package/dist/rules/implementation/IMP-019.js.map +1 -0
  229. package/dist/rules/implementation/IMP-020.d.ts +9 -0
  230. package/dist/rules/implementation/IMP-020.js +62 -0
  231. package/dist/rules/implementation/IMP-020.js.map +1 -0
  232. package/dist/rules/implementation/IMP-021.d.ts +8 -0
  233. package/dist/rules/implementation/IMP-021.js +64 -0
  234. package/dist/rules/implementation/IMP-021.js.map +1 -0
  235. package/dist/rules/implementation/IMP-022.d.ts +8 -0
  236. package/dist/rules/implementation/IMP-022.js +70 -0
  237. package/dist/rules/implementation/IMP-022.js.map +1 -0
  238. package/dist/rules/index.d.ts +73 -6
  239. package/dist/rules/index.js +141 -6
  240. package/dist/rules/index.js.map +1 -1
  241. package/dist/rules/schema/SCHEMA-004.d.ts +9 -0
  242. package/dist/rules/schema/SCHEMA-004.js +57 -0
  243. package/dist/rules/schema/SCHEMA-004.js.map +1 -0
  244. package/dist/rules/schema/SCHEMA-005.d.ts +9 -0
  245. package/dist/rules/schema/SCHEMA-005.js +61 -0
  246. package/dist/rules/schema/SCHEMA-005.js.map +1 -0
  247. package/dist/rules/schema/SCHEMA-006.d.ts +10 -0
  248. package/dist/rules/schema/SCHEMA-006.js +85 -0
  249. package/dist/rules/schema/SCHEMA-006.js.map +1 -0
  250. package/dist/rules/schema/SCHEMA-007.d.ts +9 -0
  251. package/dist/rules/schema/SCHEMA-007.js +73 -0
  252. package/dist/rules/schema/SCHEMA-007.js.map +1 -0
  253. package/dist/rules/schema/SCHEMA-008.d.ts +9 -0
  254. package/dist/rules/schema/SCHEMA-008.js +70 -0
  255. package/dist/rules/schema/SCHEMA-008.js.map +1 -0
  256. package/dist/rules/schema/SCHEMA-009.d.ts +10 -0
  257. package/dist/rules/schema/SCHEMA-009.js +80 -0
  258. package/dist/rules/schema/SCHEMA-009.js.map +1 -0
  259. package/dist/rules/schema/SCHEMA-010.d.ts +9 -0
  260. package/dist/rules/schema/SCHEMA-010.js +96 -0
  261. package/dist/rules/schema/SCHEMA-010.js.map +1 -0
  262. package/dist/rules/schema/SCHEMA-012.d.ts +9 -0
  263. package/dist/rules/schema/SCHEMA-012.js +65 -0
  264. package/dist/rules/schema/SCHEMA-012.js.map +1 -0
  265. package/dist/rules/security/SEC-002.d.ts +8 -0
  266. package/dist/rules/security/SEC-002.js +81 -0
  267. package/dist/rules/security/SEC-002.js.map +1 -0
  268. package/dist/rules/security/SEC-003.d.ts +8 -0
  269. package/dist/rules/security/SEC-003.js +85 -0
  270. package/dist/rules/security/SEC-003.js.map +1 -0
  271. package/dist/rules/security/SEC-004.d.ts +9 -0
  272. package/dist/rules/security/SEC-004.js +87 -0
  273. package/dist/rules/security/SEC-004.js.map +1 -0
  274. package/dist/rules/security/SEC-005.d.ts +8 -0
  275. package/dist/rules/security/SEC-005.js +87 -0
  276. package/dist/rules/security/SEC-005.js.map +1 -0
  277. package/dist/rules/security/SEC-006.d.ts +10 -0
  278. package/dist/rules/security/SEC-006.js +108 -0
  279. package/dist/rules/security/SEC-006.js.map +1 -0
  280. package/dist/rules/security/SEC-007.d.ts +9 -0
  281. package/dist/rules/security/SEC-007.js +108 -0
  282. package/dist/rules/security/SEC-007.js.map +1 -0
  283. package/dist/rules/security/SEC-008.d.ts +8 -0
  284. package/dist/rules/security/SEC-008.js +109 -0
  285. package/dist/rules/security/SEC-008.js.map +1 -0
  286. package/dist/rules/security/SEC-009.d.ts +9 -0
  287. package/dist/rules/security/SEC-009.js +93 -0
  288. package/dist/rules/security/SEC-009.js.map +1 -0
  289. package/dist/rules/security/SEC-010.d.ts +8 -0
  290. package/dist/rules/security/SEC-010.js +78 -0
  291. package/dist/rules/security/SEC-010.js.map +1 -0
  292. package/dist/rules/security/SEC-011.d.ts +8 -0
  293. package/dist/rules/security/SEC-011.js +93 -0
  294. package/dist/rules/security/SEC-011.js.map +1 -0
  295. package/dist/rules/security/SEC-012.d.ts +8 -0
  296. package/dist/rules/security/SEC-012.js +79 -0
  297. package/dist/rules/security/SEC-012.js.map +1 -0
  298. package/dist/rules/security/SEC-013.d.ts +9 -0
  299. package/dist/rules/security/SEC-013.js +107 -0
  300. package/dist/rules/security/SEC-013.js.map +1 -0
  301. package/dist/scoring/calculator.js +1 -0
  302. package/dist/scoring/calculator.js.map +1 -1
  303. package/dist/ui/ink/components/AIRecommendationCard.d.ts +11 -0
  304. package/dist/ui/ink/components/AIRecommendationCard.js +23 -0
  305. package/dist/ui/ink/components/AIRecommendationCard.js.map +1 -0
  306. package/dist/ui/ink/components/OpportunityList.d.ts +10 -0
  307. package/dist/ui/ink/components/OpportunityList.js +48 -0
  308. package/dist/ui/ink/components/OpportunityList.js.map +1 -0
  309. package/dist/ui/ink/components/PotentialPageCard.d.ts +13 -0
  310. package/dist/ui/ink/components/PotentialPageCard.js +43 -0
  311. package/dist/ui/ink/components/PotentialPageCard.js.map +1 -0
  312. package/dist/ui/ink/components/PotentialProgress.d.ts +16 -0
  313. package/dist/ui/ink/components/PotentialProgress.js +44 -0
  314. package/dist/ui/ink/components/PotentialProgress.js.map +1 -0
  315. package/dist/ui/ink/components/PotentialSummary.d.ts +10 -0
  316. package/dist/ui/ink/components/PotentialSummary.js +86 -0
  317. package/dist/ui/ink/components/PotentialSummary.js.map +1 -0
  318. package/dist/ui/ink/components/SuggestionCard.d.ts +34 -0
  319. package/dist/ui/ink/components/SuggestionCard.js +36 -0
  320. package/dist/ui/ink/components/SuggestionCard.js.map +1 -0
  321. package/dist/ui/ink/components/views/MultiPageCrawlView.d.ts +21 -0
  322. package/dist/ui/ink/components/views/MultiPageCrawlView.js +55 -0
  323. package/dist/ui/ink/components/views/MultiPageCrawlView.js.map +1 -0
  324. package/dist/ui/ink/components/views/PotentialView.d.ts +18 -0
  325. package/dist/ui/ink/components/views/PotentialView.js +74 -0
  326. package/dist/ui/ink/components/views/PotentialView.js.map +1 -0
  327. package/dist/ui/ink/components/views/ReconView.d.ts +22 -0
  328. package/dist/ui/ink/components/views/ReconView.js +30 -0
  329. package/dist/ui/ink/components/views/ReconView.js.map +1 -0
  330. package/package.json +2 -1
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Multi-Page Audit Orchestrator
3
+ *
4
+ * Takes a ReconResult and crawl config, iterates through discovered
5
+ * routes in priority order, runs the single-page audit for each,
6
+ * and aggregates results.
7
+ */
8
+ import type { BrowserContext } from 'playwright';
9
+ import type { ReconResult, CrawlConfig, MultiPageCrawlProgress, MultiPageAuditResult } from '../core/types/recon.js';
10
+ /**
11
+ * Default crawl configuration
12
+ */
13
+ export declare const DEFAULT_CRAWL_CONFIG: CrawlConfig;
14
+ /**
15
+ * Options for the multi-page audit
16
+ */
17
+ export interface MultiPageAuditOptions {
18
+ /** Playwright browser context (with WebMCP interception already set up) */
19
+ context: BrowserContext;
20
+ /** Reconnaissance result with discovered routes */
21
+ recon: ReconResult;
22
+ /** Crawl configuration (merged with defaults) */
23
+ config?: Partial<CrawlConfig>;
24
+ /** Progress callback */
25
+ onProgress?: (progress: MultiPageCrawlProgress) => void;
26
+ }
27
+ /**
28
+ * Run a multi-page audit across all discovered routes.
29
+ *
30
+ * Routes are visited in priority order (highest first), limited by
31
+ * maxPages and maxDepth. Each page runs through the full single-page
32
+ * audit pipeline.
33
+ */
34
+ export declare function runMultiPageAudit(options: MultiPageAuditOptions): Promise<MultiPageAuditResult>;
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Multi-Page Audit Orchestrator
3
+ *
4
+ * Takes a ReconResult and crawl config, iterates through discovered
5
+ * routes in priority order, runs the single-page audit for each,
6
+ * and aggregates results.
7
+ */
8
+ import { runSinglePageAudit } from './run-single-page-audit.js';
9
+ import { ensureRulesRegistered, getRuleCategories, getRuleSeverities, } from '../rules/index.js';
10
+ import { calculateScore, extractFindings } from '../scoring/calculator.js';
11
+ /**
12
+ * Default crawl configuration
13
+ */
14
+ export const DEFAULT_CRAWL_CONFIG = {
15
+ maxPages: 20,
16
+ maxDepth: 4,
17
+ timeout: 30_000,
18
+ extraWaitMs: 2_000,
19
+ respectRobotsTxt: true,
20
+ };
21
+ /**
22
+ * Merge per-page rule results into an aggregate score.
23
+ * We collect all findings and recalculate a unified score.
24
+ */
25
+ function aggregateScores(allFindings, allRuleResults) {
26
+ ensureRulesRegistered();
27
+ return calculateScore(allRuleResults, getRuleCategories());
28
+ }
29
+ /**
30
+ * Run a multi-page audit across all discovered routes.
31
+ *
32
+ * Routes are visited in priority order (highest first), limited by
33
+ * maxPages and maxDepth. Each page runs through the full single-page
34
+ * audit pipeline.
35
+ */
36
+ export async function runMultiPageAudit(options) {
37
+ const { context, recon, onProgress } = options;
38
+ const config = { ...DEFAULT_CRAWL_CONFIG, ...options.config };
39
+ // Filter routes by depth and skip priority
40
+ const eligibleRoutes = recon.discoveredRoutes
41
+ .filter((r) => r.depth <= config.maxDepth && r.priority !== 'skip')
42
+ .slice(0, config.maxPages);
43
+ const totalPages = eligibleRoutes.length;
44
+ onProgress?.({
45
+ phase: 'crawling',
46
+ progress: 0,
47
+ currentUrl: eligibleRoutes[0]?.url ?? recon.url,
48
+ pagesCompleted: 0,
49
+ pagesTotal: totalPages,
50
+ toolsFound: 0,
51
+ message: `Starting crawl of ${totalPages} pages`,
52
+ });
53
+ const pageSummaries = [];
54
+ const allTools = [];
55
+ const allOpportunities = [];
56
+ const allFindings = [];
57
+ const allRuleResults = new Map();
58
+ const webmcpPages = [];
59
+ let pagesSucceeded = 0;
60
+ for (let i = 0; i < eligibleRoutes.length; i++) {
61
+ const route = eligibleRoutes[i];
62
+ const pageNum = i + 1;
63
+ onProgress?.({
64
+ phase: 'crawling',
65
+ progress: Math.round((i / totalPages) * 100),
66
+ currentUrl: route.url,
67
+ pagesCompleted: i,
68
+ pagesTotal: totalPages,
69
+ toolsFound: allTools.length,
70
+ message: `Auditing page ${pageNum}/${totalPages}: ${route.url}`,
71
+ });
72
+ try {
73
+ const result = await runSinglePageAudit({
74
+ context,
75
+ url: route.url,
76
+ timeout: config.timeout,
77
+ extraWaitMs: config.extraWaitMs,
78
+ });
79
+ pagesSucceeded++;
80
+ // Collect page summary
81
+ pageSummaries.push({
82
+ url: route.url,
83
+ title: result.title,
84
+ success: true,
85
+ hasWebMCP: result.hasWebMCP,
86
+ toolCount: result.tools.length,
87
+ opportunityCount: result.opportunities.length,
88
+ score: result.score.total,
89
+ route,
90
+ });
91
+ // Aggregate tools (deduplicate by name + pageUrl)
92
+ for (const tool of result.tools) {
93
+ const isDuplicate = allTools.some((t) => t.name === tool.name && t.pageUrl === tool.pageUrl);
94
+ if (!isDuplicate) {
95
+ allTools.push(tool);
96
+ }
97
+ }
98
+ // Aggregate opportunities
99
+ for (const opp of result.opportunities) {
100
+ allOpportunities.push({ ...opp, pageUrl: route.url });
101
+ }
102
+ // Aggregate findings (prefix page URL for context)
103
+ for (const finding of result.findings) {
104
+ allFindings.push({
105
+ ...finding,
106
+ page: finding.page ?? route.url,
107
+ });
108
+ }
109
+ // Merge rule results (prefix with page index for uniqueness)
110
+ for (const [ruleId, ruleResult] of result.ruleResults) {
111
+ const key = totalPages > 1 ? `${ruleId}@${route.url}` : ruleId;
112
+ allRuleResults.set(key, ruleResult);
113
+ }
114
+ if (result.hasWebMCP) {
115
+ webmcpPages.push(route.url);
116
+ }
117
+ }
118
+ catch (error) {
119
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
120
+ pageSummaries.push({
121
+ url: route.url,
122
+ title: '',
123
+ success: false,
124
+ hasWebMCP: false,
125
+ toolCount: 0,
126
+ opportunityCount: 0,
127
+ error: errMsg,
128
+ route,
129
+ });
130
+ }
131
+ }
132
+ // Calculate aggregate score
133
+ // For the aggregate, use the per-page rule results directly if only 1 page,
134
+ // otherwise build a combined score from findings
135
+ let aggregateScore;
136
+ if (pageSummaries.length === 1 && pageSummaries[0]?.score != null) {
137
+ // Single page — use its score directly
138
+ const singleResult = pageSummaries[0];
139
+ aggregateScore = {
140
+ total: singleResult.score,
141
+ grade: scoreToGrade(singleResult.score),
142
+ categories: [],
143
+ issueCount: countIssues(allFindings),
144
+ };
145
+ }
146
+ else if (allRuleResults.size > 0) {
147
+ // Multi-page — recalculate from combined rule results
148
+ // We need to de-key the results back to base rule IDs for scoring
149
+ const baseRuleResults = new Map();
150
+ for (const [compositeKey, result] of allRuleResults) {
151
+ const baseId = compositeKey.includes('@')
152
+ ? compositeKey.split('@')[0]
153
+ : compositeKey;
154
+ const existing = baseRuleResults.get(baseId);
155
+ if (!existing || result.score < existing.score) {
156
+ // Keep worst score per rule (conservative)
157
+ baseRuleResults.set(baseId, result);
158
+ }
159
+ }
160
+ aggregateScore = aggregateScores(allFindings, baseRuleResults);
161
+ }
162
+ else {
163
+ aggregateScore = {
164
+ total: 0,
165
+ grade: 'F',
166
+ categories: [],
167
+ issueCount: countIssues(allFindings),
168
+ };
169
+ }
170
+ onProgress?.({
171
+ phase: 'complete',
172
+ progress: 100,
173
+ currentUrl: recon.url,
174
+ pagesCompleted: totalPages,
175
+ pagesTotal: totalPages,
176
+ toolsFound: allTools.length,
177
+ message: `Crawl complete: ${pagesSucceeded}/${totalPages} pages audited`,
178
+ });
179
+ return {
180
+ recon,
181
+ pageSummaries,
182
+ allTools,
183
+ allOpportunities,
184
+ allFindings,
185
+ aggregateScore,
186
+ webmcpPages,
187
+ pagesAttempted: totalPages,
188
+ pagesSucceeded,
189
+ };
190
+ }
191
+ /**
192
+ * Convert numeric score to letter grade
193
+ */
194
+ function scoreToGrade(score) {
195
+ if (score >= 95)
196
+ return 'A+';
197
+ if (score >= 85)
198
+ return 'A';
199
+ if (score >= 80)
200
+ return 'B+';
201
+ if (score >= 70)
202
+ return 'B';
203
+ if (score >= 65)
204
+ return 'C+';
205
+ if (score >= 55)
206
+ return 'C';
207
+ if (score >= 40)
208
+ return 'D';
209
+ return 'F';
210
+ }
211
+ /**
212
+ * Count findings by severity
213
+ */
214
+ function countIssues(findings) {
215
+ let critical = 0;
216
+ let warning = 0;
217
+ let info = 0;
218
+ for (const f of findings) {
219
+ switch (f.severity) {
220
+ case 'critical':
221
+ critical++;
222
+ break;
223
+ case 'warning':
224
+ warning++;
225
+ break;
226
+ case 'info':
227
+ info++;
228
+ break;
229
+ }
230
+ }
231
+ return { critical, warning, info };
232
+ }
233
+ //# sourceMappingURL=run-multi-page-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-multi-page-audit.js","sourceRoot":"","sources":["../../src/audit/run-multi-page-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface PotentialCommandOptions {
2
+ maxPages?: string;
3
+ timeout?: string;
4
+ ai?: boolean;
5
+ output?: string;
6
+ json?: boolean;
7
+ }
8
+ export declare function runPotential(urlString: string, options: PotentialCommandOptions): Promise<number>;
@@ -0,0 +1,323 @@
1
+ import chalk from 'chalk';
2
+ import { mkdir, writeFile } from 'fs/promises';
3
+ import { dirname, resolve } from 'path';
4
+ import { render } from 'ink';
5
+ import { createElement } from 'react';
6
+ import { runPotentialAnalysis, } from '../../potential/index.js';
7
+ import { PotentialProgress, } from '../../ui/ink/components/PotentialProgress.js';
8
+ import { PotentialView } from '../../ui/ink/components/views/PotentialView.js';
9
+ const DEFAULT_MAX_PAGES = 30;
10
+ const DEFAULT_TIMEOUT = 15_000;
11
+ const DEPTH_LIMIT = 2;
12
+ const DEFAULT_MODEL = 'anthropic/claude-sonnet-4.5';
13
+ export async function runPotential(urlString, options) {
14
+ const startTime = Date.now();
15
+ let targetUrl;
16
+ try {
17
+ targetUrl = validateUrl(urlString);
18
+ }
19
+ catch (error) {
20
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
21
+ return 1;
22
+ }
23
+ let maxPages;
24
+ let timeout;
25
+ try {
26
+ maxPages = parsePositiveInteger(options.maxPages, DEFAULT_MAX_PAGES, 'max-pages');
27
+ timeout = parsePositiveInteger(options.timeout, DEFAULT_TIMEOUT, 'timeout');
28
+ }
29
+ catch (error) {
30
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
31
+ return 1;
32
+ }
33
+ const aiRequested = options.ai !== false;
34
+ const apiKey = process.env['OPENROUTER_API_KEY'];
35
+ const model = process.env['OPENROUTER_MODEL'] ?? DEFAULT_MODEL;
36
+ const useAI = aiRequested && Boolean(apiKey);
37
+ const modeLabel = useAI ? `AI-powered (${model})` : 'Heuristic-only';
38
+ if (!options.json) {
39
+ printStartupBanner(targetUrl, modeLabel, maxPages);
40
+ if (aiRequested && !useAI) {
41
+ console.log(chalk.yellow(' ⚠ OPENROUTER_API_KEY not found; falling back to heuristic recommendations.'));
42
+ console.log('');
43
+ }
44
+ }
45
+ else if (aiRequested && !useAI) {
46
+ console.error(chalk.yellow('Warning: OPENROUTER_API_KEY not found; falling back to heuristic mode.'));
47
+ }
48
+ if (options.json) {
49
+ try {
50
+ const report = await runPotentialAnalysis({
51
+ url: targetUrl,
52
+ maxPages,
53
+ timeout,
54
+ useAI,
55
+ apiKey,
56
+ model,
57
+ });
58
+ const saveResult = options.output
59
+ ? await writeReportToDisk(report, options.output)
60
+ : { path: undefined };
61
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
62
+ if (saveResult.error) {
63
+ console.error(chalk.red(`Failed to write report: ${saveResult.error}`));
64
+ return 1;
65
+ }
66
+ return 0;
67
+ }
68
+ catch (error) {
69
+ console.error(chalk.red(`Potential analysis failed: ${error instanceof Error ? error.message : String(error)}`));
70
+ return 1;
71
+ }
72
+ }
73
+ let progressState = createInitialProgress(targetUrl, maxPages);
74
+ const inkApp = render(createElement(PotentialProgress, progressState), {
75
+ exitOnCtrlC: false,
76
+ });
77
+ const exitPromise = inkApp.waitUntilExit();
78
+ let analysisComplete = false;
79
+ let shuttingDown = false;
80
+ let savedReportPath;
81
+ let saveError;
82
+ const handleCtrlC = () => {
83
+ if (shuttingDown)
84
+ return;
85
+ shuttingDown = true;
86
+ inkApp.unmount();
87
+ if (!analysisComplete) {
88
+ console.log(chalk.yellow('\nPotential analysis cancelled (Ctrl+C).'));
89
+ process.exit(1);
90
+ }
91
+ else {
92
+ console.log('');
93
+ process.exit(0);
94
+ }
95
+ };
96
+ process.once('SIGINT', handleCtrlC);
97
+ let report;
98
+ try {
99
+ report = await runPotentialAnalysis({
100
+ url: targetUrl,
101
+ maxPages,
102
+ timeout,
103
+ useAI,
104
+ apiKey,
105
+ model,
106
+ onProgress: (event) => {
107
+ progressState = updateProgress(progressState, event, maxPages);
108
+ inkApp.rerender(createElement(PotentialProgress, progressState));
109
+ },
110
+ });
111
+ analysisComplete = true;
112
+ }
113
+ catch (error) {
114
+ process.off('SIGINT', handleCtrlC);
115
+ inkApp.unmount();
116
+ console.error(chalk.red(`Potential analysis failed: ${error instanceof Error ? error.message : String(error)}`));
117
+ return 1;
118
+ }
119
+ if (options.output) {
120
+ const result = await writeReportToDisk(report, options.output);
121
+ savedReportPath = result.path;
122
+ saveError = result.error;
123
+ }
124
+ const isInteractive = Boolean(process.stdin.isTTY) && typeof process.stdin.setRawMode === 'function';
125
+ if (isInteractive) {
126
+ inkApp.rerender(createElement(PotentialView, {
127
+ report,
128
+ }));
129
+ await exitPromise;
130
+ }
131
+ else {
132
+ inkApp.unmount();
133
+ printPlainReport(report);
134
+ }
135
+ process.off('SIGINT', handleCtrlC);
136
+ console.log('');
137
+ console.log(chalk.dim(` Potential analysis completed in ${((Date.now() - startTime) / 1000).toFixed(1)}s`));
138
+ if (savedReportPath) {
139
+ console.log(chalk.dim(` Report saved to ${savedReportPath}`));
140
+ }
141
+ if (saveError) {
142
+ console.error(chalk.red(` Failed to write report: ${saveError}`));
143
+ }
144
+ return saveError ? 1 : 0;
145
+ }
146
+ function parsePositiveInteger(rawValue, fallback, label) {
147
+ if (!rawValue) {
148
+ return fallback;
149
+ }
150
+ const parsed = Number(rawValue);
151
+ if (!Number.isFinite(parsed) || parsed <= 0) {
152
+ throw new Error(`Invalid --${label}: "${rawValue}" (must be a positive integer)`);
153
+ }
154
+ return Math.floor(parsed);
155
+ }
156
+ function validateUrl(url) {
157
+ try {
158
+ const parsed = new URL(url);
159
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
160
+ throw new Error('URL must use http or https scheme');
161
+ }
162
+ return parsed.href;
163
+ }
164
+ catch {
165
+ throw new Error(`Invalid URL: ${url}`);
166
+ }
167
+ }
168
+ function printStartupBanner(targetUrl, modeLabel, maxPages) {
169
+ console.log('');
170
+ console.log(chalk.bold.cyan(' WebMCP Potential Finder'));
171
+ console.log(` Target: ${chalk.cyan(targetUrl)}`);
172
+ console.log(` Mode: ${modeLabel}`);
173
+ console.log(` Depth: ${DEPTH_LIMIT} levels | Max pages: ${maxPages}`);
174
+ console.log('');
175
+ }
176
+ function createInitialProgress(targetUrl, maxPages) {
177
+ return {
178
+ targetUrl,
179
+ depthLimit: DEPTH_LIMIT,
180
+ pagesFound: 0,
181
+ crawledPages: 0,
182
+ totalPages: maxPages,
183
+ currentPath: targetUrl,
184
+ phase: 'crawling',
185
+ statusMessage: 'Initializing crawler',
186
+ };
187
+ }
188
+ function updateProgress(previous, event, maxPages) {
189
+ switch (event.phase) {
190
+ case 'crawling':
191
+ return {
192
+ ...previous,
193
+ phase: 'crawling',
194
+ pagesFound: event.pagesFound,
195
+ crawledPages: event.pagesCrawled,
196
+ totalPages: maxPages,
197
+ currentPath: event.currentUrl,
198
+ statusMessage: `Discovering routes (${event.pagesCrawled}/${maxPages})`,
199
+ };
200
+ case 'analyzing':
201
+ return {
202
+ ...previous,
203
+ phase: 'analyzing',
204
+ crawledPages: event.pagesAnalyzed,
205
+ totalPages: event.totalPages,
206
+ currentPath: event.currentUrl,
207
+ statusMessage: `Scanning page ${event.pagesAnalyzed}/${event.totalPages}`,
208
+ };
209
+ case 'ai-analyzing':
210
+ return {
211
+ ...previous,
212
+ phase: 'ai analysis',
213
+ crawledPages: event.pagesAnalyzed,
214
+ totalPages: event.totalPages,
215
+ currentPath: event.currentUrl,
216
+ statusMessage: `Generating AI recommendations (${event.pagesAnalyzed}/${event.totalPages})`,
217
+ };
218
+ case 'summarizing':
219
+ return {
220
+ ...previous,
221
+ phase: 'summarizing',
222
+ statusMessage: 'Summarizing findings',
223
+ };
224
+ case 'complete':
225
+ return {
226
+ ...previous,
227
+ phase: 'complete',
228
+ statusMessage: 'Analysis complete',
229
+ };
230
+ default:
231
+ return previous;
232
+ }
233
+ }
234
+ async function writeReportToDisk(report, filePath) {
235
+ try {
236
+ const resolvedPath = resolve(filePath);
237
+ await mkdir(dirname(resolvedPath), { recursive: true });
238
+ await writeFile(resolvedPath, JSON.stringify(report, null, 2), 'utf-8');
239
+ return { path: resolvedPath };
240
+ }
241
+ catch (error) {
242
+ return {
243
+ error: error instanceof Error ? error.message : String(error),
244
+ };
245
+ }
246
+ }
247
+ const PRIORITY_COLORS_MAP = {
248
+ critical: chalk.red,
249
+ high: chalk.yellow,
250
+ medium: chalk.cyan,
251
+ low: chalk.gray,
252
+ };
253
+ function printPlainReport(report) {
254
+ const hr = chalk.cyan('═'.repeat(60));
255
+ console.log('');
256
+ console.log(hr);
257
+ console.log(chalk.bold.cyan(' WEBMCP POTENTIAL ANALYSIS'));
258
+ console.log(hr);
259
+ console.log(` Target: ${chalk.cyan(report.targetUrl)}`);
260
+ console.log(` Pages Crawled: ${report.crawledPages}`);
261
+ const score = report.overallReadinessScore;
262
+ const scoreColor = score >= 70 ? chalk.green : score >= 40 ? chalk.yellow : chalk.red;
263
+ console.log(` Readiness: ${scoreColor(`${score}/100`)}`);
264
+ console.log(` Opportunities: ${report.totalOpportunities}`);
265
+ console.log('');
266
+ if (report.summary) {
267
+ console.log(chalk.dim(' ' + report.summary));
268
+ console.log('');
269
+ }
270
+ if (report.topRecommendations.length > 0) {
271
+ console.log(chalk.bold.cyan(' Top Recommendations'));
272
+ console.log('');
273
+ for (let i = 0; i < report.topRecommendations.length; i++) {
274
+ const rec = report.topRecommendations[i];
275
+ printRecommendation(rec, i);
276
+ }
277
+ }
278
+ if (report.pages.length > 0) {
279
+ console.log(chalk.bold.cyan(` Pages (${report.pages.length})`));
280
+ console.log('');
281
+ for (const page of report.pages) {
282
+ printPageSummary(page);
283
+ }
284
+ }
285
+ console.log(hr);
286
+ }
287
+ function printRecommendation(rec, index) {
288
+ const colorFn = PRIORITY_COLORS_MAP[rec.priority] ?? chalk.gray;
289
+ console.log(` ${chalk.bold(`#${index + 1}`)} ${chalk.bold(rec.title)} ${colorFn(`[${rec.priority.toUpperCase()}]`)}`);
290
+ console.log(` ${rec.description}`);
291
+ if (rec.toolDefinition) {
292
+ console.log(` Tool: ${chalk.cyan(rec.toolDefinition.name)}`);
293
+ }
294
+ console.log(` Impact: ${rec.estimatedImpact}`);
295
+ console.log('');
296
+ }
297
+ function printPageSummary(page) {
298
+ const path = formatUrlPath(page.url);
299
+ const scoreColor = page.potentialScore >= 70 ? chalk.red : page.potentialScore >= 40 ? chalk.yellow : chalk.green;
300
+ console.log(` ${chalk.bold(path)} ${chalk.dim(`(depth ${page.depth})`)} ${scoreColor(`${page.potentialScore}/100`)}`);
301
+ console.log(` Existing tools: ${page.existingTools} | Opportunities: ${page.opportunities.length}`);
302
+ for (const opp of page.opportunities.slice(0, 5)) {
303
+ printOpportunity(opp);
304
+ }
305
+ if (page.opportunities.length > 5) {
306
+ console.log(chalk.dim(` …and ${page.opportunities.length - 5} more`));
307
+ }
308
+ console.log('');
309
+ }
310
+ function printOpportunity(opp) {
311
+ const colorFn = PRIORITY_COLORS_MAP[opp.agenticValue] ?? chalk.gray;
312
+ console.log(` ${colorFn('●')} ${chalk.bold(opp.suggestedToolName)} ${chalk.dim(`(${opp.agenticValue})`)}`);
313
+ }
314
+ function formatUrlPath(url) {
315
+ try {
316
+ const parsed = new URL(url);
317
+ return parsed.pathname === '/' ? '/' : parsed.pathname;
318
+ }
319
+ catch {
320
+ return url;
321
+ }
322
+ }
323
+ //# sourceMappingURL=potential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"potential.js","sourceRoot":"","sources":["../../../src/cli/commands/potential.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Report Command
3
+ *
4
+ * Open or manage generated audit reports.
5
+ */
6
+ export interface ReportOpenOptions {
7
+ dir?: string;
8
+ }
9
+ /**
10
+ * Open the latest HTML report in the default browser.
11
+ */
12
+ export declare function runReportOpen(options: ReportOpenOptions): Promise<number>;