webmcp-cli 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/dist/analysis/form-to-tool-mapper.d.ts +61 -0
  2. package/dist/analysis/form-to-tool-mapper.js +360 -0
  3. package/dist/analysis/form-to-tool-mapper.js.map +1 -0
  4. package/dist/analysis/index.d.ts +84 -0
  5. package/dist/analysis/index.js +81 -0
  6. package/dist/analysis/index.js.map +1 -0
  7. package/dist/analysis/missing-tool-analyzer.d.ts +35 -0
  8. package/dist/analysis/missing-tool-analyzer.js +617 -0
  9. package/dist/analysis/missing-tool-analyzer.js.map +1 -0
  10. package/dist/audit/run-multi-page-audit.d.ts +34 -0
  11. package/dist/audit/run-multi-page-audit.js +233 -0
  12. package/dist/audit/run-multi-page-audit.js.map +1 -0
  13. package/dist/cli/commands/potential.d.ts +8 -0
  14. package/dist/cli/commands/potential.js +323 -0
  15. package/dist/cli/commands/potential.js.map +1 -0
  16. package/dist/cli/commands/report.d.ts +12 -0
  17. package/dist/cli/commands/report.js +89 -0
  18. package/dist/cli/commands/report.js.map +1 -0
  19. package/dist/cli/index.js +35 -0
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/config/defaults.d.ts +36 -0
  22. package/dist/config/defaults.js +33 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/index.d.ts +7 -0
  25. package/dist/config/index.js +7 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/config/loader.d.ts +22 -0
  28. package/dist/config/loader.js +91 -0
  29. package/dist/config/loader.js.map +1 -0
  30. package/dist/config/schema.d.ts +280 -0
  31. package/dist/config/schema.js +42 -0
  32. package/dist/config/schema.js.map +1 -0
  33. package/dist/core/types/audit.d.ts +1 -1
  34. package/dist/core/types/index.d.ts +1 -0
  35. package/dist/core/types/index.js +1 -0
  36. package/dist/core/types/index.js.map +1 -1
  37. package/dist/core/types/recon.d.ts +265 -0
  38. package/dist/core/types/recon.js +5 -0
  39. package/dist/core/types/recon.js.map +1 -0
  40. package/dist/core/types/rule.d.ts +1 -1
  41. package/dist/core/types/rule.js +7 -5
  42. package/dist/core/types/rule.js.map +1 -1
  43. package/dist/crawler/depth-crawler.d.ts +29 -0
  44. package/dist/crawler/depth-crawler.js +212 -0
  45. package/dist/crawler/depth-crawler.js.map +1 -0
  46. package/dist/crawler/index.d.ts +2 -0
  47. package/dist/crawler/index.js +3 -0
  48. package/dist/crawler/index.js.map +1 -0
  49. package/dist/crawler/link-extractor.d.ts +1 -0
  50. package/dist/crawler/link-extractor.js +49 -0
  51. package/dist/crawler/link-extractor.js.map +1 -0
  52. package/dist/generators/index.d.ts +10 -0
  53. package/dist/generators/index.js +8 -0
  54. package/dist/generators/index.js.map +1 -0
  55. package/dist/generators/report-html.d.ts +12 -0
  56. package/dist/generators/report-html.js +470 -0
  57. package/dist/generators/report-html.js.map +1 -0
  58. package/dist/generators/report-json.d.ts +95 -0
  59. package/dist/generators/report-json.js +144 -0
  60. package/dist/generators/report-json.js.map +1 -0
  61. package/dist/generators/report-manager.d.ts +31 -0
  62. package/dist/generators/report-manager.js +208 -0
  63. package/dist/generators/report-manager.js.map +1 -0
  64. package/dist/generators/tool-code-generator.d.ts +31 -0
  65. package/dist/generators/tool-code-generator.js +201 -0
  66. package/dist/generators/tool-code-generator.js.map +1 -0
  67. package/dist/potential/ai-recommender.d.ts +33 -0
  68. package/dist/potential/ai-recommender.js +414 -0
  69. package/dist/potential/ai-recommender.js.map +1 -0
  70. package/dist/potential/analyzer.d.ts +32 -0
  71. package/dist/potential/analyzer.js +383 -0
  72. package/dist/potential/analyzer.js.map +1 -0
  73. package/dist/potential/index.d.ts +3 -0
  74. package/dist/potential/index.js +4 -0
  75. package/dist/potential/index.js.map +1 -0
  76. package/dist/potential/prompts.d.ts +20 -0
  77. package/dist/potential/prompts.js +42 -0
  78. package/dist/potential/prompts.js.map +1 -0
  79. package/dist/potential/types.d.ts +40 -0
  80. package/dist/potential/types.js +2 -0
  81. package/dist/potential/types.js.map +1 -0
  82. package/dist/recon/index.d.ts +20 -0
  83. package/dist/recon/index.js +143 -0
  84. package/dist/recon/index.js.map +1 -0
  85. package/dist/recon/manifest.d.ts +16 -0
  86. package/dist/recon/manifest.js +108 -0
  87. package/dist/recon/manifest.js.map +1 -0
  88. package/dist/recon/meta-extractor.d.ts +11 -0
  89. package/dist/recon/meta-extractor.js +276 -0
  90. package/dist/recon/meta-extractor.js.map +1 -0
  91. package/dist/recon/robots.d.ts +16 -0
  92. package/dist/recon/robots.js +158 -0
  93. package/dist/recon/robots.js.map +1 -0
  94. package/dist/recon/route-discovery.d.ts +25 -0
  95. package/dist/recon/route-discovery.js +303 -0
  96. package/dist/recon/route-discovery.js.map +1 -0
  97. package/dist/recon/sitemap.d.ts +12 -0
  98. package/dist/recon/sitemap.js +177 -0
  99. package/dist/recon/sitemap.js.map +1 -0
  100. package/dist/rules/accessibility/AXE-001.d.ts +9 -0
  101. package/dist/rules/accessibility/AXE-001.js +109 -0
  102. package/dist/rules/accessibility/AXE-001.js.map +1 -0
  103. package/dist/rules/accessibility/AXE-002.d.ts +8 -0
  104. package/dist/rules/accessibility/AXE-002.js +85 -0
  105. package/dist/rules/accessibility/AXE-002.js.map +1 -0
  106. package/dist/rules/accessibility/AXE-003.d.ts +8 -0
  107. package/dist/rules/accessibility/AXE-003.js +94 -0
  108. package/dist/rules/accessibility/AXE-003.js.map +1 -0
  109. package/dist/rules/accessibility/AXE-004.d.ts +8 -0
  110. package/dist/rules/accessibility/AXE-004.js +101 -0
  111. package/dist/rules/accessibility/AXE-004.js.map +1 -0
  112. package/dist/rules/accessibility/AXE-005.d.ts +9 -0
  113. package/dist/rules/accessibility/AXE-005.js +89 -0
  114. package/dist/rules/accessibility/AXE-005.js.map +1 -0
  115. package/dist/rules/best-practices/BP-004.d.ts +9 -0
  116. package/dist/rules/best-practices/BP-004.js +96 -0
  117. package/dist/rules/best-practices/BP-004.js.map +1 -0
  118. package/dist/rules/best-practices/BP-005.d.ts +8 -0
  119. package/dist/rules/best-practices/BP-005.js +94 -0
  120. package/dist/rules/best-practices/BP-005.js.map +1 -0
  121. package/dist/rules/best-practices/BP-006.d.ts +8 -0
  122. package/dist/rules/best-practices/BP-006.js +80 -0
  123. package/dist/rules/best-practices/BP-006.js.map +1 -0
  124. package/dist/rules/best-practices/BP-007.d.ts +8 -0
  125. package/dist/rules/best-practices/BP-007.js +92 -0
  126. package/dist/rules/best-practices/BP-007.js.map +1 -0
  127. package/dist/rules/best-practices/BP-008.d.ts +12 -0
  128. package/dist/rules/best-practices/BP-008.js +86 -0
  129. package/dist/rules/best-practices/BP-008.js.map +1 -0
  130. package/dist/rules/best-practices/BP-009.d.ts +9 -0
  131. package/dist/rules/best-practices/BP-009.js +77 -0
  132. package/dist/rules/best-practices/BP-009.js.map +1 -0
  133. package/dist/rules/best-practices/BP-010.d.ts +8 -0
  134. package/dist/rules/best-practices/BP-010.js +85 -0
  135. package/dist/rules/best-practices/BP-010.js.map +1 -0
  136. package/dist/rules/coverage/COV-002.d.ts +8 -0
  137. package/dist/rules/coverage/COV-002.js +68 -0
  138. package/dist/rules/coverage/COV-002.js.map +1 -0
  139. package/dist/rules/coverage/COV-003.d.ts +8 -0
  140. package/dist/rules/coverage/COV-003.js +68 -0
  141. package/dist/rules/coverage/COV-003.js.map +1 -0
  142. package/dist/rules/coverage/COV-004.d.ts +8 -0
  143. package/dist/rules/coverage/COV-004.js +89 -0
  144. package/dist/rules/coverage/COV-004.js.map +1 -0
  145. package/dist/rules/coverage/COV-005.d.ts +8 -0
  146. package/dist/rules/coverage/COV-005.js +67 -0
  147. package/dist/rules/coverage/COV-005.js.map +1 -0
  148. package/dist/rules/coverage/COV-006.d.ts +9 -0
  149. package/dist/rules/coverage/COV-006.js +76 -0
  150. package/dist/rules/coverage/COV-006.js.map +1 -0
  151. package/dist/rules/coverage/COV-007.d.ts +8 -0
  152. package/dist/rules/coverage/COV-007.js +67 -0
  153. package/dist/rules/coverage/COV-007.js.map +1 -0
  154. package/dist/rules/coverage/COV-008.d.ts +9 -0
  155. package/dist/rules/coverage/COV-008.js +87 -0
  156. package/dist/rules/coverage/COV-008.js.map +1 -0
  157. package/dist/rules/coverage/COV-009.d.ts +8 -0
  158. package/dist/rules/coverage/COV-009.js +73 -0
  159. package/dist/rules/coverage/COV-009.js.map +1 -0
  160. package/dist/rules/coverage/COV-010.d.ts +9 -0
  161. package/dist/rules/coverage/COV-010.js +82 -0
  162. package/dist/rules/coverage/COV-010.js.map +1 -0
  163. package/dist/rules/description/DESC-001.d.ts +9 -0
  164. package/dist/rules/description/DESC-001.js +88 -0
  165. package/dist/rules/description/DESC-001.js.map +1 -0
  166. package/dist/rules/description/DESC-002.d.ts +10 -0
  167. package/dist/rules/description/DESC-002.js +99 -0
  168. package/dist/rules/description/DESC-002.js.map +1 -0
  169. package/dist/rules/description/DESC-006.d.ts +9 -0
  170. package/dist/rules/description/DESC-006.js +78 -0
  171. package/dist/rules/description/DESC-006.js.map +1 -0
  172. package/dist/rules/description/DESC-007.d.ts +9 -0
  173. package/dist/rules/description/DESC-007.js +70 -0
  174. package/dist/rules/description/DESC-007.js.map +1 -0
  175. package/dist/rules/description/DESC-008.d.ts +9 -0
  176. package/dist/rules/description/DESC-008.js +70 -0
  177. package/dist/rules/description/DESC-008.js.map +1 -0
  178. package/dist/rules/description/DESC-009.d.ts +8 -0
  179. package/dist/rules/description/DESC-009.js +55 -0
  180. package/dist/rules/description/DESC-009.js.map +1 -0
  181. package/dist/rules/description/DESC-010.d.ts +9 -0
  182. package/dist/rules/description/DESC-010.js +92 -0
  183. package/dist/rules/description/DESC-010.js.map +1 -0
  184. package/dist/rules/description/DESC-011.d.ts +9 -0
  185. package/dist/rules/description/DESC-011.js +81 -0
  186. package/dist/rules/description/DESC-011.js.map +1 -0
  187. package/dist/rules/description/DESC-012.d.ts +9 -0
  188. package/dist/rules/description/DESC-012.js +98 -0
  189. package/dist/rules/description/DESC-012.js.map +1 -0
  190. package/dist/rules/implementation/IMP-002.d.ts +9 -0
  191. package/dist/rules/implementation/IMP-002.js +59 -0
  192. package/dist/rules/implementation/IMP-002.js.map +1 -0
  193. package/dist/rules/implementation/IMP-006.d.ts +9 -0
  194. package/dist/rules/implementation/IMP-006.js +48 -0
  195. package/dist/rules/implementation/IMP-006.js.map +1 -0
  196. package/dist/rules/implementation/IMP-008.d.ts +9 -0
  197. package/dist/rules/implementation/IMP-008.js +46 -0
  198. package/dist/rules/implementation/IMP-008.js.map +1 -0
  199. package/dist/rules/implementation/IMP-009.d.ts +9 -0
  200. package/dist/rules/implementation/IMP-009.js +48 -0
  201. package/dist/rules/implementation/IMP-009.js.map +1 -0
  202. package/dist/rules/implementation/IMP-010.d.ts +9 -0
  203. package/dist/rules/implementation/IMP-010.js +66 -0
  204. package/dist/rules/implementation/IMP-010.js.map +1 -0
  205. package/dist/rules/implementation/IMP-011.d.ts +9 -0
  206. package/dist/rules/implementation/IMP-011.js +82 -0
  207. package/dist/rules/implementation/IMP-011.js.map +1 -0
  208. package/dist/rules/implementation/IMP-012.d.ts +9 -0
  209. package/dist/rules/implementation/IMP-012.js +88 -0
  210. package/dist/rules/implementation/IMP-012.js.map +1 -0
  211. package/dist/rules/implementation/IMP-014.d.ts +9 -0
  212. package/dist/rules/implementation/IMP-014.js +58 -0
  213. package/dist/rules/implementation/IMP-014.js.map +1 -0
  214. package/dist/rules/implementation/IMP-015.d.ts +9 -0
  215. package/dist/rules/implementation/IMP-015.js +64 -0
  216. package/dist/rules/implementation/IMP-015.js.map +1 -0
  217. package/dist/rules/implementation/IMP-016.d.ts +9 -0
  218. package/dist/rules/implementation/IMP-016.js +52 -0
  219. package/dist/rules/implementation/IMP-016.js.map +1 -0
  220. package/dist/rules/implementation/IMP-017.d.ts +8 -0
  221. package/dist/rules/implementation/IMP-017.js +51 -0
  222. package/dist/rules/implementation/IMP-017.js.map +1 -0
  223. package/dist/rules/implementation/IMP-018.d.ts +8 -0
  224. package/dist/rules/implementation/IMP-018.js +52 -0
  225. package/dist/rules/implementation/IMP-018.js.map +1 -0
  226. package/dist/rules/implementation/IMP-019.d.ts +8 -0
  227. package/dist/rules/implementation/IMP-019.js +53 -0
  228. package/dist/rules/implementation/IMP-019.js.map +1 -0
  229. package/dist/rules/implementation/IMP-020.d.ts +9 -0
  230. package/dist/rules/implementation/IMP-020.js +62 -0
  231. package/dist/rules/implementation/IMP-020.js.map +1 -0
  232. package/dist/rules/implementation/IMP-021.d.ts +8 -0
  233. package/dist/rules/implementation/IMP-021.js +64 -0
  234. package/dist/rules/implementation/IMP-021.js.map +1 -0
  235. package/dist/rules/implementation/IMP-022.d.ts +8 -0
  236. package/dist/rules/implementation/IMP-022.js +70 -0
  237. package/dist/rules/implementation/IMP-022.js.map +1 -0
  238. package/dist/rules/index.d.ts +73 -6
  239. package/dist/rules/index.js +141 -6
  240. package/dist/rules/index.js.map +1 -1
  241. package/dist/rules/schema/SCHEMA-004.d.ts +9 -0
  242. package/dist/rules/schema/SCHEMA-004.js +57 -0
  243. package/dist/rules/schema/SCHEMA-004.js.map +1 -0
  244. package/dist/rules/schema/SCHEMA-005.d.ts +9 -0
  245. package/dist/rules/schema/SCHEMA-005.js +61 -0
  246. package/dist/rules/schema/SCHEMA-005.js.map +1 -0
  247. package/dist/rules/schema/SCHEMA-006.d.ts +10 -0
  248. package/dist/rules/schema/SCHEMA-006.js +85 -0
  249. package/dist/rules/schema/SCHEMA-006.js.map +1 -0
  250. package/dist/rules/schema/SCHEMA-007.d.ts +9 -0
  251. package/dist/rules/schema/SCHEMA-007.js +73 -0
  252. package/dist/rules/schema/SCHEMA-007.js.map +1 -0
  253. package/dist/rules/schema/SCHEMA-008.d.ts +9 -0
  254. package/dist/rules/schema/SCHEMA-008.js +70 -0
  255. package/dist/rules/schema/SCHEMA-008.js.map +1 -0
  256. package/dist/rules/schema/SCHEMA-009.d.ts +10 -0
  257. package/dist/rules/schema/SCHEMA-009.js +80 -0
  258. package/dist/rules/schema/SCHEMA-009.js.map +1 -0
  259. package/dist/rules/schema/SCHEMA-010.d.ts +9 -0
  260. package/dist/rules/schema/SCHEMA-010.js +96 -0
  261. package/dist/rules/schema/SCHEMA-010.js.map +1 -0
  262. package/dist/rules/schema/SCHEMA-012.d.ts +9 -0
  263. package/dist/rules/schema/SCHEMA-012.js +65 -0
  264. package/dist/rules/schema/SCHEMA-012.js.map +1 -0
  265. package/dist/rules/security/SEC-002.d.ts +8 -0
  266. package/dist/rules/security/SEC-002.js +81 -0
  267. package/dist/rules/security/SEC-002.js.map +1 -0
  268. package/dist/rules/security/SEC-003.d.ts +8 -0
  269. package/dist/rules/security/SEC-003.js +85 -0
  270. package/dist/rules/security/SEC-003.js.map +1 -0
  271. package/dist/rules/security/SEC-004.d.ts +9 -0
  272. package/dist/rules/security/SEC-004.js +87 -0
  273. package/dist/rules/security/SEC-004.js.map +1 -0
  274. package/dist/rules/security/SEC-005.d.ts +8 -0
  275. package/dist/rules/security/SEC-005.js +87 -0
  276. package/dist/rules/security/SEC-005.js.map +1 -0
  277. package/dist/rules/security/SEC-006.d.ts +10 -0
  278. package/dist/rules/security/SEC-006.js +108 -0
  279. package/dist/rules/security/SEC-006.js.map +1 -0
  280. package/dist/rules/security/SEC-007.d.ts +9 -0
  281. package/dist/rules/security/SEC-007.js +108 -0
  282. package/dist/rules/security/SEC-007.js.map +1 -0
  283. package/dist/rules/security/SEC-008.d.ts +8 -0
  284. package/dist/rules/security/SEC-008.js +109 -0
  285. package/dist/rules/security/SEC-008.js.map +1 -0
  286. package/dist/rules/security/SEC-009.d.ts +9 -0
  287. package/dist/rules/security/SEC-009.js +93 -0
  288. package/dist/rules/security/SEC-009.js.map +1 -0
  289. package/dist/rules/security/SEC-010.d.ts +8 -0
  290. package/dist/rules/security/SEC-010.js +78 -0
  291. package/dist/rules/security/SEC-010.js.map +1 -0
  292. package/dist/rules/security/SEC-011.d.ts +8 -0
  293. package/dist/rules/security/SEC-011.js +93 -0
  294. package/dist/rules/security/SEC-011.js.map +1 -0
  295. package/dist/rules/security/SEC-012.d.ts +8 -0
  296. package/dist/rules/security/SEC-012.js +79 -0
  297. package/dist/rules/security/SEC-012.js.map +1 -0
  298. package/dist/rules/security/SEC-013.d.ts +9 -0
  299. package/dist/rules/security/SEC-013.js +107 -0
  300. package/dist/rules/security/SEC-013.js.map +1 -0
  301. package/dist/scoring/calculator.js +1 -0
  302. package/dist/scoring/calculator.js.map +1 -1
  303. package/dist/ui/ink/components/AIRecommendationCard.d.ts +11 -0
  304. package/dist/ui/ink/components/AIRecommendationCard.js +23 -0
  305. package/dist/ui/ink/components/AIRecommendationCard.js.map +1 -0
  306. package/dist/ui/ink/components/OpportunityList.d.ts +10 -0
  307. package/dist/ui/ink/components/OpportunityList.js +48 -0
  308. package/dist/ui/ink/components/OpportunityList.js.map +1 -0
  309. package/dist/ui/ink/components/PotentialPageCard.d.ts +13 -0
  310. package/dist/ui/ink/components/PotentialPageCard.js +43 -0
  311. package/dist/ui/ink/components/PotentialPageCard.js.map +1 -0
  312. package/dist/ui/ink/components/PotentialProgress.d.ts +16 -0
  313. package/dist/ui/ink/components/PotentialProgress.js +44 -0
  314. package/dist/ui/ink/components/PotentialProgress.js.map +1 -0
  315. package/dist/ui/ink/components/PotentialSummary.d.ts +10 -0
  316. package/dist/ui/ink/components/PotentialSummary.js +86 -0
  317. package/dist/ui/ink/components/PotentialSummary.js.map +1 -0
  318. package/dist/ui/ink/components/SuggestionCard.d.ts +34 -0
  319. package/dist/ui/ink/components/SuggestionCard.js +36 -0
  320. package/dist/ui/ink/components/SuggestionCard.js.map +1 -0
  321. package/dist/ui/ink/components/views/MultiPageCrawlView.d.ts +21 -0
  322. package/dist/ui/ink/components/views/MultiPageCrawlView.js +55 -0
  323. package/dist/ui/ink/components/views/MultiPageCrawlView.js.map +1 -0
  324. package/dist/ui/ink/components/views/PotentialView.d.ts +18 -0
  325. package/dist/ui/ink/components/views/PotentialView.js +74 -0
  326. package/dist/ui/ink/components/views/PotentialView.js.map +1 -0
  327. package/dist/ui/ink/components/views/ReconView.d.ts +22 -0
  328. package/dist/ui/ink/components/views/ReconView.js +30 -0
  329. package/dist/ui/ink/components/views/ReconView.js.map +1 -0
  330. package/package.json +2 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * DESC-006: Description Positive Framing
