webmcp-cli 1.2.1 → 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 (331) 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/bin/webmcp.js +0 -0
  14. package/dist/cli/commands/potential.d.ts +8 -0
  15. package/dist/cli/commands/potential.js +323 -0
  16. package/dist/cli/commands/potential.js.map +1 -0
  17. package/dist/cli/commands/report.d.ts +12 -0
  18. package/dist/cli/commands/report.js +89 -0
  19. package/dist/cli/commands/report.js.map +1 -0
  20. package/dist/cli/index.js +35 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/config/defaults.d.ts +36 -0
  23. package/dist/config/defaults.js +33 -0
  24. package/dist/config/defaults.js.map +1 -0
  25. package/dist/config/index.d.ts +7 -0
  26. package/dist/config/index.js +7 -0
  27. package/dist/config/index.js.map +1 -0
  28. package/dist/config/loader.d.ts +22 -0
  29. package/dist/config/loader.js +91 -0
  30. package/dist/config/loader.js.map +1 -0
  31. package/dist/config/schema.d.ts +280 -0
  32. package/dist/config/schema.js +42 -0
  33. package/dist/config/schema.js.map +1 -0
  34. package/dist/core/types/audit.d.ts +1 -1
  35. package/dist/core/types/index.d.ts +1 -0
  36. package/dist/core/types/index.js +1 -0
  37. package/dist/core/types/index.js.map +1 -1
  38. package/dist/core/types/recon.d.ts +265 -0
  39. package/dist/core/types/recon.js +5 -0
  40. package/dist/core/types/recon.js.map +1 -0
  41. package/dist/core/types/rule.d.ts +1 -1
  42. package/dist/core/types/rule.js +7 -5
  43. package/dist/core/types/rule.js.map +1 -1
  44. package/dist/crawler/depth-crawler.d.ts +29 -0
  45. package/dist/crawler/depth-crawler.js +212 -0
  46. package/dist/crawler/depth-crawler.js.map +1 -0
  47. package/dist/crawler/index.d.ts +2 -0
  48. package/dist/crawler/index.js +3 -0
  49. package/dist/crawler/index.js.map +1 -0
  50. package/dist/crawler/link-extractor.d.ts +1 -0
  51. package/dist/crawler/link-extractor.js +49 -0
  52. package/dist/crawler/link-extractor.js.map +1 -0
  53. package/dist/generators/index.d.ts +10 -0
  54. package/dist/generators/index.js +8 -0
  55. package/dist/generators/index.js.map +1 -0
  56. package/dist/generators/report-html.d.ts +12 -0
  57. package/dist/generators/report-html.js +470 -0
  58. package/dist/generators/report-html.js.map +1 -0
  59. package/dist/generators/report-json.d.ts +95 -0
  60. package/dist/generators/report-json.js +144 -0
  61. package/dist/generators/report-json.js.map +1 -0
  62. package/dist/generators/report-manager.d.ts +31 -0
  63. package/dist/generators/report-manager.js +208 -0
  64. package/dist/generators/report-manager.js.map +1 -0
  65. package/dist/generators/tool-code-generator.d.ts +31 -0
  66. package/dist/generators/tool-code-generator.js +201 -0
  67. package/dist/generators/tool-code-generator.js.map +1 -0
  68. package/dist/potential/ai-recommender.d.ts +33 -0
  69. package/dist/potential/ai-recommender.js +414 -0
  70. package/dist/potential/ai-recommender.js.map +1 -0
  71. package/dist/potential/analyzer.d.ts +32 -0
  72. package/dist/potential/analyzer.js +383 -0
  73. package/dist/potential/analyzer.js.map +1 -0
  74. package/dist/potential/index.d.ts +3 -0
  75. package/dist/potential/index.js +4 -0
  76. package/dist/potential/index.js.map +1 -0
  77. package/dist/potential/prompts.d.ts +20 -0
  78. package/dist/potential/prompts.js +42 -0
  79. package/dist/potential/prompts.js.map +1 -0
  80. package/dist/potential/types.d.ts +40 -0
  81. package/dist/potential/types.js +2 -0
  82. package/dist/potential/types.js.map +1 -0
  83. package/dist/recon/index.d.ts +20 -0
  84. package/dist/recon/index.js +143 -0
  85. package/dist/recon/index.js.map +1 -0
  86. package/dist/recon/manifest.d.ts +16 -0
  87. package/dist/recon/manifest.js +108 -0
  88. package/dist/recon/manifest.js.map +1 -0
  89. package/dist/recon/meta-extractor.d.ts +11 -0
  90. package/dist/recon/meta-extractor.js +276 -0
  91. package/dist/recon/meta-extractor.js.map +1 -0
  92. package/dist/recon/robots.d.ts +16 -0
  93. package/dist/recon/robots.js +158 -0
  94. package/dist/recon/robots.js.map +1 -0
  95. package/dist/recon/route-discovery.d.ts +25 -0
  96. package/dist/recon/route-discovery.js +303 -0
  97. package/dist/recon/route-discovery.js.map +1 -0
  98. package/dist/recon/sitemap.d.ts +12 -0
  99. package/dist/recon/sitemap.js +177 -0
  100. package/dist/recon/sitemap.js.map +1 -0
  101. package/dist/rules/accessibility/AXE-001.d.ts +9 -0
  102. package/dist/rules/accessibility/AXE-001.js +109 -0
  103. package/dist/rules/accessibility/AXE-001.js.map +1 -0
  104. package/dist/rules/accessibility/AXE-002.d.ts +8 -0
  105. package/dist/rules/accessibility/AXE-002.js +85 -0
  106. package/dist/rules/accessibility/AXE-002.js.map +1 -0
  107. package/dist/rules/accessibility/AXE-003.d.ts +8 -0
  108. package/dist/rules/accessibility/AXE-003.js +94 -0
  109. package/dist/rules/accessibility/AXE-003.js.map +1 -0
  110. package/dist/rules/accessibility/AXE-004.d.ts +8 -0
  111. package/dist/rules/accessibility/AXE-004.js +101 -0
  112. package/dist/rules/accessibility/AXE-004.js.map +1 -0
  113. package/dist/rules/accessibility/AXE-005.d.ts +9 -0
  114. package/dist/rules/accessibility/AXE-005.js +89 -0
  115. package/dist/rules/accessibility/AXE-005.js.map +1 -0
  116. package/dist/rules/best-practices/BP-004.d.ts +9 -0
  117. package/dist/rules/best-practices/BP-004.js +96 -0
  118. package/dist/rules/best-practices/BP-004.js.map +1 -0
  119. package/dist/rules/best-practices/BP-005.d.ts +8 -0
  120. package/dist/rules/best-practices/BP-005.js +94 -0
  121. package/dist/rules/best-practices/BP-005.js.map +1 -0
  122. package/dist/rules/best-practices/BP-006.d.ts +8 -0
  123. package/dist/rules/best-practices/BP-006.js +80 -0
  124. package/dist/rules/best-practices/BP-006.js.map +1 -0
  125. package/dist/rules/best-practices/BP-007.d.ts +8 -0
  126. package/dist/rules/best-practices/BP-007.js +92 -0
  127. package/dist/rules/best-practices/BP-007.js.map +1 -0
  128. package/dist/rules/best-practices/BP-008.d.ts +12 -0
  129. package/dist/rules/best-practices/BP-008.js +86 -0
  130. package/dist/rules/best-practices/BP-008.js.map +1 -0
  131. package/dist/rules/best-practices/BP-009.d.ts +9 -0
  132. package/dist/rules/best-practices/BP-009.js +77 -0
  133. package/dist/rules/best-practices/BP-009.js.map +1 -0
  134. package/dist/rules/best-practices/BP-010.d.ts +8 -0
  135. package/dist/rules/best-practices/BP-010.js +85 -0
  136. package/dist/rules/best-practices/BP-010.js.map +1 -0
  137. package/dist/rules/coverage/COV-002.d.ts +8 -0
  138. package/dist/rules/coverage/COV-002.js +68 -0
  139. package/dist/rules/coverage/COV-002.js.map +1 -0
  140. package/dist/rules/coverage/COV-003.d.ts +8 -0
  141. package/dist/rules/coverage/COV-003.js +68 -0
  142. package/dist/rules/coverage/COV-003.js.map +1 -0
  143. package/dist/rules/coverage/COV-004.d.ts +8 -0
  144. package/dist/rules/coverage/COV-004.js +89 -0
  145. package/dist/rules/coverage/COV-004.js.map +1 -0
  146. package/dist/rules/coverage/COV-005.d.ts +8 -0
  147. package/dist/rules/coverage/COV-005.js +67 -0
  148. package/dist/rules/coverage/COV-005.js.map +1 -0
  149. package/dist/rules/coverage/COV-006.d.ts +9 -0
  150. package/dist/rules/coverage/COV-006.js +76 -0
  151. package/dist/rules/coverage/COV-006.js.map +1 -0
  152. package/dist/rules/coverage/COV-007.d.ts +8 -0
  153. package/dist/rules/coverage/COV-007.js +67 -0
  154. package/dist/rules/coverage/COV-007.js.map +1 -0
  155. package/dist/rules/coverage/COV-008.d.ts +9 -0
  156. package/dist/rules/coverage/COV-008.js +87 -0
  157. package/dist/rules/coverage/COV-008.js.map +1 -0
  158. package/dist/rules/coverage/COV-009.d.ts +8 -0
  159. package/dist/rules/coverage/COV-009.js +73 -0
  160. package/dist/rules/coverage/COV-009.js.map +1 -0
  161. package/dist/rules/coverage/COV-010.d.ts +9 -0
  162. package/dist/rules/coverage/COV-010.js +82 -0
  163. package/dist/rules/coverage/COV-010.js.map +1 -0
  164. package/dist/rules/description/DESC-001.d.ts +9 -0
  165. package/dist/rules/description/DESC-001.js +88 -0
  166. package/dist/rules/description/DESC-001.js.map +1 -0
  167. package/dist/rules/description/DESC-002.d.ts +10 -0
  168. package/dist/rules/description/DESC-002.js +99 -0
  169. package/dist/rules/description/DESC-002.js.map +1 -0
  170. package/dist/rules/description/DESC-006.d.ts +9 -0
  171. package/dist/rules/description/DESC-006.js +78 -0
  172. package/dist/rules/description/DESC-006.js.map +1 -0
  173. package/dist/rules/description/DESC-007.d.ts +9 -0
  174. package/dist/rules/description/DESC-007.js +70 -0
  175. package/dist/rules/description/DESC-007.js.map +1 -0
  176. package/dist/rules/description/DESC-008.d.ts +9 -0
  177. package/dist/rules/description/DESC-008.js +70 -0
  178. package/dist/rules/description/DESC-008.js.map +1 -0
  179. package/dist/rules/description/DESC-009.d.ts +8 -0
  180. package/dist/rules/description/DESC-009.js +55 -0
  181. package/dist/rules/description/DESC-009.js.map +1 -0
  182. package/dist/rules/description/DESC-010.d.ts +9 -0
  183. package/dist/rules/description/DESC-010.js +92 -0
  184. package/dist/rules/description/DESC-010.js.map +1 -0
  185. package/dist/rules/description/DESC-011.d.ts +9 -0
  186. package/dist/rules/description/DESC-011.js +81 -0
  187. package/dist/rules/description/DESC-011.js.map +1 -0
  188. package/dist/rules/description/DESC-012.d.ts +9 -0
  189. package/dist/rules/description/DESC-012.js +98 -0
  190. package/dist/rules/description/DESC-012.js.map +1 -0
  191. package/dist/rules/implementation/IMP-002.d.ts +9 -0
  192. package/dist/rules/implementation/IMP-002.js +59 -0
  193. package/dist/rules/implementation/IMP-002.js.map +1 -0
  194. package/dist/rules/implementation/IMP-006.d.ts +9 -0
  195. package/dist/rules/implementation/IMP-006.js +48 -0
  196. package/dist/rules/implementation/IMP-006.js.map +1 -0
  197. package/dist/rules/implementation/IMP-008.d.ts +9 -0
  198. package/dist/rules/implementation/IMP-008.js +46 -0
  199. package/dist/rules/implementation/IMP-008.js.map +1 -0
  200. package/dist/rules/implementation/IMP-009.d.ts +9 -0
  201. package/dist/rules/implementation/IMP-009.js +48 -0
  202. package/dist/rules/implementation/IMP-009.js.map +1 -0
  203. package/dist/rules/implementation/IMP-010.d.ts +9 -0
  204. package/dist/rules/implementation/IMP-010.js +66 -0
  205. package/dist/rules/implementation/IMP-010.js.map +1 -0
  206. package/dist/rules/implementation/IMP-011.d.ts +9 -0
  207. package/dist/rules/implementation/IMP-011.js +82 -0
  208. package/dist/rules/implementation/IMP-011.js.map +1 -0
  209. package/dist/rules/implementation/IMP-012.d.ts +9 -0
  210. package/dist/rules/implementation/IMP-012.js +88 -0
  211. package/dist/rules/implementation/IMP-012.js.map +1 -0
  212. package/dist/rules/implementation/IMP-014.d.ts +9 -0
  213. package/dist/rules/implementation/IMP-014.js +58 -0
  214. package/dist/rules/implementation/IMP-014.js.map +1 -0
  215. package/dist/rules/implementation/IMP-015.d.ts +9 -0
  216. package/dist/rules/implementation/IMP-015.js +64 -0
  217. package/dist/rules/implementation/IMP-015.js.map +1 -0
  218. package/dist/rules/implementation/IMP-016.d.ts +9 -0
  219. package/dist/rules/implementation/IMP-016.js +52 -0
  220. package/dist/rules/implementation/IMP-016.js.map +1 -0
  221. package/dist/rules/implementation/IMP-017.d.ts +8 -0
  222. package/dist/rules/implementation/IMP-017.js +51 -0
  223. package/dist/rules/implementation/IMP-017.js.map +1 -0
  224. package/dist/rules/implementation/IMP-018.d.ts +8 -0
  225. package/dist/rules/implementation/IMP-018.js +52 -0
  226. package/dist/rules/implementation/IMP-018.js.map +1 -0
  227. package/dist/rules/implementation/IMP-019.d.ts +8 -0
  228. package/dist/rules/implementation/IMP-019.js +53 -0
  229. package/dist/rules/implementation/IMP-019.js.map +1 -0
  230. package/dist/rules/implementation/IMP-020.d.ts +9 -0
  231. package/dist/rules/implementation/IMP-020.js +62 -0
  232. package/dist/rules/implementation/IMP-020.js.map +1 -0
  233. package/dist/rules/implementation/IMP-021.d.ts +8 -0
  234. package/dist/rules/implementation/IMP-021.js +64 -0
  235. package/dist/rules/implementation/IMP-021.js.map +1 -0
  236. package/dist/rules/implementation/IMP-022.d.ts +8 -0
  237. package/dist/rules/implementation/IMP-022.js +70 -0
  238. package/dist/rules/implementation/IMP-022.js.map +1 -0
  239. package/dist/rules/index.d.ts +73 -6
  240. package/dist/rules/index.js +141 -6
  241. package/dist/rules/index.js.map +1 -1
  242. package/dist/rules/schema/SCHEMA-004.d.ts +9 -0
  243. package/dist/rules/schema/SCHEMA-004.js +57 -0
  244. package/dist/rules/schema/SCHEMA-004.js.map +1 -0
  245. package/dist/rules/schema/SCHEMA-005.d.ts +9 -0
  246. package/dist/rules/schema/SCHEMA-005.js +61 -0
  247. package/dist/rules/schema/SCHEMA-005.js.map +1 -0
  248. package/dist/rules/schema/SCHEMA-006.d.ts +10 -0
  249. package/dist/rules/schema/SCHEMA-006.js +85 -0
  250. package/dist/rules/schema/SCHEMA-006.js.map +1 -0
  251. package/dist/rules/schema/SCHEMA-007.d.ts +9 -0
  252. package/dist/rules/schema/SCHEMA-007.js +73 -0
  253. package/dist/rules/schema/SCHEMA-007.js.map +1 -0
  254. package/dist/rules/schema/SCHEMA-008.d.ts +9 -0
  255. package/dist/rules/schema/SCHEMA-008.js +70 -0
  256. package/dist/rules/schema/SCHEMA-008.js.map +1 -0
  257. package/dist/rules/schema/SCHEMA-009.d.ts +10 -0
  258. package/dist/rules/schema/SCHEMA-009.js +80 -0
  259. package/dist/rules/schema/SCHEMA-009.js.map +1 -0
  260. package/dist/rules/schema/SCHEMA-010.d.ts +9 -0
  261. package/dist/rules/schema/SCHEMA-010.js +96 -0
  262. package/dist/rules/schema/SCHEMA-010.js.map +1 -0
  263. package/dist/rules/schema/SCHEMA-012.d.ts +9 -0
  264. package/dist/rules/schema/SCHEMA-012.js +65 -0
  265. package/dist/rules/schema/SCHEMA-012.js.map +1 -0
  266. package/dist/rules/security/SEC-002.d.ts +8 -0
  267. package/dist/rules/security/SEC-002.js +81 -0
  268. package/dist/rules/security/SEC-002.js.map +1 -0
  269. package/dist/rules/security/SEC-003.d.ts +8 -0
  270. package/dist/rules/security/SEC-003.js +85 -0
  271. package/dist/rules/security/SEC-003.js.map +1 -0
  272. package/dist/rules/security/SEC-004.d.ts +9 -0
  273. package/dist/rules/security/SEC-004.js +87 -0
  274. package/dist/rules/security/SEC-004.js.map +1 -0
  275. package/dist/rules/security/SEC-005.d.ts +8 -0
  276. package/dist/rules/security/SEC-005.js +87 -0
  277. package/dist/rules/security/SEC-005.js.map +1 -0
  278. package/dist/rules/security/SEC-006.d.ts +10 -0
  279. package/dist/rules/security/SEC-006.js +108 -0
  280. package/dist/rules/security/SEC-006.js.map +1 -0
  281. package/dist/rules/security/SEC-007.d.ts +9 -0
  282. package/dist/rules/security/SEC-007.js +108 -0
  283. package/dist/rules/security/SEC-007.js.map +1 -0
  284. package/dist/rules/security/SEC-008.d.ts +8 -0
  285. package/dist/rules/security/SEC-008.js +109 -0
  286. package/dist/rules/security/SEC-008.js.map +1 -0
  287. package/dist/rules/security/SEC-009.d.ts +9 -0
  288. package/dist/rules/security/SEC-009.js +93 -0
  289. package/dist/rules/security/SEC-009.js.map +1 -0
  290. package/dist/rules/security/SEC-010.d.ts +8 -0
  291. package/dist/rules/security/SEC-010.js +78 -0
  292. package/dist/rules/security/SEC-010.js.map +1 -0
  293. package/dist/rules/security/SEC-011.d.ts +8 -0
  294. package/dist/rules/security/SEC-011.js +93 -0
  295. package/dist/rules/security/SEC-011.js.map +1 -0
  296. package/dist/rules/security/SEC-012.d.ts +8 -0
  297. package/dist/rules/security/SEC-012.js +79 -0
  298. package/dist/rules/security/SEC-012.js.map +1 -0
  299. package/dist/rules/security/SEC-013.d.ts +9 -0
  300. package/dist/rules/security/SEC-013.js +107 -0
  301. package/dist/rules/security/SEC-013.js.map +1 -0
  302. package/dist/scoring/calculator.js +1 -0
  303. package/dist/scoring/calculator.js.map +1 -1
  304. package/dist/ui/ink/components/AIRecommendationCard.d.ts +11 -0
  305. package/dist/ui/ink/components/AIRecommendationCard.js +23 -0
  306. package/dist/ui/ink/components/AIRecommendationCard.js.map +1 -0
  307. package/dist/ui/ink/components/OpportunityList.d.ts +10 -0
  308. package/dist/ui/ink/components/OpportunityList.js +48 -0
  309. package/dist/ui/ink/components/OpportunityList.js.map +1 -0
  310. package/dist/ui/ink/components/PotentialPageCard.d.ts +13 -0
  311. package/dist/ui/ink/components/PotentialPageCard.js +43 -0
  312. package/dist/ui/ink/components/PotentialPageCard.js.map +1 -0
  313. package/dist/ui/ink/components/PotentialProgress.d.ts +16 -0
  314. package/dist/ui/ink/components/PotentialProgress.js +44 -0
  315. package/dist/ui/ink/components/PotentialProgress.js.map +1 -0
  316. package/dist/ui/ink/components/PotentialSummary.d.ts +10 -0
  317. package/dist/ui/ink/components/PotentialSummary.js +86 -0
  318. package/dist/ui/ink/components/PotentialSummary.js.map +1 -0
  319. package/dist/ui/ink/components/SuggestionCard.d.ts +34 -0
  320. package/dist/ui/ink/components/SuggestionCard.js +36 -0
  321. package/dist/ui/ink/components/SuggestionCard.js.map +1 -0
  322. package/dist/ui/ink/components/views/MultiPageCrawlView.d.ts +21 -0
  323. package/dist/ui/ink/components/views/MultiPageCrawlView.js +55 -0
  324. package/dist/ui/ink/components/views/MultiPageCrawlView.js.map +1 -0
  325. package/dist/ui/ink/components/views/PotentialView.d.ts +18 -0
  326. package/dist/ui/ink/components/views/PotentialView.js +74 -0
  327. package/dist/ui/ink/components/views/PotentialView.js.map +1 -0
  328. package/dist/ui/ink/components/views/ReconView.d.ts +22 -0
  329. package/dist/ui/ink/components/views/ReconView.js +30 -0
  330. package/dist/ui/ink/components/views/ReconView.js.map +1 -0
  331. package/package.json +9 -9
