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,105 @@
1
+ /**
2
+ * LLM-005: Full Quality Analysis
3
+ *
4
+ * Comprehensive LLM-based quality analysis of tool descriptions.
5
+ * This is the "premium" LLM rule that provides:
6
+ * - Overall quality score
7
+ * - Aspect-by-aspect breakdown
8
+ * - Suggested improved descriptions
9
+ * - Priority improvements
10
+ *
11
+ * This rule has a higher weight as it represents the most
12
+ * thorough AI-powered analysis.
13
+ */
14
+ import { createRuleResult } from '../runner.js';
15
+ import { getDefaultEvaluator } from '../../llm/evaluator.js';
16
+ export const LLM_005 = {
17
+ id: 'LLM-005',
18
+ category: 'description',
19
+ name: 'Full Quality Analysis',
20
+ description: 'Comprehensive LLM evaluation of tool description quality',
21
+ severity: 'warning',
22
+ maxScore: 20,
23
+ async check(context) {
24
+ const tools = context.tools;
25
+ if (tools.length === 0) {
26
+ return createRuleResult('LLM-005', 20, {
27
+ passed: true,
28
+ score: 20,
29
+ message: 'No tools detected (rule not applicable)',
30
+ });
31
+ }
32
+ const evaluator = getDefaultEvaluator();
33
+ if (!evaluator.isLLMAvailable()) {
34
+ return createRuleResult('LLM-005', 20, {
35
+ passed: true,
36
+ score: 20,
37
+ message: 'LLM full analysis skipped (no API key configured)',
38
+ details: [
39
+ 'Set OPENROUTER_API_KEY for comprehensive AI-powered analysis',
40
+ 'This includes: clarity, specificity, steering performance, atomicity',
41
+ ],
42
+ });
43
+ }
44
+ const reports = [];
45
+ let totalScore = 0;
46
+ for (const tool of tools) {
47
+ const report = await evaluator.getQualityReport(tool);
48
+ reports.push({ tool: tool.name, report });
49
+ totalScore += report.overallScore;
50
+ }
51
+ const avgScore = totalScore / tools.length;
52
+ const normalizedScore = Math.round((avgScore / 100) * 20);
53
+ // Collect all issues and suggestions
54
+ const allDetails = [];
55
+ const allSuggestions = [];
56
+ const affectedTools = [];
57
+ for (const { tool, report } of reports) {
58
+ if (report.overallScore < 70) {
59
+ affectedTools.push(tool);
60
+ allDetails.push(`Tool "${tool}" (score: ${report.overallScore}/100):`);
61
+ allDetails.push(` Summary: ${report.summary}`);
62
+ // Add aspect breakdowns for low scores
63
+ const aspects = report.aspects;
64
+ if (aspects.clarity.score < 7) {
65
+ allDetails.push(` - Clarity: ${aspects.clarity.score}/10 - ${aspects.clarity.reasoning}`);
66
+ }
67
+ if (aspects.specificity.score < 7) {
68
+ allDetails.push(` - Specificity: ${aspects.specificity.score}/10 - ${aspects.specificity.reasoning}`);
69
+ }
70
+ if (aspects.steeringPerformance.score < 7) {
71
+ allDetails.push(` - Steering: ${aspects.steeringPerformance.score}/10 - ${aspects.steeringPerformance.reasoning}`);
72
+ }
73
+ if (aspects.atomicity.score < 7) {
74
+ allDetails.push(` - Atomicity: ${aspects.atomicity.score}/10 - ${aspects.atomicity.reasoning}`);
75
+ }
76
+ // Collect suggestions
77
+ allSuggestions.push(...report.priorityImprovements);
78
+ // Add suggested description if available
79
+ if (report.suggestedDescription) {
80
+ allSuggestions.push(`Suggested description for "${tool}": "${report.suggestedDescription}"`);
81
+ }
82
+ }
83
+ }
84
+ if (affectedTools.length === 0) {
85
+ return createRuleResult('LLM-005', 20, {
86
+ passed: true,
87
+ score: normalizedScore,
88
+ message: `All ${tools.length} tool(s) have good quality descriptions (avg: ${avgScore.toFixed(0)}/100)`,
89
+ details: reports.map((r) => `${r.tool}: ${r.report.overallScore}/100 - ${r.report.summary}`),
90
+ });
91
+ }
92
+ return createRuleResult('LLM-005', 20, {
93
+ passed: false,
94
+ score: normalizedScore,
95
+ message: `${affectedTools.length}/${tools.length} tool(s) need description improvements (avg: ${avgScore.toFixed(0)}/100)`,
96
+ details: allDetails,
97
+ suggestions: allSuggestions
98
+ .filter((s, i, arr) => arr.indexOf(s) === i)
99
+ .slice(0, 10),
100
+ affectedTools,
101
+ });
102
+ },
103
+ };
104
+ export default LLM_005;
105
+ //# sourceMappingURL=LLM-005.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLM-005.js","sourceRoot":"","sources":["../../../src/rules/llm/LLM-005.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * LLM Rules Module
3
+ *
4
+ * LLM-powered audit rules for deep tool description analysis.
5
+ */
6
+ export { LLM_001 } from './LLM-001.js';
7
+ export { LLM_002 } from './LLM-002.js';
8
+ export { LLM_003 } from './LLM-003.js';
9
+ export { LLM_004 } from './LLM-004.js';
10
+ export { LLM_005 } from './LLM-005.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * LLM Rules Module
3
+ *
4
+ * LLM-powered audit rules for deep tool description analysis.
5
+ */
6
+ export { LLM_001 } from './LLM-001.js';
7
+ export { LLM_002 } from './LLM-002.js';
8
+ export { LLM_003 } from './LLM-003.js';
9
+ export { LLM_004 } from './LLM-004.js';
10
+ export { LLM_005 } from './LLM-005.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Rule Runner
3
+ *
4
+ * Executes audit rules and collects results.
5
+ */
6
+ import type { Rule, RuleContext, RuleResult, RuleCategory } from '../core/types/rule.js';
7
+ /**
8
+ * Register a rule
9
+ */
10
+ export declare function registerRule(rule: Rule): void;
11
+ /**
12
+ * Get a rule by ID
13
+ */
14
+ export declare function getRule(id: string): Rule | undefined;
15
+ /**
16
+ * Get all registered rules
17
+ */
18
+ export declare function getAllRules(): Rule[];
19
+ /**
20
+ * Get rules by category
21
+ */
22
+ export declare function getRulesByCategory(category: RuleCategory): Rule[];
23
+ /**
24
+ * Get rule categories for all rules
25
+ */
26
+ export declare function getRuleCategories(): Map<string, RuleCategory>;
27
+ /**
28
+ * Get rule severities for all rules
29
+ */
30
+ export declare function getRuleSeverities(): Map<string, 'critical' | 'warning' | 'info'>;
31
+ /**
32
+ * Run all rules against the given context
33
+ */
34
+ export declare function runAllRules(context: RuleContext): Promise<Map<string, RuleResult>>;
35
+ /**
36
+ * Run specific rules against the given context
37
+ */
38
+ export declare function runRules(ruleIds: string[], context: RuleContext): Promise<Map<string, RuleResult>>;
39
+ /**
40
+ * Create a helper to build rule results
41
+ */
42
+ export declare function createRuleResult(ruleId: string, maxScore: number, options: {
43
+ passed?: boolean;
44
+ score?: number;
45
+ message: string;
46
+ details?: string[];
47
+ suggestions?: string[];
48
+ affectedTools?: string[];
49
+ affectedPages?: string[];
50
+ }): RuleResult;
51
+ /**
52
+ * Clear all registered rules (for testing)
53
+ */
54
+ export declare function clearRules(): void;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Rule Runner
3
+ *
4
+ * Executes audit rules and collects results.
5
+ */
6
+ /**
7
+ * Rule registry
8
+ */
9
+ const rules = new Map();
10
+ /**
11
+ * Register a rule
12
+ */
13
+ export function registerRule(rule) {
14
+ if (rules.has(rule.id)) {
15
+ throw new Error(`Rule ${rule.id} is already registered`);
16
+ }
17
+ rules.set(rule.id, rule);
18
+ }
19
+ /**
20
+ * Get a rule by ID
21
+ */
22
+ export function getRule(id) {
23
+ return rules.get(id);
24
+ }
25
+ /**
26
+ * Get all registered rules
27
+ */
28
+ export function getAllRules() {
29
+ return Array.from(rules.values());
30
+ }
31
+ /**
32
+ * Get rules by category
33
+ */
34
+ export function getRulesByCategory(category) {
35
+ return Array.from(rules.values()).filter((r) => r.category === category);
36
+ }
37
+ /**
38
+ * Get rule categories for all rules
39
+ */
40
+ export function getRuleCategories() {
41
+ const categories = new Map();
42
+ for (const rule of rules.values()) {
43
+ categories.set(rule.id, rule.category);
44
+ }
45
+ return categories;
46
+ }
47
+ /**
48
+ * Get rule severities for all rules
49
+ */
50
+ export function getRuleSeverities() {
51
+ const severities = new Map();
52
+ for (const rule of rules.values()) {
53
+ severities.set(rule.id, rule.severity);
54
+ }
55
+ return severities;
56
+ }
57
+ /**
58
+ * Run all rules against the given context
59
+ */
60
+ export async function runAllRules(context) {
61
+ const results = new Map();
62
+ for (const rule of rules.values()) {
63
+ try {
64
+ const result = await rule.check(context);
65
+ results.set(rule.id, result);
66
+ }
67
+ catch (error) {
68
+ // If a rule throws, record it as failed with an error message
69
+ results.set(rule.id, {
70
+ ruleId: rule.id,
71
+ passed: false,
72
+ score: 0,
73
+ maxScore: rule.maxScore,
74
+ message: `Rule execution error: ${error instanceof Error ? error.message : 'Unknown error'}`,
75
+ details: [
76
+ error instanceof Error ? error.stack ?? '' : String(error),
77
+ ],
78
+ });
79
+ }
80
+ }
81
+ return results;
82
+ }
83
+ /**
84
+ * Run specific rules against the given context
85
+ */
86
+ export async function runRules(ruleIds, context) {
87
+ const results = new Map();
88
+ for (const id of ruleIds) {
89
+ const rule = rules.get(id);
90
+ if (!rule) {
91
+ results.set(id, {
92
+ ruleId: id,
93
+ passed: false,
94
+ score: 0,
95
+ maxScore: 0,
96
+ message: `Rule ${id} not found`,
97
+ });
98
+ continue;
99
+ }
100
+ try {
101
+ const result = await rule.check(context);
102
+ results.set(id, result);
103
+ }
104
+ catch (error) {
105
+ results.set(id, {
106
+ ruleId: rule.id,
107
+ passed: false,
108
+ score: 0,
109
+ maxScore: rule.maxScore,
110
+ message: `Rule execution error: ${error instanceof Error ? error.message : 'Unknown error'}`,
111
+ });
112
+ }
113
+ }
114
+ return results;
115
+ }
116
+ /**
117
+ * Create a helper to build rule results
118
+ */
119
+ export function createRuleResult(ruleId, maxScore, options) {
120
+ return {
121
+ ruleId,
122
+ passed: options.passed ?? (options.score === maxScore),
123
+ score: options.score ?? (options.passed ? maxScore : 0),
124
+ maxScore,
125
+ message: options.message,
126
+ details: options.details,
127
+ suggestions: options.suggestions,
128
+ affectedTools: options.affectedTools,
129
+ affectedPages: options.affectedPages,
130
+ };
131
+ }
132
+ /**
133
+ * Clear all registered rules (for testing)
134
+ */
135
+ export function clearRules() {
136
+ rules.clear();
137
+ }
138
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/rules/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SCHEMA-001: Schema Is Object Type
3
+ *
4
+ * Checks that the root inputSchema type is "object".
5
+ * This is required by the WebMCP specification.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const SCHEMA_001: Rule;
9
+ export default SCHEMA_001;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * SCHEMA-001: Schema Is Object Type
3
+ *
4
+ * Checks that the root inputSchema type is "object".
5
+ * This is required by the WebMCP specification.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const SCHEMA_001 = {
9
+ id: 'SCHEMA-001',
10
+ category: 'schema',
11
+ name: 'Schema Is Object Type',
12
+ description: 'Root inputSchema type must be "object"',
13
+ severity: 'critical',
14
+ maxScore: 10,
15
+ async check(context) {
16
+ const tools = context.tools;
17
+ if (tools.length === 0) {
18
+ return createRuleResult('SCHEMA-001', 10, {
19
+ passed: true,
20
+ score: 10,
21
+ message: 'No tools detected (rule not applicable)',
22
+ });
23
+ }
24
+ const violations = [];
25
+ for (const tool of tools) {
26
+ if (!tool.inputSchema) {
27
+ // Skip tools without inputSchema (handled by IMP-005)
28
+ continue;
29
+ }
30
+ if (tool.inputSchema.type !== 'object') {
31
+ violations.push(`Tool "${tool.name}" has inputSchema.type="${tool.inputSchema.type}" instead of "object"`);
32
+ }
33
+ }
34
+ if (violations.length === 0) {
35
+ return createRuleResult('SCHEMA-001', 10, {
36
+ passed: true,
37
+ score: 10,
38
+ message: 'All tool schemas have type "object"',
39
+ });
40
+ }
41
+ // Deduct 3 points per violation
42
+ const penalty = violations.length * 3;
43
+ const score = Math.max(0, 10 - penalty);
44
+ return createRuleResult('SCHEMA-001', 10, {
45
+ passed: false,
46
+ score,
47
+ message: `${violations.length} tool(s) have invalid schema type`,
48
+ details: violations,
49
+ suggestions: [
50
+ 'Set inputSchema.type to "object"',
51
+ 'Example: { type: "object", properties: { ... } }',
52
+ ],
53
+ });
54
+ },
55
+ };
56
+ export default SCHEMA_001;
57
+ //# sourceMappingURL=SCHEMA-001.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SCHEMA-001.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-001.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,wCAAwC;IACrD,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE;gBACxC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvC,UAAU,CAAC,IAAI,CACb,SAAS,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,WAAW,CAAC,IAAI,uBAAuB,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE;gBACxC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,qCAAqC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;QAExC,OAAO,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE;YACxC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,mCAAmC;YAChE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,kCAAkC;gBAClC,kDAAkD;aACnD;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SCHEMA-002: Properties Defined
3
+ *
4
+ * Checks that the inputSchema has at least one property defined.
5
+ * Tools should have parameters for agents to invoke them properly.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const SCHEMA_002: Rule;
9
+ export default SCHEMA_002;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * SCHEMA-002: Properties Defined
3
+ *
4
+ * Checks that the inputSchema has at least one property defined.
5
+ * Tools should have parameters for agents to invoke them properly.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const SCHEMA_002 = {
9
+ id: 'SCHEMA-002',
10
+ category: 'schema',
11
+ name: 'Properties Defined',
12
+ description: 'Schema should have at least one property defined',
13
+ severity: 'warning',
14
+ maxScore: 8,
15
+ async check(context) {
16
+ const tools = context.tools;
17
+ if (tools.length === 0) {
18
+ return createRuleResult('SCHEMA-002', 8, {
19
+ passed: true,
20
+ score: 8,
21
+ message: 'No tools detected (rule not applicable)',
22
+ });
23
+ }
24
+ const violations = [];
25
+ for (const tool of tools) {
26
+ if (!tool.inputSchema) {
27
+ // Skip tools without inputSchema (handled by IMP-005)
28
+ continue;
29
+ }
30
+ const properties = tool.inputSchema.properties;
31
+ if (!properties || Object.keys(properties).length === 0) {
32
+ violations.push(`Tool "${tool.name}" has no properties defined`);
33
+ }
34
+ }
35
+ if (violations.length === 0) {
36
+ return createRuleResult('SCHEMA-002', 8, {
37
+ passed: true,
38
+ score: 8,
39
+ message: 'All tool schemas have properties defined',
40
+ });
41
+ }
42
+ // Deduct 2 points per violation
43
+ const penalty = violations.length * 2;
44
+ const score = Math.max(0, 8 - penalty);
45
+ return createRuleResult('SCHEMA-002', 8, {
46
+ passed: false,
47
+ score,
48
+ message: `${violations.length} tool(s) have no properties in schema`,
49
+ details: violations,
50
+ suggestions: [
51
+ 'Define properties in the inputSchema for tool parameters',
52
+ 'Example: { type: "object", properties: { query: { type: "string" } } }',
53
+ ],
54
+ affectedTools: violations.map((v) => v.match(/"([^"]+)"/)?.[1] || ''),
55
+ });
56
+ },
57
+ };
58
+ export default SCHEMA_002;
59
+ //# sourceMappingURL=SCHEMA-002.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SCHEMA-002.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-002.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,UAAU,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,0CAA0C;aACpD,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;QAEvC,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,uCAAuC;YACpE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,0DAA0D;gBAC1D,wEAAwE;aACzE;YACD,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SCHEMA-003: Required Array Exists
3
+ *
4
+ * Checks that the inputSchema has a 'required' array defined
5
+ * when properties exist. This helps agents understand which
6
+ * parameters are mandatory vs optional.
7
+ */
8
+ import type { Rule } from '../../core/types/rule.js';
9
+ export declare const SCHEMA_003: Rule;
10
+ export default SCHEMA_003;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * SCHEMA-003: Required Array Exists
3
+ *
4
+ * Checks that the inputSchema has a 'required' array defined
5
+ * when properties exist. This helps agents understand which
6
+ * parameters are mandatory vs optional.
7
+ */
8
+ import { createRuleResult } from '../runner.js';
9
+ export const SCHEMA_003 = {
10
+ id: 'SCHEMA-003',
11
+ category: 'schema',
12
+ name: 'Required Array Exists',
13
+ description: 'Schema should have a required array when properties are defined',
14
+ severity: 'info',
15
+ maxScore: 5,
16
+ async check(context) {
17
+ const tools = context.tools;
18
+ if (tools.length === 0) {
19
+ return createRuleResult('SCHEMA-003', 5, {
20
+ passed: true,
21
+ score: 5,
22
+ message: 'No tools detected (rule not applicable)',
23
+ });
24
+ }
25
+ const violations = [];
26
+ for (const tool of tools) {
27
+ if (!tool.inputSchema) {
28
+ // Skip tools without inputSchema (handled by IMP-005)
29
+ continue;
30
+ }
31
+ const properties = tool.inputSchema.properties;
32
+ if (!properties || Object.keys(properties).length === 0) {
33
+ // Skip tools with no properties (handled by SCHEMA-002)
34
+ continue;
35
+ }
36
+ // Check if required array exists
37
+ if (!tool.inputSchema.required) {
38
+ violations.push(`Tool "${tool.name}" has properties but no required array`);
39
+ }
40
+ }
41
+ if (violations.length === 0) {
42
+ return createRuleResult('SCHEMA-003', 5, {
43
+ passed: true,
44
+ score: 5,
45
+ message: 'All tool schemas with properties have required arrays',
46
+ });
47
+ }
48
+ // Deduct 1 point per violation
49
+ const penalty = Math.min(violations.length, 5);
50
+ const score = Math.max(0, 5 - penalty);
51
+ return createRuleResult('SCHEMA-003', 5, {
52
+ passed: false,
53
+ score,
54
+ message: `${violations.length} tool(s) missing required array in schema`,
55
+ details: violations,
56
+ suggestions: [
57
+ 'Add a required array to specify which properties are mandatory',
58
+ 'Even if all properties are optional, use an empty array: required: []',
59
+ 'Example: { type: "object", properties: { ... }, required: ["query"] }',
60
+ ],
61
+ affectedTools: violations.map((v) => v.match(/"([^"]+)"/)?.[1] || ''),
62
+ });
63
+ },
64
+ };
65
+ export default SCHEMA_003;
66
+ //# sourceMappingURL=SCHEMA-003.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SCHEMA-003.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-003.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,iEAAiE;IAC9E,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,wDAAwD;gBACxD,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC/B,UAAU,CAAC,IAAI,CACb,SAAS,IAAI,CAAC,IAAI,wCAAwC,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,uDAAuD;aACjE,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;QAEvC,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,2CAA2C;YACxE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,gEAAgE;gBAChE,uEAAuE;gBACvE,uEAAuE;aACxE;YACD,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SCHEMA-011: Param Count Reasonable
3
+ *
4
+ * Checks that tools don't have too many parameters (>10).
5
+ * Tools with many parameters may be doing too much and
6
+ * should be broken down into smaller, more atomic tools.
7
+ */
8
+ import type { Rule } from '../../core/types/rule.js';
9
+ export declare const SCHEMA_011: Rule;
10
+ export default SCHEMA_011;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * SCHEMA-011: Param Count Reasonable
3
+ *
4
+ * Checks that tools don't have too many parameters (>10).
5
+ * Tools with many parameters may be doing too much and
6
+ * should be broken down into smaller, more atomic tools.
7
+ */
8
+ import { createRuleResult } from '../runner.js';
9
+ const MAX_REASONABLE_PARAMS = 10;
10
+ export const SCHEMA_011 = {
11
+ id: 'SCHEMA-011',
12
+ category: 'schema',
13
+ name: 'Param Count Reasonable',
14
+ description: `Tools should have ${MAX_REASONABLE_PARAMS} or fewer parameters`,
15
+ severity: 'warning',
16
+ maxScore: 5,
17
+ async check(context) {
18
+ const tools = context.tools;
19
+ if (tools.length === 0) {
20
+ return createRuleResult('SCHEMA-011', 5, {
21
+ passed: true,
22
+ score: 5,
23
+ message: 'No tools detected (rule not applicable)',
24
+ });
25
+ }
26
+ const violations = [];
27
+ for (const tool of tools) {
28
+ if (!tool.inputSchema?.properties) {
29
+ continue;
30
+ }
31
+ const paramCount = Object.keys(tool.inputSchema.properties).length;
32
+ if (paramCount > MAX_REASONABLE_PARAMS) {
33
+ violations.push({ name: tool.name, count: paramCount });
34
+ }
35
+ }
36
+ if (violations.length === 0) {
37
+ return createRuleResult('SCHEMA-011', 5, {
38
+ passed: true,
39
+ score: 5,
40
+ message: `All tools have reasonable parameter counts (≤${MAX_REASONABLE_PARAMS})`,
41
+ });
42
+ }
43
+ // Deduct 2 points per violation
44
+ const penalty = violations.length * 2;
45
+ const score = Math.max(0, 5 - penalty);
46
+ return createRuleResult('SCHEMA-011', 5, {
47
+ passed: false,
48
+ score,
49
+ message: `${violations.length} tool(s) have too many parameters`,
50
+ details: violations.map((v) => `Tool "${v.name}" has ${v.count} parameters (max recommended: ${MAX_REASONABLE_PARAMS})`),
51
+ suggestions: [
52
+ 'Consider breaking down tools with many parameters into smaller, focused tools',
53
+ 'Group related parameters into nested objects',
54
+ 'Review if all parameters are truly necessary',
55
+ 'Atomic tools are easier for AI agents to understand and use correctly',
56
+ ],
57
+ affectedTools: violations.map((v) => v.name),
58
+ });
59
+ },
60
+ };
61
+ export default SCHEMA_011;
62
+ //# sourceMappingURL=SCHEMA-011.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SCHEMA-011.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-011.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,qBAAqB,qBAAqB,sBAAsB;IAC7E,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAsC,EAAE,CAAC;QAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;YACnE,IAAI,UAAU,GAAG,qBAAqB,EAAE,CAAC;gBACvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD,qBAAqB,GAAG;aAClF,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;QAEvC,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,mCAAmC;YAChE,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,iCAAiC,qBAAqB,GAAG,CAC3F;YACD,WAAW,EAAE;gBACX,+EAA+E;gBAC/E,8CAA8C;gBAC9C,8CAA8C;gBAC9C,uEAAuE;aACxE;YACD,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}