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,8 @@
1
+ /**
2
+ * DESC-004: Description Not Empty
3
+ *
4
+ * Checks that tool descriptions are meaningful (not empty or trivially short).
5
+ */
6
+ import type { Rule } from '../../core/types/rule.js';
7
+ export declare const DESC_004: Rule;
8
+ export default DESC_004;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * DESC-004: Description Not Empty
3
+ *
4
+ * Checks that tool descriptions are meaningful (not empty or trivially short).
5
+ */
6
+ import { createRuleResult } from '../runner.js';
7
+ const MIN_DESCRIPTION_LENGTH = 10;
8
+ export const DESC_004 = {
9
+ id: 'DESC-004',
10
+ category: 'description',
11
+ name: 'Description Not Empty',
12
+ description: 'Verifies that tool descriptions are meaningful and not empty',
13
+ severity: 'critical',
14
+ maxScore: 8,
15
+ async check(context) {
16
+ if (context.tools.length === 0) {
17
+ return createRuleResult('DESC-004', 8, {
18
+ passed: true,
19
+ score: 8,
20
+ message: 'No tools found to check',
21
+ });
22
+ }
23
+ const toolsWithBadDesc = context.tools.filter((t) => {
24
+ if (!t.description)
25
+ return true;
26
+ if (t.description.trim().length < MIN_DESCRIPTION_LENGTH)
27
+ return true;
28
+ return false;
29
+ });
30
+ if (toolsWithBadDesc.length === 0) {
31
+ return createRuleResult('DESC-004', 8, {
32
+ passed: true,
33
+ score: 8,
34
+ message: `All ${context.tools.length} tool(s) have meaningful descriptions`,
35
+ });
36
+ }
37
+ return createRuleResult('DESC-004', 8, {
38
+ passed: false,
39
+ score: Math.max(0, 8 - toolsWithBadDesc.length * 4),
40
+ message: `${toolsWithBadDesc.length} tool(s) have empty or trivial descriptions`,
41
+ details: toolsWithBadDesc.map((t) => {
42
+ const desc = t.description?.trim() ?? '';
43
+ if (desc.length === 0) {
44
+ return `Tool "${t.name}" has no description`;
45
+ }
46
+ return `Tool "${t.name}" has a trivially short description (${desc.length} chars): "${desc}"`;
47
+ }),
48
+ suggestions: [
49
+ 'Descriptions should clearly explain what the tool does',
50
+ 'Include information about when to use the tool',
51
+ 'Aim for 20-200 characters that provide context',
52
+ 'Example: "Search for available flights between two airports on a specific date"',
53
+ ],
54
+ affectedTools: toolsWithBadDesc
55
+ .filter((t) => t.name)
56
+ .map((t) => t.name),
57
+ });
58
+ },
59
+ };
60
+ export default DESC_004;
61
+ //# sourceMappingURL=DESC-004.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-004.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-004.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,8DAA8D;IAC3E,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAClD,IAAI,CAAC,CAAC,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAC;YAChC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,sBAAsB;gBAAE,OAAO,IAAI,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,uCAAuC;aAC5E,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;YACnD,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,6CAA6C;YAChF,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClC,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAC,CAAC,IAAI,sBAAsB,CAAC;gBAC/C,CAAC;gBACD,OAAO,SAAS,CAAC,CAAC,IAAI,wCAAwC,IAAI,CAAC,MAAM,aAAa,IAAI,GAAG,CAAC;YAChG,CAAC,CAAC;YACF,WAAW,EAAE;gBACX,wDAAwD;gBACxD,gDAAgD;gBAChD,gDAAgD;gBAChD,iFAAiF;aAClF;YACD,aAAa,EAAE,gBAAgB;iBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * DESC-005: Description Min Length
3
+ *
4
+ * Checks that tool descriptions are at least 20 characters long.
5
+ * Good descriptions help agents understand when and how to use tools.
6
+ *
7
+ * This is stricter than DESC-004 (which checks for 10 chars) and
8
+ * encourages more detailed, helpful descriptions.
9
+ */
10
+ import type { Rule } from '../../core/types/rule.js';
11
+ export declare const DESC_005: Rule;
12
+ export default DESC_005;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * DESC-005: Description Min Length
3
+ *
4
+ * Checks that tool descriptions are at least 20 characters long.
5
+ * Good descriptions help agents understand when and how to use tools.
6
+ *
7
+ * This is stricter than DESC-004 (which checks for 10 chars) and
8
+ * encourages more detailed, helpful descriptions.
9
+ */
10
+ import { createRuleResult } from '../runner.js';
11
+ const MIN_DESCRIPTION_LENGTH = 20;
12
+ export const DESC_005 = {
13
+ id: 'DESC-005',
14
+ category: 'description',
15
+ name: 'Description Min Length',
16
+ description: `Tool descriptions should be at least ${MIN_DESCRIPTION_LENGTH} characters`,
17
+ severity: 'warning',
18
+ maxScore: 8,
19
+ async check(context) {
20
+ const tools = context.tools;
21
+ if (tools.length === 0) {
22
+ return createRuleResult('DESC-005', 8, {
23
+ passed: true,
24
+ score: 8,
25
+ message: 'No tools detected (rule not applicable)',
26
+ });
27
+ }
28
+ const violations = [];
29
+ for (const tool of tools) {
30
+ const desc = tool.description?.trim() ?? '';
31
+ if (desc.length < MIN_DESCRIPTION_LENGTH) {
32
+ violations.push({
33
+ name: tool.name,
34
+ length: desc.length,
35
+ description: desc,
36
+ });
37
+ }
38
+ }
39
+ if (violations.length === 0) {
40
+ return createRuleResult('DESC-005', 8, {
41
+ passed: true,
42
+ score: 8,
43
+ message: `All tool descriptions meet minimum length (${MIN_DESCRIPTION_LENGTH}+ chars)`,
44
+ });
45
+ }
46
+ // Deduct 2 points per violation
47
+ const penalty = violations.length * 2;
48
+ const score = Math.max(0, 8 - penalty);
49
+ return createRuleResult('DESC-005', 8, {
50
+ passed: false,
51
+ score,
52
+ message: `${violations.length} tool(s) have descriptions shorter than ${MIN_DESCRIPTION_LENGTH} characters`,
53
+ details: violations.map((v) => {
54
+ if (v.length === 0) {
55
+ return `Tool "${v.name}" has no description`;
56
+ }
57
+ return `Tool "${v.name}" has a short description (${v.length} chars): "${v.description}"`;
58
+ }),
59
+ suggestions: [
60
+ `Descriptions should be at least ${MIN_DESCRIPTION_LENGTH} characters`,
61
+ 'Explain what the tool does and when to use it',
62
+ 'Include key parameters or constraints if relevant',
63
+ 'Example: "Search for available flights between airports on specified dates"',
64
+ ],
65
+ affectedTools: violations.map((v) => v.name),
66
+ });
67
+ },
68
+ };
69
+ export default DESC_005;
70
+ //# sourceMappingURL=DESC-005.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-005.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-005.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,wCAAwC,sBAAsB,aAAa;IACxF,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,UAAU,EAAE,CAAC,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAA4D,EAAE,CAAC;QAE/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAE5C,IAAI,IAAI,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,WAAW,EAAE,IAAI;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,8CAA8C,sBAAsB,UAAU;aACxF,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,UAAU,EAAE,CAAC,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,2CAA2C,sBAAsB,aAAa;YAC3G,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnB,OAAO,SAAS,CAAC,CAAC,IAAI,sBAAsB,CAAC;gBAC/C,CAAC;gBACD,OAAO,SAAS,CAAC,CAAC,IAAI,8BAA8B,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC,WAAW,GAAG,CAAC;YAC5F,CAAC,CAAC;YACF,WAAW,EAAE;gBACX,mCAAmC,sBAAsB,aAAa;gBACtE,+CAA+C;gBAC/C,mDAAmD;gBACnD,6EAA6E;aAC9E;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,QAAQ,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Description Rules
3
+ */
4
+ export { DESC_004 } from './DESC-004.js';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Description Rules
3
+ */
4
+ export { DESC_004 } from './DESC-004.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/description/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * IMP-001: WebMCP API Exists
3
+ *
4
+ * Checks if navigator.modelContext exists on the page.
5
+ * This is the most fundamental check - without WebMCP support,
6
+ * nothing else matters.
7
+ */
8
+ import type { Rule } from '../../core/types/rule.js';
9
+ export declare const IMP_001: Rule;
10
+ export default IMP_001;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * IMP-001: WebMCP API Exists
3
+ *
4
+ * Checks if navigator.modelContext exists on the page.
5
+ * This is the most fundamental check - without WebMCP support,
6
+ * nothing else matters.
7
+ */
8
+ import { createRuleResult } from '../runner.js';
9
+ export const IMP_001 = {
10
+ id: 'IMP-001',
11
+ category: 'implementation',
12
+ name: 'WebMCP API Exists',
13
+ description: 'Verifies that navigator.modelContext is available on the page',
14
+ severity: 'critical',
15
+ maxScore: 15,
16
+ async check(context) {
17
+ if (context.hasWebMCP) {
18
+ return createRuleResult('IMP-001', 15, {
19
+ passed: true,
20
+ score: 15,
21
+ message: 'WebMCP API (navigator.modelContext) is available',
22
+ });
23
+ }
24
+ return createRuleResult('IMP-001', 15, {
25
+ passed: false,
26
+ score: 0,
27
+ message: 'WebMCP API (navigator.modelContext) not found',
28
+ suggestions: [
29
+ 'Ensure the browser has WebMCP support enabled (--enable-features=WebMCP)',
30
+ 'WebMCP may not be available in all browsers yet',
31
+ ],
32
+ });
33
+ },
34
+ };
35
+ export default IMP_001;
36
+ //# sourceMappingURL=IMP-001.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMP-001.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-001.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,+DAA+D;IAC5E,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,kDAAkD;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,+CAA+C;YACxD,WAAW,EAAE;gBACX,0EAA0E;gBAC1E,iDAAiD;aAClD;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * IMP-003: Tool Has Name
3
+ *
4
+ * Checks that every registered tool has a name property.
5
+ * Without a name, the agent cannot invoke the tool.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const IMP_003: Rule;
9
+ export default IMP_003;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * IMP-003: Tool Has Name
3
+ *
4
+ * Checks that every registered tool has a name property.
5
+ * Without a name, the agent cannot invoke the tool.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const IMP_003 = {
9
+ id: 'IMP-003',
10
+ category: 'implementation',
11
+ name: 'Tool Has Name',
12
+ description: 'Verifies that every tool has a valid name property',
13
+ severity: 'critical',
14
+ maxScore: 10,
15
+ async check(context) {
16
+ if (context.tools.length === 0) {
17
+ return createRuleResult('IMP-003', 10, {
18
+ passed: true,
19
+ score: 10,
20
+ message: 'No tools found to check',
21
+ });
22
+ }
23
+ const toolsWithoutName = context.tools.filter((t) => !t.name || t.name.trim() === '');
24
+ if (toolsWithoutName.length === 0) {
25
+ return createRuleResult('IMP-003', 10, {
26
+ passed: true,
27
+ score: 10,
28
+ message: `All ${context.tools.length} tool(s) have valid names`,
29
+ });
30
+ }
31
+ return createRuleResult('IMP-003', 10, {
32
+ passed: false,
33
+ score: Math.max(0, 10 - toolsWithoutName.length * 5),
34
+ message: `${toolsWithoutName.length} tool(s) missing a name`,
35
+ details: toolsWithoutName.map((t) => `Tool at ${t.pageUrl} is missing a name`),
36
+ suggestions: [
37
+ 'Every tool must have a unique name property',
38
+ 'Use descriptive snake_case names like "search_flights" or "book_hotel"',
39
+ ],
40
+ affectedPages: [...new Set(toolsWithoutName.map((t) => t.pageUrl))],
41
+ });
42
+ },
43
+ };
44
+ export default IMP_003;
45
+ //# sourceMappingURL=IMP-003.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMP-003.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-003.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,oDAAoD;IACjE,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CACvC,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,2BAA2B;aAChE,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,GAAG,CACb,CAAC,EACD,EAAE,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CACjC;YACD,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,yBAAyB;YAC5D,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,oBAAoB,CAChD;YACD,WAAW,EAAE;gBACX,6CAA6C;gBAC7C,wEAAwE;aACzE;YACD,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SACpE,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * IMP-004: Tool Has Description
3
+ *
4
+ * Checks that every registered tool has a description.
5
+ * Without a description, the agent cannot decide when to use the tool.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const IMP_004: Rule;
9
+ export default IMP_004;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * IMP-004: Tool Has Description
3
+ *
4
+ * Checks that every registered tool has a description.
5
+ * Without a description, the agent cannot decide when to use the tool.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const IMP_004 = {
9
+ id: 'IMP-004',
10
+ category: 'implementation',
11
+ name: 'Tool Has Description',
12
+ description: 'Verifies that every tool has a description property',
13
+ severity: 'critical',
14
+ maxScore: 10,
15
+ async check(context) {
16
+ if (context.tools.length === 0) {
17
+ return createRuleResult('IMP-004', 10, {
18
+ passed: true,
19
+ score: 10,
20
+ message: 'No tools found to check',
21
+ });
22
+ }
23
+ const toolsWithoutDesc = context.tools.filter((t) => !t.description || t.description.trim() === '');
24
+ if (toolsWithoutDesc.length === 0) {
25
+ return createRuleResult('IMP-004', 10, {
26
+ passed: true,
27
+ score: 10,
28
+ message: `All ${context.tools.length} tool(s) have descriptions`,
29
+ });
30
+ }
31
+ return createRuleResult('IMP-004', 10, {
32
+ passed: false,
33
+ score: Math.max(0, 10 - toolsWithoutDesc.length * 5),
34
+ message: `${toolsWithoutDesc.length} tool(s) missing a description`,
35
+ details: toolsWithoutDesc.map((t) => `Tool "${t.name || '(unnamed)'}" is missing a description`),
36
+ suggestions: [
37
+ 'Every tool should have a clear description explaining what it does',
38
+ 'Descriptions help AI agents decide when to invoke your tool',
39
+ 'Use positive framing: describe what the tool DOES, not what it doesn\'t do',
40
+ ],
41
+ affectedTools: toolsWithoutDesc
42
+ .filter((t) => t.name)
43
+ .map((t) => t.name),
44
+ });
45
+ },
46
+ };
47
+ export default IMP_004;
48
+ //# sourceMappingURL=IMP-004.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMP-004.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-004.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,qDAAqD;IAClE,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CACrD,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,4BAA4B;aACjE,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,gCAAgC;YACnE,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,WAAW,4BAA4B,CAClE;YACD,WAAW,EAAE;gBACX,oEAAoE;gBACpE,6DAA6D;gBAC7D,4EAA4E;aAC7E;YACD,aAAa,EAAE,gBAAgB;iBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * IMP-005: Tool Has Input Schema
3
+ *
4
+ * Checks that every registered tool has an inputSchema.
5
+ * Without a schema, the agent cannot provide correct parameters.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const IMP_005: Rule;
9
+ export default IMP_005;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * IMP-005: Tool Has Input Schema
3
+ *
4
+ * Checks that every registered tool has an inputSchema.
5
+ * Without a schema, the agent cannot provide correct parameters.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const IMP_005 = {
9
+ id: 'IMP-005',
10
+ category: 'implementation',
11
+ name: 'Tool Has Input Schema',
12
+ description: 'Verifies that every tool has an inputSchema property',
13
+ severity: 'critical',
14
+ maxScore: 10,
15
+ async check(context) {
16
+ if (context.tools.length === 0) {
17
+ return createRuleResult('IMP-005', 10, {
18
+ passed: true,
19
+ score: 10,
20
+ message: 'No tools found to check',
21
+ });
22
+ }
23
+ const toolsWithoutSchema = context.tools.filter((t) => {
24
+ if (!t.inputSchema)
25
+ return true;
26
+ if (typeof t.inputSchema !== 'object')
27
+ return true;
28
+ return false;
29
+ });
30
+ if (toolsWithoutSchema.length === 0) {
31
+ return createRuleResult('IMP-005', 10, {
32
+ passed: true,
33
+ score: 10,
34
+ message: `All ${context.tools.length} tool(s) have input schemas`,
35
+ });
36
+ }
37
+ return createRuleResult('IMP-005', 10, {
38
+ passed: false,
39
+ score: Math.max(0, 10 - toolsWithoutSchema.length * 5),
40
+ message: `${toolsWithoutSchema.length} tool(s) missing inputSchema`,
41
+ details: toolsWithoutSchema.map((t) => `Tool "${t.name || '(unnamed)'}" is missing an inputSchema`),
42
+ suggestions: [
43
+ 'Every tool should define an inputSchema using JSON Schema format',
44
+ 'The schema tells AI agents what parameters your tool accepts',
45
+ 'Even tools with no parameters should have an empty schema: { type: "object" }',
46
+ ],
47
+ affectedTools: toolsWithoutSchema
48
+ .filter((t) => t.name)
49
+ .map((t) => t.name),
50
+ });
51
+ },
52
+ };
53
+ export default IMP_005;
54
+ //# sourceMappingURL=IMP-005.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMP-005.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-005.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpD,IAAI,CAAC,CAAC,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAC;YAChC,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,6BAA6B;aAClE,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,kBAAkB,CAAC,MAAM,8BAA8B;YACnE,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,WAAW,6BAA6B,CACnE;YACD,WAAW,EAAE;gBACX,kEAAkE;gBAClE,8DAA8D;gBAC9D,+EAA+E;aAChF;YACD,aAAa,EAAE,kBAAkB;iBAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * IMP-007: Valid JSON Schema
3
+ *
4
+ * Checks that tool inputSchemas are valid JSON Schema documents.
5
+ */
6
+ import type { Rule } from '../../core/types/rule.js';
7
+ export declare const IMP_007: Rule;
8
+ export default IMP_007;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * IMP-007: Valid JSON Schema
3
+ *
4
+ * Checks that tool inputSchemas are valid JSON Schema documents.
5
+ */
6
+ import Ajv from 'ajv';
7
+ import addFormats from 'ajv-formats';
8
+ import { createRuleResult } from '../runner.js';
9
+ // Create AJV instance for schema validation
10
+ const ajv = new Ajv({
11
+ strict: false,
12
+ validateSchema: true,
13
+ allErrors: true,
14
+ });
15
+ addFormats(ajv);
16
+ export const IMP_007 = {
17
+ id: 'IMP-007',
18
+ category: 'implementation',
19
+ name: 'Valid JSON Schema',
20
+ description: 'Verifies that tool inputSchemas are valid JSON Schema documents',
21
+ severity: 'critical',
22
+ maxScore: 10,
23
+ async check(context) {
24
+ const toolsWithSchema = context.tools.filter((t) => t.inputSchema && typeof t.inputSchema === 'object');
25
+ if (toolsWithSchema.length === 0) {
26
+ return createRuleResult('IMP-007', 10, {
27
+ passed: true,
28
+ score: 10,
29
+ message: 'No tools with schemas found to validate',
30
+ });
31
+ }
32
+ const invalidSchemas = [];
33
+ for (const tool of toolsWithSchema) {
34
+ // TypeScript guard - inputSchema is guaranteed to exist from filter above
35
+ if (!tool.inputSchema)
36
+ continue;
37
+ try {
38
+ // Validate the schema itself
39
+ const valid = ajv.validateSchema(tool.inputSchema);
40
+ if (!valid && ajv.errors) {
41
+ invalidSchemas.push({
42
+ name: tool.name,
43
+ errors: ajv.errors.map((e) => `${e.instancePath || '/'}: ${e.message}`),
44
+ });
45
+ }
46
+ }
47
+ catch (error) {
48
+ invalidSchemas.push({
49
+ name: tool.name,
50
+ errors: [
51
+ error instanceof Error ? error.message : 'Schema validation error',
52
+ ],
53
+ });
54
+ }
55
+ }
56
+ if (invalidSchemas.length === 0) {
57
+ return createRuleResult('IMP-007', 10, {
58
+ passed: true,
59
+ score: 10,
60
+ message: `All ${toolsWithSchema.length} tool schema(s) are valid JSON Schema`,
61
+ });
62
+ }
63
+ return createRuleResult('IMP-007', 10, {
64
+ passed: false,
65
+ score: Math.max(0, 10 - invalidSchemas.length * 3),
66
+ message: `${invalidSchemas.length} tool(s) have invalid JSON Schema`,
67
+ details: invalidSchemas.flatMap((s) => s.errors.map((e) => `Tool "${s.name}": ${e}`)),
68
+ suggestions: [
69
+ 'Ensure inputSchema follows JSON Schema Draft-07 format',
70
+ 'Use type: "object" at the root level',
71
+ 'Define properties for each parameter',
72
+ 'Specify required array for mandatory parameters',
73
+ ],
74
+ affectedTools: invalidSchemas.map((s) => s.name),
75
+ });
76
+ },
77
+ };
78
+ export default IMP_007;
79
+ //# sourceMappingURL=IMP-007.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMP-007.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-007.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * IMP-013: No Duplicate Tool Names
3
+ *
4
+ * Checks that no two tools share the same name.
5
+ * Duplicate names cause confusion and the second tool may overwrite the first.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const IMP_013: Rule;
9
+ export default IMP_013;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * IMP-013: No Duplicate Tool Names
3
+ *
4
+ * Checks that no two tools share the same name.
5
+ * Duplicate names cause confusion and the second tool may overwrite the first.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const IMP_013 = {
9
+ id: 'IMP-013',
10
+ category: 'implementation',
11
+ name: 'No Duplicate Tool Names',
12
+ description: 'Verifies that all tools have unique names',
13
+ severity: 'critical',
14
+ maxScore: 10,
15
+ async check(context) {
16
+ if (context.tools.length <= 1) {
17
+ return createRuleResult('IMP-013', 10, {
18
+ passed: true,
19
+ score: 10,
20
+ message: 'Not enough tools to check for duplicates',
21
+ });
22
+ }
23
+ // Find duplicates
24
+ const nameCount = new Map();
25
+ for (const tool of context.tools) {
26
+ if (tool.name) {
27
+ nameCount.set(tool.name, (nameCount.get(tool.name) ?? 0) + 1);
28
+ }
29
+ }
30
+ const duplicates = Array.from(nameCount.entries())
31
+ .filter(([_, count]) => count > 1)
32
+ .map(([name, count]) => ({ name, count }));
33
+ if (duplicates.length === 0) {
34
+ return createRuleResult('IMP-013', 10, {
35
+ passed: true,
36
+ score: 10,
37
+ message: `All ${context.tools.length} tool names are unique`,
38
+ });
39
+ }
40
+ return createRuleResult('IMP-013', 10, {
41
+ passed: false,
42
+ score: Math.max(0, 10 - duplicates.length * 5),
43
+ message: `${duplicates.length} duplicate tool name(s) found`,
44
+ details: duplicates.map((d) => `Tool name "${d.name}" is used ${d.count} times`),
45
+ suggestions: [
46
+ 'Each tool must have a unique name',
47
+ 'When using provideContext(), it replaces all tools - ensure no duplicates in the array',
48
+ 'Consider using more specific names to avoid collisions',
49
+ ],
50
+ affectedTools: duplicates.map((d) => d.name),
51
+ });
52
+ },
53
+ };
54
+ export default IMP_013;
55
+ //# sourceMappingURL=IMP-013.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMP-013.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-013.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,2CAA2C;IACxD,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,0CAA0C;aACpD,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;aAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAE7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,wBAAwB;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9C,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,+BAA+B;YAC5D,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,QAAQ,CACxD;YACD,WAAW,EAAE;gBACX,mCAAmC;gBACnC,wFAAwF;gBACxF,wDAAwD;aACzD;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,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Implementation Rules
3
+ */
4
+ export { IMP_001 } from './IMP-001.js';
5
+ export { IMP_003 } from './IMP-003.js';
6
+ export { IMP_004 } from './IMP-004.js';
7
+ export { IMP_005 } from './IMP-005.js';
8
+ export { IMP_007 } from './IMP-007.js';
9
+ export { IMP_013 } from './IMP-013.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Implementation Rules
3
+ */
4
+ export { IMP_001 } from './IMP-001.js';
5
+ export { IMP_003 } from './IMP-003.js';
6
+ export { IMP_004 } from './IMP-004.js';
7
+ export { IMP_005 } from './IMP-005.js';
8
+ export { IMP_007 } from './IMP-007.js';
9
+ export { IMP_013 } from './IMP-013.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/implementation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;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;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}