@@ -0,0 +1,144 @@
1
+ /**
2
+ * JSON Report Generator
3
+ *
4
+ * Generates a machine-readable JSON audit report.
5
+ */
6
+ import { writeJson } from 'fs-extra';
7
+ import { join } from 'path';
8
+ import { CATEGORY_WEIGHTS } from '../core/types/rule.js';
9
+ function serializeTool(tool) {
10
+ return {
11
+ name: tool.name,
12
+ description: tool.description,
13
+ source: tool.source,
14
+ pageUrl: tool.pageUrl,
15
+ hasExecute: tool.hasExecute,
16
+ registrationMethod: tool.registrationMethod,
17
+ inputSchema: tool.inputSchema,
18
+ annotations: tool.annotations,
19
+ };
20
+ }
21
+ function serializeOpportunity(opp) {
22
+ return {
23
+ index: opp.index,
24
+ sensitivity: opp.sensitivity,
25
+ agenticValue: opp.agenticValue,
26
+ fieldCount: opp.fieldCount,
27
+ contextClues: {
28
+ formAction: opp.contextClues.formAction,
29
+ formMethod: opp.contextClues.formMethod,
30
+ submitText: opp.contextClues.submitText,
31
+ nearestHeading: opp.contextClues.nearestHeading,
32
+ fieldNames: opp.contextClues.fieldNames,
33
+ },
34
+ };
35
+ }
36
+ function serializeFinding(finding) {
37
+ return {
38
+ ruleId: finding.ruleId,
39
+ severity: finding.severity,
40
+ message: finding.message,
41
+ tool: finding.tool,
42
+ page: finding.page,
43
+ fix: finding.fix,
44
+ scoreImpact: finding.scoreImpact,
45
+ };
46
+ }
47
+ function serializeRecommendation(rec) {
48
+ return {
49
+ priority: rec.priority,
50
+ action: rec.action,
51
+ scoreImpact: rec.scoreImpact,
52
+ effort: rec.effort,
53
+ ruleId: rec.ruleId,
54
+ affectedTools: rec.affectedTools,
55
+ };
56
+ }
57
+ function buildCategoryScoreMap(categories, ruleResults) {
58
+ const result = {};
59
+ for (const cat of categories) {
60
+ // Count rules in this category by prefix mapping
61
+ const categoryPrefixes = {
62
+ implementation: ['IMP'],
63
+ description: ['DESC'],
64
+ schema: ['SCHEMA'],
65
+ security: ['SEC'],
66
+ 'best-practices': ['BP'],
67
+ coverage: ['COV'],
68
+ };
69
+ const prefixes = categoryPrefixes[cat.id] ?? [];
70
+ let rulesChecked = 0;
71
+ let rulesPassed = 0;
72
+ for (const [ruleId, ruleResult] of ruleResults) {
73
+ const matchesCategory = prefixes.some((p) => ruleId.startsWith(p));
74
+ if (matchesCategory) {
75
+ rulesChecked++;
76
+ if (ruleResult.passed) {
77
+ rulesPassed++;
78
+ }
79
+ }
80
+ }
81
+ result[cat.id] = {
82
+ score: cat.score,
83
+ maxScore: cat.maxScore,
84
+ percentage: cat.percentage,
85
+ weight: CATEGORY_WEIGHTS[cat.id] ?? 0,
86
+ rulesChecked,
87
+ rulesPassed,
88
+ };
89
+ }
90
+ return result;
91
+ }
92
+ /**
93
+ * Generate machine-readable JSON report file.
94
+ *
95
+ * @returns Absolute path to the written file.
96
+ */
97
+ export async function generateJsonReport(auditResult, outputDir) {
98
+ const findings = auditResult.findings;
99
+ const critical = findings.filter((f) => f.severity === 'critical').length;
100
+ const warnings = findings.filter((f) => f.severity === 'warning').length;
101
+ const info = findings.filter((f) => f.severity === 'info').length;
102
+ const topActions = auditResult.recommendations
103
+ .slice(0, 5)
104
+ .map((r) => r.action);
105
+ const report = {
106
+ meta: {
107
+ tool: 'webmcp-cli',
108
+ version: auditResult.cliVersion,
109
+ timestamp: auditResult.startedAt.toISOString(),
110
+ targetUrl: auditResult.url,
111
+ auditDuration: auditResult.duration,
112
+ },
113
+ score: {
114
+ total: auditResult.score.total,
115
+ grade: auditResult.score.grade,
116
+ categories: buildCategoryScoreMap(auditResult.score.categories, auditResult.ruleResults),
117
+ },
118
+ pages: auditResult.pages.map((p) => ({
119
+ url: p.url,
120
+ title: p.title,
121
+ hasWebMCP: p.hasWebMCP,
122
+ toolCount: p.toolCount,
123
+ formCount: p.formCount,
124
+ opportunityCount: p.opportunityCount,
125
+ })),
126
+ tools: {
127
+ existing: auditResult.tools.map(serializeTool),
128
+ opportunities: auditResult.opportunities.map(serializeOpportunity),
129
+ },
130
+ findings: findings.map(serializeFinding),
131
+ recommendations: auditResult.recommendations.map(serializeRecommendation),
132
+ summary: {
133
+ totalFindings: findings.length,
134
+ critical,
135
+ warnings,
136
+ info,
137
+ topActions,
138
+ },
139
+ };
140
+ const filePath = join(outputDir, 'audit-report.json');
141
+ await writeJson(filePath, report, { spaces: 2 });
142
+ return filePath;
143
+ }
144
+ //# sourceMappingURL=report-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-json.js","sourceRoot":"","sources":["../../src/generators/report-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Report Manager
3
+ *
4
+ * Orchestrates report generation — JSON, HTML, tool exports.
5
+ */
6
+ import type { AuditResult } from '../core/types/audit.js';
7
+ export interface ReportOptions {
8
+ /** Output directory (default: ./agentready-report) */
9
+ outputDir: string;
10
+ /** Report formats to generate */
11
+ formats: ('html' | 'json')[];
12
+ /** Copy page screenshots if available */
13
+ includeScreenshots: boolean;
14
+ /** Export suggested tool snippets */
15
+ generateSuggestedTools: boolean;
16
+ }
17
+ export interface ReportOutput {
18
+ outputDir: string;
19
+ files: string[];
20
+ jsonReportPath?: string;
21
+ htmlReportPath?: string;
22
+ toolsDetectedPath?: string;
23
+ toolsSuggestedJsPath?: string;
24
+ toolsSuggestedHtmlPath?: string;
25
+ }
26
+ /**
27
+ * Generate all requested reports and tool exports.
28
+ *
29
+ * @returns Paths to every generated file.
30
+ */
31
+ export declare function generateReports(auditResult: AuditResult, options?: Partial<ReportOptions>): Promise<ReportOutput>;
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Report Manager
3
+ *
4
+ * Orchestrates report generation — JSON, HTML, tool exports.
5
+ */
6
+ import { ensureDir, writeJson, copy, pathExists } from 'fs-extra';
7
+ import { writeFile } from 'fs/promises';
8
+ import { join } from 'path';
9
+ import { generateJsonReport } from './report-json.js';
10
+ import { generateHtmlReport } from './report-html.js';
11
+ const DEFAULT_OPTIONS = {
12
+ outputDir: './agentready-report',
13
+ formats: ['html', 'json'],
14
+ includeScreenshots: true,
15
+ generateSuggestedTools: true,
16
+ };
17
+ /* ------------------------------------------------------------------ */
18
+ /* Tool export helpers */
19
+ /* ------------------------------------------------------------------ */
20
+ function toolToImperativeJs(tool) {
21
+ const schema = tool.inputSchema
22
+ ? JSON.stringify(tool.inputSchema, null, 2)
23
+ : '{ type: "object", properties: {} }';
24
+ return `navigator.modelContext.registerTool({
25
+ name: ${JSON.stringify(tool.name)},
26
+ description: ${JSON.stringify(tool.description)},
27
+ inputSchema: ${schema},
28
+ execute: async (params) => {
29
+ // TODO: Implement tool logic
30
+ console.log('Executing ${tool.name}', params);
31
+ return { success: true };
32
+ },
33
+ });`;
34
+ }
35
+ function toolToDeclarativeHtml(tool) {
36
+ const params = tool.inputSchema?.properties ?? {};
37
+ const required = new Set(tool.inputSchema?.required ?? []);
38
+ const inputs = Object.entries(params)
39
+ .map(([name, schema]) => {
40
+ const s = schema;
41
+ const type = s['type'] === 'number' ? 'number' : 'text';
42
+ const req = required.has(name) ? ' required' : '';
43
+ const desc = s['description'] ? ` toolparamdescription="${String(s['description']).replace(/"/g, '&quot;')}"` : '';
44
+ return ` <label>${name}: <input type="${type}" name="${name}"${desc}${req} /></label>`;
45
+ })
46
+ .join('\n');
47
+ return `<form toolname="${tool.name}" tooldescription="${tool.description.replace(/"/g, '&quot;')}" toolautosubmit>
48
+ ${inputs}
49
+ <button type="submit">Submit</button>
50
+ </form>`;
51
+ }
52
+ function opportunityToSuggestedJs(opp) {
53
+ const clues = opp.contextClues;
54
+ const name = deriveName(clues);
55
+ const desc = deriveDescription(clues);
56
+ const props = {};
57
+ for (const field of opp.fields) {
58
+ props[field.name] = {
59
+ type: field.type === 'number' ? 'number' : 'string',
60
+ description: field.label ?? field.placeholder ?? field.name,
61
+ };
62
+ }
63
+ const requiredFields = opp.fields.filter((f) => f.required).map((f) => f.name);
64
+ const schema = JSON.stringify({ type: 'object', properties: props, required: requiredFields }, null, 2);
65
+ return `// Suggested tool for form: ${clues.nearestHeading ?? clues.formAction ?? `#${opp.index}`}
66
+ navigator.modelContext.registerTool({
67
+ name: ${JSON.stringify(name)},
68
+ description: ${JSON.stringify(desc)},
69
+ inputSchema: ${schema},
70
+ execute: async (params) => {
71
+ // TODO: Wire up to form at ${clues.formAction ?? '(no action)'}
72
+ console.log('${name}', params);
73
+ return { success: true };
74
+ },
75
+ });`;
76
+ }
77
+ function opportunityToSuggestedHtml(opp) {
78
+ const clues = opp.contextClues;
79
+ const name = deriveName(clues);
80
+ const desc = deriveDescription(clues);
81
+ const inputs = opp.fields
82
+ .map((f) => {
83
+ const type = f.type === 'number' ? 'number' : 'text';
84
+ const req = f.required ? ' required' : '';
85
+ const descAttr = f.label ? ` toolparamdescription="${f.label.replace(/"/g, '&quot;')}"` : '';
86
+ return ` <label>${f.name}: <input type="${type}" name="${f.name}"${descAttr}${req} /></label>`;
87
+ })
88
+ .join('\n');
89
+ return `<!-- Suggested: ${clues.nearestHeading ?? clues.formAction ?? `form #${opp.index}`} -->
90
+ <form toolname="${name}" tooldescription="${desc.replace(/"/g, '&quot;')}" toolautosubmit>
91
+ ${inputs}
92
+ <button type="submit">Submit</button>
93
+ </form>`;
94
+ }
95
+ function deriveName(clues) {
96
+ // Derive a snake_case name from context
97
+ const source = clues.submitText ?? clues.nearestHeading ?? clues.formId ?? clues.formAction ?? 'form_action';
98
+ return source
99
+ .toLowerCase()
100
+ .replace(/[^a-z0-9]+/g, '_')
101
+ .replace(/^_|_$/g, '')
102
+ .substring(0, 40);
103
+ }
104
+ function deriveDescription(clues) {
105
+ if (clues.nearestHeading)
106
+ return clues.nearestHeading;
107
+ if (clues.submitText)
108
+ return `Submit: ${clues.submitText}`;
109
+ if (clues.formAction)
110
+ return `Form action: ${clues.formAction}`;
111
+ return 'Unregistered form';
112
+ }
113
+ /* ------------------------------------------------------------------ */
114
+ /* Main orchestrator */
115
+ /* ------------------------------------------------------------------ */
116
+ /**
117
+ * Generate all requested reports and tool exports.
118
+ *
119
+ * @returns Paths to every generated file.
120
+ */
121
+ export async function generateReports(auditResult, options) {
122
+ const opts = { ...DEFAULT_OPTIONS, ...options };
123
+ const outDir = opts.outputDir;
124
+ await ensureDir(outDir);
125
+ const output = {
126
+ outputDir: outDir,
127
+ files: [],
128
+ };
129
+ // ── JSON report ──────────────────────────────────────────────────
130
+ if (opts.formats.includes('json')) {
131
+ const path = await generateJsonReport(auditResult, outDir);
132
+ output.jsonReportPath = path;
133
+ output.files.push(path);
134
+ }
135
+ // ── HTML report ──────────────────────────────────────────────────
136
+ if (opts.formats.includes('html')) {
137
+ const path = await generateHtmlReport(auditResult, outDir);
138
+ output.htmlReportPath = path;
139
+ output.files.push(path);
140
+ }
141
+ // ── Detected tools export ────────────────────────────────────────
142
+ const detectedToolsPath = join(outDir, 'tools-detected.json');
143
+ await writeJson(detectedToolsPath, auditResult.tools.map((t) => ({
144
+ name: t.name,
145
+ description: t.description,
146
+ source: t.source,
147
+ pageUrl: t.pageUrl,
148
+ inputSchema: t.inputSchema,
149
+ annotations: t.annotations,
150
+ })), { spaces: 2 });
151
+ output.toolsDetectedPath = detectedToolsPath;
152
+ output.files.push(detectedToolsPath);
153
+ // ── Suggested tool snippets ──────────────────────────────────────
154
+ if (opts.generateSuggestedTools && auditResult.opportunities.length > 0) {
155
+ // Imperative JS snippets
156
+ const jsSnippets = auditResult.opportunities
157
+ .map(opportunityToSuggestedJs)
158
+ .join('\n\n');
159
+ const jsPath = join(outDir, 'tools-suggested.js');
160
+ await writeFile(jsPath, jsSnippets, 'utf-8');
161
+ output.toolsSuggestedJsPath = jsPath;
162
+ output.files.push(jsPath);
163
+ // Declarative HTML snippets
164
+ const htmlSnippets = auditResult.opportunities
165
+ .map(opportunityToSuggestedHtml)
166
+ .join('\n\n');
167
+ const htmlPath = join(outDir, 'tools-suggested.html');
168
+ await writeFile(htmlPath, htmlSnippets, 'utf-8');
169
+ output.toolsSuggestedHtmlPath = htmlPath;
170
+ output.files.push(htmlPath);
171
+ }
172
+ // ── Existing tool export snippets ────────────────────────────────
173
+ if (auditResult.tools.length > 0) {
174
+ const existingJsPath = join(outDir, 'tools-existing.js');
175
+ const existingJs = auditResult.tools
176
+ .map(toolToImperativeJs)
177
+ .join('\n\n');
178
+ await writeFile(existingJsPath, existingJs, 'utf-8');
179
+ output.files.push(existingJsPath);
180
+ const existingHtmlPath = join(outDir, 'tools-existing.html');
181
+ const existingHtml = auditResult.tools
182
+ .map(toolToDeclarativeHtml)
183
+ .join('\n\n');
184
+ await writeFile(existingHtmlPath, existingHtml, 'utf-8');
185
+ output.files.push(existingHtmlPath);
186
+ }
187
+ // ── Screenshots ──────────────────────────────────────────────────
188
+ if (opts.includeScreenshots) {
189
+ const screenshotsDir = join(outDir, 'screenshots');
190
+ let hasScreenshots = false;
191
+ for (const page of auditResult.pages) {
192
+ if (page.screenshotPath && (await pathExists(page.screenshotPath))) {
193
+ if (!hasScreenshots) {
194
+ await ensureDir(screenshotsDir);
195
+ hasScreenshots = true;
196
+ }
197
+ const destName = page.url
198
+ .replace(/[^a-zA-Z0-9]/g, '_')
199
+ .substring(0, 80) + '.png';
200
+ const dest = join(screenshotsDir, destName);
201
+ await copy(page.screenshotPath, dest);
202
+ output.files.push(dest);
203
+ }
204
+ }
205
+ }
206
+ return output;
207
+ }
208
+ //# sourceMappingURL=report-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-manager.js","sourceRoot":"","sources":["../../src/generators/report-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Tool Code Generator
3
+ *
4
+ * Generates ready-to-use imperative JavaScript and declarative HTML code
5
+ * from suggested tool definitions.
6
+ */
7
+ import type { SuggestedTool } from '../analysis/form-to-tool-mapper.js';
8
+ /**
9
+ * Output from the code generator
10
+ */
11
+ export interface GeneratedCode {
12
+ /** Imperative JS code using navigator.modelContext.registerTool() */
13
+ imperativeJS: string;
14
+ /** Declarative HTML with toolname/tooldescription attributes */
15
+ declarativeHTML: string;
16
+ }
17
+ /**
18
+ * Generate both imperative JS and declarative HTML for a single suggested tool
19
+ */
20
+ export declare function generateToolCode(tool: SuggestedTool): GeneratedCode;
21
+ /**
22
+ * Generate code for multiple suggested tools
23
+ */
24
+ export declare function generateAllToolCode(tools: SuggestedTool[]): GeneratedCode[];
25
+ /**
26
+ * Generate combined output: all tools in a single JS block and a single HTML block
27
+ */
28
+ export declare function generateCombinedCode(tools: SuggestedTool[]): {
29
+ combinedJS: string;
30
+ combinedHTML: string;
31
+ };
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Tool Code Generator
3
+ *
4
+ * Generates ready-to-use imperative JavaScript and declarative HTML code
5
+ * from suggested tool definitions.
6
+ */
7
+ /**
8
+ * Generate both imperative JS and declarative HTML for a single suggested tool
9
+ */
10
+ export function generateToolCode(tool) {
11
+ return {
12
+ imperativeJS: generateImperativeJS(tool),
13
+ declarativeHTML: generateDeclarativeHTML(tool),
14
+ };
15
+ }
16
+ /**
17
+ * Generate code for multiple suggested tools
18
+ */
19
+ export function generateAllToolCode(tools) {
20
+ return tools.map(generateToolCode);
21
+ }
22
+ /**
23
+ * Generate combined output: all tools in a single JS block and a single HTML block
24
+ */
25
+ export function generateCombinedCode(tools) {
26
+ const jsBlocks = tools.map(generateImperativeJS);
27
+ const htmlBlocks = tools.map(generateDeclarativeHTML);
28
+ return {
29
+ combinedJS: jsBlocks.join('\n\n'),
30
+ combinedHTML: htmlBlocks.join('\n\n'),
31
+ };
32
+ }
33
+ /**
34
+ * Generate imperative JavaScript code for a tool
35
+ */
36
+ function generateImperativeJS(tool) {
37
+ const schemaStr = formatSchemaForJS(tool.suggestedSchema, 2);
38
+ const annotations = buildAnnotationsBlock(tool);
39
+ const lines = [];
40
+ lines.push('navigator.modelContext.registerTool({');
41
+ lines.push(` name: ${JSON.stringify(tool.suggestedName)},`);
42
+ lines.push(` description: ${JSON.stringify(tool.suggestedDescription)},`);
43
+ if (annotations) {
44
+ lines.push(` annotations: ${annotations},`);
45
+ }
46
+ lines.push(` inputSchema: ${schemaStr},`);
47
+ lines.push(' execute: async (params) => {');
48
+ lines.push(' // TODO: Implement tool logic');
49
+ // Add form submission hint
50
+ if (tool.sourceForm.action) {
51
+ const method = tool.sourceForm.method.toUpperCase();
52
+ if (method === 'GET') {
53
+ lines.push(` // Original form submits GET to ${JSON.stringify(tool.sourceForm.action)}`);
54
+ lines.push(' const queryParams = new URLSearchParams(params).toString();');
55
+ lines.push(` const response = await fetch(${JSON.stringify(tool.sourceForm.action)} + "?" + queryParams);`);
56
+ }
57
+ else {
58
+ lines.push(` // Original form submits ${method} to ${JSON.stringify(tool.sourceForm.action)}`);
59
+ lines.push(` const response = await fetch(${JSON.stringify(tool.sourceForm.action)}, {`);
60
+ lines.push(` method: ${JSON.stringify(method)},`);
61
+ lines.push(' headers: { "Content-Type": "application/x-www-form-urlencoded" },');
62
+ lines.push(' body: new URLSearchParams(params).toString(),');
63
+ lines.push(' });');
64
+ }
65
+ lines.push(' const text = await response.text();');
66
+ }
67
+ lines.push(' return {');
68
+ lines.push(' content: [{ type: "text", text: "Result" }],');
69
+ lines.push(' };');
70
+ lines.push(' },');
71
+ lines.push('});');
72
+ return lines.join('\n');
73
+ }
74
+ /**
75
+ * Generate declarative HTML for a tool
76
+ */
77
+ function generateDeclarativeHTML(tool) {
78
+ const action = tool.sourceForm.action
79
+ ? ` action="${escapeAttr(tool.sourceForm.action)}"`
80
+ : '';
81
+ const method = tool.sourceForm.method.toUpperCase() !== 'GET'
82
+ ? ` method="${escapeAttr(tool.sourceForm.method)}"`
83
+ : '';
84
+ const lines = [];
85
+ lines.push(`<form toolname="${escapeAttr(tool.suggestedName)}" tooldescription="${escapeAttr(tool.suggestedDescription)}"${action}${method}>`);
86
+ // Generate fields from schema
87
+ const props = tool.suggestedSchema.properties ?? {};
88
+ const requiredFields = new Set(tool.suggestedSchema.required ?? []);
89
+ for (const [name, prop] of Object.entries(props)) {
90
+ const isRequired = requiredFields.has(name);
91
+ const desc = prop.description ?? '';
92
+ const fieldHTML = generateFieldHTML(name, prop, isRequired, desc);
93
+ lines.push(fieldHTML);
94
+ }
95
+ // Add hidden fields
96
+ for (const hidden of tool.hiddenFields) {
97
+ const val = hidden.value ? ` value="${escapeAttr(hidden.value)}"` : '';
98
+ lines.push(` <input type="hidden" name="${escapeAttr(hidden.name)}"${val}>`);
99
+ }
100
+ lines.push(' <button type="submit">Submit</button>');
101
+ lines.push('</form>');
102
+ return lines.join('\n');
103
+ }
104
+ /**
105
+ * Generate HTML for a single form field
106
+ */
107
+ function generateFieldHTML(name, prop, isRequired, description) {
108
+ const reqAttr = isRequired ? ' required' : '';
109
+ const descAttr = description
110
+ ? ` toolparamdescription="${escapeAttr(description)}"`
111
+ : '';
112
+ // Enum -> select
113
+ if (prop.enum && Array.isArray(prop.enum) && prop.enum.length > 0) {
114
+ const options = prop.enum
115
+ .map((v) => ` <option value="${escapeAttr(String(v))}">${escapeHTML(String(v))}</option>`)
116
+ .join('\n');
117
+ return [
118
+ ` <label>${escapeHTML(description || name)}`,
119
+ ` <select name="${escapeAttr(name)}"${descAttr}${reqAttr}>`,
120
+ ` <option value="">Select...</option>`,
121
+ options,
122
+ ` </select>`,
123
+ ` </label>`,
124
+ ].join('\n');
125
+ }
126
+ // Boolean -> checkbox
127
+ if (prop.type === 'boolean') {
128
+ return ` <label><input type="checkbox" name="${escapeAttr(name)}"${descAttr}> ${escapeHTML(description || name)}</label>`;
129
+ }
130
+ // Number
131
+ if (prop.type === 'number' || prop.type === 'integer') {
132
+ const min = prop.minimum != null ? ` min="${prop.minimum}"` : '';
133
+ const max = prop.maximum != null ? ` max="${prop.maximum}"` : '';
134
+ return ` <label>${escapeHTML(description || name)} <input type="number" name="${escapeAttr(name)}"${descAttr}${reqAttr}${min}${max}></label>`;
135
+ }
136
+ // String with format
137
+ const inputType = formatToInputType(prop.format);
138
+ return ` <label>${escapeHTML(description || name)} <input type="${inputType}" name="${escapeAttr(name)}"${descAttr}${reqAttr}></label>`;
139
+ }
140
+ /**
141
+ * Map JSON Schema format to HTML input type
142
+ */
143
+ function formatToInputType(format) {
144
+ if (!format)
145
+ return 'text';
146
+ const map = {
147
+ email: 'email',
148
+ uri: 'url',
149
+ date: 'date',
150
+ 'date-time': 'datetime-local',
151
+ time: 'time',
152
+ };
153
+ return map[format] ?? 'text';
154
+ }
155
+ /**
156
+ * Format a ToolInputSchema as a pretty-printed JS object literal
157
+ */
158
+ function formatSchemaForJS(schema, baseIndent) {
159
+ const indent = ' '.repeat(baseIndent);
160
+ return JSON.stringify(schema, null, 2)
161
+ .split('\n')
162
+ .map((line, i) => (i === 0 ? line : indent + line))
163
+ .join('\n');
164
+ }
165
+ /**
166
+ * Build an annotations object literal string for JS output
167
+ */
168
+ function buildAnnotationsBlock(tool) {
169
+ const a = tool.annotations;
170
+ const entries = [];
171
+ if (a.readOnlyHint)
172
+ entries.push('readOnlyHint: true');
173
+ if (a.destructiveHint)
174
+ entries.push('destructiveHint: true');
175
+ if (a.requiresConfirmation)
176
+ entries.push('requiresConfirmation: true');
177
+ if (entries.length === 0)
178
+ return null;
179
+ return `{ ${entries.join(', ')} }`;
180
+ }
181
+ /**
182
+ * Escape a string for use in an HTML attribute
183
+ */
184
+ function escapeAttr(str) {
185
+ return str
186
+ .replace(/&/g, '&amp;')
187
+ .replace(/"/g, '&quot;')
188
+ .replace(/</g, '&lt;')
189
+ .replace(/>/g, '&gt;');
190
+ }
191
+ /**
192
+ * Escape a string for use in HTML text content
193
+ */
194
+ function escapeHTML(str) {
195
+ return str
196
+ .replace(/&/g, '&amp;')
197
+ .replace(/</g, '&lt;')
198
+ .replace(/>/g, '&gt;')
199
+ .replace(/"/g, '&quot;');
200
+ }
201
+ //# sourceMappingURL=tool-code-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-code-generator.js","sourceRoot":"","sources":["../../src/generators/tool-code-generator.ts"],"names":[],"mappings":"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"}