3
+ *
4
+ * Checks that descriptions use positive instructions,
5
+ * not negative limitations ("do not", "don't", "never").
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ const NEGATIVE_PATTERNS = [
9
+ /\bdo\s+not\b/i,
10
+ /\bdon['']t\b/i,
11
+ /\bnever\b/i,
12
+ /\bavoid\b/i,
13
+ /\bshould\s+not\b/i,
14
+ /\bshouldn['']t\b/i,
15
+ /\bmust\s+not\b/i,
16
+ /\bmustn['']t\b/i,
17
+ /\bcannot\b/i,
18
+ /\bcan['']t\b/i,
19
+ /\bwill\s+not\b/i,
20
+ /\bwon['']t\b/i,
21
+ /\bnot\s+allowed\b/i,
22
+ /\bforbidden\b/i,
23
+ /\bprohibited\b/i,
24
+ ];
25
+ export const DESC_006 = {
26
+ id: 'DESC-006',
27
+ category: 'description',
28
+ name: 'Description Positive Framing',
29
+ description: 'Descriptions should use positive instructions, not negative limitations',
30
+ severity: 'warning',
31
+ maxScore: 5,
32
+ async check(context) {
33
+ if (context.tools.length === 0) {
34
+ return createRuleResult('DESC-006', 5, {
35
+ passed: true,
36
+ score: 5,
37
+ message: 'No tools detected (rule not applicable)',
38
+ });
39
+ }
40
+ const violations = [];
41
+ for (const tool of context.tools) {
42
+ const desc = tool.description ?? '';
43
+ if (!desc.trim())
44
+ continue;
45
+ const foundPatterns = [];
46
+ for (const pattern of NEGATIVE_PATTERNS) {
47
+ const match = desc.match(pattern);
48
+ if (match) {
49
+ foundPatterns.push(match[0]);
50
+ }
51
+ }
52
+ if (foundPatterns.length > 0) {
53
+ violations.push({ name: tool.name, patterns: foundPatterns });
54
+ }
55
+ }
56
+ if (violations.length === 0) {
57
+ return createRuleResult('DESC-006', 5, {
58
+ passed: true,
59
+ score: 5,
60
+ message: 'All tool descriptions use positive framing',
61
+ });
62
+ }
63
+ return createRuleResult('DESC-006', 5, {
64
+ passed: false,
65
+ score: Math.max(0, 5 - violations.length * 2),
66
+ message: `${violations.length} tool(s) use negative framing in descriptions`,
67
+ details: violations.map((v) => `Tool "${v.name}" uses negative language: ${v.patterns.join(', ')}`),
68
+ suggestions: [
69
+ 'Reframe negatives as positive instructions',
70
+ 'Instead of "Don\'t use for bulk operations", say "Use for single-item operations"',
71
+ 'Positive framing helps agents understand what to do, not just what to avoid',
72
+ ],
73
+ affectedTools: violations.map((v) => v.name),
74
+ });
75
+ },
76
+ };
77
+ export default DESC_006;
78
+ //# sourceMappingURL=DESC-006.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-006.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-006.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,iBAAiB,GAAG;IACxB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,8BAA8B;IACpC,WAAW,EAAE,yEAAyE;IACtF,QAAQ,EAAE,SAAS;IACnB,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,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAA2C,EAAE,CAAC;QAE9D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAE3B,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,KAAK,EAAE,CAAC;oBACV,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;YAChE,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,4CAA4C;aACtD,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,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7C,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,+CAA+C;YAC5E,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,CAAC,IAAI,6BAA6B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtE;YACD,WAAW,EAAE;gBACX,4CAA4C;gBAC5C,mFAAmF;gBACnF,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,9 @@
1
+ /**
2
+ * DESC-007: Description Explains What
3
+ *
4
+ * Checks that tool descriptions explain what the tool does.
5
+ * A good description answers "what does this tool do?"
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const DESC_007: Rule;
9
+ export default DESC_007;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * DESC-007: Description Explains What
3
+ *
4
+ * Checks that tool descriptions explain what the tool does.
5
+ * A good description answers "what does this tool do?"
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ /**
9
+ * Heuristic: a description that "explains what" typically contains an action verb
10
+ * and a noun describing the object of the action.
11
+ */
12
+ const ACTION_PATTERNS = [
13
+ /\b(search|find|get|fetch|retrieve|list|query|lookup)\b.*\b(for|from|in|by)\b/i,
14
+ /\b(create|add|insert|generate|build|produce)\b.*\b\w+/i,
15
+ /\b(update|edit|modify|change|set|patch)\b.*\b\w+/i,
16
+ /\b(delete|remove|cancel|revoke|destroy)\b.*\b\w+/i,
17
+ /\b(send|submit|post|push|publish|broadcast|notify)\b.*\b\w+/i,
18
+ /\b(calculate|compute|convert|format|parse|validate|check|verify)\b/i,
19
+ /\b(download|upload|export|import|transfer|move|copy)\b/i,
20
+ /\b(book|reserve|schedule|order|purchase|subscribe)\b/i,
21
+ /\b(authenticate|authorize|login|register|sign)\b/i,
22
+ ];
23
+ export const DESC_007 = {
24
+ id: 'DESC-007',
25
+ category: 'description',
26
+ name: 'Description Explains What',
27
+ description: 'Description should explain what the tool does',
28
+ severity: 'warning',
29
+ maxScore: 5,
30
+ async check(context) {
31
+ if (context.tools.length === 0) {
32
+ return createRuleResult('DESC-007', 5, {
33
+ passed: true,
34
+ score: 5,
35
+ message: 'No tools detected (rule not applicable)',
36
+ });
37
+ }
38
+ const violations = [];
39
+ for (const tool of context.tools) {
40
+ const desc = tool.description?.trim() ?? '';
41
+ if (desc.length < 10)
42
+ continue; // Skip empty/trivial (handled by DESC-004)
43
+ const hasActionExplanation = ACTION_PATTERNS.some((p) => p.test(desc));
44
+ if (!hasActionExplanation) {
45
+ violations.push(tool.name);
46
+ }
47
+ }
48
+ if (violations.length === 0) {
49
+ return createRuleResult('DESC-007', 5, {
50
+ passed: true,
51
+ score: 5,
52
+ message: 'All tool descriptions explain what the tool does',
53
+ });
54
+ }
55
+ return createRuleResult('DESC-007', 5, {
56
+ passed: false,
57
+ score: Math.max(0, 5 - violations.length * 2),
58
+ message: `${violations.length} tool description(s) may not clearly explain what the tool does`,
59
+ details: violations.map((name) => `Tool "${name}" description lacks a clear action explanation`),
60
+ suggestions: [
61
+ 'Start descriptions with an action verb: "Search for...", "Create a...", "Delete the..."',
62
+ 'Clearly state the tool\'s primary action and its target',
63
+ 'Example: "Search for available flights between two airports on a given date"',
64
+ ],
65
+ affectedTools: violations,
66
+ });
67
+ },
68
+ };
69
+ export default DESC_007;
70
+ //# sourceMappingURL=DESC-007.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-007.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-007.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,MAAM,eAAe,GAAG;IACtB,+EAA+E;IAC/E,wDAAwD;IACxD,mDAAmD;IACnD,mDAAmD;IACnD,8DAA8D;IAC9D,qEAAqE;IACrE,yDAAyD;IACzD,uDAAuD;IACvD,mDAAmD;CACpD,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,+CAA+C;IAC5D,QAAQ,EAAE,SAAS;IACnB,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,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;gBAAE,SAAS,CAAC,2CAA2C;YAE3E,MAAM,oBAAoB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;YAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,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,kDAAkD;aAC5D,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,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7C,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,iEAAiE;YAC9F,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,gDAAgD,CACxE;YACD,WAAW,EAAE;gBACX,yFAAyF;gBACzF,yDAAyD;gBACzD,8EAA8E;aAC/E;YACD,aAAa,EAAE,UAAU;SAC1B,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * DESC-008: Description Explains When
3
+ *
4
+ * Checks that descriptions explain when to use the tool.
5
+ * A good description provides context for when the tool should be invoked.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const DESC_008: Rule;
9
+ export default DESC_008;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * DESC-008: Description Explains When
3
+ *
4
+ * Checks that descriptions explain when to use the tool.
5
+ * A good description provides context for when the tool should be invoked.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ /**
9
+ * Heuristic patterns that indicate a description mentions when/context for usage
10
+ */
11
+ const WHEN_PATTERNS = [
12
+ /\bwhen\b/i,
13
+ /\bif\s+(the\s+)?(user|customer|client)\b/i,
14
+ /\buse\s+this\s+(tool\s+)?(to|for|when)\b/i,
15
+ /\bused?\s+(for|to|when)\b/i,
16
+ /\b(after|before|during|while)\b/i,
17
+ /\b(suitable|appropriate|ideal|best)\s+(for|when)\b/i,
18
+ /\b(in\s+case|in\s+the\s+event)\b/i,
19
+ /\b(to\s+help|to\s+assist|to\s+allow)\b/i,
20
+ /\b(enables?|allows?|permits?)\s+(the\s+)?(user|agent|you)\b/i,
21
+ /\b(for\s+)(searching|creating|updating|booking|checking|finding)\b/i,
22
+ ];
23
+ export const DESC_008 = {
24
+ id: 'DESC-008',
25
+ category: 'description',
26
+ name: 'Description Explains When',
27
+ description: 'Description should explain when to use the tool',
28
+ severity: 'info',
29
+ maxScore: 3,
30
+ async check(context) {
31
+ if (context.tools.length === 0) {
32
+ return createRuleResult('DESC-008', 3, {
33
+ passed: true,
34
+ score: 3,
35
+ message: 'No tools detected (rule not applicable)',
36
+ });
37
+ }
38
+ const violations = [];
39
+ for (const tool of context.tools) {
40
+ const desc = tool.description?.trim() ?? '';
41
+ if (desc.length < 20)
42
+ continue; // Skip short descriptions
43
+ const hasWhenContext = WHEN_PATTERNS.some((p) => p.test(desc));
44
+ if (!hasWhenContext) {
45
+ violations.push(tool.name);
46
+ }
47
+ }
48
+ if (violations.length === 0) {
49
+ return createRuleResult('DESC-008', 3, {
50
+ passed: true,
51
+ score: 3,
52
+ message: 'All tool descriptions provide usage context',
53
+ });
54
+ }
55
+ return createRuleResult('DESC-008', 3, {
56
+ passed: false,
57
+ score: Math.max(0, 3 - violations.length),
58
+ message: `${violations.length} tool description(s) don't explain when to use the tool`,
59
+ details: violations.map((name) => `Tool "${name}" description lacks usage context (when to invoke)`),
60
+ suggestions: [
61
+ 'Include context for when the tool should be used',
62
+ 'Example: "Search for flights when the user wants to travel between cities"',
63
+ 'Agents need context to decide which tool to invoke for a given user intent',
64
+ ],
65
+ affectedTools: violations,
66
+ });
67
+ },
68
+ };
69
+ export default DESC_008;
70
+ //# sourceMappingURL=DESC-008.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-008.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-008.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,aAAa,GAAG;IACpB,WAAW;IACX,2CAA2C;IAC3C,2CAA2C;IAC3C,4BAA4B;IAC5B,kCAAkC;IAClC,qDAAqD;IACrD,mCAAmC;IACnC,yCAAyC;IACzC,8DAA8D;IAC9D,qEAAqE;CACtE,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,iDAAiD;IAC9D,QAAQ,EAAE,MAAM;IAChB,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,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;gBAAE,SAAS,CAAC,0BAA0B;YAE1D,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE/D,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,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,6CAA6C;aACvD,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,UAAU,CAAC,MAAM,CAAC;YACzC,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,yDAAyD;YACtF,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,oDAAoD,CAC5E;YACD,WAAW,EAAE;gBACX,kDAAkD;gBAClD,4EAA4E;gBAC5E,4EAA4E;aAC7E;YACD,aAAa,EAAE,UAAU;SAC1B,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * DESC-009: Param Descriptions Exist
3
+ *
4
+ * Checks that every parameter in the schema has a description field.
5
+ */
6
+ import type { Rule } from '../../core/types/rule.js';
7
+ export declare const DESC_009: Rule;
8
+ export default DESC_009;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * DESC-009: Param Descriptions Exist
3
+ *
4
+ * Checks that every parameter in the schema has a description field.
5
+ */
6
+ import { createRuleResult } from '../runner.js';
7
+ export const DESC_009 = {
8
+ id: 'DESC-009',
9
+ category: 'description',
10
+ name: 'Param Descriptions Exist',
11
+ description: 'Every parameter should have a description field',
12
+ severity: 'warning',
13
+ maxScore: 5,
14
+ async check(context) {
15
+ if (context.tools.length === 0) {
16
+ return createRuleResult('DESC-009', 5, {
17
+ passed: true,
18
+ score: 5,
19
+ message: 'No tools detected (rule not applicable)',
20
+ });
21
+ }
22
+ const violations = [];
23
+ for (const tool of context.tools) {
24
+ if (!tool.inputSchema?.properties)
25
+ continue;
26
+ for (const [paramName, paramDef] of Object.entries(tool.inputSchema.properties)) {
27
+ if (!paramDef.description ||
28
+ paramDef.description.trim() === '') {
29
+ violations.push({ tool: tool.name, param: paramName });
30
+ }
31
+ }
32
+ }
33
+ if (violations.length === 0) {
34
+ return createRuleResult('DESC-009', 5, {
35
+ passed: true,
36
+ score: 5,
37
+ message: 'All parameters have descriptions',
38
+ });
39
+ }
40
+ return createRuleResult('DESC-009', 5, {
41
+ passed: false,
42
+ score: Math.max(0, 5 - violations.length),
43
+ message: `${violations.length} parameter(s) missing descriptions`,
44
+ details: violations.map((v) => `Parameter "${v.param}" in tool "${v.tool}" has no description`),
45
+ suggestions: [
46
+ 'Add a description to every parameter in the schema',
47
+ 'Descriptions help agents understand what each parameter expects',
48
+ 'Example: { "origin": { "type": "string", "description": "IATA airport code for departure (e.g. LAX)" } }',
49
+ ],
50
+ affectedTools: [...new Set(violations.map((v) => v.tool))],
51
+ });
52
+ },
53
+ };
54
+ export default DESC_009;
55
+ //# sourceMappingURL=DESC-009.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-009.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-009.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,UAAU;IACd,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,iDAAiD;IAC9D,QAAQ,EAAE,SAAS;IACnB,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,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAsC,EAAE,CAAC;QAEzD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU;gBAAE,SAAS;YAE5C,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAChD,IAAI,CAAC,WAAW,CAAC,UAAU,CAC5B,EAAE,CAAC;gBACF,IACE,CAAC,QAAQ,CAAC,WAAW;oBACrB,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAClC,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,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,kCAAkC;aAC5C,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,UAAU,CAAC,MAAM,CAAC;YACzC,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,oCAAoC;YACjE,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,IAAI,sBAAsB,CACvE;YACD,WAAW,EAAE;gBACX,oDAAoD;gBACpD,iEAAiE;gBACjE,0GAA0G;aAC3G;YACD,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * DESC-010: Param Descriptions Explain Format
3
+ *
4
+ * Checks that parameter descriptions explain expected format
5
+ * (e.g., "IATA airport code", "ISO 8601 date", "email address").
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const DESC_010: Rule;
9
+ export default DESC_010;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * DESC-010: Param Descriptions Explain Format
3
+ *
4
+ * Checks that parameter descriptions explain expected format
5
+ * (e.g., "IATA airport code", "ISO 8601 date", "email address").
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ /**
9
+ * Patterns that indicate a description includes format information
10
+ */
11
+ const FORMAT_INDICATORS = [
12
+ /\b(e\.g\.|for example|such as|like)\b/i,
13
+ /\b(format|formatted)\b/i,
14
+ /\b(ISO|IATA|RFC|UTC|UUID|URL|URI)\b/,
15
+ /\b(YYYY|yyyy|MM|DD|dd)\b/,
16
+ /\b[A-Z]{3}\b.*\bcode\b/i,
17
+ /\b(code|ID|identifier)\b/i,
18
+ /\b(digits?|characters?|letters?|alphanumeric)\b/i,
19
+ /\b(email|phone|zip|postal)\b/i,
20
+ /\b(currency|unit|percent|decimal)\b/i,
21
+ /\b(between|from|to|range)\b.*\b\d/i,
22
+ /\b(max(imum)?|min(imum)?)\s+\d/i,
23
+ /\b\d+\s*(chars?|characters?|digits?|bytes?|bits?)\b/i,
24
+ /\b(pattern|regex|regexp)\b/i,
25
+ /\b(comma[- ]separated|space[- ]separated|pipe[- ]delimited)\b/i,
26
+ ];
27
+ export const DESC_010 = {
28
+ id: 'DESC-010',
29
+ category: 'description',
30
+ name: 'Param Descriptions Explain Format',
31
+ description: 'Parameter descriptions should explain expected format',
32
+ severity: 'info',
33
+ maxScore: 3,
34
+ async check(context) {
35
+ if (context.tools.length === 0) {
36
+ return createRuleResult('DESC-010', 3, {
37
+ passed: true,
38
+ score: 3,
39
+ message: 'No tools detected (rule not applicable)',
40
+ });
41
+ }
42
+ const violations = [];
43
+ let totalParams = 0;
44
+ for (const tool of context.tools) {
45
+ if (!tool.inputSchema?.properties)
46
+ continue;
47
+ for (const [paramName, paramDef] of Object.entries(tool.inputSchema.properties)) {
48
+ const desc = paramDef.description?.trim() ?? '';
49
+ if (!desc)
50
+ continue; // Missing descriptions handled by DESC-009
51
+ totalParams++;
52
+ // Skip boolean params — format is inherently clear
53
+ if (paramDef.type === 'boolean')
54
+ continue;
55
+ // Skip if schema already has format/pattern/enum hints
56
+ if (paramDef.format || paramDef.pattern || paramDef.enum)
57
+ continue;
58
+ const hasFormatHint = FORMAT_INDICATORS.some((p) => p.test(desc));
59
+ if (!hasFormatHint) {
60
+ violations.push({ tool: tool.name, param: paramName });
61
+ }
62
+ }
63
+ }
64
+ if (totalParams === 0) {
65
+ return createRuleResult('DESC-010', 3, {
66
+ passed: true,
67
+ score: 3,
68
+ message: 'No parameters with descriptions to check',
69
+ });
70
+ }
71
+ if (violations.length === 0) {
72
+ return createRuleResult('DESC-010', 3, {
73
+ passed: true,
74
+ score: 3,
75
+ message: 'All parameter descriptions include format hints',
76
+ });
77
+ }
78
+ return createRuleResult('DESC-010', 3, {
79
+ passed: false,
80
+ score: Math.max(0, 3 - Math.ceil(violations.length / 2)),
81
+ message: `${violations.length} parameter description(s) lack format information`,
82
+ details: violations.map((v) => `Parameter "${v.param}" in tool "${v.tool}" does not specify expected format`),
83
+ suggestions: [
84
+ 'Include format hints: "IATA airport code (e.g. LAX)", "ISO 8601 date", "email address"',
85
+ 'Agents need format information to provide correctly formatted values',
86
+ ],
87
+ affectedTools: [...new Set(violations.map((v) => v.tool))],
88
+ });
89
+ },
90
+ };
91
+ export default DESC_010;
92
+ //# sourceMappingURL=DESC-010.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-010.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-010.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * DESC-011: Param Descriptions Explain Why
3
+ *
4
+ * Checks that enum/option descriptions explain the "why" not just "what".
5
+ * Per spec: "Use EXPRESS for next-day delivery" rather than just "EXPRESS".
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const DESC_011: Rule;
9
+ export default DESC_011;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * DESC-011: Param Descriptions Explain Why
3
+ *
4
+ * Checks that enum/option descriptions explain the "why" not just "what".
5
+ * Per spec: "Use EXPRESS for next-day delivery" rather than just "EXPRESS".
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ export const DESC_011 = {
9
+ id: 'DESC-011',
10
+ category: 'description',
11
+ name: 'Param Descriptions Explain Why',
12
+ description: 'Enum descriptions should explain the "why", not just "what"',
13
+ severity: 'info',
14
+ maxScore: 3,
15
+ async check(context) {
16
+ if (context.tools.length === 0) {
17
+ return createRuleResult('DESC-011', 3, {
18
+ passed: true,
19
+ score: 3,
20
+ message: 'No tools detected (rule not applicable)',
21
+ });
22
+ }
23
+ const violations = [];
24
+ let enumParamCount = 0;
25
+ for (const tool of context.tools) {
26
+ if (!tool.inputSchema?.properties)
27
+ continue;
28
+ for (const [paramName, paramDef] of Object.entries(tool.inputSchema.properties)) {
29
+ // Only check enum/oneOf params
30
+ if (!paramDef.enum && !paramDef.oneOf)
31
+ continue;
32
+ enumParamCount++;
33
+ if (paramDef.oneOf) {
34
+ // Check if oneOf entries have titles/descriptions
35
+ const hasDescriptiveOneOf = paramDef.oneOf.every((opt) => opt['title'] || opt['description']);
36
+ if (!hasDescriptiveOneOf) {
37
+ violations.push({ tool: tool.name, param: paramName });
38
+ }
39
+ }
40
+ else if (paramDef.enum) {
41
+ // Plain enum without oneOf — no descriptions available
42
+ const desc = paramDef.description ?? '';
43
+ // Check if the parent description explains the options
44
+ const enumValues = paramDef.enum.map(String);
45
+ const mentionsValues = enumValues.some((v) => desc.toLowerCase().includes(v.toLowerCase()));
46
+ if (!mentionsValues && enumValues.length > 1) {
47
+ violations.push({ tool: tool.name, param: paramName });
48
+ }
49
+ }
50
+ }
51
+ }
52
+ if (enumParamCount === 0) {
53
+ return createRuleResult('DESC-011', 3, {
54
+ passed: true,
55
+ score: 3,
56
+ message: 'No enum parameters found to check',
57
+ });
58
+ }
59
+ if (violations.length === 0) {
60
+ return createRuleResult('DESC-011', 3, {
61
+ passed: true,
62
+ score: 3,
63
+ message: 'All enum parameters have descriptive options',
64
+ });
65
+ }
66
+ return createRuleResult('DESC-011', 3, {
67
+ passed: false,
68
+ score: Math.max(0, 3 - violations.length),
69
+ message: `${violations.length} enum parameter(s) lack descriptive option explanations`,
70
+ details: violations.map((v) => `Parameter "${v.param}" in tool "${v.tool}" has enum values without explanations`),
71
+ suggestions: [
72
+ 'Use oneOf with title and const for enum options',
73
+ 'Example: { "oneOf": [{ "const": "EXPRESS", "title": "Express (next-day delivery)" }] }',
74
+ 'Explain why/when to choose each option, not just label it',
75
+ ],
76
+ affectedTools: [...new Set(violations.map((v) => v.tool))],
77
+ });
78
+ },
79
+ };
80
+ export default DESC_011;
81
+ //# sourceMappingURL=DESC-011.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-011.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-011.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * DESC-012: Description No Injection Patterns
3
+ *
4
+ * Checks that descriptions don't contain suspicious instruction-like text
5
+ * that could be prompt injection attempts.
6
+ */
7
+ import type { Rule } from '../../core/types/rule.js';
8
+ export declare const DESC_012: Rule;
9
+ export default DESC_012;
@@ -0,0 +1,98 @@
1
+ /**
2
+ * DESC-012: Description No Injection Patterns
3
+ *
4
+ * Checks that descriptions don't contain suspicious instruction-like text
5
+ * that could be prompt injection attempts.
6
+ */
7
+ import { createRuleResult } from '../runner.js';
8
+ const INJECTION_PATTERNS = [
9
+ /\bSYSTEM\s*:/i,
10
+ /\bIGNORE\s+(ALL\s+)?PREVIOUS\b/i,
11
+ /\bIGNORE\s+THE\s+ABOVE\b/i,
12
+ /\bIMPORTANT\s*:/i,
13
+ /\bINSTRUCTION\s*:/i,
14
+ /\bOVERRIDE\b/i,
15
+ /\bDISREGARD\b/i,
16
+ /\bFORGET\s+(ALL\s+)?PREVIOUS\b/i,
17
+ /\bYOU\s+ARE\s+(NOW|A)\b/i,
18
+ /\bACT\s+AS\b/i,
19
+ /\bPRETEND\b/i,
20
+ /\bROLE\s*:/i,
21
+ /\bJAILBREAK\b/i,
22
+ /\bBYPASS\b/i,
23
+ /\bDO\s+ANYTHING\s+NOW\b/i,
24
+ /\[\s*INST\s*\]/i,
25
+ /<<\s*SYS\s*>>/i,
26
+ // Base64 encoded instructions (simple heuristic for suspicious encoded content)
27
+ /(?:data:|base64)[,;]\s*[A-Za-z0-9+/=]{50,}/,
28
+ // Unusual unicode that could be used to hide instructions
29
+ /[\u200B-\u200F\u2028-\u202F\uFEFF]/,
30
+ ];
31
+ export const DESC_012 = {
32
+ id: 'DESC-012',
33
+ category: 'description',
34
+ name: 'Description No Injection Patterns',
35
+ description: 'Descriptions must not contain prompt injection patterns',
36
+ severity: 'critical',
37
+ maxScore: 10,
38
+ async check(context) {
39
+ if (context.tools.length === 0) {
40
+ return createRuleResult('DESC-012', 10, {
41
+ passed: true,
42
+ score: 10,
43
+ message: 'No tools detected (rule not applicable)',
44
+ });
45
+ }
46
+ const violations = [];
47
+ for (const tool of context.tools) {
48
+ const textsToCheck = [
49
+ tool.description ?? '',
50
+ tool.name ?? '',
51
+ ];
52
+ // Also check parameter descriptions
53
+ if (tool.inputSchema?.properties) {
54
+ for (const paramDef of Object.values(tool.inputSchema.properties)) {
55
+ if (paramDef.description) {
56
+ textsToCheck.push(paramDef.description);
57
+ }
58
+ }
59
+ }
60
+ const foundPatterns = [];
61
+ for (const text of textsToCheck) {
62
+ for (const pattern of INJECTION_PATTERNS) {
63
+ const match = text.match(pattern);
64
+ if (match) {
65
+ foundPatterns.push(match[0]);
66
+ }
67
+ }
68
+ }
69
+ if (foundPatterns.length > 0) {
70
+ violations.push({
71
+ tool: tool.name,
72
+ patterns: [...new Set(foundPatterns)],
73
+ });
74
+ }
75
+ }
76
+ if (violations.length === 0) {
77
+ return createRuleResult('DESC-012', 10, {
78
+ passed: true,
79
+ score: 10,
80
+ message: 'No prompt injection patterns detected in descriptions',
81
+ });
82
+ }
83
+ return createRuleResult('DESC-012', 10, {
84
+ passed: false,
85
+ score: 0,
86
+ message: `${violations.length} tool(s) contain suspicious injection patterns`,
87
+ details: violations.map((v) => `Tool "${v.tool}" contains suspicious patterns: ${v.patterns.join(', ')}`),
88
+ suggestions: [
89
+ 'Remove any instruction-like text from tool descriptions',
90
+ 'Descriptions should only explain what the tool does, not give system-level instructions',
91
+ 'Suspicious patterns include: SYSTEM:, IGNORE, OVERRIDE, encoded instructions',
92
+ ],
93
+ affectedTools: violations.map((v) => v.tool),
94
+ });
95
+ },
96
+ };
97
+ export default DESC_012;
98
+ //# sourceMappingURL=DESC-012.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DESC-012.js","sourceRoot":"","sources":["../../../src/rules/description/DESC-012.ts"],"names":[],"mappings":"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"}