@shareai-lab/kode 2.0.2 → 2.0.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 (343) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +649 -25
  3. package/README.zh-CN.md +579 -0
  4. package/cli-acp.js +3 -17
  5. package/cli.js +5 -7
  6. package/dist/chunks/Doctor-M3J7GRTJ.js +12 -0
  7. package/dist/chunks/LogList-ISWZ6DDD.js +121 -0
  8. package/dist/chunks/LogList-ISWZ6DDD.js.map +7 -0
  9. package/dist/chunks/REPL-RQ6LO6S7.js +56 -0
  10. package/dist/chunks/ResumeConversation-6DMVBEGH.js +56 -0
  11. package/dist/chunks/agentLoader-FCRG3TFJ.js +31 -0
  12. package/dist/{agentsValidate-XP3CFN6F.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
  13. package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
  14. package/dist/{ask-3G5H5KD5.js → chunks/ask-D7SOHJ6Z.js} +36 -44
  15. package/dist/chunks/ask-D7SOHJ6Z.js.map +7 -0
  16. package/dist/chunks/autoUpdater-CNESBOKO.js +19 -0
  17. package/dist/{chunk-EH34V7CY.js → chunks/chunk-2JN5MY67.js} +12 -14
  18. package/dist/chunks/chunk-2JN5MY67.js.map +7 -0
  19. package/dist/chunks/chunk-2QONJ5MG.js +14 -0
  20. package/dist/chunks/chunk-2QONJ5MG.js.map +7 -0
  21. package/dist/chunks/chunk-2WEXPKHH.js +903 -0
  22. package/dist/chunks/chunk-2WEXPKHH.js.map +7 -0
  23. package/dist/{chunk-K2MI4TPB.js → chunks/chunk-3BYE3ME6.js} +717 -792
  24. package/dist/chunks/chunk-3BYE3ME6.js.map +7 -0
  25. package/dist/chunks/chunk-3JDNWX7W.js +1264 -0
  26. package/dist/chunks/chunk-3JDNWX7W.js.map +7 -0
  27. package/dist/chunks/chunk-3OEJVB5A.js +906 -0
  28. package/dist/chunks/chunk-3OEJVB5A.js.map +7 -0
  29. package/dist/chunks/chunk-3TNIOEBO.js +369 -0
  30. package/dist/chunks/chunk-3TNIOEBO.js.map +7 -0
  31. package/dist/chunks/chunk-4A46ZXMJ.js +67 -0
  32. package/dist/chunks/chunk-4A46ZXMJ.js.map +7 -0
  33. package/dist/{chunk-4GAIJGRH.js → chunks/chunk-4ATBQOFO.js} +107 -55
  34. package/dist/chunks/chunk-4ATBQOFO.js.map +7 -0
  35. package/dist/chunks/chunk-4CRUCZR4.js +0 -0
  36. package/dist/{chunk-54DNHKOD.js → chunks/chunk-4EO6SIQY.js} +32 -75
  37. package/dist/chunks/chunk-4EO6SIQY.js.map +7 -0
  38. package/dist/chunks/chunk-53M46S5I.js +64 -0
  39. package/dist/chunks/chunk-53M46S5I.js.map +7 -0
  40. package/dist/{chunk-JC6NCUG5.js → chunks/chunk-54KOYG5C.js} +0 -2
  41. package/dist/{chunk-EZXMVTDU.js → chunks/chunk-6BAS4WY6.js} +29 -45
  42. package/dist/chunks/chunk-6BAS4WY6.js.map +7 -0
  43. package/dist/{chunk-BHGTA6JQ.js → chunks/chunk-6KRRFSDN.js} +4 -6
  44. package/dist/chunks/chunk-6KRRFSDN.js.map +7 -0
  45. package/dist/chunks/chunk-6LJNZK4K.js +39 -0
  46. package/dist/chunks/chunk-6LJNZK4K.js.map +7 -0
  47. package/dist/chunks/chunk-6ZWEOSEI.js +666 -0
  48. package/dist/chunks/chunk-6ZWEOSEI.js.map +7 -0
  49. package/dist/chunks/chunk-77XDJMBP.js +3326 -0
  50. package/dist/chunks/chunk-77XDJMBP.js.map +7 -0
  51. package/dist/chunks/chunk-7RRW4NTB.js +6454 -0
  52. package/dist/chunks/chunk-7RRW4NTB.js.map +7 -0
  53. package/dist/chunks/chunk-7X3TW4JB.js +4520 -0
  54. package/dist/chunks/chunk-7X3TW4JB.js.map +7 -0
  55. package/dist/chunks/chunk-B3MW3YGY.js +1409 -0
  56. package/dist/chunks/chunk-B3MW3YGY.js.map +7 -0
  57. package/dist/chunks/chunk-BBJFHTBC.js +28 -0
  58. package/dist/chunks/chunk-BBJFHTBC.js.map +7 -0
  59. package/dist/chunks/chunk-BHDHXOXB.js +24 -0
  60. package/dist/chunks/chunk-BHDHXOXB.js.map +7 -0
  61. package/dist/{chunk-OZNRLY3E.js → chunks/chunk-BTA7SZ26.js} +152 -223
  62. package/dist/chunks/chunk-BTA7SZ26.js.map +7 -0
  63. package/dist/chunks/chunk-CDGRYGPZ.js +103 -0
  64. package/dist/chunks/chunk-CDGRYGPZ.js.map +7 -0
  65. package/dist/{chunk-S6HRABTA.js → chunks/chunk-CP6E5UG6.js} +1 -4
  66. package/dist/chunks/chunk-CP6E5UG6.js.map +7 -0
  67. package/dist/{chunk-2PMO2FS2.js → chunks/chunk-DQ4JHXMT.js} +462 -424
  68. package/dist/chunks/chunk-DQ4JHXMT.js.map +7 -0
  69. package/dist/chunks/chunk-DXD76CMV.js +208 -0
  70. package/dist/chunks/chunk-DXD76CMV.js.map +7 -0
  71. package/dist/chunks/chunk-GCQCAXJZ.js +0 -0
  72. package/dist/chunks/chunk-GELCZWMB.js +42 -0
  73. package/dist/chunks/chunk-GELCZWMB.js.map +7 -0
  74. package/dist/{chunk-NQLEUHMS.js → chunks/chunk-HJYOH4HC.js} +23 -18
  75. package/dist/chunks/chunk-HJYOH4HC.js.map +7 -0
  76. package/dist/chunks/chunk-HPYNW6TT.js +744 -0
  77. package/dist/chunks/chunk-HPYNW6TT.js.map +7 -0
  78. package/dist/{chunk-2KWKUXLT.js → chunks/chunk-HRJ3ICQK.js} +59 -55
  79. package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
  80. package/dist/{chunk-ZQU3TXLC.js → chunks/chunk-IFCIADS3.js} +571 -573
  81. package/dist/chunks/chunk-IFCIADS3.js.map +7 -0
  82. package/dist/chunks/chunk-IN7XZ7BC.js +27 -0
  83. package/dist/chunks/chunk-IN7XZ7BC.js.map +7 -0
  84. package/dist/chunks/chunk-L7P4M4KW.js +193 -0
  85. package/dist/chunks/chunk-L7P4M4KW.js.map +7 -0
  86. package/dist/chunks/chunk-LB6TCPDI.js +0 -0
  87. package/dist/{chunk-3RUXVV4S.js → chunks/chunk-LOCXPQNJ.js} +1 -4
  88. package/dist/{chunk-3RUXVV4S.js.map → chunks/chunk-LOCXPQNJ.js.map} +2 -2
  89. package/dist/{chunk-IE2CG2TV.js → chunks/chunk-LOD5ZHCI.js} +213 -208
  90. package/dist/chunks/chunk-LOD5ZHCI.js.map +7 -0
  91. package/dist/{chunk-S3J2TLV6.js → chunks/chunk-M7P3QNRU.js} +1 -4
  92. package/dist/{chunk-S3J2TLV6.js.map → chunks/chunk-M7P3QNRU.js.map} +2 -2
  93. package/dist/chunks/chunk-PPHLQVL7.js +4234 -0
  94. package/dist/chunks/chunk-PPHLQVL7.js.map +7 -0
  95. package/dist/{chunk-ABLVTESJ.js → chunks/chunk-QAXE37B5.js} +1 -4
  96. package/dist/chunks/chunk-QAXE37B5.js.map +7 -0
  97. package/dist/chunks/chunk-QHQOBUF6.js +60 -0
  98. package/dist/chunks/chunk-QHQOBUF6.js.map +7 -0
  99. package/dist/{chunk-SRZZFAS7.js → chunks/chunk-RPJXO7GG.js} +241 -214
  100. package/dist/chunks/chunk-RPJXO7GG.js.map +7 -0
  101. package/dist/{chunk-NPFOMITO.js → chunks/chunk-SWQV4KSY.js} +1 -4
  102. package/dist/{chunk-NPFOMITO.js.map → chunks/chunk-SWQV4KSY.js.map} +2 -2
  103. package/dist/chunks/chunk-SZLAPULP.js +28 -0
  104. package/dist/chunks/chunk-SZLAPULP.js.map +7 -0
  105. package/dist/{chunk-SDGKPKDK.js → chunks/chunk-T7RB5V5J.js} +23 -25
  106. package/dist/chunks/chunk-T7RB5V5J.js.map +7 -0
  107. package/dist/{chunk-HN4E4UUQ.js → chunks/chunk-TI2CTTMA.js} +25 -17
  108. package/dist/chunks/chunk-TI2CTTMA.js.map +7 -0
  109. package/dist/{chunk-G6I7XROM.js → chunks/chunk-TNGVRTO5.js} +45 -20
  110. package/dist/chunks/chunk-TNGVRTO5.js.map +7 -0
  111. package/dist/chunks/chunk-TNWB3U5Y.js +2077 -0
  112. package/dist/chunks/chunk-TNWB3U5Y.js.map +7 -0
  113. package/dist/chunks/chunk-U2IHWPCU.js +12 -0
  114. package/dist/chunks/chunk-U2IHWPCU.js.map +7 -0
  115. package/dist/{chunk-KAA5BGMQ.js → chunks/chunk-UNOY3VJ2.js} +1 -4
  116. package/dist/{chunk-KAA5BGMQ.js.map → chunks/chunk-UNOY3VJ2.js.map} +2 -2
  117. package/dist/{chunk-3TXNP6HH.js → chunks/chunk-UVDJL6ZZ.js} +97 -58
  118. package/dist/chunks/chunk-UVDJL6ZZ.js.map +7 -0
  119. package/dist/chunks/chunk-VNCW4C2Z.js +13452 -0
  120. package/dist/chunks/chunk-VNCW4C2Z.js.map +7 -0
  121. package/dist/chunks/chunk-W5EGGA44.js +15 -0
  122. package/dist/chunks/chunk-W5EGGA44.js.map +7 -0
  123. package/dist/chunks/chunk-XR2W3MAM.js +1533 -0
  124. package/dist/chunks/chunk-XR2W3MAM.js.map +7 -0
  125. package/dist/{chunk-QYFKRZQC.js → chunks/chunk-YIO5EBMQ.js} +423 -377
  126. package/dist/chunks/chunk-YIO5EBMQ.js.map +7 -0
  127. package/dist/chunks/chunk-ZBVLKZ5V.js +1062 -0
  128. package/dist/chunks/chunk-ZBVLKZ5V.js.map +7 -0
  129. package/dist/{chunk-E6YNABER.js → chunks/chunk-ZCLTZIVP.js} +1 -4
  130. package/dist/chunks/chunk-ZCLTZIVP.js.map +7 -0
  131. package/dist/chunks/client-SILZNM5N.js +42 -0
  132. package/dist/{config-6ZMBCL23.js → chunks/config-25HRTPSP.js} +48 -10
  133. package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
  134. package/dist/{customCommands-DNEJS3ZU.js → chunks/customCommands-TYMYZRG5.js} +11 -8
  135. package/dist/chunks/engine-MRVF6FK6.js +39 -0
  136. package/dist/{env-OFAXZ3XG.js → chunks/env-TJ5NOBEB.js} +7 -5
  137. package/dist/{kodeAgentSessionId-X6XWQW7B.js → chunks/kodeAgentSessionId-VTNISJ2L.js} +2 -4
  138. package/dist/chunks/kodeAgentSessionLoad-YB2RKBGJ.js +15 -0
  139. package/dist/chunks/kodeAgentSessionResume-DZSIVKVA.js +13 -0
  140. package/dist/chunks/kodeAgentStreamJson-X5PLS2S6.js +11 -0
  141. package/dist/{kodeAgentStreamJsonSession-GRWG3SPE.js → chunks/kodeAgentStreamJsonSession-RDXM4XYF.js} +38 -24
  142. package/dist/chunks/kodeAgentStreamJsonSession-RDXM4XYF.js.map +7 -0
  143. package/dist/{chunk-4RTX4AG4.js → chunks/kodeAgentStructuredStdio-SVGDSB4P.js} +14 -9
  144. package/dist/chunks/kodeAgentStructuredStdio-SVGDSB4P.js.map +7 -0
  145. package/dist/{kodeHooks-TDMXFWSO.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
  146. package/dist/{llm-XVXWYOHK.js → chunks/llm-62N6T5ZT.js} +1734 -1526
  147. package/dist/chunks/llm-62N6T5ZT.js.map +7 -0
  148. package/dist/chunks/llmLazy-ZUSSE3ZA.js +13 -0
  149. package/dist/{mentionProcessor-YD7YXYGF.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
  150. package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
  151. package/dist/{messages-OFUJSPRV.js → chunks/messages-EEWWLPHN.js} +2 -6
  152. package/dist/chunks/model-5TIEKQPD.js +37 -0
  153. package/dist/{openai-5G5D5Q4B.js → chunks/openai-XXK3YZG4.js} +13 -10
  154. package/dist/{outputStyles-HLDXFQK3.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
  155. package/dist/chunks/permissions-HO7INPWM.js +27 -0
  156. package/dist/{pluginRuntime-FPTKK6NY.js → chunks/pluginRuntime-C7K5ULK2.js} +31 -48
  157. package/dist/chunks/pluginRuntime-C7K5ULK2.js.map +7 -0
  158. package/dist/chunks/pluginValidation-DAM7WRTC.js +20 -0
  159. package/dist/chunks/registry-XYJXMOA5.js +60 -0
  160. package/dist/chunks/responsesStreaming-JNGE2P3D.js +8 -0
  161. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js +577 -0
  162. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js.map +7 -0
  163. package/dist/chunks/server-REXXF5IK.js +46 -0
  164. package/dist/{skillMarketplace-PSNKDINM.js → chunks/skillMarketplace-N4HVHNST.js} +8 -6
  165. package/dist/chunks/src-OROQIWP3.js +44 -0
  166. package/dist/chunks/src-QXLGGMUW.js +1647 -0
  167. package/dist/chunks/src-QXLGGMUW.js.map +7 -0
  168. package/dist/{cli-SRV2INSL.js → chunks/src-SSDT6MVP.js} +2659 -3384
  169. package/dist/chunks/src-SSDT6MVP.js.map +7 -0
  170. package/dist/chunks/theme-YBJUIMWK.js +10 -0
  171. package/dist/{toolPermissionContext-65L65VEZ.js → chunks/toolPermissionContext-MOCTRR7N.js} +2 -4
  172. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js +18 -0
  173. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js.map +7 -0
  174. package/dist/chunks/uuid-6577SO6X.js +7 -0
  175. package/dist/chunks/uuid-6577SO6X.js.map +7 -0
  176. package/dist/chunks/webOnlyMode-ALXX7UQY.js +66 -0
  177. package/dist/chunks/webOnlyMode-ALXX7UQY.js.map +7 -0
  178. package/dist/entrypoints/cli.js +10 -0
  179. package/dist/entrypoints/cli.js.map +7 -0
  180. package/dist/entrypoints/daemon.js +10 -0
  181. package/dist/entrypoints/daemon.js.map +7 -0
  182. package/dist/entrypoints/mcp.js +71 -0
  183. package/dist/entrypoints/mcp.js.map +7 -0
  184. package/dist/index.js +6 -7
  185. package/dist/index.js.map +3 -3
  186. package/dist/sdk/client.cjs +391 -0
  187. package/dist/sdk/client.cjs.map +7 -0
  188. package/dist/sdk/client.js +364 -0
  189. package/dist/sdk/client.js.map +7 -0
  190. package/dist/sdk/core.cjs +19932 -0
  191. package/dist/sdk/core.cjs.map +7 -0
  192. package/dist/sdk/core.js +19893 -0
  193. package/dist/sdk/core.js.map +7 -0
  194. package/dist/sdk/daemon-client.cjs +257 -0
  195. package/dist/sdk/daemon-client.cjs.map +7 -0
  196. package/dist/sdk/daemon-client.js +221 -0
  197. package/dist/sdk/daemon-client.js.map +7 -0
  198. package/dist/sdk/protocol.cjs +170 -0
  199. package/dist/sdk/protocol.cjs.map +7 -0
  200. package/dist/sdk/protocol.js +140 -0
  201. package/dist/sdk/protocol.js.map +7 -0
  202. package/dist/sdk/runtime-node.cjs +236 -0
  203. package/dist/sdk/runtime-node.cjs.map +7 -0
  204. package/dist/sdk/runtime-node.js +222 -0
  205. package/dist/sdk/runtime-node.js.map +7 -0
  206. package/dist/sdk/runtime.cjs +17 -0
  207. package/dist/sdk/runtime.cjs.map +7 -0
  208. package/dist/sdk/runtime.js +0 -0
  209. package/dist/sdk/runtime.js.map +7 -0
  210. package/dist/sdk/tools.cjs +30300 -0
  211. package/dist/sdk/tools.cjs.map +7 -0
  212. package/dist/sdk/tools.js +30282 -0
  213. package/dist/sdk/tools.js.map +7 -0
  214. package/dist/webui/assets/index-5hlfByVS.css +1 -0
  215. package/dist/webui/assets/index-BR9lm1lA.js +82 -0
  216. package/dist/webui/index.html +28 -0
  217. package/package.json +93 -22
  218. package/scripts/binary-utils.cjs +12 -4
  219. package/scripts/cli-acp-wrapper.cjs +3 -17
  220. package/scripts/cli-wrapper.cjs +5 -7
  221. package/scripts/postinstall.js +8 -4
  222. package/dist/REPL-GIU4ZIXM.js +0 -42
  223. package/dist/acp-H3VJ77YG.js +0 -1357
  224. package/dist/acp-H3VJ77YG.js.map +0 -7
  225. package/dist/agentsValidate-XP3CFN6F.js.map +0 -7
  226. package/dist/ask-3G5H5KD5.js.map +0 -7
  227. package/dist/autoUpdater-DNRMJWFQ.js +0 -17
  228. package/dist/chunk-2KWKUXLT.js.map +0 -7
  229. package/dist/chunk-2PMO2FS2.js.map +0 -7
  230. package/dist/chunk-3TXNP6HH.js.map +0 -7
  231. package/dist/chunk-4GAIJGRH.js.map +0 -7
  232. package/dist/chunk-4RTX4AG4.js.map +0 -7
  233. package/dist/chunk-54DNHKOD.js.map +0 -7
  234. package/dist/chunk-67PY5IX6.js +0 -34
  235. package/dist/chunk-67PY5IX6.js.map +0 -7
  236. package/dist/chunk-6DRDLOLP.js +0 -2613
  237. package/dist/chunk-6DRDLOLP.js.map +0 -7
  238. package/dist/chunk-7CQVZNQV.js +0 -1609
  239. package/dist/chunk-7CQVZNQV.js.map +0 -7
  240. package/dist/chunk-ABLVTESJ.js.map +0 -7
  241. package/dist/chunk-AIMIPK4B.js +0 -835
  242. package/dist/chunk-AIMIPK4B.js.map +0 -7
  243. package/dist/chunk-BHGTA6JQ.js.map +0 -7
  244. package/dist/chunk-CIG63V4E.js +0 -72
  245. package/dist/chunk-CIG63V4E.js.map +0 -7
  246. package/dist/chunk-E6YNABER.js.map +0 -7
  247. package/dist/chunk-EH34V7CY.js.map +0 -7
  248. package/dist/chunk-EZXMVTDU.js.map +0 -7
  249. package/dist/chunk-FH5CHM6L.js +0 -148
  250. package/dist/chunk-FH5CHM6L.js.map +0 -7
  251. package/dist/chunk-G6I7XROM.js.map +0 -7
  252. package/dist/chunk-HN4E4UUQ.js.map +0 -7
  253. package/dist/chunk-HSPVVDIW.js +0 -30198
  254. package/dist/chunk-HSPVVDIW.js.map +0 -7
  255. package/dist/chunk-IE2CG2TV.js.map +0 -7
  256. package/dist/chunk-K2MI4TPB.js.map +0 -7
  257. package/dist/chunk-MN77D2F7.js +0 -2931
  258. package/dist/chunk-MN77D2F7.js.map +0 -7
  259. package/dist/chunk-NQLEUHMS.js.map +0 -7
  260. package/dist/chunk-OIFQB3S4.js +0 -515
  261. package/dist/chunk-OIFQB3S4.js.map +0 -7
  262. package/dist/chunk-OWTG2W3A.js +0 -164
  263. package/dist/chunk-OWTG2W3A.js.map +0 -7
  264. package/dist/chunk-OZNRLY3E.js.map +0 -7
  265. package/dist/chunk-QYFKRZQC.js.map +0 -7
  266. package/dist/chunk-S6HRABTA.js.map +0 -7
  267. package/dist/chunk-SDGKPKDK.js.map +0 -7
  268. package/dist/chunk-SRZZFAS7.js.map +0 -7
  269. package/dist/chunk-UKHTVRJM.js +0 -47
  270. package/dist/chunk-UKHTVRJM.js.map +0 -7
  271. package/dist/chunk-UYXEDKOZ.js +0 -24
  272. package/dist/chunk-UYXEDKOZ.js.map +0 -7
  273. package/dist/chunk-VBXVYQYY.js +0 -145
  274. package/dist/chunk-VBXVYQYY.js.map +0 -7
  275. package/dist/chunk-WVHORZQ5.js +0 -17
  276. package/dist/chunk-WVHORZQ5.js.map +0 -7
  277. package/dist/chunk-WWUWDNWW.js +0 -49
  278. package/dist/chunk-WWUWDNWW.js.map +0 -7
  279. package/dist/chunk-Z33T5YN5.js +0 -654
  280. package/dist/chunk-Z33T5YN5.js.map +0 -7
  281. package/dist/chunk-ZQU3TXLC.js.map +0 -7
  282. package/dist/cli-SRV2INSL.js.map +0 -7
  283. package/dist/commands-TWH6PGVG.js +0 -46
  284. package/dist/context-JQIOOI4W.js +0 -30
  285. package/dist/costTracker-6SL26FDB.js +0 -19
  286. package/dist/kodeAgentSessionLoad-6N27AC5K.js +0 -18
  287. package/dist/kodeAgentSessionResume-HUSAEO24.js +0 -16
  288. package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
  289. package/dist/kodeAgentStreamJsonSession-GRWG3SPE.js.map +0 -7
  290. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
  291. package/dist/llm-XVXWYOHK.js.map +0 -7
  292. package/dist/llmLazy-7TD5N7XP.js +0 -15
  293. package/dist/loader-AUXIJTY6.js +0 -28
  294. package/dist/mcp-BXJ3K7NZ.js +0 -49
  295. package/dist/mentionProcessor-YD7YXYGF.js.map +0 -7
  296. package/dist/model-KPYCXWBK.js +0 -30
  297. package/dist/pluginRuntime-FPTKK6NY.js.map +0 -7
  298. package/dist/pluginValidation-DSFXZ4GF.js +0 -17
  299. package/dist/prompts-LWLAJRS2.js +0 -48
  300. package/dist/query-HVPWL27C.js +0 -50
  301. package/dist/responsesStreaming-AW344PQO.js +0 -10
  302. package/dist/ripgrep-YOPCY2GO.js +0 -17
  303. package/dist/state-KNRWP3FO.js +0 -16
  304. package/dist/theme-7S2QN2FO.js +0 -14
  305. package/dist/toolPermissionSettings-GPOBH4IV.js +0 -18
  306. package/dist/tools-FZU2FZBD.js +0 -47
  307. package/dist/userInput-VHNBN2MW.js +0 -311
  308. package/dist/userInput-VHNBN2MW.js.map +0 -7
  309. package/dist/uuid-QN2CNKKN.js +0 -9
  310. /package/dist/{REPL-GIU4ZIXM.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
  311. /package/dist/{autoUpdater-DNRMJWFQ.js.map → chunks/REPL-RQ6LO6S7.js.map} +0 -0
  312. /package/dist/{chunk-JC6NCUG5.js.map → chunks/ResumeConversation-6DMVBEGH.js.map} +0 -0
  313. /package/dist/{commands-TWH6PGVG.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
  314. /package/dist/{config-6ZMBCL23.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
  315. /package/dist/{context-JQIOOI4W.js.map → chunks/chunk-4CRUCZR4.js.map} +0 -0
  316. /package/dist/{costTracker-6SL26FDB.js.map → chunks/chunk-54KOYG5C.js.map} +0 -0
  317. /package/dist/{customCommands-DNEJS3ZU.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
  318. /package/dist/{env-OFAXZ3XG.js.map → chunks/chunk-LB6TCPDI.js.map} +0 -0
  319. /package/dist/{kodeAgentSessionId-X6XWQW7B.js.map → chunks/client-SILZNM5N.js.map} +0 -0
  320. /package/dist/{kodeAgentSessionLoad-6N27AC5K.js.map → chunks/config-25HRTPSP.js.map} +0 -0
  321. /package/dist/{kodeAgentSessionResume-HUSAEO24.js.map → chunks/cost-tracker-Z2UZT2J5.js.map} +0 -0
  322. /package/dist/{kodeAgentStreamJson-NXFN7TXH.js.map → chunks/customCommands-TYMYZRG5.js.map} +0 -0
  323. /package/dist/{kodeAgentStructuredStdio-HGWJT7CU.js.map → chunks/engine-MRVF6FK6.js.map} +0 -0
  324. /package/dist/{kodeHooks-TDMXFWSO.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
  325. /package/dist/{llmLazy-7TD5N7XP.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
  326. /package/dist/{loader-AUXIJTY6.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
  327. /package/dist/{mcp-BXJ3K7NZ.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
  328. /package/dist/{messages-OFUJSPRV.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
  329. /package/dist/{model-KPYCXWBK.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
  330. /package/dist/{openai-5G5D5Q4B.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
  331. /package/dist/{outputStyles-HLDXFQK3.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
  332. /package/dist/{pluginValidation-DSFXZ4GF.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
  333. /package/dist/{prompts-LWLAJRS2.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
  334. /package/dist/{query-HVPWL27C.js.map → chunks/outputStyles-FAJTXN2A.js.map} +0 -0
  335. /package/dist/{responsesStreaming-AW344PQO.js.map → chunks/permissions-HO7INPWM.js.map} +0 -0
  336. /package/dist/{ripgrep-YOPCY2GO.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
  337. /package/dist/{skillMarketplace-PSNKDINM.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
  338. /package/dist/{state-KNRWP3FO.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
  339. /package/dist/{theme-7S2QN2FO.js.map → chunks/server-REXXF5IK.js.map} +0 -0
  340. /package/dist/{toolPermissionContext-65L65VEZ.js.map → chunks/skillMarketplace-N4HVHNST.js.map} +0 -0
  341. /package/dist/{toolPermissionSettings-GPOBH4IV.js.map → chunks/src-OROQIWP3.js.map} +0 -0
  342. /package/dist/{tools-FZU2FZBD.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
  343. /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../packages/core/src/engine/systemPrompt.ts", "../../packages/core/src/engine/turn.ts"],
4
+ "sourcesContent": ["import { getSystemPrompt } from '#core/constants/prompts'\n\nexport async function buildSystemPromptForSession(args: {\n disableSlashCommands?: boolean\n systemPromptOverride?: string\n appendSystemPrompt?: string\n jsonSchema?: Record<string, unknown> | null\n outputStyleActive?: boolean\n keepCodingInstructions?: boolean\n}): Promise<string[]> {\n const baseSystemPrompt =\n typeof args.systemPromptOverride === 'string' &&\n args.systemPromptOverride.trim()\n ? [args.systemPromptOverride]\n : await getSystemPrompt({\n disableSlashCommands: args.disableSlashCommands === true,\n outputStyleActive: args.outputStyleActive,\n keepCodingInstructions: args.keepCodingInstructions,\n })\n\n const systemPrompt =\n typeof args.appendSystemPrompt === 'string' &&\n args.appendSystemPrompt.trim()\n ? [...baseSystemPrompt, args.appendSystemPrompt]\n : baseSystemPrompt\n\n if (args.jsonSchema) {\n systemPrompt.push(\n [\n 'You MUST respond with ONLY valid JSON.',\n 'The JSON MUST validate against the following JSON Schema.',\n 'Do not wrap the JSON in markdown code fences and do not add extra commentary.',\n '',\n `<json_schema>${JSON.stringify(args.jsonSchema)}</json_schema>`,\n ].join('\\n'),\n )\n }\n\n return systemPrompt\n}\n", "import type { AgentEvent } from '#protocol/agentEvent'\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n Message,\n} from '#core/query'\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\n\nimport { getContext } from '#core/context'\nimport { query } from './orchestrator'\n\nimport { messagesToAgentEvents } from '../query/agentEvents'\nimport { buildSystemPromptForSession } from './systemPrompt'\n\nexport type QueryToolUseContext = Parameters<typeof query>[4]\n\nexport async function getSessionContext(): Promise<{ [k: string]: string }> {\n return getContext()\n}\n\nexport async function* runTurn(args: {\n messages: Message[]\n canUseTool: CanUseToolFn\n toolUseContext: QueryToolUseContext\n\n disableSlashCommands?: boolean\n systemPromptOverride?: string\n appendSystemPrompt?: string\n jsonSchema?: Record<string, unknown> | null\n\n systemPrompt?: string[]\n context?: { [k: string]: string }\n\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>\n}): AsyncGenerator<Message, void> {\n const [systemPrompt, context] = await Promise.all([\n args.systemPrompt ??\n buildSystemPromptForSession({\n disableSlashCommands: args.disableSlashCommands,\n systemPromptOverride: args.systemPromptOverride,\n appendSystemPrompt: args.appendSystemPrompt,\n jsonSchema: args.jsonSchema,\n }),\n args.context ?? getContext(),\n ])\n\n yield* query(\n args.messages,\n systemPrompt,\n context,\n args.canUseTool,\n args.toolUseContext,\n args.getBinaryFeedbackResponse,\n )\n}\n\nexport async function* runTurnEvents(\n args: {\n sessionId: string\n } & Parameters<typeof runTurn>[0],\n): AsyncGenerator<AgentEvent, void> {\n yield* messagesToAgentEvents({\n source: runTurn(args),\n sessionId: args.sessionId,\n })\n}\n"],
5
+ "mappings": ";;;;;;;;;;AAEA,eAAsB,4BAA4B,MAO5B;AACpB,QAAM,mBACJ,OAAO,KAAK,yBAAyB,YACrC,KAAK,qBAAqB,KAAK,IAC3B,CAAC,KAAK,oBAAoB,IAC1B,MAAM,gBAAgB;AAAA,IACpB,sBAAsB,KAAK,yBAAyB;AAAA,IACpD,mBAAmB,KAAK;AAAA,IACxB,wBAAwB,KAAK;AAAA,EAC/B,CAAC;AAEP,QAAM,eACJ,OAAO,KAAK,uBAAuB,YACnC,KAAK,mBAAmB,KAAK,IACzB,CAAC,GAAG,kBAAkB,KAAK,kBAAkB,IAC7C;AAEN,MAAI,KAAK,YAAY;AACnB,iBAAa;AAAA,MACX;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,KAAK,UAAU,KAAK,UAAU,CAAC;AAAA,MACjD,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AACT;;;ACvBA,eAAsB,oBAAsD;AAC1E,SAAO,WAAW;AACpB;AAEA,gBAAuB,QAAQ,MAiBG;AAChC,QAAM,CAAC,cAAc,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IAChD,KAAK,gBACH,4BAA4B;AAAA,MAC1B,sBAAsB,KAAK;AAAA,MAC3B,sBAAsB,KAAK;AAAA,MAC3B,oBAAoB,KAAK;AAAA,MACzB,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,IACH,KAAK,WAAW,WAAW;AAAA,EAC7B,CAAC;AAED,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEA,gBAAuB,cACrB,MAGkC;AAClC,SAAO,sBAAsB;AAAA,IAC3B,QAAQ,QAAQ,IAAI;AAAA,IACpB,WAAW,KAAK;AAAA,EAClB,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -1,35 +1,19 @@
1
- import { createRequire as __kodeCreateRequire } from "node:module";
2
- const require = __kodeCreateRequire(import.meta.url);
3
1
  import {
4
2
  MarketplaceManifestSchema
5
- } from "./chunk-2PMO2FS2.js";
3
+ } from "./chunk-DQ4JHXMT.js";
6
4
  import {
7
5
  parseFrontmatter
8
- } from "./chunk-SRZZFAS7.js";
6
+ } from "./chunk-RPJXO7GG.js";
9
7
  import {
10
8
  getCwd
11
- } from "./chunk-MN77D2F7.js";
9
+ } from "./chunk-BBJFHTBC.js";
12
10
 
13
- // src/services/plugins/pluginValidation.ts
14
- import { existsSync, lstatSync, readFileSync } from "node:fs";
15
- import { dirname, join, resolve, sep } from "node:path";
16
- import figures from "figures";
17
- import { z } from "zod";
18
- var PluginManifestSchema = z.strictObject({
19
- name: z.string().min(1),
20
- version: z.string().optional(),
21
- description: z.string().optional(),
22
- author: z.unknown().optional(),
23
- homepage: z.string().optional(),
24
- repository: z.unknown().optional(),
25
- license: z.string().optional(),
26
- keywords: z.array(z.string()).optional(),
27
- commands: z.union([z.string(), z.array(z.string())]).optional(),
28
- agents: z.union([z.string(), z.array(z.string())]).optional(),
29
- skills: z.union([z.string(), z.array(z.string())]).optional(),
30
- hooks: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
31
- mcpServers: z.union([z.string(), z.record(z.string(), z.unknown())]).optional()
32
- }).passthrough();
11
+ // apps/cli/src/services/pluginValidation/validate.ts
12
+ import { existsSync as existsSync4, lstatSync as lstatSync4, readFileSync as readFileSync4 } from "node:fs";
13
+ import { join as join3 } from "node:path";
14
+
15
+ // apps/cli/src/services/pluginValidation/utils.ts
16
+ import { resolve, sep } from "node:path";
33
17
  function resolveFromAgentCwd(input) {
34
18
  const trimmed = input.trim();
35
19
  if (!trimmed) return trimmed;
@@ -54,9 +38,24 @@ function safeResolveWithin(baseDir, rel) {
54
38
  if (!abs.startsWith(base + sep) && abs !== base) return null;
55
39
  return abs;
56
40
  }
41
+
42
+ // apps/cli/src/services/pluginValidation/marketplace.ts
43
+ import { existsSync as existsSync2, lstatSync as lstatSync2, readFileSync as readFileSync2 } from "node:fs";
44
+ import { dirname } from "node:path";
45
+
46
+ // apps/cli/src/services/pluginValidation/skills.ts
47
+ import { existsSync, lstatSync, readFileSync } from "node:fs";
48
+ import { join, sep as sep2 } from "node:path";
49
+ function getStringField(obj, key) {
50
+ if (!obj || typeof obj !== "object") return "";
51
+ const record = obj;
52
+ const value = record[key];
53
+ if (typeof value !== "string") return "";
54
+ return value.trim();
55
+ }
57
56
  function validateSkillDir(skillDir) {
58
57
  const issues = [];
59
- const name = skillDir.split(sep).pop() || "";
58
+ const name = skillDir.split(sep2).pop() || "";
60
59
  if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name) || name.length > 64) {
61
60
  issues.push({
62
61
  path: `skills/${name}`,
@@ -64,6 +63,13 @@ function validateSkillDir(skillDir) {
64
63
  });
65
64
  return issues;
66
65
  }
66
+ if (!existsSync(skillDir) || !lstatSync(skillDir).isDirectory()) {
67
+ issues.push({
68
+ path: `skills/${name}`,
69
+ message: "Skill directory not found"
70
+ });
71
+ return issues;
72
+ }
67
73
  const skillFileCandidates = [
68
74
  join(skillDir, "SKILL.md"),
69
75
  join(skillDir, "skill.md")
@@ -79,7 +85,7 @@ function validateSkillDir(skillDir) {
79
85
  try {
80
86
  const raw = readFileSync(skillFile, "utf8");
81
87
  const { frontmatter } = parseFrontmatter(raw);
82
- const declared = typeof frontmatter.name === "string" ? String(frontmatter.name).trim() : "";
88
+ const declared = getStringField(frontmatter, "name");
83
89
  if (!declared) {
84
90
  issues.push({
85
91
  path: `${name}/SKILL.md`,
@@ -91,7 +97,7 @@ function validateSkillDir(skillDir) {
91
97
  message: `Frontmatter name must match directory name (dir=${name}, name=${declared})`
92
98
  });
93
99
  }
94
- const description = typeof frontmatter.description === "string" ? String(frontmatter.description).trim() : "";
100
+ const description = getStringField(frontmatter, "description");
95
101
  if (!description) {
96
102
  issues.push({
97
103
  path: `${name}/SKILL.md`,
@@ -111,12 +117,22 @@ function validateSkillDir(skillDir) {
111
117
  }
112
118
  return issues;
113
119
  }
120
+
121
+ // apps/cli/src/services/pluginValidation/marketplace.ts
122
+ function metadataDescriptionFrom(manifest) {
123
+ const metadata = manifest.metadata;
124
+ if (!metadata || typeof metadata !== "object") return "";
125
+ const record = metadata;
126
+ const value = record.description;
127
+ if (typeof value !== "string") return "";
128
+ return value.trim();
129
+ }
114
130
  function validateMarketplaceJson(filePath) {
115
131
  const errors = [];
116
132
  const warnings = [];
117
133
  let raw;
118
134
  try {
119
- raw = readFileSync(filePath, "utf8");
135
+ raw = readFileSync2(filePath, "utf8");
120
136
  } catch (err) {
121
137
  return {
122
138
  success: false,
@@ -159,8 +175,8 @@ function validateMarketplaceJson(filePath) {
159
175
  };
160
176
  }
161
177
  const data = parsed.data;
162
- const topLevelDescription = typeof data.description === "string" ? String(data.description).trim() : "";
163
- const metadataDescription = typeof data.metadata?.description === "string" ? String(data.metadata.description).trim() : "";
178
+ const topLevelDescription = typeof data.description === "string" ? data.description.trim() : "";
179
+ const metadataDescription = metadataDescriptionFrom(data);
164
180
  if (!topLevelDescription && !metadataDescription) {
165
181
  warnings.push({
166
182
  path: "description",
@@ -184,8 +200,9 @@ function validateMarketplaceJson(filePath) {
184
200
  pluginNames.add(plugin.name);
185
201
  const source = plugin.source ?? "./";
186
202
  const sourceErr = validateRelativePath(source);
187
- if (sourceErr)
203
+ if (sourceErr) {
188
204
  errors.push({ path: `plugins[${index}].source`, message: sourceErr });
205
+ }
189
206
  const marketplaceRoot = dirname(dirname(filePath));
190
207
  const pluginBase = safeResolveWithin(marketplaceRoot, source);
191
208
  if (!pluginBase) {
@@ -195,7 +212,7 @@ function validateMarketplaceJson(filePath) {
195
212
  });
196
213
  continue;
197
214
  }
198
- if (!existsSync(pluginBase) || !lstatSync(pluginBase).isDirectory()) {
215
+ if (!existsSync2(pluginBase) || !lstatSync2(pluginBase).isDirectory()) {
199
216
  errors.push({
200
217
  path: `plugins[${index}].source`,
201
218
  message: `Source path not found: ${source}`
@@ -217,7 +234,7 @@ function validateMarketplaceJson(filePath) {
217
234
  });
218
235
  continue;
219
236
  }
220
- if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {
237
+ if (!existsSync2(abs) || !lstatSync2(abs).isDirectory()) {
221
238
  errors.push({
222
239
  path: `plugins[${index}].skills[${j}]`,
223
240
  message: `Skill directory not found: ${rel}`
@@ -246,7 +263,7 @@ function validateMarketplaceJson(filePath) {
246
263
  });
247
264
  continue;
248
265
  }
249
- if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {
266
+ if (!existsSync2(abs) || !lstatSync2(abs).isDirectory()) {
250
267
  errors.push({
251
268
  path: `plugins[${index}].commands[${j}]`,
252
269
  message: `Command directory not found: ${rel}`
@@ -262,12 +279,32 @@ function validateMarketplaceJson(filePath) {
262
279
  warnings
263
280
  };
264
281
  }
282
+
283
+ // apps/cli/src/services/pluginValidation/plugin.ts
284
+ import { existsSync as existsSync3, lstatSync as lstatSync3, readFileSync as readFileSync3 } from "node:fs";
285
+ import { dirname as dirname2, join as join2 } from "node:path";
286
+ import { z } from "zod";
287
+ var PluginManifestSchema = z.strictObject({
288
+ name: z.string().min(1),
289
+ version: z.string().optional(),
290
+ description: z.string().optional(),
291
+ author: z.unknown().optional(),
292
+ homepage: z.string().optional(),
293
+ repository: z.unknown().optional(),
294
+ license: z.string().optional(),
295
+ keywords: z.array(z.string()).optional(),
296
+ commands: z.union([z.string(), z.array(z.string())]).optional(),
297
+ agents: z.union([z.string(), z.array(z.string())]).optional(),
298
+ skills: z.union([z.string(), z.array(z.string())]).optional(),
299
+ hooks: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
300
+ mcpServers: z.union([z.string(), z.record(z.string(), z.unknown())]).optional()
301
+ }).passthrough();
265
302
  function validatePluginJson(filePath) {
266
303
  const errors = [];
267
304
  const warnings = [];
268
305
  let raw;
269
306
  try {
270
- raw = readFileSync(filePath, "utf8");
307
+ raw = readFileSync3(filePath, "utf8");
271
308
  } catch (err) {
272
309
  return {
273
310
  success: false,
@@ -350,7 +387,7 @@ function validatePluginJson(filePath) {
350
387
  message: "No author information provided. Consider adding author details for plugin attribution"
351
388
  });
352
389
  }
353
- const pluginRoot = dirname(dirname(filePath));
390
+ const pluginRoot = dirname2(dirname2(filePath));
354
391
  const validatePathList = (field, value) => {
355
392
  if (!value) return;
356
393
  const values = Array.isArray(value) ? value : [value];
@@ -364,7 +401,7 @@ function validatePluginJson(filePath) {
364
401
  path: `${field}[${idx}]`,
365
402
  message: "Invalid path (must be ./..., no .., forward slashes)"
366
403
  });
367
- } else if (!existsSync(abs)) {
404
+ } else if (!existsSync3(abs)) {
368
405
  errors.push({
369
406
  path: `${field}[${idx}]`,
370
407
  message: `Path not found: ${p}`
@@ -378,6 +415,13 @@ function validatePluginJson(filePath) {
378
415
  if (typeof data.hooks === "string") validatePathList("hooks", data.hooks);
379
416
  if (typeof data.mcpServers === "string")
380
417
  validatePathList("mcpServers", data.mcpServers);
418
+ const pluginManifest = join2(pluginRoot, ".kode-plugin", "plugin.json");
419
+ if (!existsSync3(pluginManifest) && lstatSync3(dirname2(filePath)).isDirectory()) {
420
+ warnings.push({
421
+ path: "plugin.json",
422
+ message: "Manifest is not under .kode-plugin/plugin.json"
423
+ });
424
+ }
381
425
  return {
382
426
  success: errors.length === 0,
383
427
  fileType: "plugin",
@@ -386,6 +430,13 @@ function validatePluginJson(filePath) {
386
430
  warnings
387
431
  };
388
432
  }
433
+
434
+ // apps/cli/src/services/pluginValidation/validate.ts
435
+ function looksLikeMarketplace(json) {
436
+ if (!json || typeof json !== "object") return false;
437
+ const record = json;
438
+ return Array.isArray(record.plugins);
439
+ }
389
440
  function validatePluginOrMarketplacePath(path) {
390
441
  const abs = resolveFromAgentCwd(path);
391
442
  if (!abs) {
@@ -397,7 +448,7 @@ function validatePluginOrMarketplacePath(path) {
397
448
  warnings: []
398
449
  };
399
450
  }
400
- if (!existsSync(abs)) {
451
+ if (!existsSync4(abs)) {
401
452
  return {
402
453
  success: false,
403
454
  fileType: "plugin",
@@ -406,17 +457,17 @@ function validatePluginOrMarketplacePath(path) {
406
457
  warnings: []
407
458
  };
408
459
  }
409
- const stat = lstatSync(abs);
460
+ const stat = lstatSync4(abs);
410
461
  let filePath = abs;
411
462
  if (stat.isDirectory()) {
412
- const marketplace = join(abs, ".kode-plugin", "marketplace.json");
413
- const plugin = join(abs, ".kode-plugin", "plugin.json");
414
- const legacyMarketplace = join(abs, ".claude-plugin", "marketplace.json");
415
- const legacyPlugin = join(abs, ".claude-plugin", "plugin.json");
416
- if (existsSync(marketplace)) filePath = marketplace;
417
- else if (existsSync(plugin)) filePath = plugin;
418
- else if (existsSync(legacyMarketplace)) filePath = legacyMarketplace;
419
- else if (existsSync(legacyPlugin)) filePath = legacyPlugin;
463
+ const marketplace = join3(abs, ".kode-plugin", "marketplace.json");
464
+ const plugin = join3(abs, ".kode-plugin", "plugin.json");
465
+ const legacyMarketplace = join3(abs, ".claude-plugin", "marketplace.json");
466
+ const legacyPlugin = join3(abs, ".claude-plugin", "plugin.json");
467
+ if (existsSync4(marketplace)) filePath = marketplace;
468
+ else if (existsSync4(plugin)) filePath = plugin;
469
+ else if (existsSync4(legacyMarketplace)) filePath = legacyMarketplace;
470
+ else if (existsSync4(legacyPlugin)) filePath = legacyPlugin;
420
471
  else {
421
472
  return {
422
473
  success: false,
@@ -436,15 +487,18 @@ function validatePluginOrMarketplacePath(path) {
436
487
  return validateMarketplaceJson(filePath);
437
488
  if (filePath.endsWith("plugin.json")) return validatePluginJson(filePath);
438
489
  try {
439
- const raw = readFileSync(filePath, "utf8");
490
+ const raw = readFileSync4(filePath, "utf8");
440
491
  const json = JSON.parse(raw);
441
- if (json && typeof json === "object" && Array.isArray(json.plugins)) {
492
+ if (looksLikeMarketplace(json)) {
442
493
  return validateMarketplaceJson(filePath);
443
494
  }
444
495
  } catch {
445
496
  }
446
497
  return validatePluginJson(filePath);
447
498
  }
499
+
500
+ // apps/cli/src/services/pluginValidation/format.ts
501
+ import figures from "figures";
448
502
  function formatValidationResult(result) {
449
503
  const lines = [];
450
504
  for (const err of result.errors) {
@@ -455,11 +509,9 @@ function formatValidationResult(result) {
455
509
  }
456
510
  lines.push("");
457
511
  if (result.success) {
458
- if (result.warnings.length > 0) {
459
- lines.push(`${figures.tick} Validation passed with warnings`);
460
- } else {
461
- lines.push(`${figures.tick} Validation passed`);
462
- }
512
+ lines.push(
513
+ result.warnings.length > 0 ? `${figures.tick} Validation passed with warnings` : `${figures.tick} Validation passed`
514
+ );
463
515
  } else {
464
516
  lines.push(`${figures.cross} Validation failed`);
465
517
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../apps/cli/src/services/pluginValidation/validate.ts", "../../apps/cli/src/services/pluginValidation/utils.ts", "../../apps/cli/src/services/pluginValidation/marketplace.ts", "../../apps/cli/src/services/pluginValidation/skills.ts", "../../apps/cli/src/services/pluginValidation/plugin.ts", "../../apps/cli/src/services/pluginValidation/format.ts"],
4
+ "sourcesContent": ["import { existsSync, lstatSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { ValidationResult } from './types'\nimport { resolveFromAgentCwd } from './utils'\nimport { validateMarketplaceJson } from './marketplace'\nimport { validatePluginJson } from './plugin'\n\nfunction looksLikeMarketplace(json: unknown): boolean {\n if (!json || typeof json !== 'object') return false\n const record = json as Record<string, unknown>\n return Array.isArray(record.plugins)\n}\n\nexport function validatePluginOrMarketplacePath(\n path: string,\n): ValidationResult {\n const abs = resolveFromAgentCwd(path)\n if (!abs) {\n return {\n success: false,\n fileType: 'plugin',\n filePath: '',\n errors: [{ path: 'path', message: 'Path is required' }],\n warnings: [],\n }\n }\n if (!existsSync(abs)) {\n return {\n success: false,\n fileType: 'plugin',\n filePath: abs,\n errors: [{ path: 'file', message: `Path not found: ${abs}` }],\n warnings: [],\n }\n }\n\n const stat = lstatSync(abs)\n let filePath = abs\n if (stat.isDirectory()) {\n const marketplace = join(abs, '.kode-plugin', 'marketplace.json')\n const plugin = join(abs, '.kode-plugin', 'plugin.json')\n const legacyMarketplace = join(abs, '.claude-plugin', 'marketplace.json')\n const legacyPlugin = join(abs, '.claude-plugin', 'plugin.json')\n if (existsSync(marketplace)) filePath = marketplace\n else if (existsSync(plugin)) filePath = plugin\n else if (existsSync(legacyMarketplace)) filePath = legacyMarketplace\n else if (existsSync(legacyPlugin)) filePath = legacyPlugin\n else {\n return {\n success: false,\n fileType: 'plugin',\n filePath: abs,\n errors: [\n {\n path: 'directory',\n message:\n 'No manifest found in directory. Expected .kode-plugin/marketplace.json or .kode-plugin/plugin.json (legacy .claude-plugin/* is also supported)',\n },\n ],\n warnings: [],\n }\n }\n }\n\n if (filePath.endsWith('marketplace.json'))\n return validateMarketplaceJson(filePath)\n if (filePath.endsWith('plugin.json')) return validatePluginJson(filePath)\n\n try {\n const raw = readFileSync(filePath, 'utf8')\n const json = JSON.parse(raw)\n if (looksLikeMarketplace(json)) {\n return validateMarketplaceJson(filePath)\n }\n } catch {\n // ignore\n }\n\n return validatePluginJson(filePath)\n}\n", "import { resolve, sep } from 'node:path'\n\nimport { getCwd } from '#core/utils/state'\n\nexport function resolveFromAgentCwd(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return trimmed\n if (trimmed.startsWith('~')) {\n return trimmed\n }\n if (trimmed.startsWith(sep)) return trimmed\n return resolve(getCwd(), trimmed)\n}\n\nexport function validateRelativePath(path: string): string | null {\n if (!path.startsWith('./')) return 'must start with \"./\"'\n if (path.split('/').includes('..')) return 'must not contain \"..\"'\n if (path.includes('\\\\')) return 'must use forward slashes'\n return null\n}\n\nexport function safeResolveWithin(baseDir: string, rel: string): string | null {\n const normalized = rel.replace(/\\\\/g, '/')\n if (!normalized.startsWith('./') || normalized.split('/').includes('..'))\n return null\n const abs = resolve(baseDir, normalized.split('/').join(sep))\n const base = resolve(baseDir)\n if (!abs.startsWith(base + sep) && abs !== base) return null\n return abs\n}\n", "import { existsSync, lstatSync, readFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nimport { MarketplaceManifestSchema } from '#cli-services/skillMarketplace'\n\nimport type { MarketplaceManifest } from '#cli-services/skillMarketplace'\n\nimport type { ValidationIssue, ValidationResult } from './types'\nimport { safeResolveWithin, validateRelativePath } from './utils'\nimport { validateSkillDir } from './skills'\n\nfunction metadataDescriptionFrom(manifest: MarketplaceManifest): string {\n const metadata = manifest.metadata as unknown\n if (!metadata || typeof metadata !== 'object') return ''\n const record = metadata as Record<string, unknown>\n const value = record.description\n if (typeof value !== 'string') return ''\n return value.trim()\n}\n\nexport function validateMarketplaceJson(filePath: string): ValidationResult {\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n let raw: string\n try {\n raw = readFileSync(filePath, 'utf8')\n } catch (err) {\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors: [\n { path: 'file', message: `Failed to read file: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors: [\n { path: 'json', message: `Invalid JSON syntax: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n const parsed = MarketplaceManifestSchema.safeParse(json)\n if (!parsed.success) {\n errors.push(\n ...parsed.error.issues.map(i => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n )\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors,\n warnings,\n }\n }\n\n const data = parsed.data\n const topLevelDescription =\n typeof data.description === 'string' ? data.description.trim() : ''\n const metadataDescription = metadataDescriptionFrom(data)\n\n if (!topLevelDescription && !metadataDescription) {\n warnings.push({\n path: 'description',\n message:\n 'No marketplace description provided. Adding a description helps users understand what this marketplace offers',\n })\n }\n\n if (!data.plugins || data.plugins.length === 0) {\n warnings.push({\n path: 'plugins',\n message: 'Marketplace has no plugins defined',\n })\n }\n\n const pluginNames = new Set<string>()\n for (const [index, plugin] of data.plugins.entries()) {\n if (pluginNames.has(plugin.name)) {\n errors.push({\n path: `plugins[${index}].name`,\n message: `Duplicate plugin name \"${plugin.name}\"`,\n })\n }\n pluginNames.add(plugin.name)\n\n const source = plugin.source ?? './'\n const sourceErr = validateRelativePath(source)\n if (sourceErr) {\n errors.push({ path: `plugins[${index}].source`, message: sourceErr })\n }\n\n const marketplaceRoot = dirname(dirname(filePath))\n const pluginBase = safeResolveWithin(marketplaceRoot, source)\n if (!pluginBase) {\n errors.push({\n path: `plugins[${index}].source`,\n message: 'Invalid source path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n\n if (!existsSync(pluginBase) || !lstatSync(pluginBase).isDirectory()) {\n errors.push({\n path: `plugins[${index}].source`,\n message: `Source path not found: ${source}`,\n })\n continue\n }\n\n const skillPaths = plugin.skills ?? []\n for (const [j, rel] of skillPaths.entries()) {\n const err = validateRelativePath(rel)\n if (err) {\n errors.push({ path: `plugins[${index}].skills[${j}]`, message: err })\n continue\n }\n const abs = safeResolveWithin(pluginBase, rel)\n if (!abs) {\n errors.push({\n path: `plugins[${index}].skills[${j}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {\n errors.push({\n path: `plugins[${index}].skills[${j}]`,\n message: `Skill directory not found: ${rel}`,\n })\n continue\n }\n errors.push(\n ...validateSkillDir(abs).map(e => ({\n ...e,\n path: `plugins[${index}].skills[${j}]: ${e.path}`,\n })),\n )\n }\n\n const commandPaths = plugin.commands ?? []\n for (const [j, rel] of commandPaths.entries()) {\n const err = validateRelativePath(rel)\n if (err) {\n errors.push({ path: `plugins[${index}].commands[${j}]`, message: err })\n continue\n }\n const abs = safeResolveWithin(pluginBase, rel)\n if (!abs) {\n errors.push({\n path: `plugins[${index}].commands[${j}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {\n errors.push({\n path: `plugins[${index}].commands[${j}]`,\n message: `Command directory not found: ${rel}`,\n })\n }\n }\n }\n\n return {\n success: errors.length === 0,\n fileType: 'marketplace',\n filePath,\n errors,\n warnings,\n }\n}\n", "import { existsSync, lstatSync, readFileSync } from 'node:fs'\nimport { join, sep } from 'node:path'\n\nimport { parseFrontmatter } from '#cli-services/customCommands'\n\nimport type { ValidationIssue } from './types'\n\nfunction getStringField(obj: unknown, key: string): string {\n if (!obj || typeof obj !== 'object') return ''\n const record = obj as Record<string, unknown>\n const value = record[key]\n if (typeof value !== 'string') return ''\n return value.trim()\n}\n\nexport function validateSkillDir(skillDir: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n const name = skillDir.split(sep).pop() || ''\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name) || name.length > 64) {\n issues.push({\n path: `skills/${name}`,\n message:\n 'Invalid skill directory name (must be lowercase kebab-case, 1\u201364 chars)',\n })\n return issues\n }\n\n if (!existsSync(skillDir) || !lstatSync(skillDir).isDirectory()) {\n issues.push({\n path: `skills/${name}`,\n message: 'Skill directory not found',\n })\n return issues\n }\n\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) {\n issues.push({\n path: `skills/${name}`,\n message: 'Missing SKILL.md (or skill.md)',\n })\n return issues\n }\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter } = parseFrontmatter(raw)\n\n const declared = getStringField(frontmatter, 'name')\n if (!declared) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'Missing required frontmatter field: name',\n })\n } else if (declared !== name) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: `Frontmatter name must match directory name (dir=${name}, name=${declared})`,\n })\n }\n\n const description = getStringField(frontmatter, 'description')\n if (!description) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'Missing required frontmatter field: description',\n })\n } else if (description.length > 1024) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'description must be <= 1024 characters',\n })\n }\n } catch (err) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: `Failed to parse SKILL.md: ${err instanceof Error ? err.message : String(err)}`,\n })\n }\n\n return issues\n}\n", "import { existsSync, lstatSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { z } from 'zod'\n\nimport type { ValidationIssue, ValidationResult } from './types'\nimport { safeResolveWithin, validateRelativePath } from './utils'\n\nconst PluginManifestSchema = z\n .strictObject({\n name: z.string().min(1),\n version: z.string().optional(),\n description: z.string().optional(),\n author: z.unknown().optional(),\n homepage: z.string().optional(),\n repository: z.unknown().optional(),\n license: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n mcpServers: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n })\n .passthrough()\n\nexport function validatePluginJson(filePath: string): ValidationResult {\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n let raw: string\n try {\n raw = readFileSync(filePath, 'utf8')\n } catch (err) {\n return {\n success: false,\n fileType: 'plugin',\n filePath,\n errors: [\n { path: 'file', message: `Failed to read file: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n return {\n success: false,\n fileType: 'plugin',\n filePath,\n errors: [\n { path: 'json', message: `Invalid JSON syntax: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n const parsed = PluginManifestSchema.safeParse(json)\n if (!parsed.success) {\n errors.push(\n ...parsed.error.issues.map(i => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n )\n return { success: false, fileType: 'plugin', filePath, errors, warnings }\n }\n\n const data = parsed.data\n\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(data.name)) {\n errors.push({\n path: 'name',\n message: 'Must be kebab-case and start with a letter',\n })\n }\n\n if (\n data.version &&\n !/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.test(\n data.version,\n )\n ) {\n errors.push({\n path: 'version',\n message: 'Invalid semantic version (expected MAJOR.MINOR.PATCH)',\n })\n }\n\n if (data.homepage) {\n try {\n // eslint-disable-next-line no-new\n new URL(data.homepage)\n } catch {\n errors.push({ path: 'homepage', message: 'Invalid URL' })\n }\n }\n\n if (typeof data.repository === 'string') {\n try {\n // eslint-disable-next-line no-new\n new URL(data.repository)\n } catch {\n errors.push({ path: 'repository', message: 'Invalid URL' })\n }\n }\n\n if (!data.version) {\n warnings.push({\n path: 'version',\n message:\n 'No version specified. Consider adding a version following semver (e.g., \"1.0.0\")',\n })\n }\n\n if (!data.description) {\n warnings.push({\n path: 'description',\n message:\n 'No description provided. Adding a description helps users understand what your plugin does',\n })\n }\n\n if (!data.author) {\n warnings.push({\n path: 'author',\n message:\n 'No author information provided. Consider adding author details for plugin attribution',\n })\n }\n\n const pluginRoot = dirname(dirname(filePath))\n\n const validatePathList = (field: string, value: unknown) => {\n if (!value) return\n const values = Array.isArray(value) ? value : [value]\n for (const [idx, p] of values.entries()) {\n if (typeof p !== 'string') continue\n const err = validateRelativePath(p)\n if (err) errors.push({ path: `${field}[${idx}]`, message: err })\n const abs = safeResolveWithin(pluginRoot, p)\n if (!abs) {\n errors.push({\n path: `${field}[${idx}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n } else if (!existsSync(abs)) {\n errors.push({\n path: `${field}[${idx}]`,\n message: `Path not found: ${p}`,\n })\n }\n }\n }\n\n validatePathList('commands', data.commands)\n validatePathList('agents', data.agents)\n validatePathList('skills', data.skills)\n\n if (typeof data.hooks === 'string') validatePathList('hooks', data.hooks)\n if (typeof data.mcpServers === 'string')\n validatePathList('mcpServers', data.mcpServers)\n\n // If plugin root looks like a plugin directory, warn if the manifests are missing.\n const pluginManifest = join(pluginRoot, '.kode-plugin', 'plugin.json')\n if (\n !existsSync(pluginManifest) &&\n lstatSync(dirname(filePath)).isDirectory()\n ) {\n warnings.push({\n path: 'plugin.json',\n message: 'Manifest is not under .kode-plugin/plugin.json',\n })\n }\n\n return {\n success: errors.length === 0,\n fileType: 'plugin',\n filePath,\n errors,\n warnings,\n }\n}\n", "import figures from 'figures'\n\nimport type { ValidationResult } from './types'\n\nexport function formatValidationResult(result: ValidationResult): string {\n const lines: string[] = []\n for (const err of result.errors) {\n lines.push(` ${figures.pointer} ${err.path}: ${err.message}`)\n }\n for (const warn of result.warnings) {\n lines.push(` ${figures.pointer} ${warn.path}: ${warn.message}`)\n }\n\n lines.push('')\n\n if (result.success) {\n lines.push(\n result.warnings.length > 0\n ? `${figures.tick} Validation passed with warnings`\n : `${figures.tick} Validation passed`,\n )\n } else {\n lines.push(`${figures.cross} Validation failed`)\n }\n\n return lines.join('\\n')\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "lstatSync", "readFileSync", "join", "existsSync", "lstatSync", "readFileSync", "sep", "sep", "readFileSync", "existsSync", "lstatSync", "existsSync", "lstatSync", "readFileSync", "dirname", "join", "readFileSync", "dirname", "existsSync", "join", "lstatSync", "existsSync", "lstatSync", "join", "readFileSync"]
7
+ }
File without changes
@@ -1,64 +1,26 @@
1
- import { createRequire as __kodeCreateRequire } from "node:module";
2
- const require = __kodeCreateRequire(import.meta.url);
3
- import {
4
- getSettingsFileCandidates,
5
- loadSettingsWithLegacyFallback,
6
- saveSettingsToPrimaryAndSyncLegacy
7
- } from "./chunk-VBXVYQYY.js";
8
- import {
9
- isSettingSourceEnabled
10
- } from "./chunk-UKHTVRJM.js";
11
1
  import {
12
2
  getSessionPlugins
13
- } from "./chunk-S3J2TLV6.js";
3
+ } from "./chunk-M7P3QNRU.js";
14
4
  import {
15
5
  getCwd
16
- } from "./chunk-MN77D2F7.js";
6
+ } from "./chunk-BBJFHTBC.js";
7
+ import {
8
+ isSettingSourceEnabled,
9
+ readLocalSettings,
10
+ updateLocalSettings
11
+ } from "./chunk-XR2W3MAM.js";
17
12
 
18
- // src/services/ui/outputStyles.ts
13
+ // apps/cli/src/services/outputStyles.ts
19
14
  import figures from "figures";
20
15
  import { memoize } from "lodash-es";
16
+ import { statSync as statSync2 } from "node:fs";
17
+ import { basename, join as join2 } from "path";
18
+
19
+ // apps/cli/src/services/outputStyles/filesystem.ts
21
20
  import { existsSync, readdirSync, readFileSync, statSync } from "fs";
22
- import { basename, dirname, join, resolve } from "path";
21
+ import { dirname, join, resolve } from "path";
23
22
  import { homedir } from "os";
24
23
  import matter from "gray-matter";
25
- import yaml from "js-yaml";
26
-
27
- // src/utils/config/localSettings.ts
28
- function readLocalSettings(options) {
29
- const projectDir = options?.projectDir ?? getCwd();
30
- const loaded = loadSettingsWithLegacyFallback({
31
- destination: "localSettings",
32
- projectDir,
33
- migrateToPrimary: true
34
- });
35
- return loaded.settings ?? {};
36
- }
37
- function updateLocalSettings(patch, options) {
38
- const projectDir = options?.projectDir ?? getCwd();
39
- const candidates = getSettingsFileCandidates({
40
- destination: "localSettings",
41
- projectDir
42
- });
43
- const existing = (candidates ? loadSettingsWithLegacyFallback({
44
- destination: "localSettings",
45
- projectDir,
46
- migrateToPrimary: true
47
- }).settings : null) ?? {};
48
- const next = { ...existing, ...patch };
49
- if (candidates) {
50
- saveSettingsToPrimaryAndSyncLegacy({
51
- destination: "localSettings",
52
- projectDir,
53
- settings: next,
54
- syncLegacyIfExists: true
55
- });
56
- }
57
- return next;
58
- }
59
-
60
- // src/services/ui/outputStyles.ts
61
- var DEFAULT_OUTPUT_STYLE = "default";
62
24
  function normalizeString(value) {
63
25
  if (typeof value !== "string") return null;
64
26
  const trimmed = value.trim();
@@ -79,7 +41,8 @@ function getUserConfigBaseDirs() {
79
41
  const hasAnyOverride = typeof process.env.CLAUDE_CONFIG_DIR === "string" || typeof process.env.KODE_CONFIG_DIR === "string";
80
42
  const claudeBase = normalizeString(process.env.CLAUDE_CONFIG_DIR);
81
43
  const kodeBase = normalizeString(process.env.KODE_CONFIG_DIR);
82
- if (claudeBase) out.push({ claude: resolve(claudeBase), kode: resolve(claudeBase) });
44
+ if (claudeBase)
45
+ out.push({ claude: resolve(claudeBase), kode: resolve(claudeBase) });
83
46
  if (kodeBase) out.push({ claude: resolve(kodeBase), kode: resolve(kodeBase) });
84
47
  if (hasAnyOverride) {
85
48
  return dedupeConfigBases(out);
@@ -141,7 +104,7 @@ function listMarkdownFilesRecursively(rootDir) {
141
104
  visitedDirs.add(dirKey);
142
105
  let entries;
143
106
  try {
144
- entries = readdirSync(dirPath, { withFileTypes: true, encoding: "utf8" });
107
+ entries = readdirSync(dirPath, { withFileTypes: true });
145
108
  } catch {
146
109
  return;
147
110
  }
@@ -174,19 +137,18 @@ function listMarkdownFilesRecursively(rootDir) {
174
137
  walk(rootDir);
175
138
  return files;
176
139
  }
140
+ function asRecord(value) {
141
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
142
+ return value;
143
+ }
177
144
  function readMarkdownFile(filePath) {
178
145
  try {
179
146
  const raw = readFileSync(filePath, "utf8");
180
- const yamlSchema = yaml.JSON_SCHEMA;
181
- const matterOptions = {
182
- engines: {
183
- yaml: {
184
- parse: (input) => yaml.load(input, yamlSchema ? { schema: yamlSchema } : void 0) ?? {}
185
- }
186
- }
147
+ const parsed = matter(raw);
148
+ return {
149
+ frontmatter: asRecord(parsed.data),
150
+ content: String(parsed.content ?? "")
187
151
  };
188
- const parsed = matter(raw, matterOptions);
189
- return { frontmatter: parsed.data ?? {}, content: String(parsed.content ?? "") };
190
152
  } catch {
191
153
  return null;
192
154
  }
@@ -194,14 +156,14 @@ function readMarkdownFile(filePath) {
194
156
  function inodeKeyForPath(filePath) {
195
157
  try {
196
158
  const st = statSync(filePath);
197
- if (typeof st.dev === "number" && typeof st.ino === "number") {
198
- return `${st.dev}:${st.ino}`;
199
- }
200
- return null;
159
+ return `${st.dev}:${st.ino}`;
201
160
  } catch {
202
161
  return null;
203
162
  }
204
163
  }
164
+
165
+ // apps/cli/src/services/outputStyles.ts
166
+ var DEFAULT_OUTPUT_STYLE = "default";
205
167
  var INSIGHTS_SECTION = `
206
168
  ## Insights
207
169
  In order to encourage learning, before and after writing code, always provide brief educational explanations about implementation choices using (with backticks):
@@ -359,7 +321,7 @@ function loadPluginOutputStyles() {
359
321
  for (const dir of plugin.outputStylesDirs ?? []) {
360
322
  let st;
361
323
  try {
362
- st = statSync(dir);
324
+ st = statSync2(dir);
363
325
  } catch {
364
326
  continue;
365
327
  }
@@ -391,11 +353,7 @@ function loadPluginOutputStyles() {
391
353
  function loadCustomOutputStyles(options) {
392
354
  const out = [];
393
355
  const seen = /* @__PURE__ */ new Set();
394
- const policyDir = join(
395
- getClaudePolicyBaseDir(),
396
- ".claude",
397
- "output-styles"
398
- );
356
+ const policyDir = join2(getClaudePolicyBaseDir(), ".claude", "output-styles");
399
357
  for (const filePath of listMarkdownFilesRecursively(policyDir)) {
400
358
  const inodeKey = inodeKeyForPath(filePath);
401
359
  const dedupeKey = inodeKey ? `inode:${inodeKey}` : `path:${filePath}`;
@@ -411,7 +369,7 @@ function loadCustomOutputStyles(options) {
411
369
  const userBases = getUserConfigBaseDirs();
412
370
  for (const base of userBases) {
413
371
  for (const userBaseDir of /* @__PURE__ */ new Set([base.claude, base.kode])) {
414
- const dirPath = join(userBaseDir, "output-styles");
372
+ const dirPath = join2(userBaseDir, "output-styles");
415
373
  for (const filePath of listMarkdownFilesRecursively(dirPath)) {
416
374
  const inodeKey = inodeKeyForPath(filePath);
417
375
  const dedupeKey = inodeKey ? `inode:${inodeKey}` : `path:${filePath}`;
@@ -460,8 +418,7 @@ var getAvailableOutputStyles = memoize(() => {
460
418
  return merged;
461
419
  });
462
420
  function clearOutputStyleCache() {
463
- ;
464
- getAvailableOutputStyles.cache?.clear?.();
421
+ getAvailableOutputStyles.cache.clear?.();
465
422
  }
466
423
  function getCurrentOutputStyle() {
467
424
  if (!isSettingSourceEnabled("localSettings")) return DEFAULT_OUTPUT_STYLE;