webmcp-cli 1.0.0 → 1.2.1

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 (347) hide show
  1. package/dist/agent/features/agent-simulator.d.ts +67 -0
  2. package/dist/agent/features/agent-simulator.js +368 -0
  3. package/dist/agent/features/agent-simulator.js.map +1 -0
  4. package/dist/agent/features/index.d.ts +8 -0
  5. package/dist/agent/features/index.js +9 -0
  6. package/dist/agent/features/index.js.map +1 -0
  7. package/dist/agent/features/simulation-judge.d.ts +78 -0
  8. package/dist/agent/features/simulation-judge.js +276 -0
  9. package/dist/agent/features/simulation-judge.js.map +1 -0
  10. package/dist/agent/features/test-case-generator.d.ts +35 -0
  11. package/dist/agent/features/test-case-generator.js +257 -0
  12. package/dist/agent/features/test-case-generator.js.map +1 -0
  13. package/dist/agent/index.d.ts +7 -0
  14. package/dist/agent/index.js +10 -0
  15. package/dist/agent/index.js.map +1 -0
  16. package/dist/agent/llm-client.d.ts +76 -0
  17. package/dist/agent/llm-client.js +198 -0
  18. package/dist/agent/llm-client.js.map +1 -0
  19. package/dist/audit/run-single-page-audit.d.ts +41 -0
  20. package/dist/audit/run-single-page-audit.js +103 -0
  21. package/dist/audit/run-single-page-audit.js.map +1 -0
  22. package/dist/bin/webmcp.d.ts +5 -0
  23. package/dist/bin/webmcp.js +14 -0
  24. package/dist/bin/webmcp.js.map +1 -0
  25. package/dist/browser/audit-runner.d.ts +30 -0
  26. package/dist/browser/audit-runner.js +77 -0
  27. package/dist/browser/audit-runner.js.map +1 -0
  28. package/dist/browser/index.d.ts +6 -0
  29. package/dist/browser/index.js +7 -0
  30. package/dist/browser/index.js.map +1 -0
  31. package/dist/browser/interceptor.d.ts +68 -0
  32. package/dist/browser/interceptor.js +257 -0
  33. package/dist/browser/interceptor.js.map +1 -0
  34. package/dist/browser/playwright.d.ts +98 -0
  35. package/dist/browser/playwright.js +158 -0
  36. package/dist/browser/playwright.js.map +1 -0
  37. package/dist/cli/commands/audit.d.ts +12 -0
  38. package/dist/cli/commands/audit.js +349 -0
  39. package/dist/cli/commands/audit.js.map +1 -0
  40. package/dist/cli/commands/interactive.d.ts +10 -0
  41. package/dist/cli/commands/interactive.js +34 -0
  42. package/dist/cli/commands/interactive.js.map +1 -0
  43. package/dist/cli/index.d.ts +17 -0
  44. package/dist/cli/index.js +84 -0
  45. package/dist/cli/index.js.map +1 -0
  46. package/dist/cli/options/parse-audit-options.d.ts +12 -0
  47. package/dist/cli/options/parse-audit-options.js +64 -0
  48. package/dist/cli/options/parse-audit-options.js.map +1 -0
  49. package/dist/core/constants.d.ts +102 -0
  50. package/dist/core/constants.js +214 -0
  51. package/dist/core/constants.js.map +1 -0
  52. package/dist/core/types/audit.d.ts +260 -0
  53. package/dist/core/types/audit.js +5 -0
  54. package/dist/core/types/audit.js.map +1 -0
  55. package/dist/core/types/index.d.ts +6 -0
  56. package/dist/core/types/index.js +7 -0
  57. package/dist/core/types/index.js.map +1 -0
  58. package/dist/core/types/rule.d.ts +190 -0
  59. package/dist/core/types/rule.js +26 -0
  60. package/dist/core/types/rule.js.map +1 -0
  61. package/dist/core/types/tool.d.ts +312 -0
  62. package/dist/core/types/tool.js +6 -0
  63. package/dist/core/types/tool.js.map +1 -0
  64. package/dist/detection/declarative.d.ts +27 -0
  65. package/dist/detection/declarative.js +343 -0
  66. package/dist/detection/declarative.js.map +1 -0
  67. package/dist/detection/imperative.d.ts +38 -0
  68. package/dist/detection/imperative.js +99 -0
  69. package/dist/detection/imperative.js.map +1 -0
  70. package/dist/detection/index.d.ts +5 -0
  71. package/dist/detection/index.js +6 -0
  72. package/dist/detection/index.js.map +1 -0
  73. package/dist/index.d.ts +12 -0
  74. package/dist/index.js +19 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/llm/advice-service.d.ts +38 -0
  77. package/dist/llm/advice-service.js +243 -0
  78. package/dist/llm/advice-service.js.map +1 -0
  79. package/dist/llm/evaluator.d.ts +89 -0
  80. package/dist/llm/evaluator.js +274 -0
  81. package/dist/llm/evaluator.js.map +1 -0
  82. package/dist/llm/index.d.ts +11 -0
  83. package/dist/llm/index.js +15 -0
  84. package/dist/llm/index.js.map +1 -0
  85. package/dist/llm/json-response.d.ts +12 -0
  86. package/dist/llm/json-response.js +67 -0
  87. package/dist/llm/json-response.js.map +1 -0
  88. package/dist/llm/providers/mock.d.ts +29 -0
  89. package/dist/llm/providers/mock.js +324 -0
  90. package/dist/llm/providers/mock.js.map +1 -0
  91. package/dist/llm/providers/openrouter.d.ts +53 -0
  92. package/dist/llm/providers/openrouter.js +321 -0
  93. package/dist/llm/providers/openrouter.js.map +1 -0
  94. package/dist/llm/request-cache.d.ts +28 -0
  95. package/dist/llm/request-cache.js +99 -0
  96. package/dist/llm/request-cache.js.map +1 -0
  97. package/dist/llm/types.d.ts +233 -0
  98. package/dist/llm/types.js +7 -0
  99. package/dist/llm/types.js.map +1 -0
  100. package/dist/rules/best-practices/BP-001.d.ts +11 -0
  101. package/dist/rules/best-practices/BP-001.js +56 -0
  102. package/dist/rules/best-practices/BP-001.js.map +1 -0
  103. package/dist/rules/best-practices/BP-002.d.ts +11 -0
  104. package/dist/rules/best-practices/BP-002.js +63 -0
  105. package/dist/rules/best-practices/BP-002.js.map +1 -0
  106. package/dist/rules/best-practices/BP-003.d.ts +11 -0
  107. package/dist/rules/best-practices/BP-003.js +68 -0
  108. package/dist/rules/best-practices/BP-003.js.map +1 -0
  109. package/dist/rules/coverage/COV-001.d.ts +8 -0
  110. package/dist/rules/coverage/COV-001.js +51 -0
  111. package/dist/rules/coverage/COV-001.js.map +1 -0
  112. package/dist/rules/description/DESC-003.d.ts +13 -0
  113. package/dist/rules/description/DESC-003.js +96 -0
  114. package/dist/rules/description/DESC-003.js.map +1 -0
  115. package/dist/rules/description/DESC-004.d.ts +8 -0
  116. package/dist/rules/description/DESC-004.js +61 -0
  117. package/dist/rules/description/DESC-004.js.map +1 -0
  118. package/dist/rules/description/DESC-005.d.ts +12 -0
  119. package/dist/rules/description/DESC-005.js +70 -0
  120. package/dist/rules/description/DESC-005.js.map +1 -0
  121. package/dist/rules/description/index.d.ts +4 -0
  122. package/dist/rules/description/index.js +5 -0
  123. package/dist/rules/description/index.js.map +1 -0
  124. package/dist/rules/implementation/IMP-001.d.ts +10 -0
  125. package/dist/rules/implementation/IMP-001.js +36 -0
  126. package/dist/rules/implementation/IMP-001.js.map +1 -0
  127. package/dist/rules/implementation/IMP-003.d.ts +9 -0
  128. package/dist/rules/implementation/IMP-003.js +45 -0
  129. package/dist/rules/implementation/IMP-003.js.map +1 -0
  130. package/dist/rules/implementation/IMP-004.d.ts +9 -0
  131. package/dist/rules/implementation/IMP-004.js +48 -0
  132. package/dist/rules/implementation/IMP-004.js.map +1 -0
  133. package/dist/rules/implementation/IMP-005.d.ts +9 -0
  134. package/dist/rules/implementation/IMP-005.js +54 -0
  135. package/dist/rules/implementation/IMP-005.js.map +1 -0
  136. package/dist/rules/implementation/IMP-007.d.ts +8 -0
  137. package/dist/rules/implementation/IMP-007.js +79 -0
  138. package/dist/rules/implementation/IMP-007.js.map +1 -0
  139. package/dist/rules/implementation/IMP-013.d.ts +9 -0
  140. package/dist/rules/implementation/IMP-013.js +55 -0
  141. package/dist/rules/implementation/IMP-013.js.map +1 -0
  142. package/dist/rules/implementation/index.d.ts +9 -0
  143. package/dist/rules/implementation/index.js +10 -0
  144. package/dist/rules/implementation/index.js.map +1 -0
  145. package/dist/rules/index.d.ts +51 -0
  146. package/dist/rules/index.js +100 -0
  147. package/dist/rules/index.js.map +1 -0
  148. package/dist/rules/llm/LLM-001.d.ts +14 -0
  149. package/dist/rules/llm/LLM-001.js +78 -0
  150. package/dist/rules/llm/LLM-001.js.map +1 -0
  151. package/dist/rules/llm/LLM-002.d.ts +14 -0
  152. package/dist/rules/llm/LLM-002.js +77 -0
  153. package/dist/rules/llm/LLM-002.js.map +1 -0
  154. package/dist/rules/llm/LLM-003.d.ts +16 -0
  155. package/dist/rules/llm/LLM-003.js +82 -0
  156. package/dist/rules/llm/LLM-003.js.map +1 -0
  157. package/dist/rules/llm/LLM-004.d.ts +14 -0
  158. package/dist/rules/llm/LLM-004.js +87 -0
  159. package/dist/rules/llm/LLM-004.js.map +1 -0
  160. package/dist/rules/llm/LLM-005.d.ts +16 -0
  161. package/dist/rules/llm/LLM-005.js +105 -0
  162. package/dist/rules/llm/LLM-005.js.map +1 -0
  163. package/dist/rules/llm/index.d.ts +10 -0
  164. package/dist/rules/llm/index.js +11 -0
  165. package/dist/rules/llm/index.js.map +1 -0
  166. package/dist/rules/runner.d.ts +54 -0
  167. package/dist/rules/runner.js +138 -0
  168. package/dist/rules/runner.js.map +1 -0
  169. package/dist/rules/schema/SCHEMA-001.d.ts +9 -0
  170. package/dist/rules/schema/SCHEMA-001.js +57 -0
  171. package/dist/rules/schema/SCHEMA-001.js.map +1 -0
  172. package/dist/rules/schema/SCHEMA-002.d.ts +9 -0
  173. package/dist/rules/schema/SCHEMA-002.js +59 -0
  174. package/dist/rules/schema/SCHEMA-002.js.map +1 -0
  175. package/dist/rules/schema/SCHEMA-003.d.ts +10 -0
  176. package/dist/rules/schema/SCHEMA-003.js +66 -0
  177. package/dist/rules/schema/SCHEMA-003.js.map +1 -0
  178. package/dist/rules/schema/SCHEMA-011.d.ts +10 -0
  179. package/dist/rules/schema/SCHEMA-011.js +62 -0
  180. package/dist/rules/schema/SCHEMA-011.js.map +1 -0
  181. package/dist/rules/security/SEC-001.d.ts +12 -0
  182. package/dist/rules/security/SEC-001.js +66 -0
  183. package/dist/rules/security/SEC-001.js.map +1 -0
  184. package/dist/rules/utils/keywords.d.ts +35 -0
  185. package/dist/rules/utils/keywords.js +100 -0
  186. package/dist/rules/utils/keywords.js.map +1 -0
  187. package/dist/scoring/calculator.d.ts +27 -0
  188. package/dist/scoring/calculator.js +194 -0
  189. package/dist/scoring/calculator.js.map +1 -0
  190. package/dist/scoring/grades.d.ts +34 -0
  191. package/dist/scoring/grades.js +167 -0
  192. package/dist/scoring/grades.js.map +1 -0
  193. package/dist/scoring/index.d.ts +5 -0
  194. package/dist/scoring/index.js +6 -0
  195. package/dist/scoring/index.js.map +1 -0
  196. package/dist/ui/banner.d.ts +21 -0
  197. package/dist/ui/banner.js +60 -0
  198. package/dist/ui/banner.js.map +1 -0
  199. package/dist/ui/design-tokens.d.ts +23 -0
  200. package/dist/ui/design-tokens.js +58 -0
  201. package/dist/ui/design-tokens.js.map +1 -0
  202. package/dist/ui/findings.d.ts +23 -0
  203. package/dist/ui/findings.js +190 -0
  204. package/dist/ui/findings.js.map +1 -0
  205. package/dist/ui/index.d.ts +9 -0
  206. package/dist/ui/index.js +10 -0
  207. package/dist/ui/index.js.map +1 -0
  208. package/dist/ui/ink/App.d.ts +14 -0
  209. package/dist/ui/ink/App.js +113 -0
  210. package/dist/ui/ink/App.js.map +1 -0
  211. package/dist/ui/ink/FullScreenLayout.d.ts +16 -0
  212. package/dist/ui/ink/FullScreenLayout.js +29 -0
  213. package/dist/ui/ink/FullScreenLayout.js.map +1 -0
  214. package/dist/ui/ink/InteractiveApp.d.ts +28 -0
  215. package/dist/ui/ink/InteractiveApp.js +229 -0
  216. package/dist/ui/ink/InteractiveApp.js.map +1 -0
  217. package/dist/ui/ink/RealAuditApp.d.ts +19 -0
  218. package/dist/ui/ink/RealAuditApp.js +170 -0
  219. package/dist/ui/ink/RealAuditApp.js.map +1 -0
  220. package/dist/ui/ink/components/AnimatedProgressBar.d.ts +20 -0
  221. package/dist/ui/ink/components/AnimatedProgressBar.js +46 -0
  222. package/dist/ui/ink/components/AnimatedProgressBar.js.map +1 -0
  223. package/dist/ui/ink/components/AsciiLogo.d.ts +12 -0
  224. package/dist/ui/ink/components/AsciiLogo.js +35 -0
  225. package/dist/ui/ink/components/AsciiLogo.js.map +1 -0
  226. package/dist/ui/ink/components/CategoryBars.d.ts +18 -0
  227. package/dist/ui/ink/components/CategoryBars.js +18 -0
  228. package/dist/ui/ink/components/CategoryBars.js.map +1 -0
  229. package/dist/ui/ink/components/FindingsTable.d.ts +18 -0
  230. package/dist/ui/ink/components/FindingsTable.js +19 -0
  231. package/dist/ui/ink/components/FindingsTable.js.map +1 -0
  232. package/dist/ui/ink/components/Footer.d.ts +15 -0
  233. package/dist/ui/ink/components/Footer.js +20 -0
  234. package/dist/ui/ink/components/Footer.js.map +1 -0
  235. package/dist/ui/ink/components/Header.d.ts +11 -0
  236. package/dist/ui/ink/components/Header.js +12 -0
  237. package/dist/ui/ink/components/Header.js.map +1 -0
  238. package/dist/ui/ink/components/LinkList.d.ts +17 -0
  239. package/dist/ui/ink/components/LinkList.js +44 -0
  240. package/dist/ui/ink/components/LinkList.js.map +1 -0
  241. package/dist/ui/ink/components/Navigation.d.ts +26 -0
  242. package/dist/ui/ink/components/Navigation.js +62 -0
  243. package/dist/ui/ink/components/Navigation.js.map +1 -0
  244. package/dist/ui/ink/components/ProgressBar.d.ts +15 -0
  245. package/dist/ui/ink/components/ProgressBar.js +14 -0
  246. package/dist/ui/ink/components/ProgressBar.js.map +1 -0
  247. package/dist/ui/ink/components/ScoreCard.d.ts +30 -0
  248. package/dist/ui/ink/components/ScoreCard.js +26 -0
  249. package/dist/ui/ink/components/ScoreCard.js.map +1 -0
  250. package/dist/ui/ink/components/SimulationResults.d.ts +33 -0
  251. package/dist/ui/ink/components/SimulationResults.js +23 -0
  252. package/dist/ui/ink/components/SimulationResults.js.map +1 -0
  253. package/dist/ui/ink/components/Spinner.d.ts +11 -0
  254. package/dist/ui/ink/components/Spinner.js +12 -0
  255. package/dist/ui/ink/components/Spinner.js.map +1 -0
  256. package/dist/ui/ink/components/ToolCard.d.ts +23 -0
  257. package/dist/ui/ink/components/ToolCard.js +20 -0
  258. package/dist/ui/ink/components/ToolCard.js.map +1 -0
  259. package/dist/ui/ink/components/shared/Badge.d.ts +21 -0
  260. package/dist/ui/ink/components/shared/Badge.js +39 -0
  261. package/dist/ui/ink/components/shared/Badge.js.map +1 -0
  262. package/dist/ui/ink/components/shared/Card.d.ts +18 -0
  263. package/dist/ui/ink/components/shared/Card.js +11 -0
  264. package/dist/ui/ink/components/shared/Card.js.map +1 -0
  265. package/dist/ui/ink/components/shared/HelpOverlay.d.ts +10 -0
  266. package/dist/ui/ink/components/shared/HelpOverlay.js +28 -0
  267. package/dist/ui/ink/components/shared/HelpOverlay.js.map +1 -0
  268. package/dist/ui/ink/components/shared/LoadingWithTimeout.d.ts +11 -0
  269. package/dist/ui/ink/components/shared/LoadingWithTimeout.js +21 -0
  270. package/dist/ui/ink/components/shared/LoadingWithTimeout.js.map +1 -0
  271. package/dist/ui/ink/components/shared/Menu.d.ts +23 -0
  272. package/dist/ui/ink/components/shared/Menu.js +43 -0
  273. package/dist/ui/ink/components/shared/Menu.js.map +1 -0
  274. package/dist/ui/ink/components/shared/Table.d.ts +23 -0
  275. package/dist/ui/ink/components/shared/Table.js +40 -0
  276. package/dist/ui/ink/components/shared/Table.js.map +1 -0
  277. package/dist/ui/ink/components/views/CrawlingView.d.ts +12 -0
  278. package/dist/ui/ink/components/views/CrawlingView.js +34 -0
  279. package/dist/ui/ink/components/views/CrawlingView.js.map +1 -0
  280. package/dist/ui/ink/components/views/DashboardView.d.ts +21 -0
  281. package/dist/ui/ink/components/views/DashboardView.js +51 -0
  282. package/dist/ui/ink/components/views/DashboardView.js.map +1 -0
  283. package/dist/ui/ink/components/views/FindingDetailView.d.ts +16 -0
  284. package/dist/ui/ink/components/views/FindingDetailView.js +34 -0
  285. package/dist/ui/ink/components/views/FindingDetailView.js.map +1 -0
  286. package/dist/ui/ink/components/views/FindingsView.d.ts +16 -0
  287. package/dist/ui/ink/components/views/FindingsView.js +79 -0
  288. package/dist/ui/ink/components/views/FindingsView.js.map +1 -0
  289. package/dist/ui/ink/components/views/OnboardingView.d.ts +12 -0
  290. package/dist/ui/ink/components/views/OnboardingView.js +40 -0
  291. package/dist/ui/ink/components/views/OnboardingView.js.map +1 -0
  292. package/dist/ui/ink/components/views/SimulationView.d.ts +17 -0
  293. package/dist/ui/ink/components/views/SimulationView.js +53 -0
  294. package/dist/ui/ink/components/views/SimulationView.js.map +1 -0
  295. package/dist/ui/ink/components/views/TestCaseDetailView.d.ts +11 -0
  296. package/dist/ui/ink/components/views/TestCaseDetailView.js +53 -0
  297. package/dist/ui/ink/components/views/TestCaseDetailView.js.map +1 -0
  298. package/dist/ui/ink/components/views/ToolDetailView.d.ts +15 -0
  299. package/dist/ui/ink/components/views/ToolDetailView.js +25 -0
  300. package/dist/ui/ink/components/views/ToolDetailView.js.map +1 -0
  301. package/dist/ui/ink/components/views/ToolsView.d.ts +15 -0
  302. package/dist/ui/ink/components/views/ToolsView.js +43 -0
  303. package/dist/ui/ink/components/views/ToolsView.js.map +1 -0
  304. package/dist/ui/ink/demo.d.ts +6 -0
  305. package/dist/ui/ink/demo.js +254 -0
  306. package/dist/ui/ink/demo.js.map +1 -0
  307. package/dist/ui/ink/hooks/useAnimation.d.ts +29 -0
  308. package/dist/ui/ink/hooks/useAnimation.js +89 -0
  309. package/dist/ui/ink/hooks/useAnimation.js.map +1 -0
  310. package/dist/ui/ink/hooks/useAudit.d.ts +69 -0
  311. package/dist/ui/ink/hooks/useAudit.js +99 -0
  312. package/dist/ui/ink/hooks/useAudit.js.map +1 -0
  313. package/dist/ui/ink/hooks/useCrawlAnimation.d.ts +19 -0
  314. package/dist/ui/ink/hooks/useCrawlAnimation.js +204 -0
  315. package/dist/ui/ink/hooks/useCrawlAnimation.js.map +1 -0
  316. package/dist/ui/ink/hooks/useKeyboardNav.d.ts +23 -0
  317. package/dist/ui/ink/hooks/useKeyboardNav.js +81 -0
  318. package/dist/ui/ink/hooks/useKeyboardNav.js.map +1 -0
  319. package/dist/ui/ink/hooks/useNavigation.d.ts +16 -0
  320. package/dist/ui/ink/hooks/useNavigation.js +42 -0
  321. package/dist/ui/ink/hooks/useNavigation.js.map +1 -0
  322. package/dist/ui/ink/hooks/useTerminalSize.d.ts +10 -0
  323. package/dist/ui/ink/hooks/useTerminalSize.js +29 -0
  324. package/dist/ui/ink/hooks/useTerminalSize.js.map +1 -0
  325. package/dist/ui/ink/index.d.ts +43 -0
  326. package/dist/ui/ink/index.js +50 -0
  327. package/dist/ui/ink/index.js.map +1 -0
  328. package/dist/ui/ink/render.d.ts +24 -0
  329. package/dist/ui/ink/render.js +14 -0
  330. package/dist/ui/ink/render.js.map +1 -0
  331. package/dist/ui/ink/theme.d.ts +37 -0
  332. package/dist/ui/ink/theme.js +38 -0
  333. package/dist/ui/ink/theme.js.map +1 -0
  334. package/dist/ui/ink/types.d.ts +77 -0
  335. package/dist/ui/ink/types.js +5 -0
  336. package/dist/ui/ink/types.js.map +1 -0
  337. package/dist/ui/score-display.d.ts +16 -0
  338. package/dist/ui/score-display.js +201 -0
  339. package/dist/ui/score-display.js.map +1 -0
  340. package/dist/ui/spinner.d.ts +45 -0
  341. package/dist/ui/spinner.js +112 -0
  342. package/dist/ui/spinner.js.map +1 -0
  343. package/dist/ui/utils.d.ts +13 -0
  344. package/dist/ui/utils.js +25 -0
  345. package/dist/ui/utils.js.map +1 -0
  346. package/package.json +61 -9
  347. package/index.js +0 -105
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Audit Command
3
+ *
4
+ * Run a full WebMCP audit on a website.
5
+ */
6
+ import chalk from 'chalk';
7
+ import figures from 'figures';
8
+ import { truncateText } from '../../ui/design-tokens.js';
9
+ import { createAuditBrowser, closeBrowser, } from '../../browser/playwright.js';
10
+ import { generateRecommendations, } from '../../scoring/calculator.js';
11
+ import { printBanner, printCompactBanner, printPhaseHeader, printSectionHeader, } from '../../ui/banner.js';
12
+ import { runStep, success, warning, error, skip } from '../../ui/spinner.js';
13
+ import { animateScoreReveal, displayScoreStatic } from '../../ui/score-display.js';
14
+ import { renderFindingsTable, renderRecommendations, renderToolsList } from '../../ui/findings.js';
15
+ import { version } from '../index.js';
16
+ // Agent simulation imports
17
+ import { createLLMClient, generateTestCases, runSimulations, judgeSimulations, } from '../../agent/index.js';
18
+ import { runSinglePageAudit, } from '../../audit/run-single-page-audit.js';
19
+ import { parseAuditCommandOptions } from '../options/parse-audit-options.js';
20
+ /**
21
+ * Validate URL
22
+ */
23
+ function validateUrl(url) {
24
+ try {
25
+ const parsed = new URL(url);
26
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
27
+ throw new Error('URL must use http or https protocol');
28
+ }
29
+ return parsed;
30
+ }
31
+ catch {
32
+ throw new Error(`Invalid URL: ${url}`);
33
+ }
34
+ }
35
+ /**
36
+ * Get site context from URL for LLM prompts
37
+ */
38
+ function getSiteContext(url, title) {
39
+ // Try to infer site type from URL and title
40
+ const domain = url.hostname.toLowerCase();
41
+ const titleLower = title.toLowerCase();
42
+ const pathLower = url.pathname.toLowerCase();
43
+ if (domain.includes('travel') || titleLower.includes('travel') ||
44
+ titleLower.includes('flight') || titleLower.includes('hotel')) {
45
+ return 'travel booking';
46
+ }
47
+ if (domain.includes('shop') || titleLower.includes('shop') ||
48
+ titleLower.includes('store') || titleLower.includes('product')) {
49
+ return 'e-commerce';
50
+ }
51
+ if (domain.includes('bank') || titleLower.includes('bank') ||
52
+ titleLower.includes('finance')) {
53
+ return 'financial services';
54
+ }
55
+ if (pathLower.includes('demo') || domain.includes('demo')) {
56
+ return 'demo';
57
+ }
58
+ return 'website';
59
+ }
60
+ /**
61
+ * Run agent simulation phase
62
+ */
63
+ async function runAgentSimulation(tools, siteContext, config) {
64
+ const llm = createLLMClient({
65
+ model: config.model || process.env['OPENROUTER_MODEL'] || 'anthropic/claude-sonnet-4',
66
+ });
67
+ // Check if LLM is available
68
+ if (!llm.isAvailable()) {
69
+ return null;
70
+ }
71
+ // Generate test cases
72
+ const testCases = await generateTestCases(tools, siteContext, {
73
+ count: Math.min(config.promptsPerTool * tools.length, 50), // Cap at 50 total
74
+ categories: ['happy_path', 'partial_info', 'casual', 'adversarial', 'out_of_scope'],
75
+ model: config.model,
76
+ }, llm);
77
+ if (testCases.length === 0) {
78
+ return null;
79
+ }
80
+ // Run simulations
81
+ const simResults = await runSimulations(testCases, tools, {
82
+ maxRounds: config.maxRounds,
83
+ mockToolResponses: true,
84
+ model: config.model || 'anthropic/claude-sonnet-4',
85
+ siteContext,
86
+ maxCost: config.maxCost,
87
+ });
88
+ // Judge results
89
+ const judgment = await judgeSimulations(simResults, tools, llm);
90
+ return { simResults, judgment };
91
+ }
92
+ /**
93
+ * Render simulation results
94
+ */
95
+ function renderSimulationResults(simResults, judgment) {
96
+ printSectionHeader('Agent Simulation Results');
97
+ // Summary stats
98
+ const passed = simResults.filter(r => r.finalSuccess).length;
99
+ const failed = simResults.length - passed;
100
+ const avgScore = Math.round(simResults.reduce((s, r) => s + r.evaluation.overallScore, 0) / simResults.length);
101
+ const totalCost = simResults.reduce((s, r) => s + r.totalCost, 0);
102
+ console.log(` ${chalk.cyan('Tests:')} ${simResults.length} total, ${chalk.green(passed + ' passed')}, ${chalk.red(failed + ' failed')}`);
103
+ console.log(` ${chalk.cyan('Avg Score:')} ${avgScore}/100`);
104
+ console.log(` ${chalk.cyan('Pass Rate:')} ${Math.round(judgment.passRate * 100)}%`);
105
+ console.log(` ${chalk.cyan('LLM Cost:')} $${totalCost.toFixed(4)}`);
106
+ console.log('');
107
+ // Show failure patterns if any
108
+ if (judgment.failurePatterns.length > 0) {
109
+ console.log(chalk.yellow(' Top Issues:'));
110
+ for (const pattern of judgment.failurePatterns.slice(0, 3)) {
111
+ console.log(` ${chalk.dim('•')} ${pattern.pattern} (${pattern.frequency}x)`);
112
+ }
113
+ console.log('');
114
+ }
115
+ // Show top improvements
116
+ if (judgment.topImprovements.length > 0) {
117
+ console.log(chalk.cyan(' Suggested Improvements:'));
118
+ for (const improvement of judgment.topImprovements.slice(0, 3)) {
119
+ console.log(` ${chalk.dim('•')} ${chalk.white(improvement.tool)}: ${improvement.suggestedFix}`);
120
+ }
121
+ console.log('');
122
+ }
123
+ // Show some test results
124
+ const showResults = simResults.slice(0, 5);
125
+ console.log(chalk.dim(' Sample Tests:'));
126
+ for (const result of showResults) {
127
+ const icon = result.finalSuccess ? chalk.green(figures.tick) : chalk.red(figures.cross);
128
+ const score = result.evaluation.overallScore;
129
+ const scoreColor = score >= 70 ? chalk.green : score >= 50 ? chalk.yellow : chalk.red;
130
+ console.log(` ${icon} ${chalk.white(truncateText(result.testCase.prompt, 50))} ${scoreColor(score + '/100')}`);
131
+ }
132
+ if (simResults.length > 5) {
133
+ console.log(chalk.dim(` ... and ${simResults.length - 5} more tests`));
134
+ }
135
+ console.log('');
136
+ }
137
+ async function runBrowserSetup(config) {
138
+ let session = null;
139
+ const result = await runStep('Launching browser with WebMCP', async () => {
140
+ session = await createAuditBrowser({
141
+ headless: !config.visible,
142
+ timeout: config.timeout,
143
+ });
144
+ return success('Chromium ready');
145
+ });
146
+ if (result.status === 'error') {
147
+ return null;
148
+ }
149
+ return session;
150
+ }
151
+ async function runPageAuditPhase(session, url, config) {
152
+ let auditResult = null;
153
+ const result = await runStep(`Auditing ${url.hostname}`, async () => {
154
+ auditResult = await runSinglePageAudit({
155
+ context: session.context,
156
+ url: url.href,
157
+ timeout: config.timeout,
158
+ extraWaitMs: 2000,
159
+ });
160
+ if (!auditResult.hasWebMCP) {
161
+ return warning('WebMCP not available');
162
+ }
163
+ if (auditResult.tools.length === 0) {
164
+ return skip('no tools registered');
165
+ }
166
+ return success(`${auditResult.tools.length} tool(s) found`);
167
+ });
168
+ if (result.status === 'error' || !auditResult) {
169
+ throw new Error('no audit result produced');
170
+ }
171
+ return auditResult;
172
+ }
173
+ async function runFindingsAnalysisPhase(findings) {
174
+ await runStep('Evaluating findings', async () => {
175
+ const critical = findings.filter((f) => f.severity === 'critical').length;
176
+ const warn = findings.filter((f) => f.severity === 'warning').length;
177
+ if (critical > 0) {
178
+ return error(`${critical} critical, ${warn} warnings`);
179
+ }
180
+ if (warn > 0) {
181
+ return warning(`${warn} warnings`);
182
+ }
183
+ return success('all checks passed');
184
+ });
185
+ }
186
+ async function runSimulationPhase(config, tools, url, title, hasApiKey) {
187
+ if (config.noSimulation || tools.length === 0) {
188
+ return null;
189
+ }
190
+ if (!hasApiKey) {
191
+ console.log(chalk.dim(` ${figures.line} Skipping agent simulation (no OPENROUTER_API_KEY)`));
192
+ console.log('');
193
+ return null;
194
+ }
195
+ printPhaseHeader(3.5, 'Agent Simulation');
196
+ const siteContext = getSiteContext(url, title);
197
+ let simulationResults = null;
198
+ await runStep(`Testing ${tools.length} tool(s) with AI agent`, async () => {
199
+ try {
200
+ simulationResults = await runAgentSimulation(tools, siteContext, config);
201
+ if (!simulationResults) {
202
+ return skip('LLM not available');
203
+ }
204
+ const passRate = Math.round(simulationResults.judgment.passRate * 100);
205
+ if (passRate >= 80) {
206
+ return success(`${passRate}% pass rate`);
207
+ }
208
+ if (passRate >= 50) {
209
+ return warning(`${passRate}% pass rate`);
210
+ }
211
+ return error(`${passRate}% pass rate`);
212
+ }
213
+ catch (e) {
214
+ console.warn(chalk.yellow(`\n Simulation error: ${e instanceof Error ? e.message : e}`));
215
+ return skip('simulation failed');
216
+ }
217
+ });
218
+ return simulationResults;
219
+ }
220
+ async function renderResultsPhase(auditResult, findings, tools, simulationResults, animate) {
221
+ const score = auditResult.score;
222
+ const recommendations = generateRecommendations(findings);
223
+ console.log('');
224
+ if (animate) {
225
+ await animateScoreReveal(score);
226
+ }
227
+ else {
228
+ displayScoreStatic(score);
229
+ }
230
+ if (tools.length > 0) {
231
+ printSectionHeader('Detected Tools');
232
+ renderToolsList(tools);
233
+ console.log('');
234
+ }
235
+ if (simulationResults) {
236
+ renderSimulationResults(simulationResults.simResults, simulationResults.judgment);
237
+ }
238
+ if (findings.length > 0) {
239
+ printSectionHeader('Issues Found');
240
+ renderFindingsTable(findings);
241
+ }
242
+ if (recommendations.length > 0) {
243
+ renderRecommendations(recommendations);
244
+ }
245
+ }
246
+ function printCiOutcome(score, minScore) {
247
+ if (score.total >= minScore) {
248
+ console.log(chalk.green(`PASS: Score ${score.total}/100 (${score.grade}) >= ${minScore}`));
249
+ return 0;
250
+ }
251
+ console.log(chalk.red(`FAIL: Score ${score.total}/100 (${score.grade}) < ${minScore}`));
252
+ return 1;
253
+ }
254
+ /**
255
+ * Run the audit command
256
+ */
257
+ export async function runAudit(urlString, options) {
258
+ const startTime = Date.now();
259
+ let config;
260
+ try {
261
+ config = parseAuditCommandOptions(options);
262
+ }
263
+ catch (e) {
264
+ console.error(chalk.red(`Error: ${e instanceof Error ? e.message : 'Invalid audit options'}`));
265
+ return 2;
266
+ }
267
+ const animate = options.animation !== false && !config.ci;
268
+ // Print banner
269
+ if (config.ci) {
270
+ printCompactBanner(version);
271
+ }
272
+ else {
273
+ printBanner(version);
274
+ }
275
+ // Validate URL
276
+ let url;
277
+ try {
278
+ url = validateUrl(urlString);
279
+ }
280
+ catch (e) {
281
+ console.error(chalk.red(`Error: ${e instanceof Error ? e.message : 'Invalid URL'}`));
282
+ return 2;
283
+ }
284
+ console.log(chalk.white(` Auditing: ${chalk.cyan(url.href)}`));
285
+ console.log('');
286
+ // Check for API key
287
+ const hasApiKey = Boolean(process.env['OPENROUTER_API_KEY']);
288
+ if (!hasApiKey && !config.noSimulation) {
289
+ console.log(chalk.dim(` ${figures.info} Set OPENROUTER_API_KEY for AI-powered agent simulation`));
290
+ console.log('');
291
+ }
292
+ // ═══════════════════════════════════════════════════════
293
+ // Phase 1: Browser Setup
294
+ // ═══════════════════════════════════════════════════════
295
+ printPhaseHeader(1, 'Browser Setup');
296
+ let browserSession = null;
297
+ try {
298
+ browserSession = await runBrowserSetup(config);
299
+ if (!browserSession) {
300
+ return 2;
301
+ }
302
+ }
303
+ catch (e) {
304
+ console.error(chalk.red(`Failed to launch browser: ${e instanceof Error ? e.message : e}`));
305
+ return 2;
306
+ }
307
+ let auditResult;
308
+ let simulationResults = null;
309
+ try {
310
+ // ═══════════════════════════════════════════════════════
311
+ // Phase 2: Page Audit + Detection
312
+ // ═══════════════════════════════════════════════════════
313
+ printPhaseHeader(2, 'Page Audit');
314
+ auditResult = await runPageAuditPhase(browserSession, url, config);
315
+ // ═══════════════════════════════════════════════════════
316
+ // Phase 3: Analysis
317
+ // ═══════════════════════════════════════════════════════
318
+ printPhaseHeader(3, 'Analysis');
319
+ const findings = auditResult.findings;
320
+ const allTools = auditResult.tools;
321
+ await runFindingsAnalysisPhase(findings);
322
+ simulationResults = await runSimulationPhase(config, allTools, url, auditResult.title, hasApiKey);
323
+ }
324
+ catch (e) {
325
+ console.error(chalk.red(`Audit failed: ${e instanceof Error ? e.message : e}`));
326
+ return 2;
327
+ }
328
+ finally {
329
+ if (browserSession) {
330
+ await closeBrowser(browserSession.browser);
331
+ }
332
+ }
333
+ // ═══════════════════════════════════════════════════════
334
+ // Phase 4: Results
335
+ // ═══════════════════════════════════════════════════════
336
+ printPhaseHeader(4, 'Results');
337
+ await renderResultsPhase(auditResult, auditResult.findings, auditResult.tools, simulationResults, animate);
338
+ // Final summary
339
+ const duration = Date.now() - startTime;
340
+ console.log('');
341
+ console.log(chalk.dim(` Audit completed in ${(duration / 1000).toFixed(1)}s`));
342
+ console.log('');
343
+ // CI mode exit
344
+ if (config.ci) {
345
+ return printCiOutcome(auditResult.score, config.minScore);
346
+ }
347
+ return 0;
348
+ }
349
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Interactive Command
3
+ *
4
+ * Launches full-screen TUI with smart advice
5
+ */
6
+ interface InteractiveOptions {
7
+ timeout?: string;
8
+ }
9
+ export declare function runInteractive(url: string | undefined, options: InteractiveOptions): Promise<void>;
10
+ export {};
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Interactive Command
3
+ *
4
+ * Launches full-screen TUI with smart advice
5
+ */
6
+ import chalk from 'chalk';
7
+ import { render } from 'ink';
8
+ import { createElement } from 'react';
9
+ import { RealAuditApp } from '../../ui/ink/RealAuditApp.js';
10
+ import { AdviceService } from '../../llm/advice-service.js';
11
+ import { version } from '../index.js';
12
+ import { parseInteractiveCommandOptions } from '../options/parse-audit-options.js';
13
+ export async function runInteractive(url, options) {
14
+ let parsedOptions;
15
+ try {
16
+ parsedOptions = parseInteractiveCommandOptions(options);
17
+ }
18
+ catch (e) {
19
+ console.error(chalk.red(`Error: ${e instanceof Error ? e.message : 'Invalid interactive options'}`));
20
+ return;
21
+ }
22
+ const adviceService = new AdviceService();
23
+ // Launch interactive TUI
24
+ const { waitUntilExit } = render(createElement(RealAuditApp, {
25
+ initialUrl: url,
26
+ adviceService,
27
+ version,
28
+ config: {
29
+ timeout: parsedOptions.timeout,
30
+ }
31
+ }), { exitOnCtrlC: true });
32
+ await waitUntilExit();
33
+ }
34
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../../src/cli/commands/interactive.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAMnF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAuB,EACvB,OAA2B;IAE3B,IAAI,aAAkC,CAAC;IACvC,IAAI,CAAC;QACH,aAAa,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;QACrG,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,yBAAyB;IACzB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,aAAa,CAAC,YAAY,EAAE;QAC1B,UAAU,EAAE,GAAG;QACf,aAAa;QACb,OAAO;QACP,MAAM,EAAE;YACN,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B;KACF,CAAC,EACF,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAC;IAEF,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CLI Setup
3
+ *
4
+ * Configures Commander.js with all commands.
5
+ */
6
+ import 'dotenv/config';
7
+ import { Command } from 'commander';
8
+ declare let version: string;
9
+ /**
10
+ * Create and configure the CLI program
11
+ */
12
+ export declare function createProgram(): Command;
13
+ /**
14
+ * Run the CLI
15
+ */
16
+ export declare function run(): Promise<void>;
17
+ export { version };
@@ -0,0 +1,84 @@
1
+ /**
2
+ * CLI Setup
3
+ *
4
+ * Configures Commander.js with all commands.
5
+ */
6
+ // Load environment variables first
7
+ import 'dotenv/config';
8
+ import { Command } from 'commander';
9
+ import { readFileSync } from 'fs';
10
+ import { fileURLToPath } from 'url';
11
+ import { dirname, join } from 'path';
12
+ import chalk from 'chalk';
13
+ // Get package.json for version
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ let version = '0.1.0';
17
+ try {
18
+ const pkgPath = join(__dirname, '..', '..', 'package.json');
19
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
20
+ version = pkg.version;
21
+ }
22
+ catch {
23
+ // Ignore errors reading package.json
24
+ }
25
+ /**
26
+ * Create and configure the CLI program
27
+ */
28
+ export function createProgram() {
29
+ const program = new Command();
30
+ program
31
+ .name('webmcp')
32
+ .description(chalk.cyan('Audit any website for AI agent readiness (WebMCP)'))
33
+ .version(version, '-v, --version')
34
+ .option('--debug', 'Enable debug logging');
35
+ // ═══════════════════════════════════════════════════════
36
+ // COMMAND: audit
37
+ // ═══════════════════════════════════════════════════════
38
+ program
39
+ .command('audit')
40
+ .description('Run a full WebMCP audit on a website')
41
+ .argument('<url>', 'The URL to audit')
42
+ .option('-t, --timeout <ms>', 'Per-page timeout in milliseconds', '30000')
43
+ .option('--visible', 'Run browser in visible mode (for debugging)')
44
+ .option('--no-animation', 'Disable score animation')
45
+ .option('--ci', 'CI mode: exit with code 1 if score below threshold')
46
+ .option('--min-score <number>', 'Minimum score for CI mode', '60')
47
+ // LLM / Simulation options
48
+ .option('--model <model>', 'LLM model to use (e.g., anthropic/claude-sonnet-4)')
49
+ .option('--no-simulation', 'Skip agent simulation tests')
50
+ .option('--prompts-per-tool <number>', 'Test prompts per tool', '10')
51
+ .option('--max-rounds <number>', 'Max conversation rounds', '5')
52
+ .option('--max-cost <dollars>', 'Max cost in USD', '2.00')
53
+ .action(async (url, options) => {
54
+ // Dynamic import to keep startup fast
55
+ const { runAudit } = await import('./commands/audit.js');
56
+ const exitCode = await runAudit(url, options);
57
+ if (exitCode !== 0) {
58
+ process.exitCode = exitCode;
59
+ }
60
+ });
61
+ // ═══════════════════════════════════════════════════════
62
+ // COMMAND: interactive (full-screen TUI)
63
+ // ═══════════════════════════════════════════════════════
64
+ program
65
+ .command('interactive')
66
+ .alias('i')
67
+ .description('Launch interactive TUI with smart AI advice')
68
+ .argument('[url]', 'Optional URL to audit immediately')
69
+ .option('-t, --timeout <ms>', 'Per-page timeout in milliseconds', '30000')
70
+ .action(async (url, options) => {
71
+ const { runInteractive } = await import('./commands/interactive.js');
72
+ await runInteractive(url, options);
73
+ });
74
+ return program;
75
+ }
76
+ /**
77
+ * Run the CLI
78
+ */
79
+ export async function run() {
80
+ const program = createProgram();
81
+ await program.parseAsync(process.argv);
82
+ }
83
+ export { version };
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared CLI option parsing and validation for audit flows.
3
+ */
4
+ import type { AuditConfig, AuditOptions } from '../../core/types/audit.js';
5
+ export interface InteractiveCommandOptions {
6
+ timeout?: string;
7
+ }
8
+ export interface InteractiveCommandConfig {
9
+ timeout: number;
10
+ }
11
+ export declare function parseAuditCommandOptions(options: AuditOptions): AuditConfig;
12
+ export declare function parseInteractiveCommandOptions(options: InteractiveCommandOptions): InteractiveCommandConfig;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Shared CLI option parsing and validation for audit flows.
3
+ */
4
+ import { DEFAULT_AUDIT_CONFIG } from '../../core/constants.js';
5
+ function parseIntegerOption(name, value, fallback, minimum) {
6
+ const raw = value ?? String(fallback);
7
+ const parsed = Number.parseInt(raw, 10);
8
+ if (!Number.isFinite(parsed) || parsed < minimum) {
9
+ throw new Error(`Invalid --${name}: "${raw}" (must be an integer >= ${minimum})`);
10
+ }
11
+ return parsed;
12
+ }
13
+ function parseNumberOption(name, value, fallback, minimum) {
14
+ const raw = value ?? String(fallback);
15
+ const parsed = Number.parseFloat(raw);
16
+ if (!Number.isFinite(parsed) || parsed < minimum) {
17
+ throw new Error(`Invalid --${name}: "${raw}" (must be a number >= ${minimum})`);
18
+ }
19
+ return parsed;
20
+ }
21
+ function parseEnvInteger(envName, fallback, minimum) {
22
+ const raw = process.env[envName];
23
+ if (raw == null || raw === '') {
24
+ return fallback;
25
+ }
26
+ const parsed = Number.parseInt(raw, 10);
27
+ if (!Number.isFinite(parsed) || parsed < minimum) {
28
+ throw new Error(`Invalid ${envName}: "${raw}" (must be an integer >= ${minimum})`);
29
+ }
30
+ return parsed;
31
+ }
32
+ function parseEnvNumber(envName, fallback, minimum) {
33
+ const raw = process.env[envName];
34
+ if (raw == null || raw === '') {
35
+ return fallback;
36
+ }
37
+ const parsed = Number.parseFloat(raw);
38
+ if (!Number.isFinite(parsed) || parsed < minimum) {
39
+ throw new Error(`Invalid ${envName}: "${raw}" (must be a number >= ${minimum})`);
40
+ }
41
+ return parsed;
42
+ }
43
+ export function parseAuditCommandOptions(options) {
44
+ const promptsPerToolDefault = parseEnvInteger('WEBMCP_PROMPTS_PER_TOOL', DEFAULT_AUDIT_CONFIG.promptsPerTool, 1);
45
+ const maxRoundsDefault = parseEnvInteger('WEBMCP_MAX_ROUNDS', DEFAULT_AUDIT_CONFIG.maxRounds, 1);
46
+ const maxCostDefault = parseEnvNumber('WEBMCP_MAX_COST', DEFAULT_AUDIT_CONFIG.maxCost, 0);
47
+ return {
48
+ timeout: parseIntegerOption('timeout', options.timeout, DEFAULT_AUDIT_CONFIG.timeout, 1000),
49
+ visible: options.visible ?? DEFAULT_AUDIT_CONFIG.visible,
50
+ noSimulation: options.noSimulation ?? DEFAULT_AUDIT_CONFIG.noSimulation,
51
+ model: options.model,
52
+ ci: options.ci ?? DEFAULT_AUDIT_CONFIG.ci,
53
+ minScore: parseIntegerOption('min-score', options.minScore, DEFAULT_AUDIT_CONFIG.minScore, 0),
54
+ promptsPerTool: parseIntegerOption('prompts-per-tool', options.promptsPerTool, promptsPerToolDefault, 1),
55
+ maxRounds: parseIntegerOption('max-rounds', options.maxRounds, maxRoundsDefault, 1),
56
+ maxCost: parseNumberOption('max-cost', options.maxCost, maxCostDefault, 0),
57
+ };
58
+ }
59
+ export function parseInteractiveCommandOptions(options) {
60
+ return {
61
+ timeout: parseIntegerOption('timeout', options.timeout, DEFAULT_AUDIT_CONFIG.timeout, 1000),
62
+ };
63
+ }
64
+ //# sourceMappingURL=parse-audit-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-audit-options.js","sourceRoot":"","sources":["../../../src/cli/options/parse-audit-options.ts"],"names":[],"mappings":"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"}