jialing-code 1.1.0

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 (460) hide show
  1. package/README.md +97 -0
  2. package/dist/chunk-065m026w.js +97 -0
  3. package/dist/chunk-06saje2v.js +39 -0
  4. package/dist/chunk-0731m51q.js +8 -0
  5. package/dist/chunk-0975ccyw.js +265 -0
  6. package/dist/chunk-09n3fjx5.js +67 -0
  7. package/dist/chunk-0bdjdzew.js +41 -0
  8. package/dist/chunk-0ce6kd7y.js +212 -0
  9. package/dist/chunk-0e1xsncc.js +969 -0
  10. package/dist/chunk-0m2861gw.js +154 -0
  11. package/dist/chunk-0paqc2yw.js +15 -0
  12. package/dist/chunk-0rg6yrhy.js +99 -0
  13. package/dist/chunk-0sakxrcf.js +643 -0
  14. package/dist/chunk-0v9hwxvz.js +105 -0
  15. package/dist/chunk-0vkfrmqm.js +690 -0
  16. package/dist/chunk-0vvfnhhv.js +248 -0
  17. package/dist/chunk-0w4rsycj.js +145 -0
  18. package/dist/chunk-0x9b2nmd.js +63 -0
  19. package/dist/chunk-0xjaqda8.js +1124 -0
  20. package/dist/chunk-1141xmr4.js +8 -0
  21. package/dist/chunk-13d1842d.js +154 -0
  22. package/dist/chunk-1921a6yb.js +32 -0
  23. package/dist/chunk-1ad8mk9g.js +527 -0
  24. package/dist/chunk-1ax41pws.js +28 -0
  25. package/dist/chunk-1c8z1b5v.js +16 -0
  26. package/dist/chunk-1cbn5kxf.js +7 -0
  27. package/dist/chunk-1eapde8a.js +726 -0
  28. package/dist/chunk-1h2famwb.js +49 -0
  29. package/dist/chunk-1jggnf7z.js +85 -0
  30. package/dist/chunk-1k92pn9c.js +32 -0
  31. package/dist/chunk-1qakq4sn.js +802 -0
  32. package/dist/chunk-1rvz0433.js +722 -0
  33. package/dist/chunk-1xkekb9y.js +19 -0
  34. package/dist/chunk-238g70xa.js +36 -0
  35. package/dist/chunk-24ge0eqa.js +106 -0
  36. package/dist/chunk-278vghwm.js +5395 -0
  37. package/dist/chunk-27xc1csx.js +104 -0
  38. package/dist/chunk-2a42s11t.js +412 -0
  39. package/dist/chunk-2aa02aw6.js +438 -0
  40. package/dist/chunk-2eykm0j0.js +20 -0
  41. package/dist/chunk-2gzv8nrw.js +205 -0
  42. package/dist/chunk-2k995y2x.js +880 -0
  43. package/dist/chunk-2nayx6q1.js +63 -0
  44. package/dist/chunk-2sd2w2h4.js +44 -0
  45. package/dist/chunk-2tw2ve8h.js +145 -0
  46. package/dist/chunk-30rst83v.js +168 -0
  47. package/dist/chunk-3aavh06g.js +1581 -0
  48. package/dist/chunk-3b0yvt2h.js +469 -0
  49. package/dist/chunk-3be7ka25.js +56 -0
  50. package/dist/chunk-3c25bcsw.js +17 -0
  51. package/dist/chunk-3dyxka97.js +584 -0
  52. package/dist/chunk-3f7rypmf.js +16544 -0
  53. package/dist/chunk-3fsd7f51.js +93 -0
  54. package/dist/chunk-3gqdqmzb.js +75 -0
  55. package/dist/chunk-3h8a89gy.js +46 -0
  56. package/dist/chunk-3m84sret.js +71 -0
  57. package/dist/chunk-3nb7j3js.js +96 -0
  58. package/dist/chunk-3p08nvn2.js +98 -0
  59. package/dist/chunk-3r09htpc.js +318 -0
  60. package/dist/chunk-3r24h7t6.js +113 -0
  61. package/dist/chunk-3rkfxjtq.js +80 -0
  62. package/dist/chunk-3tmk7dc2.js +604 -0
  63. package/dist/chunk-3w6s9m5w.js +16 -0
  64. package/dist/chunk-43qjymy5.js +92 -0
  65. package/dist/chunk-44fpr6jq.js +434 -0
  66. package/dist/chunk-45kxdsp8.js +444 -0
  67. package/dist/chunk-495d85x1.js +8066 -0
  68. package/dist/chunk-4ba796se.js +1095 -0
  69. package/dist/chunk-4g3v8y12.js +23 -0
  70. package/dist/chunk-4h53xj8n.js +3445 -0
  71. package/dist/chunk-4jm600zv.js +13 -0
  72. package/dist/chunk-4jy9dtwk.js +116 -0
  73. package/dist/chunk-4p60dd45.js +55 -0
  74. package/dist/chunk-4z0jsrqg.js +81 -0
  75. package/dist/chunk-4zfkzkt6.js +37 -0
  76. package/dist/chunk-55wgxwa9.js +13877 -0
  77. package/dist/chunk-5dbk24zg.js +890 -0
  78. package/dist/chunk-5hzvp4va.js +115 -0
  79. package/dist/chunk-5kbt1mbt.js +500 -0
  80. package/dist/chunk-5pen7vr8.js +176 -0
  81. package/dist/chunk-5r280eng.js +198 -0
  82. package/dist/chunk-5srym52s.js +88 -0
  83. package/dist/chunk-600kg7k6.js +41 -0
  84. package/dist/chunk-616w0qj3.js +160 -0
  85. package/dist/chunk-62jw1t8c.js +94 -0
  86. package/dist/chunk-62xmt9mk.js +372 -0
  87. package/dist/chunk-64bvg7c3.js +229 -0
  88. package/dist/chunk-65yhe4s0.js +281 -0
  89. package/dist/chunk-6aewh27m.js +102 -0
  90. package/dist/chunk-6bd8brc4.js +48 -0
  91. package/dist/chunk-6dj5t602.js +341 -0
  92. package/dist/chunk-6exxdk1p.js +6956 -0
  93. package/dist/chunk-6f5j8fs0.js +752 -0
  94. package/dist/chunk-6g62sjpf.js +328 -0
  95. package/dist/chunk-6gecq2ta.js +1493 -0
  96. package/dist/chunk-6gr3c3w9.js +378 -0
  97. package/dist/chunk-6kpbgc5w.js +23 -0
  98. package/dist/chunk-6kseqw79.js +154 -0
  99. package/dist/chunk-6mxm1qd0.js +40764 -0
  100. package/dist/chunk-6n2qgm9v.js +8 -0
  101. package/dist/chunk-6tq2v3rk.js +186 -0
  102. package/dist/chunk-6wsdhj3v.js +93 -0
  103. package/dist/chunk-6zw9fhgb.js +4389 -0
  104. package/dist/chunk-71grc1mw.js +111 -0
  105. package/dist/chunk-73rpbt04.js +1947 -0
  106. package/dist/chunk-748feghg.js +604 -0
  107. package/dist/chunk-75e8gtg9.js +84 -0
  108. package/dist/chunk-75th4717.js +780 -0
  109. package/dist/chunk-760252na.js +101 -0
  110. package/dist/chunk-7739pg2c.js +4261 -0
  111. package/dist/chunk-778fnx46.js +472 -0
  112. package/dist/chunk-77g09znh.js +391 -0
  113. package/dist/chunk-7aw745vx.js +40175 -0
  114. package/dist/chunk-7m2nd8da.js +110 -0
  115. package/dist/chunk-7n35vjtw.js +444 -0
  116. package/dist/chunk-7n5ss4sh.js +144 -0
  117. package/dist/chunk-7rjnxcfe.js +107 -0
  118. package/dist/chunk-7sb5axvf.js +122 -0
  119. package/dist/chunk-7wm5s02e.js +216 -0
  120. package/dist/chunk-7ymfj7m3.js +151 -0
  121. package/dist/chunk-7z8j9qfn.js +121 -0
  122. package/dist/chunk-7zsapntc.js +216 -0
  123. package/dist/chunk-805fhkfh.js +908 -0
  124. package/dist/chunk-80k1nj24.js +253 -0
  125. package/dist/chunk-83hfzbx3.js +10 -0
  126. package/dist/chunk-85cypsdd.js +92 -0
  127. package/dist/chunk-8760caxf.js +2644 -0
  128. package/dist/chunk-88f6egg6.js +387 -0
  129. package/dist/chunk-88r7kwgj.js +22 -0
  130. package/dist/chunk-89e1v45e.js +463 -0
  131. package/dist/chunk-8bedvdm1.js +32 -0
  132. package/dist/chunk-8c4x4vdz.js +177 -0
  133. package/dist/chunk-8hq5kk3y.js +44 -0
  134. package/dist/chunk-8ngxagxq.js +18 -0
  135. package/dist/chunk-8tnsngw2.js +31 -0
  136. package/dist/chunk-8wjnca8h.js +307 -0
  137. package/dist/chunk-8y12jxg8.js +10 -0
  138. package/dist/chunk-8ymf4e6z.js +48 -0
  139. package/dist/chunk-90wp6wez.js +10510 -0
  140. package/dist/chunk-92bp5bnf.js +650 -0
  141. package/dist/chunk-92q8sx5z.js +90 -0
  142. package/dist/chunk-958rtmtx.js +10476 -0
  143. package/dist/chunk-9e2kqv5g.js +125 -0
  144. package/dist/chunk-9f4f1hy5.js +281 -0
  145. package/dist/chunk-9gbamk79.js +93 -0
  146. package/dist/chunk-9k5s3ryh.js +167 -0
  147. package/dist/chunk-9xzfqm15.js +97 -0
  148. package/dist/chunk-9zgdvbm6.js +110 -0
  149. package/dist/chunk-a0p3q8jw.js +24 -0
  150. package/dist/chunk-a22sayzp.js +220 -0
  151. package/dist/chunk-a8ejc632.js +3094 -0
  152. package/dist/chunk-a8gj9d9z.js +120 -0
  153. package/dist/chunk-a9vdeb6y.js +258 -0
  154. package/dist/chunk-a9yev47v.js +674 -0
  155. package/dist/chunk-a9zh40sj.js +48 -0
  156. package/dist/chunk-ack5mfba.js +105 -0
  157. package/dist/chunk-ae76ded0.js +30 -0
  158. package/dist/chunk-akjw4dh6.js +538 -0
  159. package/dist/chunk-asc6wz4q.js +1188 -0
  160. package/dist/chunk-atqejh3p.js +273 -0
  161. package/dist/chunk-atv2e6b7.js +61 -0
  162. package/dist/chunk-axvvkwz8.js +1551 -0
  163. package/dist/chunk-azgz7kj9.js +38 -0
  164. package/dist/chunk-b3zave8q.js +275 -0
  165. package/dist/chunk-b4wg70y1.js +54 -0
  166. package/dist/chunk-b8b13qn2.js +100 -0
  167. package/dist/chunk-bg3mt9bm.js +28 -0
  168. package/dist/chunk-bh4jvcjn.js +91 -0
  169. package/dist/chunk-bhdt6k7w.js +15 -0
  170. package/dist/chunk-bm1qb16p.js +17 -0
  171. package/dist/chunk-bpvsd1j1.js +266 -0
  172. package/dist/chunk-bqfnp99q.js +477 -0
  173. package/dist/chunk-bsbmmfyt.js +17 -0
  174. package/dist/chunk-bsbt34jm.js +42 -0
  175. package/dist/chunk-c78akdhr.js +458 -0
  176. package/dist/chunk-cdz5yb0r.js +57 -0
  177. package/dist/chunk-cfv996bs.js +22 -0
  178. package/dist/chunk-cgfdkzhb.js +12 -0
  179. package/dist/chunk-ckh4r5er.js +257 -0
  180. package/dist/chunk-cmgjnvn9.js +89 -0
  181. package/dist/chunk-cpjgvay8.js +687 -0
  182. package/dist/chunk-crfryjx9.js +276 -0
  183. package/dist/chunk-ctw5jwcd.js +213 -0
  184. package/dist/chunk-cvy3vntc.js +65 -0
  185. package/dist/chunk-cwbzz504.js +94 -0
  186. package/dist/chunk-cy2hswr1.js +15 -0
  187. package/dist/chunk-cyejkay3.js +222 -0
  188. package/dist/chunk-d18z9pna.js +106 -0
  189. package/dist/chunk-d5cq0n0v.js +162 -0
  190. package/dist/chunk-db45aryp.js +50 -0
  191. package/dist/chunk-de8nqh0z.js +790 -0
  192. package/dist/chunk-dfw6h350.js +2336 -0
  193. package/dist/chunk-dgqrcy74.js +48 -0
  194. package/dist/chunk-dn75ptgd.js +184 -0
  195. package/dist/chunk-dnh7jtpb.js +37 -0
  196. package/dist/chunk-dpshyv9m.js +90 -0
  197. package/dist/chunk-dt8cdvnm.js +642 -0
  198. package/dist/chunk-dtxby6fr.js +306 -0
  199. package/dist/chunk-dv1wfr85.js +6373 -0
  200. package/dist/chunk-dw363edx.js +1154 -0
  201. package/dist/chunk-dwrdacck.js +62 -0
  202. package/dist/chunk-dxnnv5e3.js +276 -0
  203. package/dist/chunk-e3g8q4cn.js +1646 -0
  204. package/dist/chunk-e3m9k9s2.js +542 -0
  205. package/dist/chunk-e4q49asn.js +155 -0
  206. package/dist/chunk-e5pntxye.js +37 -0
  207. package/dist/chunk-e7393td6.js +42 -0
  208. package/dist/chunk-ead42yrh.js +87 -0
  209. package/dist/chunk-eb90vwvr.js +152 -0
  210. package/dist/chunk-ecvwk9hg.js +250 -0
  211. package/dist/chunk-edjd6aay.js +173 -0
  212. package/dist/chunk-eg0h8mtm.js +130 -0
  213. package/dist/chunk-ehtwnxpg.js +1591 -0
  214. package/dist/chunk-ek686gx1.js +94 -0
  215. package/dist/chunk-eqp1rfft.js +17 -0
  216. package/dist/chunk-evhwt0ar.js +1015 -0
  217. package/dist/chunk-ewadzrm8.js +103 -0
  218. package/dist/chunk-ewsgsw9h.js +172291 -0
  219. package/dist/chunk-f0pa0r7e.js +3198 -0
  220. package/dist/chunk-f2mhrmww.js +62 -0
  221. package/dist/chunk-f39zxvwn.js +401 -0
  222. package/dist/chunk-f46z54tq.js +374 -0
  223. package/dist/chunk-f5ma3nh5.js +3436 -0
  224. package/dist/chunk-f60q23az.js +3038 -0
  225. package/dist/chunk-f6v2nz57.js +107 -0
  226. package/dist/chunk-f6yjan38.js +38 -0
  227. package/dist/chunk-fbv4apne.js +51 -0
  228. package/dist/chunk-fem4s778.js +70 -0
  229. package/dist/chunk-fezm1kn8.js +376 -0
  230. package/dist/chunk-fm1n3ysp.js +6108 -0
  231. package/dist/chunk-frg83bfw.js +225 -0
  232. package/dist/chunk-fscm8db0.js +692 -0
  233. package/dist/chunk-fyc5fepv.js +10 -0
  234. package/dist/chunk-g0j0t6qk.js +26 -0
  235. package/dist/chunk-g0nc1ftf.js +849 -0
  236. package/dist/chunk-g338npwr.js +1061 -0
  237. package/dist/chunk-g3t0act8.js +8 -0
  238. package/dist/chunk-g75w4hw3.js +26 -0
  239. package/dist/chunk-g8vp82en.js +1866 -0
  240. package/dist/chunk-gax0fcbx.js +182 -0
  241. package/dist/chunk-gsz4dh3y.js +606 -0
  242. package/dist/chunk-gtfffm7h.js +440 -0
  243. package/dist/chunk-gver9zb9.js +420 -0
  244. package/dist/chunk-gyj242zr.js +20 -0
  245. package/dist/chunk-h0qngp9w.js +157 -0
  246. package/dist/chunk-h14kemnk.js +123 -0
  247. package/dist/chunk-h8wj1a74.js +8960 -0
  248. package/dist/chunk-h9mcb2eg.js +87 -0
  249. package/dist/chunk-h9nh2980.js +91 -0
  250. package/dist/chunk-hakdhagh.js +16606 -0
  251. package/dist/chunk-hbc6ymdv.js +55 -0
  252. package/dist/chunk-hh7cmy4k.js +20 -0
  253. package/dist/chunk-hjhc4cpt.js +69 -0
  254. package/dist/chunk-hjwez8qc.js +5018 -0
  255. package/dist/chunk-hk9xz7gk.js +118 -0
  256. package/dist/chunk-hqmz36b3.js +552 -0
  257. package/dist/chunk-hrzerbfw.js +1299 -0
  258. package/dist/chunk-hs8ph4p8.js +8 -0
  259. package/dist/chunk-ht1xwrnd.js +716 -0
  260. package/dist/chunk-hvmfg2dc.js +338 -0
  261. package/dist/chunk-hx2tr4ep.js +7189 -0
  262. package/dist/chunk-hzhe8ygc.js +547 -0
  263. package/dist/chunk-j2k4p94p.js +55 -0
  264. package/dist/chunk-j3a4p81y.js +184 -0
  265. package/dist/chunk-j49g6g3s.js +57 -0
  266. package/dist/chunk-j5d5hp9h.js +71 -0
  267. package/dist/chunk-j64ga6ta.js +8035 -0
  268. package/dist/chunk-j7tyxan1.js +116 -0
  269. package/dist/chunk-j8v4774z.js +424 -0
  270. package/dist/chunk-jafes477.js +29 -0
  271. package/dist/chunk-jd32zbps.js +15 -0
  272. package/dist/chunk-jdgeec04.js +4249 -0
  273. package/dist/chunk-jftd4jq5.js +4521 -0
  274. package/dist/chunk-jkxqhv6y.js +812 -0
  275. package/dist/chunk-jmfr6h0n.js +120 -0
  276. package/dist/chunk-jn4aabmx.js +40 -0
  277. package/dist/chunk-jnhkref0.js +30 -0
  278. package/dist/chunk-jsbpm1gz.js +27 -0
  279. package/dist/chunk-jtcyjc3k.js +5802 -0
  280. package/dist/chunk-jx817w05.js +11 -0
  281. package/dist/chunk-jzmz18nn.js +65 -0
  282. package/dist/chunk-k0p9w03v.js +4957 -0
  283. package/dist/chunk-k3dcdnck.js +89 -0
  284. package/dist/chunk-k3wadzcd.js +88 -0
  285. package/dist/chunk-kaeshsk1.js +713 -0
  286. package/dist/chunk-kbkey9ed.js +522 -0
  287. package/dist/chunk-kcwfhqbb.js +196 -0
  288. package/dist/chunk-key6jr7p.js +224 -0
  289. package/dist/chunk-knay8cy9.js +173 -0
  290. package/dist/chunk-kr3rg2y1.js +95 -0
  291. package/dist/chunk-kwekc97v.js +18 -0
  292. package/dist/chunk-m06q12hg.js +61 -0
  293. package/dist/chunk-m2mcpbhk.js +43 -0
  294. package/dist/chunk-m8v220gz.js +71 -0
  295. package/dist/chunk-mgpqy78h.js +208 -0
  296. package/dist/chunk-mkejwh4t.js +16 -0
  297. package/dist/chunk-mptyw5n1.js +107 -0
  298. package/dist/chunk-mqajm0dp.js +66 -0
  299. package/dist/chunk-mrksbgxj.js +490 -0
  300. package/dist/chunk-msjfc5ba.js +246 -0
  301. package/dist/chunk-mt25echc.js +6157 -0
  302. package/dist/chunk-mt3jfnr8.js +277 -0
  303. package/dist/chunk-mtn242d4.js +9300 -0
  304. package/dist/chunk-mzfkvave.js +169 -0
  305. package/dist/chunk-n0qaeaa5.js +256 -0
  306. package/dist/chunk-n1erf6kh.js +22820 -0
  307. package/dist/chunk-n2avk1r2.js +61 -0
  308. package/dist/chunk-n6atnpcq.js +765 -0
  309. package/dist/chunk-n7ttdtk0.js +641 -0
  310. package/dist/chunk-ncnfzby5.js +822 -0
  311. package/dist/chunk-ncnr1jtf.js +2058 -0
  312. package/dist/chunk-nerv0jvx.js +74 -0
  313. package/dist/chunk-ngd2abep.js +90 -0
  314. package/dist/chunk-nka1g8f4.js +773 -0
  315. package/dist/chunk-nnaxkc2z.js +128 -0
  316. package/dist/chunk-npyrtj8j.js +691 -0
  317. package/dist/chunk-nq0fxyxh.js +752 -0
  318. package/dist/chunk-nrmffak7.js +114 -0
  319. package/dist/chunk-nsz546wq.js +1170 -0
  320. package/dist/chunk-nt837qt9.js +21 -0
  321. package/dist/chunk-nv64x1z5.js +86 -0
  322. package/dist/chunk-nxsh6de2.js +1711 -0
  323. package/dist/chunk-nz4getcr.js +40 -0
  324. package/dist/chunk-p1f607pa.js +83 -0
  325. package/dist/chunk-p2816w9z.js +1486 -0
  326. package/dist/chunk-p2d5nh3g.js +342 -0
  327. package/dist/chunk-p4r5y02t.js +90 -0
  328. package/dist/chunk-p7g7pf3f.js +336 -0
  329. package/dist/chunk-pb4ad8r2.js +110 -0
  330. package/dist/chunk-pbrhz0zr.js +716 -0
  331. package/dist/chunk-ps49ymvj.js +43 -0
  332. package/dist/chunk-pwnt3veb.js +103 -0
  333. package/dist/chunk-pwwa7s62.js +11 -0
  334. package/dist/chunk-px3w0kde.js +299 -0
  335. package/dist/chunk-pzn777jb.js +756 -0
  336. package/dist/chunk-q25bjaev.js +15 -0
  337. package/dist/chunk-q5by3da6.js +8 -0
  338. package/dist/chunk-q6av622g.js +38 -0
  339. package/dist/chunk-q6xkvtf2.js +1318 -0
  340. package/dist/chunk-q81jx1tq.js +476 -0
  341. package/dist/chunk-qehb6fk5.js +339 -0
  342. package/dist/chunk-qj1avx1q.js +87 -0
  343. package/dist/chunk-qn2dxr66.js +105 -0
  344. package/dist/chunk-qnfx3qtx.js +617 -0
  345. package/dist/chunk-qp18kd4h.js +48 -0
  346. package/dist/chunk-qp2qdcda.js +100 -0
  347. package/dist/chunk-qpjy9tcf.js +133 -0
  348. package/dist/chunk-qqfa0dqg.js +2343 -0
  349. package/dist/chunk-qwh3htcz.js +202 -0
  350. package/dist/chunk-qz2x630m.js +49145 -0
  351. package/dist/chunk-r3vakcs1.js +496 -0
  352. package/dist/chunk-r66hz8j6.js +34 -0
  353. package/dist/chunk-r6b58y3x.js +17 -0
  354. package/dist/chunk-rekp48rk.js +62 -0
  355. package/dist/chunk-rn0v1hk8.js +34 -0
  356. package/dist/chunk-rs1xrs6m.js +534 -0
  357. package/dist/chunk-rs45skes.js +123 -0
  358. package/dist/chunk-rzszqp82.js +524 -0
  359. package/dist/chunk-s274nv8k.js +8 -0
  360. package/dist/chunk-s3pzvdss.js +50 -0
  361. package/dist/chunk-s9mesaw0.js +26840 -0
  362. package/dist/chunk-sd36yzx8.js +954 -0
  363. package/dist/chunk-sdj9b9wh.js +782 -0
  364. package/dist/chunk-sdw2q69p.js +227 -0
  365. package/dist/chunk-sfgp9cc0.js +130 -0
  366. package/dist/chunk-spqaamnc.js +63 -0
  367. package/dist/chunk-spzrs4df.js +73 -0
  368. package/dist/chunk-sxkr7k43.js +55 -0
  369. package/dist/chunk-szj5wvdy.js +28 -0
  370. package/dist/chunk-t0rgmccj.js +39 -0
  371. package/dist/chunk-t1nnzjgg.js +17 -0
  372. package/dist/chunk-t94fcnt8.js +566 -0
  373. package/dist/chunk-tjaqa99q.js +125 -0
  374. package/dist/chunk-tjq2evtw.js +328 -0
  375. package/dist/chunk-ts2p6bv1.js +224 -0
  376. package/dist/chunk-ttk5dzz8.js +25 -0
  377. package/dist/chunk-tw0q7ynt.js +59 -0
  378. package/dist/chunk-v02jkvgy.js +131 -0
  379. package/dist/chunk-v084bqt3.js +1529 -0
  380. package/dist/chunk-v0amythm.js +164 -0
  381. package/dist/chunk-v1kzp02e.js +785 -0
  382. package/dist/chunk-v1mgv1et.js +15 -0
  383. package/dist/chunk-v399mzxk.js +58 -0
  384. package/dist/chunk-v3gm2day.js +8 -0
  385. package/dist/chunk-v43hrrxp.js +71 -0
  386. package/dist/chunk-v6aqb2aj.js +102 -0
  387. package/dist/chunk-v78fj8by.js +145 -0
  388. package/dist/chunk-v7qmhjdn.js +1921 -0
  389. package/dist/chunk-v9smspw2.js +4301 -0
  390. package/dist/chunk-vdw93s4h.js +2431 -0
  391. package/dist/chunk-vest0y6x.js +3830 -0
  392. package/dist/chunk-vf5sd1nq.js +12 -0
  393. package/dist/chunk-vratq94g.js +349 -0
  394. package/dist/chunk-vrz7t3m3.js +20 -0
  395. package/dist/chunk-vtb185z9.js +70 -0
  396. package/dist/chunk-vx01rvg8.js +654 -0
  397. package/dist/chunk-vyc0rjyx.js +31 -0
  398. package/dist/chunk-vyjeh50y.js +2149 -0
  399. package/dist/chunk-vzpffsza.js +269 -0
  400. package/dist/chunk-w2ef3kxk.js +3353 -0
  401. package/dist/chunk-w2z5pqd3.js +336 -0
  402. package/dist/chunk-w3whm4mn.js +432 -0
  403. package/dist/chunk-w7wgpqcp.js +157 -0
  404. package/dist/chunk-waa00cvb.js +301 -0
  405. package/dist/chunk-wb0qm4es.js +155 -0
  406. package/dist/chunk-wbkahkdc.js +27 -0
  407. package/dist/chunk-wfz0qffj.js +3939 -0
  408. package/dist/chunk-wn0cx0pt.js +283 -0
  409. package/dist/chunk-wv6gzt9c.js +726 -0
  410. package/dist/chunk-wx42ycm4.js +998 -0
  411. package/dist/chunk-wxkpgy05.js +268 -0
  412. package/dist/chunk-wzpdet3m.js +843 -0
  413. package/dist/chunk-x0mwzt38.js +714 -0
  414. package/dist/chunk-x592wbfh.js +244 -0
  415. package/dist/chunk-x5pqsp9r.js +100 -0
  416. package/dist/chunk-x679thag.js +825 -0
  417. package/dist/chunk-x8b7vft8.js +132 -0
  418. package/dist/chunk-x8cftch7.js +119 -0
  419. package/dist/chunk-x9q7r885.js +348 -0
  420. package/dist/chunk-xawkt0vb.js +1585 -0
  421. package/dist/chunk-xdw5dv00.js +8 -0
  422. package/dist/chunk-xe9cc860.js +287 -0
  423. package/dist/chunk-xjr9c3vt.js +101 -0
  424. package/dist/chunk-xk7zaqta.js +21933 -0
  425. package/dist/chunk-xktbmawc.js +678 -0
  426. package/dist/chunk-xn6yw46v.js +140 -0
  427. package/dist/chunk-xsq9ae7x.js +90 -0
  428. package/dist/chunk-xszk7n10.js +14358 -0
  429. package/dist/chunk-xt8a5r1t.js +84 -0
  430. package/dist/chunk-xydyndkv.js +195 -0
  431. package/dist/chunk-xzt10yc5.js +60 -0
  432. package/dist/chunk-y04y95dr.js +91 -0
  433. package/dist/chunk-y1784krc.js +19 -0
  434. package/dist/chunk-y1x32h3x.js +128 -0
  435. package/dist/chunk-y3s7aww5.js +99 -0
  436. package/dist/chunk-y47cg3kz.js +42 -0
  437. package/dist/chunk-y7kzvepn.js +469 -0
  438. package/dist/chunk-y89kbsyc.js +287 -0
  439. package/dist/chunk-yd87p1c3.js +159 -0
  440. package/dist/chunk-yf3yw8fw.js +105 -0
  441. package/dist/chunk-ygbf0ezx.js +1391 -0
  442. package/dist/chunk-yjbxnshv.js +208 -0
  443. package/dist/chunk-ynednmqd.js +192 -0
  444. package/dist/chunk-yvhez44y.js +259 -0
  445. package/dist/chunk-ywxd4qw4.js +22 -0
  446. package/dist/chunk-yzrmgpy4.js +117 -0
  447. package/dist/chunk-z0b2vb24.js +862 -0
  448. package/dist/chunk-z1zj044v.js +655 -0
  449. package/dist/chunk-z2dp53wn.js +17 -0
  450. package/dist/chunk-z3w0xasa.js +165 -0
  451. package/dist/chunk-z7ycmrb3.js +644 -0
  452. package/dist/chunk-zh11tdkb.js +347 -0
  453. package/dist/chunk-zk2wsm7d.js +15 -0
  454. package/dist/chunk-zqfqcf22.js +229 -0
  455. package/dist/chunk-zqk2j8px.js +699 -0
  456. package/dist/chunk-zqvsc10j.js +2833 -0
  457. package/dist/chunk-zsfxha74.js +17655 -0
  458. package/dist/chunk-zvc4snyb.js +117 -0
  459. package/dist/cli.js +194 -0
  460. package/package.json +173 -0
