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,12 @@
1
+ /**
2
+ * SEC-001: Destructive Actions Flagged
3
+ *
4
+ * CRITICAL security rule that checks if tools with critical
5
+ * destructive operations have either destructiveHint OR
6
+ * requiresConfirmation set.
7
+ *
8
+ * Critical operations include: delete, destroy, purchase, pay, transfer, etc.
9
+ */
10
+ import type { Rule } from '../../core/types/rule.js';
11
+ export declare const SEC_001: Rule;
12
+ export default SEC_001;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * SEC-001: Destructive Actions Flagged
3
+ *
4
+ * CRITICAL security rule that checks if tools with critical
5
+ * destructive operations have either destructiveHint OR
6
+ * requiresConfirmation set.
7
+ *
8
+ * Critical operations include: delete, destroy, purchase, pay, transfer, etc.
9
+ */
10
+ import { createRuleResult } from '../runner.js';
11
+ import { CRITICAL_DESTRUCTIVE_KEYWORDS, hasKeyword, findMatchedKeywords, } from '../utils/keywords.js';
12
+ export const SEC_001 = {
13
+ id: 'SEC-001',
14
+ category: 'security',
15
+ name: 'Destructive Actions Flagged',
16
+ description: 'Critical destructive operations must have destructiveHint or requiresConfirmation',
17
+ severity: 'critical',
18
+ maxScore: 15,
19
+ async check(context) {
20
+ const tools = context.tools;
21
+ if (tools.length === 0) {
22
+ return createRuleResult('SEC-001', 15, {
23
+ passed: true,
24
+ score: 15,
25
+ message: 'No tools detected (rule not applicable)',
26
+ });
27
+ }
28
+ const violations = [];
29
+ for (const tool of tools) {
30
+ const textToSearch = `${tool.name} ${tool.description}`;
31
+ if (hasKeyword(textToSearch, CRITICAL_DESTRUCTIVE_KEYWORDS)) {
32
+ // Check if either destructiveHint OR requiresConfirmation is set
33
+ const hasDestructiveHint = tool.annotations?.destructiveHint === true;
34
+ const hasRequiresConfirmation = tool.annotations?.requiresConfirmation === true;
35
+ if (!hasDestructiveHint && !hasRequiresConfirmation) {
36
+ const matchedKeywords = findMatchedKeywords(textToSearch, CRITICAL_DESTRUCTIVE_KEYWORDS);
37
+ violations.push({ name: tool.name, keywords: matchedKeywords });
38
+ }
39
+ }
40
+ }
41
+ if (violations.length === 0) {
42
+ return createRuleResult('SEC-001', 15, {
43
+ passed: true,
44
+ score: 15,
45
+ message: 'All critical destructive tools are properly flagged',
46
+ });
47
+ }
48
+ // Deduct 5 points per violation (critical security issue)
49
+ const penalty = violations.length * 5;
50
+ const score = Math.max(0, 15 - penalty);
51
+ return createRuleResult('SEC-001', 15, {
52
+ passed: false,
53
+ score,
54
+ message: `${violations.length} critical tool(s) missing security annotations`,
55
+ details: violations.map((v) => `CRITICAL: Tool "${v.name}" contains [${v.keywords.join(', ')}] but lacks destructiveHint or requiresConfirmation`),
56
+ suggestions: [
57
+ 'Add destructiveHint: true OR requiresConfirmation: true for critical operations',
58
+ 'These annotations help agents understand the impact of tool execution',
59
+ 'Example: { annotations: { destructiveHint: true, requiresConfirmation: true } }',
60
+ ],
61
+ affectedTools: violations.map((v) => v.name),
62
+ });
63
+ },
64
+ };
65
+ export default SEC_001;
66
+ //# sourceMappingURL=SEC-001.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SEC-001.js","sourceRoot":"","sources":["../../../src/rules/security/SEC-001.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,mFAAmF;IACrF,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;gBACrC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAA2C,EAAE,CAAC;QAE9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAExD,IAAI,UAAU,CAAC,YAAY,EAAE,6BAA6B,CAAC,EAAE,CAAC;gBAC5D,iEAAiE;gBACjE,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,KAAK,IAAI,CAAC;gBACtE,MAAM,uBAAuB,GAC3B,IAAI,CAAC,WAAW,EAAE,oBAAoB,KAAK,IAAI,CAAC;gBAElD,IAAI,CAAC,kBAAkB,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACpD,MAAM,eAAe,GAAG,mBAAmB,CACzC,YAAY,EACZ,6BAA6B,CAC9B,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QAED,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,qDAAqD;aAC/D,CAAC,CAAC;QACL,CAAC;QAED,0DAA0D;QAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;QAExC,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,gDAAgD;YAC7E,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,mBAAmB,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qDAAqD,CACrH;YACD,WAAW,EAAE;gBACX,iFAAiF;gBACjF,uEAAuE;gBACvE,iFAAiF;aAClF;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,35 @@
1
+ /**
2
+ * Keyword utilities for rule analysis
3
+ *
4
+ * Shared keyword lists and matching utilities used by
5
+ * best-practices and security rules.
6
+ */
7
+ /**
8
+ * Keywords that suggest destructive operations
9
+ * Used by BP-002 to check if destructiveHint should be set
10
+ */
11
+ export declare const DESTRUCTIVE_KEYWORDS: string[];
12
+ /**
13
+ * Critical destructive keywords that MUST have destructiveHint or requiresConfirmation
14
+ * Used by SEC-001 for security enforcement
15
+ */
16
+ export declare const CRITICAL_DESTRUCTIVE_KEYWORDS: string[];
17
+ /**
18
+ * Keywords that suggest read-only operations
19
+ * Used by BP-003 to check if readOnlyHint should be set
20
+ */
21
+ export declare const READONLY_KEYWORDS: string[];
22
+ /**
23
+ * Check if text contains any of the given keywords
24
+ * @param text - Text to search in (name or description)
25
+ * @param keywords - List of keywords to search for
26
+ * @returns true if any keyword is found
27
+ */
28
+ export declare function hasKeyword(text: string, keywords: string[]): boolean;
29
+ /**
30
+ * Find all matching keywords in the text
31
+ * @param text - Text to search in (name or description)
32
+ * @param keywords - List of keywords to search for
33
+ * @returns Array of matched keywords
34
+ */
35
+ export declare function findMatchedKeywords(text: string, keywords: string[]): string[];
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Keyword utilities for rule analysis
3
+ *
4
+ * Shared keyword lists and matching utilities used by
5
+ * best-practices and security rules.
6
+ */
7
+ /**
8
+ * Keywords that suggest destructive operations
9
+ * Used by BP-002 to check if destructiveHint should be set
10
+ */
11
+ export const DESTRUCTIVE_KEYWORDS = [
12
+ 'delete',
13
+ 'remove',
14
+ 'destroy',
15
+ 'drop',
16
+ 'truncate',
17
+ 'purchase',
18
+ 'buy',
19
+ 'order',
20
+ 'checkout',
21
+ 'pay',
22
+ 'cancel',
23
+ 'terminate',
24
+ 'revoke',
25
+ 'disable',
26
+ 'wipe',
27
+ 'clear',
28
+ 'reset',
29
+ 'unsubscribe',
30
+ ];
31
+ /**
32
+ * Critical destructive keywords that MUST have destructiveHint or requiresConfirmation
33
+ * Used by SEC-001 for security enforcement
34
+ */
35
+ export const CRITICAL_DESTRUCTIVE_KEYWORDS = [
36
+ 'delete',
37
+ 'remove',
38
+ 'destroy',
39
+ 'drop',
40
+ 'wipe',
41
+ 'purchase',
42
+ 'buy',
43
+ 'checkout',
44
+ 'pay',
45
+ 'transfer',
46
+ 'cancel',
47
+ 'terminate',
48
+ 'revoke',
49
+ 'ban',
50
+ 'deactivate',
51
+ ];
52
+ /**
53
+ * Keywords that suggest read-only operations
54
+ * Used by BP-003 to check if readOnlyHint should be set
55
+ */
56
+ export const READONLY_KEYWORDS = [
57
+ 'get',
58
+ 'fetch',
59
+ 'read',
60
+ 'retrieve',
61
+ 'load',
62
+ 'search',
63
+ 'find',
64
+ 'lookup',
65
+ 'query',
66
+ 'browse',
67
+ 'list',
68
+ 'show',
69
+ 'display',
70
+ 'view',
71
+ 'check',
72
+ ];
73
+ /**
74
+ * Check if text contains any of the given keywords
75
+ * @param text - Text to search in (name or description)
76
+ * @param keywords - List of keywords to search for
77
+ * @returns true if any keyword is found
78
+ */
79
+ export function hasKeyword(text, keywords) {
80
+ const lowerText = text.toLowerCase();
81
+ return keywords.some((keyword) => {
82
+ // Match as whole word or at word boundaries
83
+ const regex = new RegExp(`\\b${keyword}\\b`, 'i');
84
+ return regex.test(lowerText);
85
+ });
86
+ }
87
+ /**
88
+ * Find all matching keywords in the text
89
+ * @param text - Text to search in (name or description)
90
+ * @param keywords - List of keywords to search for
91
+ * @returns Array of matched keywords
92
+ */
93
+ export function findMatchedKeywords(text, keywords) {
94
+ const lowerText = text.toLowerCase();
95
+ return keywords.filter((keyword) => {
96
+ const regex = new RegExp(`\\b${keyword}\\b`, 'i');
97
+ return regex.test(lowerText);
98
+ });
99
+ }
100
+ //# sourceMappingURL=keywords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keywords.js","sourceRoot":"","sources":["../../../src/rules/utils/keywords.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,UAAU;IACV,KAAK;IACL,OAAO;IACP,UAAU;IACV,KAAK;IACL,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,aAAa;CACd,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,UAAU;IACV,KAAK;IACL,UAAU;IACV,KAAK;IACL,UAAU;IACV,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,KAAK;IACL,YAAY;CACb,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK;IACL,OAAO;IACP,MAAM;IACN,UAAU;IACV,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO;CACR,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAAkB;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/B,4CAA4C;QAC5C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAkB;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Score Calculator
3
+ *
4
+ * Aggregates rule results into a final score and grade.
5
+ */
6
+ import type { RuleResult, RuleCategory, Finding } from '../core/types/rule.js';
7
+ import type { ScoreSummary, Grade, Recommendation } from '../core/types/audit.js';
8
+ /**
9
+ * Calculate the overall score from rule results
10
+ */
11
+ export declare function calculateScore(ruleResults: Map<string, RuleResult>, ruleCategories: Map<string, RuleCategory>): ScoreSummary;
12
+ /**
13
+ * Calculate the letter grade from a numeric score
14
+ */
15
+ export declare function calculateGrade(score: number): Grade;
16
+ /**
17
+ * Extract findings (issues) from rule results
18
+ */
19
+ export declare function extractFindings(ruleResults: Map<string, RuleResult>, ruleSeverities: Map<string, 'critical' | 'warning' | 'info'>): Finding[];
20
+ /**
21
+ * Generate recommendations from findings
22
+ */
23
+ export declare function generateRecommendations(findings: Finding[]): Recommendation[];
24
+ /**
25
+ * Calculate score impact of fixing a specific rule
26
+ */
27
+ export declare function estimateScoreImpact(currentScore: number, ruleResult: RuleResult, categoryWeight: number): number;
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Score Calculator
3
+ *
4
+ * Aggregates rule results into a final score and grade.
5
+ */
6
+ import { CATEGORY_WEIGHTS, CATEGORY_NAMES } from '../core/types/rule.js';
7
+ import { GRADE_THRESHOLDS } from '../core/constants.js';
8
+ /**
9
+ * Calculate the overall score from rule results
10
+ */
11
+ export function calculateScore(ruleResults, ruleCategories) {
12
+ // Group results by category
13
+ const categoryResults = {
14
+ implementation: [],
15
+ description: [],
16
+ schema: [],
17
+ security: [],
18
+ 'best-practices': [],
19
+ coverage: [],
20
+ };
21
+ for (const [ruleId, result] of ruleResults) {
22
+ const category = ruleCategories.get(ruleId);
23
+ if (category) {
24
+ categoryResults[category].push(result);
25
+ }
26
+ }
27
+ // Calculate scores per category
28
+ const categories = [];
29
+ let totalWeightedScore = 0;
30
+ let totalWeight = 0;
31
+ for (const [categoryId, results] of Object.entries(categoryResults)) {
32
+ if (results.length === 0)
33
+ continue;
34
+ const earnedScore = results.reduce((sum, r) => sum + r.score, 0);
35
+ const maxScore = results.reduce((sum, r) => sum + r.maxScore, 0);
36
+ const percentage = maxScore > 0 ? (earnedScore / maxScore) * 100 : 100;
37
+ categories.push({
38
+ name: CATEGORY_NAMES[categoryId],
39
+ id: categoryId,
40
+ score: earnedScore,
41
+ maxScore,
42
+ percentage: Math.round(percentage),
43
+ });
44
+ const weight = CATEGORY_WEIGHTS[categoryId];
45
+ totalWeightedScore += percentage * weight;
46
+ totalWeight += weight;
47
+ }
48
+ // Calculate final score (0-100)
49
+ const total = totalWeight > 0 ? Math.round(totalWeightedScore / totalWeight) : 0;
50
+ // Determine grade
51
+ const grade = calculateGrade(total);
52
+ // Count issues by severity
53
+ const issueCount = {
54
+ critical: 0,
55
+ warning: 0,
56
+ info: 0,
57
+ };
58
+ for (const result of ruleResults.values()) {
59
+ if (!result.passed) {
60
+ // Infer severity from score impact
61
+ if (result.maxScore - result.score >= 10) {
62
+ issueCount.critical++;
63
+ }
64
+ else if (result.maxScore - result.score >= 3) {
65
+ issueCount.warning++;
66
+ }
67
+ else {
68
+ issueCount.info++;
69
+ }
70
+ }
71
+ }
72
+ return {
73
+ total,
74
+ grade,
75
+ categories,
76
+ issueCount,
77
+ };
78
+ }
79
+ /**
80
+ * Calculate the letter grade from a numeric score
81
+ */
82
+ export function calculateGrade(score) {
83
+ if (score >= GRADE_THRESHOLDS['A+'])
84
+ return 'A+';
85
+ if (score >= GRADE_THRESHOLDS['A'])
86
+ return 'A';
87
+ if (score >= GRADE_THRESHOLDS['B+'])
88
+ return 'B+';
89
+ if (score >= GRADE_THRESHOLDS['B'])
90
+ return 'B';
91
+ if (score >= GRADE_THRESHOLDS['C+'])
92
+ return 'C+';
93
+ if (score >= GRADE_THRESHOLDS['C'])
94
+ return 'C';
95
+ if (score >= GRADE_THRESHOLDS['D'])
96
+ return 'D';
97
+ return 'F';
98
+ }
99
+ /**
100
+ * Extract findings (issues) from rule results
101
+ */
102
+ export function extractFindings(ruleResults, ruleSeverities) {
103
+ const findings = [];
104
+ for (const [ruleId, result] of ruleResults) {
105
+ if (result.passed)
106
+ continue;
107
+ const severity = ruleSeverities.get(ruleId) ?? 'warning';
108
+ const scoreImpact = result.maxScore - result.score;
109
+ // Create a finding for the main issue
110
+ findings.push({
111
+ ruleId,
112
+ severity,
113
+ message: result.message,
114
+ tool: result.affectedTools?.[0],
115
+ page: result.affectedPages?.[0],
116
+ fix: result.suggestions?.[0],
117
+ scoreImpact,
118
+ });
119
+ // Create additional findings for each affected tool
120
+ if (result.affectedTools && result.affectedTools.length > 1) {
121
+ for (const tool of result.affectedTools.slice(1)) {
122
+ findings.push({
123
+ ruleId,
124
+ severity,
125
+ message: result.message,
126
+ tool,
127
+ fix: result.suggestions?.[0],
128
+ scoreImpact: 0, // Only count once
129
+ });
130
+ }
131
+ }
132
+ }
133
+ // Sort by severity (critical first) and then by score impact
134
+ const severityOrder = { critical: 0, warning: 1, info: 2 };
135
+ findings.sort((a, b) => {
136
+ const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];
137
+ if (severityDiff !== 0)
138
+ return severityDiff;
139
+ return b.scoreImpact - a.scoreImpact;
140
+ });
141
+ return findings;
142
+ }
143
+ /**
144
+ * Generate recommendations from findings
145
+ */
146
+ export function generateRecommendations(findings) {
147
+ const recommendations = [];
148
+ const seenRules = new Set();
149
+ for (const finding of findings) {
150
+ if (seenRules.has(finding.ruleId))
151
+ continue;
152
+ seenRules.add(finding.ruleId);
153
+ if (!finding.fix)
154
+ continue;
155
+ // Estimate effort based on severity and type
156
+ let effort = 'medium';
157
+ if (finding.scoreImpact <= 3)
158
+ effort = 'low';
159
+ if (finding.scoreImpact >= 10)
160
+ effort = 'high';
161
+ if (finding.ruleId.startsWith('SEC-'))
162
+ effort = 'high';
163
+ if (finding.ruleId.startsWith('DESC-'))
164
+ effort = 'low';
165
+ // Collect affected tools
166
+ const affectedTools = findings
167
+ .filter((f) => f.ruleId === finding.ruleId && f.tool)
168
+ .map((f) => f.tool);
169
+ recommendations.push({
170
+ priority: recommendations.length + 1,
171
+ action: finding.fix,
172
+ scoreImpact: finding.scoreImpact,
173
+ effort,
174
+ ruleId: finding.ruleId,
175
+ affectedTools: affectedTools.length > 0 ? affectedTools : undefined,
176
+ });
177
+ }
178
+ // Sort by score impact (highest first)
179
+ recommendations.sort((a, b) => b.scoreImpact - a.scoreImpact);
180
+ // Reassign priorities after sorting
181
+ recommendations.forEach((rec, i) => {
182
+ rec.priority = i + 1;
183
+ });
184
+ return recommendations.slice(0, 10); // Return top 10
185
+ }
186
+ /**
187
+ * Calculate score impact of fixing a specific rule
188
+ */
189
+ export function estimateScoreImpact(currentScore, ruleResult, categoryWeight) {
190
+ const improvement = ruleResult.maxScore - ruleResult.score;
191
+ const percentageImprovement = improvement; // Assuming max score per rule is normalized
192
+ return Math.round((percentageImprovement * categoryWeight) / 100);
193
+ }
194
+ //# sourceMappingURL=calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.js","sourceRoot":"","sources":["../../src/scoring/calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Grade Definitions and Display
3
+ */
4
+ import type { Grade } from '../core/types/audit.js';
5
+ /**
6
+ * Grade metadata
7
+ */
8
+ export interface GradeInfo {
9
+ letter: Grade;
10
+ label: string;
11
+ description: string;
12
+ minScore: number;
13
+ color: string;
14
+ }
15
+ /**
16
+ * Grade definitions
17
+ */
18
+ export declare const GRADES: Record<Grade, GradeInfo>;
19
+ /**
20
+ * Get grade info for a score
21
+ */
22
+ export declare function getGradeInfo(score: number): GradeInfo;
23
+ /**
24
+ * Get the next grade up from the current score
25
+ */
26
+ export declare function getNextGrade(score: number): GradeInfo | null;
27
+ /**
28
+ * Calculate points needed to reach the next grade
29
+ */
30
+ export declare function pointsToNextGrade(score: number): number;
31
+ /**
32
+ * ASCII art for each grade letter
33
+ */
34
+ export declare const GRADE_ASCII: Record<Grade, string>;
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Grade Definitions and Display
3
+ */
4
+ /**
5
+ * Grade definitions
6
+ */
7
+ export const GRADES = {
8
+ 'A+': {
9
+ letter: 'A+',
10
+ label: 'Excellent',
11
+ description: 'Exceptional WebMCP implementation with best-in-class practices',
12
+ minScore: 95,
13
+ color: 'green',
14
+ },
15
+ 'A': {
16
+ letter: 'A',
17
+ label: 'Great',
18
+ description: 'Strong WebMCP implementation with minor improvements possible',
19
+ minScore: 85,
20
+ color: 'green',
21
+ },
22
+ 'B+': {
23
+ letter: 'B+',
24
+ label: 'Good',
25
+ description: 'Good implementation with some areas for improvement',
26
+ minScore: 80,
27
+ color: 'yellow',
28
+ },
29
+ 'B': {
30
+ letter: 'B',
31
+ label: 'Above Average',
32
+ description: 'Functional implementation with notable gaps',
33
+ minScore: 70,
34
+ color: 'yellow',
35
+ },
36
+ 'C+': {
37
+ letter: 'C+',
38
+ label: 'Average',
39
+ description: 'Basic implementation with significant room for improvement',
40
+ minScore: 65,
41
+ color: '#FF8C00',
42
+ },
43
+ 'C': {
44
+ letter: 'C',
45
+ label: 'Below Average',
46
+ description: 'Minimal implementation with many issues',
47
+ minScore: 55,
48
+ color: '#FF8C00',
49
+ },
50
+ 'D': {
51
+ letter: 'D',
52
+ label: 'Poor',
53
+ description: 'Inadequate implementation requiring significant work',
54
+ minScore: 40,
55
+ color: 'red',
56
+ },
57
+ 'F': {
58
+ letter: 'F',
59
+ label: 'Failing',
60
+ description: 'Little to no WebMCP support detected',
61
+ minScore: 0,
62
+ color: 'red',
63
+ },
64
+ };
65
+ /**
66
+ * Get grade info for a score
67
+ */
68
+ export function getGradeInfo(score) {
69
+ if (score >= 95)
70
+ return GRADES['A+'];
71
+ if (score >= 85)
72
+ return GRADES['A'];
73
+ if (score >= 80)
74
+ return GRADES['B+'];
75
+ if (score >= 70)
76
+ return GRADES['B'];
77
+ if (score >= 65)
78
+ return GRADES['C+'];
79
+ if (score >= 55)
80
+ return GRADES['C'];
81
+ if (score >= 40)
82
+ return GRADES['D'];
83
+ return GRADES['F'];
84
+ }
85
+ /**
86
+ * Get the next grade up from the current score
87
+ */
88
+ export function getNextGrade(score) {
89
+ const grades = Object.values(GRADES).sort((a, b) => b.minScore - a.minScore);
90
+ for (const grade of grades) {
91
+ if (score < grade.minScore) {
92
+ return grade;
93
+ }
94
+ }
95
+ return null; // Already at A+
96
+ }
97
+ /**
98
+ * Calculate points needed to reach the next grade
99
+ */
100
+ export function pointsToNextGrade(score) {
101
+ const next = getNextGrade(score);
102
+ if (!next)
103
+ return 0;
104
+ return next.minScore - score;
105
+ }
106
+ /**
107
+ * ASCII art for each grade letter
108
+ */
109
+ export const GRADE_ASCII = {
110
+ 'A+': `
111
+ █████╗ ╋
112
+ ██╔══██╗ ╋╋
113
+ ███████║ ╋
114
+ ██╔══██║
115
+ ██║ ██║ ╋
116
+ ╚═╝ ╚═╝ `,
117
+ 'A': `
118
+ █████╗
119
+ ██╔══██╗
120
+ ███████║
121
+ ██╔══██║
122
+ ██║ ██║
123
+ ╚═╝ ╚═╝ `,
124
+ 'B+': `
125
+ ██████╗ ╋
126
+ ██╔══██╗ ╋╋
127
+ ██████╔╝ ╋
128
+ ██╔══██╗
129
+ ██████╔╝ ╋
130
+ ╚═════╝ `,
131
+ 'B': `
132
+ ██████╗
133
+ ██╔══██╗
134
+ ██████╔╝
135
+ ██╔══██╗
136
+ ██████╔╝
137
+ ╚═════╝ `,
138
+ 'C+': `
139
+ ██████╗ ╋
140
+ ██╔════╝ ╋╋
141
+ ██║ ╋
142
+ ██║
143
+ ╚██████╗ ╋
144
+ ╚═════╝ `,
145
+ 'C': `
146
+ ██████╗
147
+ ██╔════╝
148
+ ██║
149
+ ██║
150
+ ╚██████╗
151
+ ╚═════╝ `,
152
+ 'D': `
153
+ ██████╗
154
+ ██╔══██╗
155
+ ██║ ██║
156
+ ██║ ██║
157
+ ██████╔╝
158
+ ╚═════╝ `,
159
+ 'F': `
160
+ ███████╗
161
+ ██╔════╝
162
+ █████╗
163
+ ██╔══╝
164
+ ██║
165
+ ╚═╝ `,
166
+ };
167
+ //# sourceMappingURL=grades.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grades.js","sourceRoot":"","sources":["../../src/scoring/grades.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAA6B;IAC9C,IAAI,EAAE;QACJ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,gEAAgE;QAC7E,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,OAAO;KACf;IACD,GAAG,EAAE;QACH,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,+DAA+D;QAC5E,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,OAAO;KACf;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,qDAAqD;QAClE,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,QAAQ;KAChB;IACD,GAAG,EAAE;QACH,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,6CAA6C;QAC1D,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,QAAQ;KAChB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,4DAA4D;QACzE,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,SAAS;KACjB;IACD,GAAG,EAAE;QACH,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,yCAAyC;QACtD,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,SAAS;KACjB;IACD,GAAG,EAAE;QACH,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,KAAK;KACb;IACD,GAAG,EAAE;QACH,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,KAAK;KACb;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE7E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,gBAAgB;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAA0B;IAChD,IAAI,EAAE;;;;;;iBAMS;IACf,GAAG,EAAE;;;;;;cAMO;IACZ,IAAI,EAAE;;;;;;iBAMS;IACf,GAAG,EAAE;;;;;;cAMO;IACZ,IAAI,EAAE;;;;;;iBAMS;IACf,GAAG,EAAE;;;;;;cAMO;IACZ,GAAG,EAAE;;;;;;aAMM;IACX,GAAG,EAAE;;;;;;YAMK;CACX,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Scoring Module
3
+ */
4
+ export * from './calculator.js';
5
+ export * from './grades.js';