@@ -0,0 +1,849 @@
1
+ // @bun
2
+ import {
3
+ FRONTMATTER_REGEX,
4
+ classifyFetchError,
5
+ getPluginsDirectory,
6
+ init_fetchTelemetry,
7
+ init_frontmatterParser,
8
+ init_pluginDirectories,
9
+ init_yaml,
10
+ logPluginFetch,
11
+ parseYaml
12
+ } from "./chunk-ewsgsw9h.js";
13
+ import {
14
+ PluginHooksSchema,
15
+ PluginManifestSchema,
16
+ PluginMarketplaceEntrySchema,
17
+ PluginMarketplaceSchema,
18
+ init_schemas
19
+ } from "./chunk-3f7rypmf.js";
20
+ import {
21
+ init_v4
22
+ } from "./chunk-g0j0t6qk.js";
23
+ import {
24
+ exports_external
25
+ } from "./chunk-55wgxwa9.js";
26
+ import {
27
+ init_log,
28
+ logError
29
+ } from "./chunk-p7g7pf3f.js";
30
+ import {
31
+ errorMessage,
32
+ getErrnoCode,
33
+ getFsImplementation,
34
+ init_debug,
35
+ init_errors,
36
+ init_fsOperations,
37
+ init_slowOperations,
38
+ isENOENT,
39
+ jsonParse,
40
+ jsonStringify,
41
+ logForDebugging
42
+ } from "./chunk-nxsh6de2.js";
43
+ import {
44
+ axios_default,
45
+ init_axios
46
+ } from "./chunk-xszk7n10.js";
47
+ import {
48
+ __esm
49
+ } from "./chunk-qp2qdcda.js";
50
+
51
+ // src/utils/plugins/parseMarketplaceInput.ts
52
+ import { homedir } from "os";
53
+ import { resolve } from "path";
54
+ async function parseMarketplaceInput(input) {
55
+ const trimmed = input.trim();
56
+ const fs = getFsImplementation();
57
+ const sshMatch = trimmed.match(/^([a-zA-Z0-9._-]+@[^:]+:.+?(?:\.git)?)(#(.+))?$/);
58
+ if (sshMatch?.[1]) {
59
+ const url = sshMatch[1];
60
+ const ref = sshMatch[3];
61
+ return ref ? { source: "git", url, ref } : { source: "git", url };
62
+ }
63
+ if (trimmed.startsWith("http://") || trimmed.startsWith("https://")) {
64
+ const fragmentMatch = trimmed.match(/^([^#]+)(#(.+))?$/);
65
+ const urlWithoutFragment = fragmentMatch?.[1] || trimmed;
66
+ const ref = fragmentMatch?.[3];
67
+ if (urlWithoutFragment.endsWith(".git") || urlWithoutFragment.includes("/_git/")) {
68
+ return ref ? { source: "git", url: urlWithoutFragment, ref } : { source: "git", url: urlWithoutFragment };
69
+ }
70
+ let url;
71
+ try {
72
+ url = new URL(urlWithoutFragment);
73
+ } catch (_err) {
74
+ return { source: "url", url: urlWithoutFragment };
75
+ }
76
+ if (url.hostname === "github.com" || url.hostname === "www.github.com") {
77
+ const match = url.pathname.match(/^\/([^/]+\/[^/]+?)(\/|\.git|$)/);
78
+ if (match?.[1]) {
79
+ const gitUrl = urlWithoutFragment.endsWith(".git") ? urlWithoutFragment : `${urlWithoutFragment}.git`;
80
+ return ref ? { source: "git", url: gitUrl, ref } : { source: "git", url: gitUrl };
81
+ }
82
+ }
83
+ return { source: "url", url: urlWithoutFragment };
84
+ }
85
+ const isWindows = process.platform === "win32";
86
+ const isWindowsPath = isWindows && (trimmed.startsWith(".\\") || trimmed.startsWith("..\\") || /^[a-zA-Z]:[/\\]/.test(trimmed));
87
+ if (trimmed.startsWith("./") || trimmed.startsWith("../") || trimmed.startsWith("/") || trimmed.startsWith("~") || isWindowsPath) {
88
+ const resolvedPath = resolve(trimmed.startsWith("~") ? trimmed.replace(/^~/, homedir()) : trimmed);
89
+ let stats;
90
+ try {
91
+ stats = await fs.stat(resolvedPath);
92
+ } catch (e) {
93
+ const code = getErrnoCode(e);
94
+ return {
95
+ error: code === "ENOENT" ? `Path does not exist: ${resolvedPath}` : `Cannot access path: ${resolvedPath} (${code ?? e})`
96
+ };
97
+ }
98
+ if (stats.isFile()) {
99
+ if (resolvedPath.endsWith(".json")) {
100
+ return { source: "file", path: resolvedPath };
101
+ } else {
102
+ return {
103
+ error: `File path must point to a .json file (marketplace.json), but got: ${resolvedPath}`
104
+ };
105
+ }
106
+ } else if (stats.isDirectory()) {
107
+ return { source: "directory", path: resolvedPath };
108
+ } else {
109
+ return {
110
+ error: `Path is neither a file nor a directory: ${resolvedPath}`
111
+ };
112
+ }
113
+ }
114
+ if (trimmed.includes("/") && !trimmed.startsWith("@")) {
115
+ if (trimmed.includes(":")) {
116
+ return null;
117
+ }
118
+ const fragmentMatch = trimmed.match(/^([^#@]+)(?:[#@](.+))?$/);
119
+ const repo = fragmentMatch?.[1] || trimmed;
120
+ const ref = fragmentMatch?.[2];
121
+ return ref ? { source: "github", repo, ref } : { source: "github", repo };
122
+ }
123
+ return null;
124
+ }
125
+ var init_parseMarketplaceInput = __esm(() => {
126
+ init_errors();
127
+ init_fsOperations();
128
+ });
129
+
130
+ // src/utils/plugins/installCounts.ts
131
+ import { randomBytes } from "crypto";
132
+ import { readFile, rename, unlink, writeFile } from "fs/promises";
133
+ import { join } from "path";
134
+ function getInstallCountsCachePath() {
135
+ return join(getPluginsDirectory(), INSTALL_COUNTS_CACHE_FILENAME);
136
+ }
137
+ async function loadInstallCountsCache() {
138
+ const cachePath = getInstallCountsCachePath();
139
+ try {
140
+ const content = await readFile(cachePath, { encoding: "utf-8" });
141
+ const parsed = jsonParse(content);
142
+ if (typeof parsed !== "object" || parsed === null || !("version" in parsed) || !("fetchedAt" in parsed) || !("counts" in parsed)) {
143
+ logForDebugging("Install counts cache has invalid structure");
144
+ return null;
145
+ }
146
+ const cache = parsed;
147
+ if (cache.version !== INSTALL_COUNTS_CACHE_VERSION) {
148
+ logForDebugging(`Install counts cache version mismatch (got ${cache.version}, expected ${INSTALL_COUNTS_CACHE_VERSION})`);
149
+ return null;
150
+ }
151
+ if (typeof cache.fetchedAt !== "string" || !Array.isArray(cache.counts)) {
152
+ logForDebugging("Install counts cache has invalid structure");
153
+ return null;
154
+ }
155
+ const fetchedAt = new Date(cache.fetchedAt).getTime();
156
+ if (Number.isNaN(fetchedAt)) {
157
+ logForDebugging("Install counts cache has invalid fetchedAt timestamp");
158
+ return null;
159
+ }
160
+ const validCounts = cache.counts.every((entry) => typeof entry === "object" && entry !== null && typeof entry.plugin === "string" && typeof entry.unique_installs === "number");
161
+ if (!validCounts) {
162
+ logForDebugging("Install counts cache has malformed entries");
163
+ return null;
164
+ }
165
+ const now = Date.now();
166
+ if (now - fetchedAt > CACHE_TTL_MS) {
167
+ logForDebugging("Install counts cache is stale (>24h old)");
168
+ return null;
169
+ }
170
+ return {
171
+ version: cache.version,
172
+ fetchedAt: cache.fetchedAt,
173
+ counts: cache.counts
174
+ };
175
+ } catch (error) {
176
+ const code = getErrnoCode(error);
177
+ if (code !== "ENOENT") {
178
+ logForDebugging(`Failed to load install counts cache: ${errorMessage(error)}`);
179
+ }
180
+ return null;
181
+ }
182
+ }
183
+ async function saveInstallCountsCache(cache) {
184
+ const cachePath = getInstallCountsCachePath();
185
+ const tempPath = `${cachePath}.${randomBytes(8).toString("hex")}.tmp`;
186
+ try {
187
+ const pluginsDir = getPluginsDirectory();
188
+ await getFsImplementation().mkdir(pluginsDir);
189
+ const content = jsonStringify(cache, null, 2);
190
+ await writeFile(tempPath, content, {
191
+ encoding: "utf-8",
192
+ mode: 384
193
+ });
194
+ await rename(tempPath, cachePath);
195
+ logForDebugging("Install counts cache saved successfully");
196
+ } catch (error) {
197
+ logError(error);
198
+ try {
199
+ await unlink(tempPath);
200
+ } catch {}
201
+ }
202
+ }
203
+ async function fetchInstallCountsFromGitHub() {
204
+ logForDebugging(`Fetching install counts from ${INSTALL_COUNTS_URL}`);
205
+ const started = performance.now();
206
+ try {
207
+ const response = await axios_default.get(INSTALL_COUNTS_URL, {
208
+ timeout: 1e4
209
+ });
210
+ if (!response.data?.plugins || !Array.isArray(response.data.plugins)) {
211
+ throw new Error("Invalid response format from install counts API");
212
+ }
213
+ logPluginFetch("install_counts", INSTALL_COUNTS_URL, "success", performance.now() - started);
214
+ return response.data.plugins;
215
+ } catch (error) {
216
+ logPluginFetch("install_counts", INSTALL_COUNTS_URL, "failure", performance.now() - started, classifyFetchError(error));
217
+ throw error;
218
+ }
219
+ }
220
+ async function getInstallCounts() {
221
+ const cache = await loadInstallCountsCache();
222
+ if (cache) {
223
+ logForDebugging("Using cached install counts");
224
+ logPluginFetch("install_counts", INSTALL_COUNTS_URL, "cache_hit", 0);
225
+ const map = new Map;
226
+ for (const entry of cache.counts) {
227
+ map.set(entry.plugin, entry.unique_installs);
228
+ }
229
+ return map;
230
+ }
231
+ try {
232
+ const counts = await fetchInstallCountsFromGitHub();
233
+ const newCache = {
234
+ version: INSTALL_COUNTS_CACHE_VERSION,
235
+ fetchedAt: new Date().toISOString(),
236
+ counts
237
+ };
238
+ await saveInstallCountsCache(newCache);
239
+ const map = new Map;
240
+ for (const entry of counts) {
241
+ map.set(entry.plugin, entry.unique_installs);
242
+ }
243
+ return map;
244
+ } catch (error) {
245
+ logError(error);
246
+ logForDebugging(`Failed to fetch install counts: ${errorMessage(error)}`);
247
+ return null;
248
+ }
249
+ }
250
+ function formatInstallCount(count) {
251
+ if (count < 1000) {
252
+ return String(count);
253
+ }
254
+ if (count < 1e6) {
255
+ const k = count / 1000;
256
+ const formatted2 = k.toFixed(1);
257
+ return formatted2.endsWith(".0") ? `${formatted2.slice(0, -2)}K` : `${formatted2}K`;
258
+ }
259
+ const m = count / 1e6;
260
+ const formatted = m.toFixed(1);
261
+ return formatted.endsWith(".0") ? `${formatted.slice(0, -2)}M` : `${formatted}M`;
262
+ }
263
+ var INSTALL_COUNTS_CACHE_VERSION = 1, INSTALL_COUNTS_CACHE_FILENAME = "install-counts-cache.json", INSTALL_COUNTS_URL = "https://raw.githubusercontent.com/anthropics/claude-plugins-official/refs/heads/stats/stats/plugin-installs.json", CACHE_TTL_MS;
264
+ var init_installCounts = __esm(() => {
265
+ init_axios();
266
+ init_debug();
267
+ init_errors();
268
+ init_fsOperations();
269
+ init_log();
270
+ init_slowOperations();
271
+ init_fetchTelemetry();
272
+ init_pluginDirectories();
273
+ CACHE_TTL_MS = 24 * 60 * 60 * 1000;
274
+ });
275
+
276
+ // src/utils/plugins/validatePlugin.ts
277
+ import { readdir, readFile as readFile2, stat } from "fs/promises";
278
+ import * as path from "path";
279
+ function detectManifestType(filePath) {
280
+ const fileName = path.basename(filePath);
281
+ const dirName = path.basename(path.dirname(filePath));
282
+ if (fileName === "plugin.json")
283
+ return "plugin";
284
+ if (fileName === "marketplace.json")
285
+ return "marketplace";
286
+ if (dirName === ".claude-plugin") {
287
+ return "plugin";
288
+ }
289
+ return "unknown";
290
+ }
291
+ function formatZodErrors(zodError) {
292
+ return zodError.issues.map((error) => ({
293
+ path: error.path.join(".") || "root",
294
+ message: error.message,
295
+ code: error.code
296
+ }));
297
+ }
298
+ function checkPathTraversal(p, field, errors, hint) {
299
+ if (p.includes("..")) {
300
+ errors.push({
301
+ path: field,
302
+ message: hint ? `Path contains "..": ${p}. ${hint}` : `Path contains ".." which could be a path traversal attempt: ${p}`
303
+ });
304
+ }
305
+ }
306
+ function marketplaceSourceHint(p) {
307
+ const stripped = p.replace(/^(\.\.\/)+/, "");
308
+ const corrected = stripped !== p ? `./${stripped}` : "./plugins/my-plugin";
309
+ return "Plugin source paths are resolved relative to the marketplace root (the directory " + "containing .claude-plugin/), not relative to marketplace.json. " + `Use "${corrected}" instead of "${p}".`;
310
+ }
311
+ async function validatePluginManifest(filePath) {
312
+ const errors = [];
313
+ const warnings = [];
314
+ const absolutePath = path.resolve(filePath);
315
+ let content;
316
+ try {
317
+ content = await readFile2(absolutePath, { encoding: "utf-8" });
318
+ } catch (error) {
319
+ const code = getErrnoCode(error);
320
+ let message;
321
+ if (code === "ENOENT") {
322
+ message = `File not found: ${absolutePath}`;
323
+ } else if (code === "EISDIR") {
324
+ message = `Path is not a file: ${absolutePath}`;
325
+ } else {
326
+ message = `Failed to read file: ${errorMessage(error)}`;
327
+ }
328
+ return {
329
+ success: false,
330
+ errors: [{ path: "file", message, code }],
331
+ warnings: [],
332
+ filePath: absolutePath,
333
+ fileType: "plugin"
334
+ };
335
+ }
336
+ let parsed;
337
+ try {
338
+ parsed = jsonParse(content);
339
+ } catch (error) {
340
+ return {
341
+ success: false,
342
+ errors: [
343
+ {
344
+ path: "json",
345
+ message: `Invalid JSON syntax: ${errorMessage(error)}`
346
+ }
347
+ ],
348
+ warnings: [],
349
+ filePath: absolutePath,
350
+ fileType: "plugin"
351
+ };
352
+ }
353
+ if (parsed && typeof parsed === "object") {
354
+ const obj = parsed;
355
+ if (obj.commands) {
356
+ const commands = Array.isArray(obj.commands) ? obj.commands : [obj.commands];
357
+ commands.forEach((cmd, i) => {
358
+ if (typeof cmd === "string") {
359
+ checkPathTraversal(cmd, `commands[${i}]`, errors);
360
+ }
361
+ });
362
+ }
363
+ if (obj.agents) {
364
+ const agents = Array.isArray(obj.agents) ? obj.agents : [obj.agents];
365
+ agents.forEach((agent, i) => {
366
+ if (typeof agent === "string") {
367
+ checkPathTraversal(agent, `agents[${i}]`, errors);
368
+ }
369
+ });
370
+ }
371
+ if (obj.skills) {
372
+ const skills = Array.isArray(obj.skills) ? obj.skills : [obj.skills];
373
+ skills.forEach((skill, i) => {
374
+ if (typeof skill === "string") {
375
+ checkPathTraversal(skill, `skills[${i}]`, errors);
376
+ }
377
+ });
378
+ }
379
+ }
380
+ let toValidate = parsed;
381
+ if (typeof parsed === "object" && parsed !== null) {
382
+ const obj = parsed;
383
+ const strayKeys = Object.keys(obj).filter((k) => MARKETPLACE_ONLY_MANIFEST_FIELDS.has(k));
384
+ if (strayKeys.length > 0) {
385
+ const stripped = { ...obj };
386
+ for (const key of strayKeys) {
387
+ delete stripped[key];
388
+ warnings.push({
389
+ path: key,
390
+ message: `Field '${key}' belongs in the marketplace entry (marketplace.json), ` + `not plugin.json. It's harmless here but unused \u2014 Claude Code ` + `ignores it at load time.`
391
+ });
392
+ }
393
+ toValidate = stripped;
394
+ }
395
+ }
396
+ const result = PluginManifestSchema().strict().safeParse(toValidate);
397
+ if (!result.success) {
398
+ errors.push(...formatZodErrors(result.error));
399
+ }
400
+ if (result.success) {
401
+ const manifest = result.data;
402
+ if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(manifest.name)) {
403
+ warnings.push({
404
+ path: "name",
405
+ message: `Plugin name "${manifest.name}" is not kebab-case. Claude Code accepts ` + `it, but the Claude.ai marketplace sync requires kebab-case ` + `(lowercase letters, digits, and hyphens only, e.g., "my-plugin").`
406
+ });
407
+ }
408
+ if (!manifest.version) {
409
+ warnings.push({
410
+ path: "version",
411
+ message: 'No version specified. Consider adding a version following semver (e.g., "1.0.0")'
412
+ });
413
+ }
414
+ if (!manifest.description) {
415
+ warnings.push({
416
+ path: "description",
417
+ message: "No description provided. Adding a description helps users understand what your plugin does"
418
+ });
419
+ }
420
+ if (!manifest.author) {
421
+ warnings.push({
422
+ path: "author",
423
+ message: "No author information provided. Consider adding author details for plugin attribution"
424
+ });
425
+ }
426
+ }
427
+ return {
428
+ success: errors.length === 0,
429
+ errors,
430
+ warnings,
431
+ filePath: absolutePath,
432
+ fileType: "plugin"
433
+ };
434
+ }
435
+ async function validateMarketplaceManifest(filePath) {
436
+ const errors = [];
437
+ const warnings = [];
438
+ const absolutePath = path.resolve(filePath);
439
+ let content;
440
+ try {
441
+ content = await readFile2(absolutePath, { encoding: "utf-8" });
442
+ } catch (error) {
443
+ const code = getErrnoCode(error);
444
+ let message;
445
+ if (code === "ENOENT") {
446
+ message = `File not found: ${absolutePath}`;
447
+ } else if (code === "EISDIR") {
448
+ message = `Path is not a file: ${absolutePath}`;
449
+ } else {
450
+ message = `Failed to read file: ${errorMessage(error)}`;
451
+ }
452
+ return {
453
+ success: false,
454
+ errors: [{ path: "file", message, code }],
455
+ warnings: [],
456
+ filePath: absolutePath,
457
+ fileType: "marketplace"
458
+ };
459
+ }
460
+ let parsed;
461
+ try {
462
+ parsed = jsonParse(content);
463
+ } catch (error) {
464
+ return {
465
+ success: false,
466
+ errors: [
467
+ {
468
+ path: "json",
469
+ message: `Invalid JSON syntax: ${errorMessage(error)}`
470
+ }
471
+ ],
472
+ warnings: [],
473
+ filePath: absolutePath,
474
+ fileType: "marketplace"
475
+ };
476
+ }
477
+ if (parsed && typeof parsed === "object") {
478
+ const obj = parsed;
479
+ if (Array.isArray(obj.plugins)) {
480
+ obj.plugins.forEach((plugin, i) => {
481
+ if (plugin && typeof plugin === "object" && "source" in plugin) {
482
+ const source = plugin.source;
483
+ if (typeof source === "string") {
484
+ checkPathTraversal(source, `plugins[${i}].source`, errors, marketplaceSourceHint(source));
485
+ }
486
+ if (source && typeof source === "object" && "path" in source && typeof source.path === "string") {
487
+ checkPathTraversal(source.path, `plugins[${i}].source.path`, errors);
488
+ }
489
+ }
490
+ });
491
+ }
492
+ }
493
+ const strictMarketplaceSchema = PluginMarketplaceSchema().extend({
494
+ plugins: exports_external.array(PluginMarketplaceEntrySchema().strict())
495
+ }).strict();
496
+ const result = strictMarketplaceSchema.safeParse(parsed);
497
+ if (!result.success) {
498
+ errors.push(...formatZodErrors(result.error));
499
+ }
500
+ if (result.success) {
501
+ const marketplace = result.data;
502
+ if (!marketplace.plugins || marketplace.plugins.length === 0) {
503
+ warnings.push({
504
+ path: "plugins",
505
+ message: "Marketplace has no plugins defined"
506
+ });
507
+ }
508
+ if (marketplace.plugins) {
509
+ marketplace.plugins.forEach((plugin, i) => {
510
+ const duplicates = marketplace.plugins.filter((p) => p.name === plugin.name);
511
+ if (duplicates.length > 1) {
512
+ errors.push({
513
+ path: `plugins[${i}].name`,
514
+ message: `Duplicate plugin name "${plugin.name}" found in marketplace`
515
+ });
516
+ }
517
+ });
518
+ const manifestDir = path.dirname(absolutePath);
519
+ const marketplaceRoot = path.basename(manifestDir) === ".claude-plugin" ? path.dirname(manifestDir) : manifestDir;
520
+ for (const [i, entry] of marketplace.plugins.entries()) {
521
+ if (!entry.version || typeof entry.source !== "string" || !entry.source.startsWith("./")) {
522
+ continue;
523
+ }
524
+ const pluginJsonPath = path.join(marketplaceRoot, entry.source, ".claude-plugin", "plugin.json");
525
+ let manifestVersion;
526
+ try {
527
+ const raw = await readFile2(pluginJsonPath, { encoding: "utf-8" });
528
+ const parsed2 = jsonParse(raw);
529
+ if (typeof parsed2.version === "string") {
530
+ manifestVersion = parsed2.version;
531
+ }
532
+ } catch {
533
+ continue;
534
+ }
535
+ if (manifestVersion && manifestVersion !== entry.version) {
536
+ warnings.push({
537
+ path: `plugins[${i}].version`,
538
+ message: `Entry declares version "${entry.version}" but ${entry.source}/.claude-plugin/plugin.json says "${manifestVersion}". ` + `At install time, plugin.json wins (calculatePluginVersion precedence) \u2014 the entry version is silently ignored. ` + `Update this entry to "${manifestVersion}" to match.`
539
+ });
540
+ }
541
+ }
542
+ }
543
+ if (!marketplace.metadata?.description) {
544
+ warnings.push({
545
+ path: "metadata.description",
546
+ message: "No marketplace description provided. Adding a description helps users understand what this marketplace offers"
547
+ });
548
+ }
549
+ }
550
+ return {
551
+ success: errors.length === 0,
552
+ errors,
553
+ warnings,
554
+ filePath: absolutePath,
555
+ fileType: "marketplace"
556
+ };
557
+ }
558
+ function validateComponentFile(filePath, content, fileType) {
559
+ const errors = [];
560
+ const warnings = [];
561
+ const match = content.match(FRONTMATTER_REGEX);
562
+ if (!match) {
563
+ warnings.push({
564
+ path: "frontmatter",
565
+ message: "No frontmatter block found. Add YAML frontmatter between --- delimiters " + "at the top of the file to set description and other metadata."
566
+ });
567
+ return { success: true, errors, warnings, filePath, fileType };
568
+ }
569
+ const frontmatterText = match[1] || "";
570
+ let parsed;
571
+ try {
572
+ parsed = parseYaml(frontmatterText);
573
+ } catch (e) {
574
+ errors.push({
575
+ path: "frontmatter",
576
+ message: `YAML frontmatter failed to parse: ${errorMessage(e)}. ` + `At runtime this ${fileType} loads with empty metadata (all frontmatter ` + `fields silently dropped).`
577
+ });
578
+ return { success: false, errors, warnings, filePath, fileType };
579
+ }
580
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
581
+ errors.push({
582
+ path: "frontmatter",
583
+ message: "Frontmatter must be a YAML mapping (key: value pairs), got " + `${Array.isArray(parsed) ? "an array" : parsed === null ? "null" : typeof parsed}.`
584
+ });
585
+ return { success: false, errors, warnings, filePath, fileType };
586
+ }
587
+ const fm = parsed;
588
+ if (fm.description !== undefined) {
589
+ const d = fm.description;
590
+ if (typeof d !== "string" && typeof d !== "number" && typeof d !== "boolean" && d !== null) {
591
+ errors.push({
592
+ path: "description",
593
+ message: `description must be a string, got ${Array.isArray(d) ? "array" : typeof d}. ` + `At runtime this value is dropped.`
594
+ });
595
+ }
596
+ } else {
597
+ warnings.push({
598
+ path: "description",
599
+ message: `No description in frontmatter. A description helps users and Claude ` + `understand when to use this ${fileType}.`
600
+ });
601
+ }
602
+ if (fm.name !== undefined && fm.name !== null && typeof fm.name !== "string") {
603
+ errors.push({
604
+ path: "name",
605
+ message: `name must be a string, got ${typeof fm.name}.`
606
+ });
607
+ }
608
+ const at = fm["allowed-tools"];
609
+ if (at !== undefined && at !== null) {
610
+ if (typeof at !== "string" && !Array.isArray(at)) {
611
+ errors.push({
612
+ path: "allowed-tools",
613
+ message: `allowed-tools must be a string or array of strings, got ${typeof at}.`
614
+ });
615
+ } else if (Array.isArray(at) && at.some((t) => typeof t !== "string")) {
616
+ errors.push({
617
+ path: "allowed-tools",
618
+ message: "allowed-tools array must contain only strings."
619
+ });
620
+ }
621
+ }
622
+ const sh = fm.shell;
623
+ if (sh !== undefined && sh !== null) {
624
+ if (typeof sh !== "string") {
625
+ errors.push({
626
+ path: "shell",
627
+ message: `shell must be a string, got ${typeof sh}.`
628
+ });
629
+ } else {
630
+ const normalized = sh.trim().toLowerCase();
631
+ if (normalized !== "bash" && normalized !== "powershell") {
632
+ errors.push({
633
+ path: "shell",
634
+ message: `shell must be 'bash' or 'powershell', got '${sh}'.`
635
+ });
636
+ }
637
+ }
638
+ }
639
+ return { success: errors.length === 0, errors, warnings, filePath, fileType };
640
+ }
641
+ async function validateHooksJson(filePath) {
642
+ let content;
643
+ try {
644
+ content = await readFile2(filePath, { encoding: "utf-8" });
645
+ } catch (e) {
646
+ const code = getErrnoCode(e);
647
+ if (code === "ENOENT") {
648
+ return {
649
+ success: true,
650
+ errors: [],
651
+ warnings: [],
652
+ filePath,
653
+ fileType: "hooks"
654
+ };
655
+ }
656
+ return {
657
+ success: false,
658
+ errors: [
659
+ { path: "file", message: `Failed to read file: ${errorMessage(e)}` }
660
+ ],
661
+ warnings: [],
662
+ filePath,
663
+ fileType: "hooks"
664
+ };
665
+ }
666
+ let parsed;
667
+ try {
668
+ parsed = jsonParse(content);
669
+ } catch (e) {
670
+ return {
671
+ success: false,
672
+ errors: [
673
+ {
674
+ path: "json",
675
+ message: `Invalid JSON syntax: ${errorMessage(e)}. ` + `At runtime this breaks the entire plugin load.`
676
+ }
677
+ ],
678
+ warnings: [],
679
+ filePath,
680
+ fileType: "hooks"
681
+ };
682
+ }
683
+ const result = PluginHooksSchema().safeParse(parsed);
684
+ if (!result.success) {
685
+ return {
686
+ success: false,
687
+ errors: formatZodErrors(result.error),
688
+ warnings: [],
689
+ filePath,
690
+ fileType: "hooks"
691
+ };
692
+ }
693
+ return {
694
+ success: true,
695
+ errors: [],
696
+ warnings: [],
697
+ filePath,
698
+ fileType: "hooks"
699
+ };
700
+ }
701
+ async function collectMarkdown(dir, isSkillsDir) {
702
+ let entries;
703
+ try {
704
+ entries = await readdir(dir, { withFileTypes: true });
705
+ } catch (e) {
706
+ const code = getErrnoCode(e);
707
+ if (code === "ENOENT" || code === "ENOTDIR")
708
+ return [];
709
+ throw e;
710
+ }
711
+ if (isSkillsDir) {
712
+ return entries.filter((e) => e.isDirectory()).map((e) => path.join(dir, e.name, "SKILL.md"));
713
+ }
714
+ const out = [];
715
+ for (const entry of entries) {
716
+ const full = path.join(dir, entry.name);
717
+ if (entry.isDirectory()) {
718
+ out.push(...await collectMarkdown(full, false));
719
+ } else if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
720
+ out.push(full);
721
+ }
722
+ }
723
+ return out;
724
+ }
725
+ async function validatePluginContents(pluginDir) {
726
+ const results = [];
727
+ const dirs = [
728
+ ["skill", path.join(pluginDir, "skills")],
729
+ ["agent", path.join(pluginDir, "agents")],
730
+ ["command", path.join(pluginDir, "commands")]
731
+ ];
732
+ for (const [fileType, dir] of dirs) {
733
+ const files = await collectMarkdown(dir, fileType === "skill");
734
+ for (const filePath of files) {
735
+ let content;
736
+ try {
737
+ content = await readFile2(filePath, { encoding: "utf-8" });
738
+ } catch (e) {
739
+ if (isENOENT(e))
740
+ continue;
741
+ results.push({
742
+ success: false,
743
+ errors: [
744
+ { path: "file", message: `Failed to read: ${errorMessage(e)}` }
745
+ ],
746
+ warnings: [],
747
+ filePath,
748
+ fileType
749
+ });
750
+ continue;
751
+ }
752
+ const r = validateComponentFile(filePath, content, fileType);
753
+ if (r.errors.length > 0 || r.warnings.length > 0) {
754
+ results.push(r);
755
+ }
756
+ }
757
+ }
758
+ const hooksResult = await validateHooksJson(path.join(pluginDir, "hooks", "hooks.json"));
759
+ if (hooksResult.errors.length > 0 || hooksResult.warnings.length > 0) {
760
+ results.push(hooksResult);
761
+ }
762
+ return results;
763
+ }
764
+ async function validateManifest(filePath) {
765
+ const absolutePath = path.resolve(filePath);
766
+ let stats = null;
767
+ try {
768
+ stats = await stat(absolutePath);
769
+ } catch (e) {
770
+ if (!isENOENT(e)) {
771
+ throw e;
772
+ }
773
+ }
774
+ if (stats?.isDirectory()) {
775
+ const marketplacePath = path.join(absolutePath, ".claude-plugin", "marketplace.json");
776
+ const marketplaceResult = await validateMarketplaceManifest(marketplacePath);
777
+ if (marketplaceResult.errors[0]?.code !== "ENOENT") {
778
+ return marketplaceResult;
779
+ }
780
+ const pluginPath = path.join(absolutePath, ".claude-plugin", "plugin.json");
781
+ const pluginResult = await validatePluginManifest(pluginPath);
782
+ if (pluginResult.errors[0]?.code !== "ENOENT") {
783
+ return pluginResult;
784
+ }
785
+ return {
786
+ success: false,
787
+ errors: [
788
+ {
789
+ path: "directory",
790
+ message: `No manifest found in directory. Expected .claude-plugin/marketplace.json or .claude-plugin/plugin.json`
791
+ }
792
+ ],
793
+ warnings: [],
794
+ filePath: absolutePath,
795
+ fileType: "plugin"
796
+ };
797
+ }
798
+ const manifestType = detectManifestType(filePath);
799
+ switch (manifestType) {
800
+ case "plugin":
801
+ return validatePluginManifest(filePath);
802
+ case "marketplace":
803
+ return validateMarketplaceManifest(filePath);
804
+ case "unknown": {
805
+ try {
806
+ const content = await readFile2(absolutePath, { encoding: "utf-8" });
807
+ const parsed = jsonParse(content);
808
+ if (Array.isArray(parsed.plugins)) {
809
+ return validateMarketplaceManifest(filePath);
810
+ }
811
+ } catch (e) {
812
+ const code = getErrnoCode(e);
813
+ if (code === "ENOENT") {
814
+ return {
815
+ success: false,
816
+ errors: [
817
+ {
818
+ path: "file",
819
+ message: `File not found: ${absolutePath}`
820
+ }
821
+ ],
822
+ warnings: [],
823
+ filePath: absolutePath,
824
+ fileType: "plugin"
825
+ };
826
+ }
827
+ }
828
+ return validatePluginManifest(filePath);
829
+ }
830
+ }
831
+ }
832
+ var MARKETPLACE_ONLY_MANIFEST_FIELDS;
833
+ var init_validatePlugin = __esm(() => {
834
+ init_v4();
835
+ init_errors();
836
+ init_frontmatterParser();
837
+ init_slowOperations();
838
+ init_yaml();
839
+ init_schemas();
840
+ MARKETPLACE_ONLY_MANIFEST_FIELDS = new Set([
841
+ "category",
842
+ "source",
843
+ "tags",
844
+ "strict",
845
+ "id"
846
+ ]);
847
+ });
848
+
849
+ export { parseMarketplaceInput, init_parseMarketplaceInput, getInstallCounts, formatInstallCount, init_installCounts, validatePluginContents, validateManifest, init_validatePlugin };