@claude-collective/cli 0.13.4 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/CHANGELOG.md +357 -0
  2. package/README.md +41 -27
  3. package/config/skills-matrix.yaml +202 -134
  4. package/config/stacks.yaml +14 -20
  5. package/dist/chunk-3X5D7RM5.js +69 -0
  6. package/dist/chunk-3X5D7RM5.js.map +1 -0
  7. package/dist/chunk-4S4FCAA2.js +100 -0
  8. package/dist/chunk-4S4FCAA2.js.map +1 -0
  9. package/dist/chunk-4WGN6SUE.js +197 -0
  10. package/dist/chunk-4WGN6SUE.js.map +1 -0
  11. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  12. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  13. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  14. package/dist/chunk-DBRUQQUF.js.map +1 -0
  15. package/dist/{chunk-Z7G4B5HJ.js → chunk-ETCVEV3S.js} +73 -150
  16. package/dist/chunk-ETCVEV3S.js.map +1 -0
  17. package/dist/chunk-F4RD5FYM.js +45 -0
  18. package/dist/chunk-F4RD5FYM.js.map +1 -0
  19. package/dist/{chunk-ACNBKXXJ.js → chunk-GGFOD5PK.js} +13 -44
  20. package/dist/chunk-GGFOD5PK.js.map +1 -0
  21. package/dist/chunk-H7SSBSPR.js +29 -0
  22. package/dist/chunk-H7SSBSPR.js.map +1 -0
  23. package/dist/chunk-HWD32NP7.js +19 -0
  24. package/dist/chunk-HWD32NP7.js.map +1 -0
  25. package/dist/{chunk-JIPWV2FX.js → chunk-IAYAE6MG.js} +12 -34
  26. package/dist/chunk-IAYAE6MG.js.map +1 -0
  27. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  28. package/dist/chunk-IXBCRT3F.js.map +1 -0
  29. package/dist/chunk-KWYO3M5Q.js +67 -0
  30. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  31. package/dist/{chunk-E3FJH4TF.js → chunk-MCTSHLAF.js} +18 -18
  32. package/dist/chunk-MCTSHLAF.js.map +1 -0
  33. package/dist/chunk-MH66WDFV.js +251 -0
  34. package/dist/chunk-MH66WDFV.js.map +1 -0
  35. package/dist/{chunk-K3NB6DSG.js → chunk-MTPM7BX5.js} +108 -110
  36. package/dist/chunk-MTPM7BX5.js.map +1 -0
  37. package/dist/chunk-NQJ47R4N.js +1092 -0
  38. package/dist/chunk-NQJ47R4N.js.map +1 -0
  39. package/dist/chunk-NRC7XYCI.js +211 -0
  40. package/dist/chunk-NRC7XYCI.js.map +1 -0
  41. package/dist/{chunk-76DWXGQE.js → chunk-O6ZTD7ZI.js} +14 -3
  42. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  43. package/dist/chunk-OBXAY23Y.js +56 -0
  44. package/dist/chunk-OBXAY23Y.js.map +1 -0
  45. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  46. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  47. package/dist/{chunk-D237EVNB.js → chunk-TMED5DQ2.js} +71 -48
  48. package/dist/chunk-TMED5DQ2.js.map +1 -0
  49. package/dist/chunk-U7HFKR74.js +21 -0
  50. package/dist/chunk-U7HFKR74.js.map +1 -0
  51. package/dist/chunk-UEMRJI2K.js +146 -0
  52. package/dist/chunk-UEMRJI2K.js.map +1 -0
  53. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  54. package/dist/chunk-V2ZIH7HV.js +29 -0
  55. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  56. package/dist/{chunk-X6QONICW.js → chunk-VVYNZZUX.js} +7 -19
  57. package/dist/chunk-VVYNZZUX.js.map +1 -0
  58. package/dist/chunk-WXS4S3MA.js +220 -0
  59. package/dist/chunk-WXS4S3MA.js.map +1 -0
  60. package/dist/{chunk-CDX4W4DM.js → chunk-XENOESJZ.js} +53 -33
  61. package/dist/chunk-XENOESJZ.js.map +1 -0
  62. package/dist/chunk-YDBSSAJ6.js +4207 -0
  63. package/dist/chunk-YDBSSAJ6.js.map +1 -0
  64. package/dist/chunk-ZDREFYD2.js +696 -0
  65. package/dist/chunk-ZDREFYD2.js.map +1 -0
  66. package/dist/chunk-ZW2PELOH.js +197 -0
  67. package/dist/chunk-ZW2PELOH.js.map +1 -0
  68. package/dist/cli/defaults/agent-mappings.yaml +13 -14
  69. package/dist/commands/build/marketplace.js +19 -23
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +13 -240
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +13 -25
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +45 -82
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/get.js +9 -9
  78. package/dist/commands/config/get.js.map +1 -1
  79. package/dist/commands/config/index.js +8 -8
  80. package/dist/commands/config/index.js.map +1 -1
  81. package/dist/commands/config/path.js +7 -9
  82. package/dist/commands/config/path.js.map +1 -1
  83. package/dist/commands/config/set-project.js +12 -13
  84. package/dist/commands/config/set-project.js.map +1 -1
  85. package/dist/commands/config/show.js +7 -7
  86. package/dist/commands/config/unset-project.js +12 -13
  87. package/dist/commands/config/unset-project.js.map +1 -1
  88. package/dist/commands/diff.js +15 -44
  89. package/dist/commands/diff.js.map +1 -1
  90. package/dist/commands/doctor.js +23 -67
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/edit.js +98 -81
  93. package/dist/commands/edit.js.map +1 -1
  94. package/dist/commands/eject.js +27 -79
  95. package/dist/commands/eject.js.map +1 -1
  96. package/dist/commands/import/skill.js +38 -58
  97. package/dist/commands/import/skill.js.map +1 -1
  98. package/dist/commands/info.js +17 -24
  99. package/dist/commands/info.js.map +1 -1
  100. package/dist/commands/init.js +103 -779
  101. package/dist/commands/init.js.map +1 -1
  102. package/dist/commands/list.js +8 -11
  103. package/dist/commands/list.js.map +1 -1
  104. package/dist/commands/new/agent.js +11 -16
  105. package/dist/commands/new/agent.js.map +1 -1
  106. package/dist/commands/new/skill.js +14 -18
  107. package/dist/commands/new/skill.js.map +1 -1
  108. package/dist/commands/outdated.js +16 -97
  109. package/dist/commands/outdated.js.map +1 -1
  110. package/dist/commands/search.js +24 -43
  111. package/dist/commands/search.js.map +1 -1
  112. package/dist/commands/uninstall.js +22 -30
  113. package/dist/commands/uninstall.js.map +1 -1
  114. package/dist/commands/update.js +23 -154
  115. package/dist/commands/update.js.map +1 -1
  116. package/dist/commands/validate.js +38 -89
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/commands/version/bump.js +12 -28
  119. package/dist/commands/version/bump.js.map +1 -1
  120. package/dist/commands/version/index.js +8 -24
  121. package/dist/commands/version/index.js.map +1 -1
  122. package/dist/commands/version/set.js +11 -26
  123. package/dist/commands/version/set.js.map +1 -1
  124. package/dist/commands/version/show.js +8 -24
  125. package/dist/commands/version/show.js.map +1 -1
  126. package/dist/components/common/confirm.js +2 -2
  127. package/dist/components/common/confirm.test.js +203 -0
  128. package/dist/components/common/confirm.test.js.map +1 -0
  129. package/dist/components/common/message.js +3 -7
  130. package/dist/components/common/message.js.map +1 -1
  131. package/dist/components/common/spinner.js +1 -1
  132. package/dist/components/common/spinner.js.map +1 -1
  133. package/dist/components/skill-search/skill-search.js +3 -3
  134. package/dist/components/wizard/category-grid.js +2 -2
  135. package/dist/components/wizard/category-grid.test.js +138 -156
  136. package/dist/components/wizard/category-grid.test.js.map +1 -1
  137. package/dist/components/wizard/menu-item.js +9 -0
  138. package/dist/components/wizard/search-modal.js +9 -0
  139. package/dist/components/wizard/search-modal.test.js +216 -0
  140. package/dist/components/wizard/search-modal.test.js.map +1 -0
  141. package/dist/components/wizard/section-progress.js +2 -2
  142. package/dist/components/wizard/section-progress.test.js +16 -106
  143. package/dist/components/wizard/section-progress.test.js.map +1 -1
  144. package/dist/components/wizard/source-grid.js +10 -0
  145. package/dist/components/wizard/source-grid.js.map +1 -0
  146. package/dist/components/wizard/source-grid.test.js +500 -0
  147. package/dist/components/wizard/source-grid.test.js.map +1 -0
  148. package/dist/components/wizard/step-approach.js +7 -5
  149. package/dist/components/wizard/step-approach.test.js +115 -0
  150. package/dist/components/wizard/step-approach.test.js.map +1 -0
  151. package/dist/components/wizard/step-build.js +9 -5
  152. package/dist/components/wizard/step-build.test.js +160 -284
  153. package/dist/components/wizard/step-build.test.js.map +1 -1
  154. package/dist/components/wizard/step-confirm.js +3 -3
  155. package/dist/components/wizard/step-confirm.test.js +364 -0
  156. package/dist/components/wizard/step-confirm.test.js.map +1 -0
  157. package/dist/components/wizard/step-refine.js +2 -3
  158. package/dist/components/wizard/step-refine.test.js +24 -26
  159. package/dist/components/wizard/step-refine.test.js.map +1 -1
  160. package/dist/components/wizard/step-settings.js +14 -0
  161. package/dist/components/wizard/step-settings.js.map +1 -0
  162. package/dist/components/wizard/step-settings.test.js +240 -0
  163. package/dist/components/wizard/step-settings.test.js.map +1 -0
  164. package/dist/components/wizard/step-sources.js +17 -0
  165. package/dist/components/wizard/step-sources.js.map +1 -0
  166. package/dist/components/wizard/step-sources.test.js +290 -0
  167. package/dist/components/wizard/step-sources.test.js.map +1 -0
  168. package/dist/components/wizard/step-stack.js +7 -4
  169. package/dist/components/wizard/step-stack.test.js +344 -0
  170. package/dist/components/wizard/step-stack.test.js.map +1 -0
  171. package/dist/components/wizard/view-title.js +9 -0
  172. package/dist/components/wizard/view-title.js.map +1 -0
  173. package/dist/components/wizard/wizard-layout.js +17 -0
  174. package/dist/components/wizard/wizard-layout.js.map +1 -0
  175. package/dist/components/wizard/wizard-tabs.js +2 -2
  176. package/dist/components/wizard/wizard-tabs.test.js +292 -0
  177. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  178. package/dist/components/wizard/wizard.js +22 -15
  179. package/dist/config/skills-matrix.yaml +202 -134
  180. package/dist/config/stacks.yaml +14 -20
  181. package/dist/hooks/init.js +6 -8
  182. package/dist/hooks/init.js.map +1 -1
  183. package/dist/index.js +1 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
  186. package/dist/source-manager-DSYZEVGZ.js +16 -0
  187. package/dist/source-manager-DSYZEVGZ.js.map +1 -0
  188. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  189. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  190. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  191. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  192. package/dist/src/agents/developer/web-developer/examples.md +1 -6
  193. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  194. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  195. package/dist/src/agents/meta/documentor/workflow.md +1 -5
  196. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  197. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  198. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  199. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  200. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  201. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  202. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  203. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  204. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  205. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  206. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  207. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  208. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  209. package/dist/src/agents/tester/web-tester/output-format.md +1 -3
  210. package/dist/stores/wizard-store.js +4 -3
  211. package/dist/stores/wizard-store.test.js +94 -88
  212. package/dist/stores/wizard-store.test.js.map +1 -1
  213. package/package.json +5 -3
  214. package/src/agents/developer/api-developer/agent.yaml +1 -1
  215. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  216. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  217. package/src/agents/developer/web-developer/agent.yaml +1 -1
  218. package/src/agents/developer/web-developer/examples.md +1 -6
  219. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  220. package/src/agents/meta/documentor/agent.yaml +1 -1
  221. package/src/agents/meta/documentor/workflow.md +1 -5
  222. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  223. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  224. package/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  225. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  226. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  227. package/src/agents/planning/web-pm/agent.yaml +1 -1
  228. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  229. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  230. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  231. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  232. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  233. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  234. package/src/agents/tester/web-tester/agent.yaml +1 -1
  235. package/src/agents/tester/web-tester/output-format.md +1 -3
  236. package/dist/chunk-3U3R4NCG.js +0 -22
  237. package/dist/chunk-3U3R4NCG.js.map +0 -1
  238. package/dist/chunk-4K4ZXQRM.js +0 -317
  239. package/dist/chunk-4K4ZXQRM.js.map +0 -1
  240. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  241. package/dist/chunk-76DWXGQE.js.map +0 -1
  242. package/dist/chunk-7Q44DMSP.js +0 -582
  243. package/dist/chunk-7Q44DMSP.js.map +0 -1
  244. package/dist/chunk-ACNBKXXJ.js.map +0 -1
  245. package/dist/chunk-B7CCVP6Q.js +0 -639
  246. package/dist/chunk-B7CCVP6Q.js.map +0 -1
  247. package/dist/chunk-BDLUZVKU.js +0 -54
  248. package/dist/chunk-BDLUZVKU.js.map +0 -1
  249. package/dist/chunk-CDX4W4DM.js.map +0 -1
  250. package/dist/chunk-D237EVNB.js.map +0 -1
  251. package/dist/chunk-DRXPNNPB.js +0 -393
  252. package/dist/chunk-DRXPNNPB.js.map +0 -1
  253. package/dist/chunk-E3FJH4TF.js.map +0 -1
  254. package/dist/chunk-ED4E6Q2T.js +0 -114
  255. package/dist/chunk-ED4E6Q2T.js.map +0 -1
  256. package/dist/chunk-EHS3TWWP.js +0 -95
  257. package/dist/chunk-EHS3TWWP.js.map +0 -1
  258. package/dist/chunk-GDH553MV.js +0 -91
  259. package/dist/chunk-GDH553MV.js.map +0 -1
  260. package/dist/chunk-HLJX2FTL.js +0 -95
  261. package/dist/chunk-HLJX2FTL.js.map +0 -1
  262. package/dist/chunk-I2DSLOXZ.js +0 -75
  263. package/dist/chunk-I2DSLOXZ.js.map +0 -1
  264. package/dist/chunk-I4TPKIYX.js +0 -493
  265. package/dist/chunk-I4TPKIYX.js.map +0 -1
  266. package/dist/chunk-IAUAQJQ2.js +0 -57
  267. package/dist/chunk-IAUAQJQ2.js.map +0 -1
  268. package/dist/chunk-IBE7JIAG.js +0 -129
  269. package/dist/chunk-IBE7JIAG.js.map +0 -1
  270. package/dist/chunk-IMDW5ZUP.js +0 -132
  271. package/dist/chunk-IMDW5ZUP.js.map +0 -1
  272. package/dist/chunk-JIPWV2FX.js.map +0 -1
  273. package/dist/chunk-K3NB6DSG.js.map +0 -1
  274. package/dist/chunk-K7EVM5LY.js +0 -141
  275. package/dist/chunk-K7EVM5LY.js.map +0 -1
  276. package/dist/chunk-KAAEN2PO.js +0 -57
  277. package/dist/chunk-KAAEN2PO.js.map +0 -1
  278. package/dist/chunk-NDY25DTL.js +0 -453
  279. package/dist/chunk-NDY25DTL.js.map +0 -1
  280. package/dist/chunk-P26A2K5N.js +0 -64
  281. package/dist/chunk-P26A2K5N.js.map +0 -1
  282. package/dist/chunk-RFTSZDHV.js +0 -313
  283. package/dist/chunk-RFTSZDHV.js.map +0 -1
  284. package/dist/chunk-RTE64SJA.js.map +0 -1
  285. package/dist/chunk-SVYPSDWY.js +0 -84
  286. package/dist/chunk-SVYPSDWY.js.map +0 -1
  287. package/dist/chunk-TKFPKEV3.js +0 -69
  288. package/dist/chunk-TKFPKEV3.js.map +0 -1
  289. package/dist/chunk-UQTEPWU7.js +0 -108
  290. package/dist/chunk-UQTEPWU7.js.map +0 -1
  291. package/dist/chunk-V46GGCCI.js +0 -294
  292. package/dist/chunk-V46GGCCI.js.map +0 -1
  293. package/dist/chunk-X6QONICW.js.map +0 -1
  294. package/dist/chunk-Y2LW7R3Y.js +0 -23
  295. package/dist/chunk-Y2LW7R3Y.js.map +0 -1
  296. package/dist/chunk-Z7G4B5HJ.js.map +0 -1
  297. package/dist/chunk-ZENYS6KW.js +0 -90
  298. package/dist/chunk-ZENYS6KW.js.map +0 -1
  299. package/dist/chunk-ZFPSUQOU.js +0 -396
  300. package/dist/chunk-ZFPSUQOU.js.map +0 -1
  301. package/dist/commands/config/set.js +0 -61
  302. package/dist/commands/config/set.js.map +0 -1
  303. package/dist/commands/config/unset.js +0 -57
  304. package/dist/commands/config/unset.js.map +0 -1
  305. package/dist/commands/test-imports.js +0 -92
  306. package/dist/commands/test-imports.js.map +0 -1
  307. package/dist/components/wizard/step-stack-options.js +0 -11
  308. package/dist/components/wizard/wizard-footer.js +0 -9
  309. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  310. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  311. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  312. /package/dist/components/wizard/{step-stack-options.js.map → menu-item.js.map} +0 -0
  313. /package/dist/components/wizard/{wizard-footer.js.map → search-modal.js.map} +0 -0
  314. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/schema-validator.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n validateAllSchemas,\n printValidationResults,\n} from \"../lib/schema-validator.js\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugin-validator.js\";\n\nexport default class Validate extends BaseCommand {\n static summary =\n \"Validate YAML files against schemas or validate compiled plugins\";\n static description =\n \"Validates skill/agent YAML files against JSON schemas, or validates compiled plugin structure and content. \" +\n \"Without arguments, validates all YAML files in the current directory against their schemas. \" +\n \"With a path argument or --plugins flag, validates plugin(s) instead.\";\n\n static args = {\n path: Args.string({\n description: \"Path to plugin or plugins directory to validate\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n all: Flags.boolean({\n char: \"a\",\n description: \"Validate all plugins in directory\",\n default: false,\n }),\n plugins: Flags.boolean({\n char: \"p\",\n description: \"Validate plugins instead of schemas\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Validate);\n\n if (args.path || flags.plugins) {\n await this.validatePlugins(args.path, flags.verbose, flags.all);\n } else {\n await this.validateSchemas();\n }\n }\n\n private async validateSchemas(): Promise<void> {\n this.log(\"\");\n this.log(\"Validating all schemas\");\n this.log(\"\");\n\n try {\n const result = await validateAllSchemas();\n\n const summary = result.valid\n ? `Done: ${result.summary.validFiles}/${result.summary.totalFiles} files valid`\n : `Done: ${result.summary.invalidFiles} invalid files`;\n\n this.log(summary);\n printValidationResults(result);\n\n if (!result.valid) {\n this.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validatePlugins(\n pluginPath: string | undefined,\n verbose: boolean,\n all: boolean,\n ): Promise<void> {\n const targetPath = pluginPath ? path.resolve(pluginPath) : process.cwd();\n\n if (all) {\n await this.validateAllPluginsInDirectory(targetPath, verbose);\n } else {\n await this.validateSinglePlugin(targetPath, verbose);\n }\n }\n\n private async validateAllPluginsInDirectory(\n targetPath: string,\n verbose: boolean,\n ): Promise<void> {\n this.log(\"\");\n this.log(`Validating all plugins in: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validateAllPlugins(targetPath);\n\n const summary = result.valid\n ? `Done: ${result.summary.valid}/${result.summary.total} plugins valid`\n : `Done: ${result.summary.invalid} invalid plugins`;\n\n this.log(summary);\n\n this.log(\"\");\n this.log(\" Plugin Validation Summary:\");\n this.log(\" -------------------------\");\n this.log(` Total plugins: ${result.summary.total}`);\n this.log(` Valid: ${result.summary.valid}`);\n this.log(` Invalid: ${result.summary.invalid}`);\n this.log(` With warnings: ${result.summary.withWarnings}`);\n\n for (const { name, result: pluginResult } of result.results) {\n printPluginValidationResult(name, pluginResult, verbose);\n }\n\n if (result.valid) {\n this.log(\"\");\n this.logSuccess(\"All plugins validated successfully\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(\"Validation failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateSinglePlugin(\n targetPath: string,\n verbose: boolean,\n ): Promise<void> {\n this.log(\"\");\n this.log(`Validating plugin: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validatePlugin(targetPath);\n\n const summary = result.valid\n ? \"Done: Plugin is valid\"\n : \"Done: Plugin has errors\";\n\n this.log(summary);\n\n printPluginValidationResult(path.basename(targetPath), result, true);\n\n if (result.valid && result.warnings.length === 0) {\n this.log(\"\");\n this.logSuccess(\"Plugin validated successfully\");\n this.log(\"\");\n } else if (result.valid) {\n this.log(\"\");\n this.logWarning(\"Plugin valid with warnings\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(\"Validation failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n","import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport path from \"path\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport { PROJECT_ROOT } from \"../consts\";\n\nexport interface FileValidationError {\n file: string;\n errors: string[];\n}\n\nexport interface SchemaValidationResult {\n schemaName: string;\n valid: boolean;\n totalFiles: number;\n validFiles: number;\n invalidFiles: FileValidationError[];\n}\n\nexport interface FullValidationResult {\n valid: boolean;\n results: SchemaValidationResult[];\n summary: {\n totalSchemas: number;\n totalFiles: number;\n validFiles: number;\n invalidFiles: number;\n };\n}\n\ntype ContentExtractor = (content: string) => unknown | null;\n\ninterface ValidationTarget {\n name: string;\n schema: string;\n pattern: string;\n baseDir: string;\n extractor?: ContentExtractor;\n}\n\nfunction extractFrontmatter(content: string): unknown | null {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match || !match[1]) {\n return null;\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return null;\n }\n}\n\nconst VALIDATION_TARGETS: ValidationTarget[] = [\n {\n name: \"Skills Matrix\",\n schema: \"skills-matrix.schema.json\",\n pattern: \"skills-matrix.yaml\",\n baseDir: \"src/config\",\n },\n {\n name: \"Skill Metadata\",\n schema: \"metadata.schema.json\",\n pattern: \"**/metadata.yaml\",\n baseDir: \"src/skills\",\n },\n {\n name: \"Stack Skill Metadata\",\n schema: \"metadata.schema.json\",\n pattern: \"**/skills/**/metadata.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Stack Config\",\n schema: \"stack.schema.json\",\n pattern: \"*/config.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Agent Definition\",\n schema: \"agent.schema.json\",\n pattern: \"**/agent.yaml\",\n baseDir: \"src/agents\",\n },\n {\n name: \"Skill Frontmatter\",\n schema: \"skill-frontmatter.schema.json\",\n pattern: \"**/SKILL.md\",\n baseDir: \"src/skills\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stack Skill Frontmatter\",\n schema: \"skill-frontmatter.schema.json\",\n pattern: \"**/skills/**/SKILL.md\",\n baseDir: \"src/stacks\",\n extractor: extractFrontmatter,\n },\n];\n\nconst schemaCache = new Map<string, object>();\nconst validatorCache = new Map<string, ValidateFunction>();\n\nasync function loadSchema(\n schemaName: string,\n rootDir: string = process.cwd(),\n): Promise<object> {\n const cacheKey = `${rootDir}:${schemaName}`;\n if (schemaCache.has(cacheKey)) {\n return schemaCache.get(cacheKey)!;\n }\n\n // Try multiple locations for schema files:\n // 1. CLI repo's schemas (for agent schemas)\n // 2. Target directory's schemas (for stack/skill schemas in claude-subagents)\n const locations = [\n path.join(PROJECT_ROOT, \"src\", \"schemas\", schemaName),\n path.join(rootDir, \"src\", \"schemas\", schemaName),\n ];\n\n for (const schemaPath of locations) {\n if (await fileExists(schemaPath)) {\n const content = await readFile(schemaPath);\n const schema = JSON.parse(content);\n schemaCache.set(cacheKey, schema);\n return schema;\n }\n }\n\n throw new Error(\n `Schema not found: ${schemaName}. Searched: ${locations.join(\", \")}`,\n );\n}\n\nasync function getValidator(\n schemaName: string,\n rootDir: string = process.cwd(),\n): Promise<ValidateFunction> {\n const cacheKey = `${rootDir}:${schemaName}`;\n if (validatorCache.has(cacheKey)) {\n return validatorCache.get(cacheKey)!;\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(ajv);\n const schema = await loadSchema(schemaName, rootDir);\n const validate = ajv.compile(schema);\n validatorCache.set(cacheKey, validate);\n return validate;\n}\n\nfunction formatAjvErrors(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors) return [];\n\n return errors.map((err) => {\n const errorPath = err.instancePath\n ? err.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\")\n : \"\";\n const message = err.message || \"Unknown error\";\n\n if (err.keyword === \"additionalProperties\") {\n const prop = (err.params as { additionalProperty?: string })\n .additionalProperty;\n return `Unrecognized key: \"${prop}\"`;\n }\n\n if (err.keyword === \"enum\") {\n const allowed = (err.params as { allowedValues?: string[] })\n .allowedValues;\n return errorPath\n ? `${errorPath}: ${message}. Allowed: ${allowed?.join(\", \")}`\n : `${message}. Allowed: ${allowed?.join(\", \")}`;\n }\n\n return errorPath ? `${errorPath}: ${message}` : message;\n });\n}\n\nasync function validateFile(\n filePath: string,\n validate: ValidateFunction,\n extractor?: ContentExtractor,\n): Promise<{ valid: boolean; errors: string[] }> {\n try {\n if (!(await fileExists(filePath))) {\n return { valid: false, errors: [`File not found: ${filePath}`] };\n }\n\n const content = await readFile(filePath);\n\n let parsed: unknown;\n if (extractor) {\n parsed = extractor(content);\n if (parsed === null) {\n return {\n valid: false,\n errors: [\"Failed to extract content (no valid frontmatter found)\"],\n };\n }\n } else {\n parsed = parseYaml(content);\n }\n\n const isValid = validate(parsed);\n\n if (isValid) {\n return { valid: true, errors: [] };\n }\n\n return { valid: false, errors: formatAjvErrors(validate.errors) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { valid: false, errors: [`Failed to parse content: ${message}`] };\n }\n}\n\nasync function validateTarget(\n target: ValidationTarget,\n rootDir: string = process.cwd(),\n): Promise<SchemaValidationResult> {\n const baseDir = path.join(rootDir, target.baseDir);\n const pattern = path.join(baseDir, target.pattern);\n const files = await fg(pattern, { absolute: true });\n\n const result: SchemaValidationResult = {\n schemaName: target.name,\n valid: true,\n totalFiles: files.length,\n validFiles: 0,\n invalidFiles: [],\n };\n\n if (files.length === 0) {\n return result;\n }\n\n const validate = await getValidator(target.schema, rootDir);\n\n for (const file of files) {\n const validation = await validateFile(file, validate, target.extractor);\n const relativePath = path.relative(rootDir, file);\n\n if (validation.valid) {\n result.validFiles++;\n } else {\n result.valid = false;\n result.invalidFiles.push({\n file: relativePath,\n errors: validation.errors,\n });\n }\n }\n\n return result;\n}\n\nexport async function validateAllSchemas(\n rootDir: string = process.cwd(),\n): Promise<FullValidationResult> {\n const results: SchemaValidationResult[] = [];\n\n for (const target of VALIDATION_TARGETS) {\n const result = await validateTarget(target, rootDir);\n results.push(result);\n }\n\n const summary = {\n totalSchemas: results.length,\n totalFiles: results.reduce((sum, r) => sum + r.totalFiles, 0),\n validFiles: results.reduce((sum, r) => sum + r.validFiles, 0),\n invalidFiles: results.reduce((sum, r) => sum + r.invalidFiles.length, 0),\n };\n\n return {\n valid: results.every((r) => r.valid),\n results,\n summary,\n };\n}\n\nexport function printValidationResults(result: FullValidationResult): void {\n console.log(`\\n Schema Validation Summary:`);\n console.log(` ─────────────────────────`);\n console.log(` Total schemas checked: ${result.summary.totalSchemas}`);\n console.log(` Total files: ${result.summary.totalFiles}`);\n console.log(` Valid: ${result.summary.validFiles}`);\n console.log(` Invalid: ${result.summary.invalidFiles}`);\n\n for (const schemaResult of result.results) {\n if (schemaResult.totalFiles === 0) continue;\n\n const status = schemaResult.valid ? \"✓\" : \"✗\";\n console.log(\n `\\n ${status} ${schemaResult.schemaName}: ${schemaResult.validFiles}/${schemaResult.totalFiles} valid`,\n );\n\n if (schemaResult.invalidFiles.length > 0) {\n for (const file of schemaResult.invalidFiles) {\n console.log(`\\n ${file.file}:`);\n file.errors.forEach((e) => console.log(` - ${e}`));\n }\n }\n }\n\n if (result.valid) {\n console.log(`\\n ✓ All schemas validated successfully\\n`);\n } else {\n console.log(`\\n ✗ Validation failed\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAC5B,OAAOA,WAAU;;;ACDjB;AAAA,OAAO,SAAsD;AAC7D,OAAO,gBAAgB;AACvB,OAAO,UAAU;AAEjB,SAAS,SAAS,iBAAiB;AACnC,OAAO,QAAQ;AAqCf,SAAS,mBAAmB,SAAiC;AAC3D,QAAM,mBAAmB;AACzB,QAAM,QAAQ,QAAQ,MAAM,gBAAgB;AAE5C,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,UAAU,MAAM,CAAC,CAAC;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,qBAAyC;AAAA,EAC7C;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,IAAM,cAAc,oBAAI,IAAoB;AAC5C,IAAM,iBAAiB,oBAAI,IAA8B;AAEzD,eAAe,WACb,YACA,UAAkB,QAAQ,IAAI,GACb;AACjB,QAAM,WAAW,GAAG,OAAO,IAAI,UAAU;AACzC,MAAI,YAAY,IAAI,QAAQ,GAAG;AAC7B,WAAO,YAAY,IAAI,QAAQ;AAAA,EACjC;AAKA,QAAM,YAAY;AAAA,IAChB,KAAK,KAAK,cAAc,OAAO,WAAW,UAAU;AAAA,IACpD,KAAK,KAAK,SAAS,OAAO,WAAW,UAAU;AAAA,EACjD;AAEA,aAAW,cAAc,WAAW;AAClC,QAAI,MAAM,WAAW,UAAU,GAAG;AAChC,YAAM,UAAU,MAAM,SAAS,UAAU;AACzC,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,kBAAY,IAAI,UAAU,MAAM;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,qBAAqB,UAAU,eAAe,UAAU,KAAK,IAAI,CAAC;AAAA,EACpE;AACF;AAEA,eAAe,aACb,YACA,UAAkB,QAAQ,IAAI,GACH;AAC3B,QAAM,WAAW,GAAG,OAAO,IAAI,UAAU;AACzC,MAAI,eAAe,IAAI,QAAQ,GAAG;AAChC,WAAO,eAAe,IAAI,QAAQ;AAAA,EACpC;AAEA,QAAM,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,QAAQ,MAAM,CAAC;AACtD,aAAW,GAAG;AACd,QAAM,SAAS,MAAM,WAAW,YAAY,OAAO;AACnD,QAAM,WAAW,IAAI,QAAQ,MAAM;AACnC,iBAAe,IAAI,UAAU,QAAQ;AACrC,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAoD;AAC3E,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,SAAO,OAAO,IAAI,CAAC,QAAQ;AACzB,UAAM,YAAY,IAAI,eAClB,IAAI,aAAa,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,GAAG,IACtD;AACJ,UAAM,UAAU,IAAI,WAAW;AAE/B,QAAI,IAAI,YAAY,wBAAwB;AAC1C,YAAM,OAAQ,IAAI,OACf;AACH,aAAO,sBAAsB,IAAI;AAAA,IACnC;AAEA,QAAI,IAAI,YAAY,QAAQ;AAC1B,YAAM,UAAW,IAAI,OAClB;AACH,aAAO,YACH,GAAG,SAAS,KAAK,OAAO,cAAc,SAAS,KAAK,IAAI,CAAC,KACzD,GAAG,OAAO,cAAc,SAAS,KAAK,IAAI,CAAC;AAAA,IACjD;AAEA,WAAO,YAAY,GAAG,SAAS,KAAK,OAAO,KAAK;AAAA,EAClD,CAAC;AACH;AAEA,eAAe,aACb,UACA,UACA,WAC+C;AAC/C,MAAI;AACF,QAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,aAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,mBAAmB,QAAQ,EAAE,EAAE;AAAA,IACjE;AAEA,UAAM,UAAU,MAAM,SAAS,QAAQ;AAEvC,QAAI;AACJ,QAAI,WAAW;AACb,eAAS,UAAU,OAAO;AAC1B,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ,CAAC,wDAAwD;AAAA,QACnE;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,UAAU,OAAO;AAAA,IAC5B;AAEA,UAAM,UAAU,SAAS,MAAM;AAE/B,QAAI,SAAS;AACX,aAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE;AAAA,IACnC;AAEA,WAAO,EAAE,OAAO,OAAO,QAAQ,gBAAgB,SAAS,MAAM,EAAE;AAAA,EAClE,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,4BAA4B,OAAO,EAAE,EAAE;AAAA,EACzE;AACF;AAEA,eAAe,eACb,QACA,UAAkB,QAAQ,IAAI,GACG;AACjC,QAAM,UAAU,KAAK,KAAK,SAAS,OAAO,OAAO;AACjD,QAAM,UAAU,KAAK,KAAK,SAAS,OAAO,OAAO;AACjD,QAAM,QAAQ,MAAM,GAAG,SAAS,EAAE,UAAU,KAAK,CAAC;AAElD,QAAM,SAAiC;AAAA,IACrC,YAAY,OAAO;AAAA,IACnB,OAAO;AAAA,IACP,YAAY,MAAM;AAAA,IAClB,YAAY;AAAA,IACZ,cAAc,CAAC;AAAA,EACjB;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,aAAa,OAAO,QAAQ,OAAO;AAE1D,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,MAAM,aAAa,MAAM,UAAU,OAAO,SAAS;AACtE,UAAM,eAAe,KAAK,SAAS,SAAS,IAAI;AAEhD,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ;AACf,aAAO,aAAa,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,mBACpB,UAAkB,QAAQ,IAAI,GACC;AAC/B,QAAM,UAAoC,CAAC;AAE3C,aAAW,UAAU,oBAAoB;AACvC,UAAM,SAAS,MAAM,eAAe,QAAQ,OAAO;AACnD,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,QAAM,UAAU;AAAA,IACd,cAAc,QAAQ;AAAA,IACtB,YAAY,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC;AAAA,IAC5D,YAAY,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC;AAAA,IAC5D,cAAc,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,aAAa,QAAQ,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,KAAK;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,QAAoC;AACzE,UAAQ,IAAI;AAAA,6BAAgC;AAC5C,UAAQ,IAAI,0JAA6B;AACzC,UAAQ,IAAI,4BAA4B,OAAO,QAAQ,YAAY,EAAE;AACrE,UAAQ,IAAI,kBAAkB,OAAO,QAAQ,UAAU,EAAE;AACzD,UAAQ,IAAI,YAAY,OAAO,QAAQ,UAAU,EAAE;AACnD,UAAQ,IAAI,cAAc,OAAO,QAAQ,YAAY,EAAE;AAEvD,aAAW,gBAAgB,OAAO,SAAS;AACzC,QAAI,aAAa,eAAe,EAAG;AAEnC,UAAM,SAAS,aAAa,QAAQ,WAAM;AAC1C,YAAQ;AAAA,MACN;AAAA,IAAO,MAAM,IAAI,aAAa,UAAU,KAAK,aAAa,UAAU,IAAI,aAAa,UAAU;AAAA,IACjG;AAEA,QAAI,aAAa,aAAa,SAAS,GAAG;AACxC,iBAAW,QAAQ,aAAa,cAAc;AAC5C,gBAAQ,IAAI;AAAA,MAAS,KAAK,IAAI,GAAG;AACjC,aAAK,OAAO,QAAQ,CAAC,MAAM,QAAQ,IAAI,WAAW,CAAC,EAAE,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,OAAO;AAChB,YAAQ,IAAI;AAAA;AAAA,CAA4C;AAAA,EAC1D,OAAO;AACL,YAAQ,IAAI;AAAA;AAAA,CAA2B;AAAA,EACzC;AACF;;;AD3SA,IAAqB,WAArB,MAAqB,kBAAiB,YAAY;AAAA,EAChD,OAAO,UACL;AAAA,EACF,OAAO,cACL;AAAA,EAIF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,KAAK,MAAM,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,SAAS,MAAM,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,SAAQ;AAEjD,QAAI,KAAK,QAAQ,MAAM,SAAS;AAC9B,YAAM,KAAK,gBAAgB,KAAK,MAAM,MAAM,SAAS,MAAM,GAAG;AAAA,IAChE,OAAO;AACL,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAc,kBAAiC;AAC7C,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,wBAAwB;AACjC,SAAK,IAAI,EAAE;AAEX,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB;AAExC,YAAM,UAAU,OAAO,QACnB,SAAS,OAAO,QAAQ,UAAU,IAAI,OAAO,QAAQ,UAAU,iBAC/D,SAAS,OAAO,QAAQ,YAAY;AAExC,WAAK,IAAI,OAAO;AAChB,6BAAuB,MAAM;AAE7B,UAAI,CAAC,OAAO,OAAO;AACjB,aAAK,KAAK,WAAW,KAAK;AAAA,MAC5B;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAK,MAAM,sBAAsB,OAAO,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,YACA,SACA,KACe;AACf,UAAM,aAAa,aAAaC,MAAK,QAAQ,UAAU,IAAI,QAAQ,IAAI;AAEvE,QAAI,KAAK;AACP,YAAM,KAAK,8BAA8B,YAAY,OAAO;AAAA,IAC9D,OAAO;AACL,YAAM,KAAK,qBAAqB,YAAY,OAAO;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAc,8BACZ,YACA,SACe;AACf,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,8BAA8B,UAAU,EAAE;AACnD,SAAK,IAAI,EAAE;AAEX,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB,UAAU;AAElD,YAAM,UAAU,OAAO,QACnB,SAAS,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,KAAK,mBACrD,SAAS,OAAO,QAAQ,OAAO;AAEnC,WAAK,IAAI,OAAO;AAEhB,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,8BAA8B;AACvC,WAAK,IAAI,6BAA6B;AACtC,WAAK,IAAI,oBAAoB,OAAO,QAAQ,KAAK,EAAE;AACnD,WAAK,IAAI,YAAY,OAAO,QAAQ,KAAK,EAAE;AAC3C,WAAK,IAAI,cAAc,OAAO,QAAQ,OAAO,EAAE;AAC/C,WAAK,IAAI,oBAAoB,OAAO,QAAQ,YAAY,EAAE;AAE1D,iBAAW,EAAE,MAAM,QAAQ,aAAa,KAAK,OAAO,SAAS;AAC3D,oCAA4B,MAAM,cAAc,OAAO;AAAA,MACzD;AAEA,UAAI,OAAO,OAAO;AAChB,aAAK,IAAI,EAAE;AACX,aAAK,WAAW,oCAAoC;AACpD,aAAK,IAAI,EAAE;AAAA,MACb,OAAO;AACL,aAAK,IAAI,EAAE;AACX,aAAK,MAAM,qBAAqB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAK,MAAM,sBAAsB,OAAO,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAc,qBACZ,YACA,SACe;AACf,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,sBAAsB,UAAU,EAAE;AAC3C,SAAK,IAAI,EAAE;AAEX,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,UAAU;AAE9C,YAAM,UAAU,OAAO,QACnB,0BACA;AAEJ,WAAK,IAAI,OAAO;AAEhB,kCAA4BA,MAAK,SAAS,UAAU,GAAG,QAAQ,IAAI;AAEnE,UAAI,OAAO,SAAS,OAAO,SAAS,WAAW,GAAG;AAChD,aAAK,IAAI,EAAE;AACX,aAAK,WAAW,+BAA+B;AAC/C,aAAK,IAAI,EAAE;AAAA,MACb,WAAW,OAAO,OAAO;AACvB,aAAK,IAAI,EAAE;AACX,aAAK,WAAW,4BAA4B;AAC5C,aAAK,IAAI,EAAE;AAAA,MACb,OAAO;AACL,aAAK,IAAI,EAAE;AACX,aAAK,MAAM,qBAAqB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAK,MAAM,sBAAsB,OAAO,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AACF;","names":["path","path"]}
1
+ {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/schema-validator.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { validateAllSchemas, printValidationResults } from \"../lib/schema-validator.js\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugins/index.js\";\n\nexport default class Validate extends BaseCommand {\n static summary = \"Validate YAML files against schemas or validate compiled plugins\";\n static description =\n \"Validates skill/agent YAML files against JSON schemas, or validates compiled plugin structure and content. \" +\n \"Without arguments, validates all YAML files in the current directory against their schemas. \" +\n \"With a path argument or --plugins flag, validates plugin(s) instead.\";\n\n static args = {\n path: Args.string({\n description: \"Path to plugin or plugins directory to validate\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n all: Flags.boolean({\n char: \"a\",\n description: \"Validate all plugins in directory\",\n default: false,\n }),\n plugins: Flags.boolean({\n char: \"p\",\n description: \"Validate plugins instead of schemas\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Validate);\n\n if (args.path || flags.plugins) {\n await this.validatePlugins(args.path, flags.verbose, flags.all);\n } else {\n await this.validateSchemas();\n }\n }\n\n private async validateSchemas(): Promise<void> {\n this.log(\"\");\n this.log(\"Validating all schemas\");\n this.log(\"\");\n\n try {\n const result = await validateAllSchemas();\n\n const summary = result.valid\n ? `Done: ${result.summary.validFiles}/${result.summary.totalFiles} files valid`\n : `Done: ${result.summary.invalidFiles} invalid files`;\n\n this.log(summary);\n printValidationResults(result);\n\n if (!result.valid) {\n this.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validatePlugins(\n pluginPath: string | undefined,\n verbose: boolean,\n all: boolean,\n ): Promise<void> {\n const targetPath = pluginPath ? path.resolve(pluginPath) : process.cwd();\n\n if (all) {\n await this.validateAllPluginsInDirectory(targetPath, verbose);\n } else {\n await this.validateSinglePlugin(targetPath, verbose);\n }\n }\n\n private async validateAllPluginsInDirectory(targetPath: string, verbose: boolean): Promise<void> {\n this.log(\"\");\n this.log(`Validating all plugins in: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validateAllPlugins(targetPath);\n\n const summary = result.valid\n ? `Done: ${result.summary.valid}/${result.summary.total} plugins valid`\n : `Done: ${result.summary.invalid} invalid plugins`;\n\n this.log(summary);\n\n this.log(\"\");\n this.log(\" Plugin Validation Summary:\");\n this.log(\" -------------------------\");\n this.log(` Total plugins: ${result.summary.total}`);\n this.log(` Valid: ${result.summary.valid}`);\n this.log(` Invalid: ${result.summary.invalid}`);\n this.log(` With warnings: ${result.summary.withWarnings}`);\n\n for (const { name, result: pluginResult } of result.results) {\n printPluginValidationResult(name, pluginResult, verbose);\n }\n\n if (result.valid) {\n this.log(\"\");\n this.logSuccess(\"All plugins validated successfully\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(\"Validation failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateSinglePlugin(targetPath: string, verbose: boolean): Promise<void> {\n this.log(\"\");\n this.log(`Validating plugin: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validatePlugin(targetPath);\n\n const summary = result.valid ? \"Done: Plugin is valid\" : \"Done: Plugin has errors\";\n\n this.log(summary);\n\n printPluginValidationResult(path.basename(targetPath), result, true);\n\n if (result.valid && result.warnings.length === 0) {\n this.log(\"\");\n this.logSuccess(\"Plugin validated successfully\");\n this.log(\"\");\n } else if (result.valid) {\n this.log(\"\");\n this.logWarning(\"Plugin valid with warnings\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(\"Validation failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n","import { sumBy } from \"remeda\";\nimport { z } from \"zod\";\nimport path from \"path\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport { extractFrontmatter } from \"../utils/frontmatter\";\nimport {\n skillsMatrixConfigSchema,\n metadataValidationSchema,\n stackConfigValidationSchema,\n skillFrontmatterValidationSchema,\n agentYamlGenerationSchema,\n} from \"./schemas\";\n\nexport type FileValidationError = {\n file: string;\n errors: string[];\n};\n\nexport type SchemaValidationResult = {\n schemaName: string;\n valid: boolean;\n totalFiles: number;\n validFiles: number;\n invalidFiles: FileValidationError[];\n};\n\nexport type FullValidationResult = {\n valid: boolean;\n results: SchemaValidationResult[];\n summary: {\n totalSchemas: number;\n totalFiles: number;\n validFiles: number;\n invalidFiles: number;\n };\n};\n\ntype ContentExtractor = (content: string) => unknown | null;\n\ntype ValidationTarget = {\n name: string;\n schema: z.ZodType<unknown>;\n pattern: string;\n baseDir: string;\n extractor?: ContentExtractor;\n};\n\nconst VALIDATION_TARGETS: ValidationTarget[] = [\n {\n name: \"Skills Matrix\",\n schema: skillsMatrixConfigSchema,\n pattern: \"skills-matrix.yaml\",\n baseDir: \"src/config\",\n },\n {\n name: \"Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: \"**/metadata.yaml\",\n baseDir: \"src/skills\",\n },\n {\n name: \"Stack Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: \"**/skills/**/metadata.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Stack Config\",\n schema: stackConfigValidationSchema,\n pattern: \"*/config.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Agent Definition\",\n schema: agentYamlGenerationSchema,\n pattern: \"**/agent.yaml\",\n baseDir: \"src/agents\",\n },\n {\n name: \"Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: \"**/SKILL.md\",\n baseDir: \"src/skills\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stack Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: \"**/skills/**/SKILL.md\",\n baseDir: \"src/stacks\",\n extractor: extractFrontmatter,\n },\n];\n\nfunction formatZodErrors(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n if (issue.code === \"unrecognized_keys\") {\n return `Unrecognized key: \"${issue.keys.join('\", \"')}\"`;\n }\n return path ? `${path}: ${issue.message}` : issue.message;\n });\n}\n\nasync function validateFile(\n filePath: string,\n schema: z.ZodType<unknown>,\n extractor?: ContentExtractor,\n): Promise<{ valid: boolean; errors: string[] }> {\n try {\n if (!(await fileExists(filePath))) {\n return { valid: false, errors: [`File not found: ${filePath}`] };\n }\n\n const content = await readFile(filePath);\n\n let parsed: unknown;\n if (extractor) {\n parsed = extractor(content);\n if (parsed === null) {\n return {\n valid: false,\n errors: [\"Failed to extract content (no valid frontmatter found)\"],\n };\n }\n } else {\n parsed = parseYaml(content);\n }\n\n const result = schema.safeParse(parsed);\n\n if (result.success) {\n return { valid: true, errors: [] };\n }\n\n return { valid: false, errors: formatZodErrors(result.error) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { valid: false, errors: [`Failed to parse content: ${message}`] };\n }\n}\n\nasync function validateTarget(\n target: ValidationTarget,\n rootDir: string = process.cwd(),\n): Promise<SchemaValidationResult> {\n const baseDir = path.join(rootDir, target.baseDir);\n const pattern = path.join(baseDir, target.pattern);\n const files = await fg(pattern, { absolute: true });\n\n const result: SchemaValidationResult = {\n schemaName: target.name,\n valid: true,\n totalFiles: files.length,\n validFiles: 0,\n invalidFiles: [],\n };\n\n if (files.length === 0) {\n return result;\n }\n\n for (const file of files) {\n const validation = await validateFile(file, target.schema, target.extractor);\n const relativePath = path.relative(rootDir, file);\n\n if (validation.valid) {\n result.validFiles++;\n } else {\n result.valid = false;\n result.invalidFiles.push({\n file: relativePath,\n errors: validation.errors,\n });\n }\n }\n\n return result;\n}\n\nexport async function validateAllSchemas(\n rootDir: string = process.cwd(),\n): Promise<FullValidationResult> {\n const results: SchemaValidationResult[] = [];\n\n for (const target of VALIDATION_TARGETS) {\n const result = await validateTarget(target, rootDir);\n results.push(result);\n }\n\n const summary = {\n totalSchemas: results.length,\n totalFiles: sumBy(results, (r) => r.totalFiles),\n validFiles: sumBy(results, (r) => r.validFiles),\n invalidFiles: sumBy(results, (r) => r.invalidFiles.length),\n };\n\n return {\n valid: results.every((r) => r.valid),\n results,\n summary,\n };\n}\n\nexport function printValidationResults(result: FullValidationResult): void {\n console.log(`\\n Schema Validation Summary:`);\n console.log(` ─────────────────────────`);\n console.log(` Total schemas checked: ${result.summary.totalSchemas}`);\n console.log(` Total files: ${result.summary.totalFiles}`);\n console.log(` Valid: ${result.summary.validFiles}`);\n console.log(` Invalid: ${result.summary.invalidFiles}`);\n\n for (const schemaResult of result.results) {\n if (schemaResult.totalFiles === 0) continue;\n\n const status = schemaResult.valid ? \"✓\" : \"✗\";\n console.log(\n `\\n ${status} ${schemaResult.schemaName}: ${schemaResult.validFiles}/${schemaResult.totalFiles} valid`,\n );\n\n if (schemaResult.invalidFiles.length > 0) {\n for (const file of schemaResult.invalidFiles) {\n console.log(`\\n ${file.file}:`);\n file.errors.forEach((e) => console.log(` - ${e}`));\n }\n }\n }\n\n if (result.valid) {\n console.log(`\\n ✓ All schemas validated successfully\\n`);\n } else {\n console.log(`\\n ✗ Validation failed\\n`);\n }\n}\n"],"mappings":"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","names":["path","path","path"]}
@@ -1,43 +1,29 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- bumpPluginVersion
4
- } from "../../chunk-P26A2K5N.js";
5
2
  import {
6
3
  BaseCommand,
7
4
  EXIT_CODES
8
- } from "../../chunk-EHS3TWWP.js";
5
+ } from "../../chunk-OBXAY23Y.js";
6
+ import {
7
+ bumpPluginVersion,
8
+ findPluginManifest
9
+ } from "../../chunk-YDBSSAJ6.js";
9
10
  import {
10
- fileExists,
11
+ pluginManifestSchema,
11
12
  readFile
12
- } from "../../chunk-TKFPKEV3.js";
13
+ } from "../../chunk-ZDREFYD2.js";
14
+ import "../../chunk-HWD32NP7.js";
13
15
  import {
14
16
  PLUGIN_MANIFEST_DIR,
15
17
  PLUGIN_MANIFEST_FILE
16
- } from "../../chunk-76DWXGQE.js";
18
+ } from "../../chunk-O6ZTD7ZI.js";
17
19
  import {
18
20
  init_esm_shims
19
- } from "../../chunk-DHET7RCE.js";
21
+ } from "../../chunk-AWKZ5BDL.js";
20
22
 
21
23
  // src/cli/commands/version/bump.ts
22
24
  init_esm_shims();
23
25
  import { Args } from "@oclif/core";
24
26
  import path from "path";
25
- async function findPluginManifest(startDir) {
26
- let currentDir = startDir;
27
- const root = path.parse(currentDir).root;
28
- while (currentDir !== root) {
29
- const manifestPath = path.join(
30
- currentDir,
31
- PLUGIN_MANIFEST_DIR,
32
- PLUGIN_MANIFEST_FILE
33
- );
34
- if (await fileExists(manifestPath)) {
35
- return manifestPath;
36
- }
37
- currentDir = path.dirname(currentDir);
38
- }
39
- return null;
40
- }
41
27
  var VersionBump = class _VersionBump extends BaseCommand {
42
28
  static summary = "Bump plugin version";
43
29
  static description = "Increment the plugin version by the specified type (major, minor, or patch).";
@@ -71,13 +57,11 @@ Expected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,
71
57
  const pluginDir = path.dirname(path.dirname(manifestPath));
72
58
  try {
73
59
  const content = await readFile(manifestPath);
74
- const manifest = JSON.parse(content);
60
+ const manifest = pluginManifestSchema.parse(JSON.parse(content));
75
61
  const oldVersion = manifest.version || "1.0.0";
76
62
  const pluginName = manifest.name || "unknown";
77
63
  if (flags["dry-run"]) {
78
- this.log(
79
- `[DRY RUN] Would bump ${pluginName} version: ${oldVersion} -> ${bumpType}`
80
- );
64
+ this.log(`[DRY RUN] Would bump ${pluginName} version: ${oldVersion} -> ${bumpType}`);
81
65
  return;
82
66
  }
83
67
  const newVersion = await bumpPluginVersion(pluginDir, bumpType);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/version/bump.ts"],"sourcesContent":["/**\n * Bump plugin version (major, minor, or patch).\n */\nimport { BaseCommand } from \"../../base-command.js\";\nimport { Args, Flags } from \"@oclif/core\";\nimport {\n bumpPluginVersion,\n type VersionBumpType,\n} from \"../../lib/plugin-version.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\nimport type { PluginManifest } from \"../../../types.js\";\n\nasync function findPluginManifest(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const manifestPath = path.join(\n currentDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\n}\n\nexport default class VersionBump extends BaseCommand {\n static summary = \"Bump plugin version\";\n static description =\n \"Increment the plugin version by the specified type (major, minor, or patch).\";\n\n static args = {\n type: Args.string({\n description: \"Version bump type\",\n required: true,\n options: [\"major\", \"minor\", \"patch\"],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %> patch\",\n \"<%= config.bin %> <%= command.id %> minor\",\n \"<%= config.bin %> <%= command.id %> major\",\n \"<%= config.bin %> <%= command.id %> patch --dry-run\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(VersionBump);\n const bumpType = args.type as VersionBumpType;\n\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n // Read current version and plugin name\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n const oldVersion = manifest.version || \"1.0.0\";\n const pluginName = manifest.name || \"unknown\";\n\n if (flags[\"dry-run\"]) {\n this.log(\n `[DRY RUN] Would bump ${pluginName} version: ${oldVersion} -> ${bumpType}`,\n );\n return;\n }\n\n const newVersion = await bumpPluginVersion(pluginDir, bumpType);\n this.log(`${pluginName}: ${oldVersion} -> ${newVersion}`);\n } catch (error) {\n this.error(`Failed to bump plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAIA,SAAS,YAAmB;AAM5B,OAAO,UAAU;AAKjB,eAAe,mBAAmB,UAA0C;AAC1E,MAAI,aAAa;AACjB,QAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AAEpC,SAAO,eAAe,MAAM;AAC1B,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,WAAW,YAAY,GAAG;AAClC,aAAO;AAAA,IACT;AACA,iBAAa,KAAK,QAAQ,UAAU;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS,CAAC,SAAS,SAAS,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,YAAW;AACpD,UAAM,WAAW,KAAK;AAEtB,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AAEF,YAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,YAAM,WAAW,KAAK,MAAM,OAAO;AACnC,YAAM,aAAa,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS,QAAQ;AAEpC,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK;AAAA,UACH,wBAAwB,UAAU,aAAa,UAAU,OAAO,QAAQ;AAAA,QAC1E;AACA;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,kBAAkB,WAAW,QAAQ;AAC9D,WAAK,IAAI,GAAG,UAAU,KAAK,UAAU,OAAO,UAAU,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/version/bump.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport { Args, Flags } from \"@oclif/core\";\nimport {\n bumpPluginVersion,\n type VersionBumpType,\n findPluginManifest,\n} from \"../../lib/plugins/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { readFile } from \"../../utils/fs.js\";\nimport type { PluginManifest } from \"../../types/index.js\";\nimport { pluginManifestSchema } from \"../../lib/schemas.js\";\n\nexport default class VersionBump extends BaseCommand {\n static summary = \"Bump plugin version\";\n static description =\n \"Increment the plugin version by the specified type (major, minor, or patch).\";\n\n static args = {\n type: Args.string({\n description: \"Version bump type\",\n required: true,\n options: [\"major\", \"minor\", \"patch\"],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %> patch\",\n \"<%= config.bin %> <%= command.id %> minor\",\n \"<%= config.bin %> <%= command.id %> major\",\n \"<%= config.bin %> <%= command.id %> patch --dry-run\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(VersionBump);\n const bumpType = args.type as VersionBumpType;\n\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n const oldVersion = manifest.version || \"1.0.0\";\n const pluginName = manifest.name || \"unknown\";\n\n if (flags[\"dry-run\"]) {\n this.log(`[DRY RUN] Would bump ${pluginName} version: ${oldVersion} -> ${bumpType}`);\n return;\n }\n\n const newVersion = await bumpPluginVersion(pluginDir, bumpType);\n this.log(`${pluginName}: ${oldVersion} -> ${newVersion}`);\n } catch (error) {\n this.error(`Failed to bump plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,SAAS,YAAmB;AAO5B,OAAO,UAAU;AAMjB,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS,CAAC,SAAS,SAAS,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,YAAW;AACpD,UAAM,WAAW,KAAK;AAEtB,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,YAAM,WAAW,qBAAqB,MAAM,KAAK,MAAM,OAAO,CAAC;AAC/D,YAAM,aAAa,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS,QAAQ;AAEpC,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK,IAAI,wBAAwB,UAAU,aAAa,UAAU,OAAO,QAAQ,EAAE;AACnF;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,kBAAkB,WAAW,QAAQ;AAC9D,WAAK,IAAI,GAAG,UAAU,KAAK,UAAU,OAAO,UAAU,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -1,41 +1,25 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- getPluginVersion
4
- } from "../../chunk-P26A2K5N.js";
5
2
  import {
6
3
  BaseCommand,
7
4
  EXIT_CODES
8
- } from "../../chunk-EHS3TWWP.js";
5
+ } from "../../chunk-OBXAY23Y.js";
9
6
  import {
10
- fileExists
11
- } from "../../chunk-TKFPKEV3.js";
7
+ findPluginManifest,
8
+ getPluginVersion
9
+ } from "../../chunk-YDBSSAJ6.js";
10
+ import "../../chunk-ZDREFYD2.js";
11
+ import "../../chunk-HWD32NP7.js";
12
12
  import {
13
13
  PLUGIN_MANIFEST_DIR,
14
14
  PLUGIN_MANIFEST_FILE
15
- } from "../../chunk-76DWXGQE.js";
15
+ } from "../../chunk-O6ZTD7ZI.js";
16
16
  import {
17
17
  init_esm_shims
18
- } from "../../chunk-DHET7RCE.js";
18
+ } from "../../chunk-AWKZ5BDL.js";
19
19
 
20
20
  // src/cli/commands/version/index.ts
21
21
  init_esm_shims();
22
22
  import path from "path";
23
- async function findPluginManifest(startDir) {
24
- let currentDir = startDir;
25
- const root = path.parse(currentDir).root;
26
- while (currentDir !== root) {
27
- const manifestPath = path.join(
28
- currentDir,
29
- PLUGIN_MANIFEST_DIR,
30
- PLUGIN_MANIFEST_FILE
31
- );
32
- if (await fileExists(manifestPath)) {
33
- return manifestPath;
34
- }
35
- currentDir = path.dirname(currentDir);
36
- }
37
- return null;
38
- }
39
23
  var Version = class _Version extends BaseCommand {
40
24
  static summary = "Show current plugin version";
41
25
  static description = "Display the current version of the plugin in the current directory.";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/version/index.ts"],"sourcesContent":["/**\n * Default version command - shows current plugin version.\n * Alias for `version show`.\n */\nimport { BaseCommand } from \"../../base-command.js\";\nimport { getPluginVersion } from \"../../lib/plugin-version.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { fileExists } from \"../../utils/fs.js\";\n\nasync function findPluginManifest(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const manifestPath = path.join(\n currentDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\n}\n\nexport default class Version extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description =\n \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(Version);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAOA,OAAO,UAAU;AAIjB,eAAe,mBAAmB,UAA0C;AAC1E,MAAI,aAAa;AACjB,QAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AAEpC,SAAO,eAAe,MAAM;AAC1B,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,WAAW,YAAY,GAAG;AAClC,aAAO;AAAA,IACT;AACA,iBAAa,KAAK,QAAQ,UAAU;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,IAAqB,UAArB,MAAqB,iBAAgB,YAAY;AAAA,EAC/C,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,CAAC,qCAAqC;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,QAAO;AACxB,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAK,IAAI,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/version/index.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport { getPluginVersion, findPluginManifest } from \"../../lib/plugins/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\n\nexport default class Version extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description = \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(Version);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAGA,OAAO,UAAU;AAGjB,IAAqB,UAArB,MAAqB,iBAAgB,YAAY;AAAA,EAC/C,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,CAAC,qCAAqC;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,QAAO;AACxB,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAK,IAAI,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -2,41 +2,28 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-EHS3TWWP.js";
5
+ } from "../../chunk-OBXAY23Y.js";
6
6
  import {
7
- fileExists,
7
+ findPluginManifest
8
+ } from "../../chunk-YDBSSAJ6.js";
9
+ import {
10
+ pluginManifestSchema,
8
11
  readFile,
9
12
  writeFile
10
- } from "../../chunk-TKFPKEV3.js";
13
+ } from "../../chunk-ZDREFYD2.js";
14
+ import "../../chunk-HWD32NP7.js";
11
15
  import {
12
16
  PLUGIN_MANIFEST_DIR,
13
17
  PLUGIN_MANIFEST_FILE
14
- } from "../../chunk-76DWXGQE.js";
18
+ } from "../../chunk-O6ZTD7ZI.js";
15
19
  import {
16
20
  init_esm_shims
17
- } from "../../chunk-DHET7RCE.js";
21
+ } from "../../chunk-AWKZ5BDL.js";
18
22
 
19
23
  // src/cli/commands/version/set.ts
20
24
  init_esm_shims();
21
25
  import { Args } from "@oclif/core";
22
- import path from "path";
23
26
  var SEMVER_REGEX = /^(\d+)\.(\d+)\.(\d+)$/;
24
- async function findPluginManifest(startDir) {
25
- let currentDir = startDir;
26
- const root = path.parse(currentDir).root;
27
- while (currentDir !== root) {
28
- const manifestPath = path.join(
29
- currentDir,
30
- PLUGIN_MANIFEST_DIR,
31
- PLUGIN_MANIFEST_FILE
32
- );
33
- if (await fileExists(manifestPath)) {
34
- return manifestPath;
35
- }
36
- currentDir = path.dirname(currentDir);
37
- }
38
- return null;
39
- }
40
27
  function isValidSemver(version) {
41
28
  return SEMVER_REGEX.test(version);
42
29
  }
@@ -76,13 +63,11 @@ Expected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,
76
63
  }
77
64
  try {
78
65
  const content = await readFile(manifestPath);
79
- const manifest = JSON.parse(content);
66
+ const manifest = pluginManifestSchema.parse(JSON.parse(content));
80
67
  const oldVersion = manifest.version || "1.0.0";
81
68
  const pluginName = manifest.name || "unknown";
82
69
  if (flags["dry-run"]) {
83
- this.log(
84
- `[DRY RUN] Would set ${pluginName} version: ${oldVersion} -> ${newVersion}`
85
- );
70
+ this.log(`[DRY RUN] Would set ${pluginName} version: ${oldVersion} -> ${newVersion}`);
86
71
  return;
87
72
  }
88
73
  manifest.version = newVersion;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/version/set.ts"],"sourcesContent":["/**\n * Set plugin version to a specific value.\n */\nimport { BaseCommand } from \"../../base-command.js\";\nimport { Args, Flags } from \"@oclif/core\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { fileExists, readFile, writeFile } from \"../../utils/fs.js\";\nimport type { PluginManifest } from \"../../../types.js\";\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)$/;\n\nasync function findPluginManifest(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const manifestPath = path.join(\n currentDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\n}\n\nfunction isValidSemver(version: string): boolean {\n return SEMVER_REGEX.test(version);\n}\n\nexport default class VersionSet extends BaseCommand {\n static summary = \"Set plugin version to a specific value\";\n static description =\n \"Set the plugin version to an explicit semantic version (e.g., 1.2.3).\";\n\n static args = {\n version: Args.string({\n description: \"Version to set (semantic version format: X.Y.Z)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %> 1.0.0\",\n \"<%= config.bin %> <%= command.id %> 2.1.3\",\n \"<%= config.bin %> <%= command.id %> 1.0.0 --dry-run\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(VersionSet);\n const newVersion = args.version;\n\n // Validate semver format\n if (!isValidSemver(newVersion)) {\n this.error(\n `Invalid version format: \"${newVersion}\". Must be semantic version (e.g., 1.0.0)`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n try {\n // Read current manifest\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n const oldVersion = manifest.version || \"1.0.0\";\n const pluginName = manifest.name || \"unknown\";\n\n if (flags[\"dry-run\"]) {\n this.log(\n `[DRY RUN] Would set ${pluginName} version: ${oldVersion} -> ${newVersion}`,\n );\n return;\n }\n\n // Update and write manifest\n manifest.version = newVersion;\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n\n this.log(`${pluginName}: ${oldVersion} -> ${newVersion}`);\n } catch (error) {\n this.error(`Failed to set plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAIA,SAAS,YAAmB;AAE5B,OAAO,UAAU;AAKjB,IAAM,eAAe;AAErB,eAAe,mBAAmB,UAA0C;AAC1E,MAAI,aAAa;AACjB,QAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AAEpC,SAAO,eAAe,MAAM;AAC1B,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,WAAW,YAAY,GAAG;AAClC,aAAO;AAAA,IACT;AACA,iBAAa,KAAK,QAAQ,UAAU;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAA0B;AAC/C,SAAO,aAAa,KAAK,OAAO;AAClC;AAEA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,SAAS,KAAK,OAAO;AAAA,MACnB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AACnD,UAAM,aAAa,KAAK;AAGxB,QAAI,CAAC,cAAc,UAAU,GAAG;AAC9B,WAAK;AAAA,QACH,4BAA4B,UAAU;AAAA,QACtC,EAAE,MAAM,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,YAAM,WAAW,KAAK,MAAM,OAAO;AACnC,YAAM,aAAa,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS,QAAQ;AAEpC,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK;AAAA,UACH,uBAAuB,UAAU,aAAa,UAAU,OAAO,UAAU;AAAA,QAC3E;AACA;AAAA,MACF;AAGA,eAAS,UAAU;AACnB,YAAM,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE/D,WAAK,IAAI,GAAG,UAAU,KAAK,UAAU,OAAO,UAAU,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,MAAM,iCAAiC,KAAK,IAAI;AAAA,QACnD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/version/set.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport { Args } from \"@oclif/core\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { readFile, writeFile } from \"../../utils/fs.js\";\nimport { findPluginManifest } from \"../../lib/plugins/index.js\";\nimport { pluginManifestSchema } from \"../../lib/schemas.js\";\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)$/;\n\nfunction isValidSemver(version: string): boolean {\n return SEMVER_REGEX.test(version);\n}\n\nexport default class VersionSet extends BaseCommand {\n static summary = \"Set plugin version to a specific value\";\n static description = \"Set the plugin version to an explicit semantic version (e.g., 1.2.3).\";\n\n static args = {\n version: Args.string({\n description: \"Version to set (semantic version format: X.Y.Z)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %> 1.0.0\",\n \"<%= config.bin %> <%= command.id %> 2.1.3\",\n \"<%= config.bin %> <%= command.id %> 1.0.0 --dry-run\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(VersionSet);\n const newVersion = args.version;\n\n if (!isValidSemver(newVersion)) {\n this.error(\n `Invalid version format: \"${newVersion}\". Must be semantic version (e.g., 1.0.0)`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n const oldVersion = manifest.version || \"1.0.0\";\n const pluginName = manifest.name || \"unknown\";\n\n if (flags[\"dry-run\"]) {\n this.log(`[DRY RUN] Would set ${pluginName} version: ${oldVersion} -> ${newVersion}`);\n return;\n }\n\n manifest.version = newVersion;\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n\n this.log(`${pluginName}: ${oldVersion} -> ${newVersion}`);\n } catch (error) {\n this.error(`Failed to set plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,SAAS,YAAY;AAOrB,IAAM,eAAe;AAErB,SAAS,cAAc,SAA0B;AAC/C,SAAO,aAAa,KAAK,OAAO;AAClC;AAEA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACZ,SAAS,KAAK,OAAO;AAAA,MACnB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AACnD,UAAM,aAAa,KAAK;AAExB,QAAI,CAAC,cAAc,UAAU,GAAG;AAC9B,WAAK;AAAA,QACH,4BAA4B,UAAU;AAAA,QACtC,EAAE,MAAM,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,YAAM,WAAW,qBAAqB,MAAM,KAAK,MAAM,OAAO,CAAC;AAC/D,YAAM,aAAa,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS,QAAQ;AAEpC,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK,IAAI,uBAAuB,UAAU,aAAa,UAAU,OAAO,UAAU,EAAE;AACpF;AAAA,MACF;AAEA,eAAS,UAAU;AACnB,YAAM,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE/D,WAAK,IAAI,GAAG,UAAU,KAAK,UAAU,OAAO,UAAU,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,MAAM,iCAAiC,KAAK,IAAI;AAAA,QACnD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -1,41 +1,25 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- getPluginVersion
4
- } from "../../chunk-P26A2K5N.js";
5
2
  import {
6
3
  BaseCommand,
7
4
  EXIT_CODES
8
- } from "../../chunk-EHS3TWWP.js";
5
+ } from "../../chunk-OBXAY23Y.js";
9
6
  import {
10
- fileExists
11
- } from "../../chunk-TKFPKEV3.js";
7
+ findPluginManifest,
8
+ getPluginVersion
9
+ } from "../../chunk-YDBSSAJ6.js";
10
+ import "../../chunk-ZDREFYD2.js";
11
+ import "../../chunk-HWD32NP7.js";
12
12
  import {
13
13
  PLUGIN_MANIFEST_DIR,
14
14
  PLUGIN_MANIFEST_FILE
15
- } from "../../chunk-76DWXGQE.js";
15
+ } from "../../chunk-O6ZTD7ZI.js";
16
16
  import {
17
17
  init_esm_shims
18
- } from "../../chunk-DHET7RCE.js";
18
+ } from "../../chunk-AWKZ5BDL.js";
19
19
 
20
20
  // src/cli/commands/version/show.ts
21
21
  init_esm_shims();
22
22
  import path from "path";
23
- async function findPluginManifest(startDir) {
24
- let currentDir = startDir;
25
- const root = path.parse(currentDir).root;
26
- while (currentDir !== root) {
27
- const manifestPath = path.join(
28
- currentDir,
29
- PLUGIN_MANIFEST_DIR,
30
- PLUGIN_MANIFEST_FILE
31
- );
32
- if (await fileExists(manifestPath)) {
33
- return manifestPath;
34
- }
35
- currentDir = path.dirname(currentDir);
36
- }
37
- return null;
38
- }
39
23
  var VersionShow = class _VersionShow extends BaseCommand {
40
24
  static summary = "Show current plugin version";
41
25
  static description = "Display the current version of the plugin in the current directory.";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/version/show.ts"],"sourcesContent":["/**\n * Show current plugin version.\n */\nimport { BaseCommand } from \"../../base-command.js\";\nimport { getPluginVersion } from \"../../lib/plugin-version.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { fileExists } from \"../../utils/fs.js\";\n\nasync function findPluginManifest(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const manifestPath = path.join(\n currentDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\n}\n\nexport default class VersionShow extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description =\n \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(VersionShow);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAMA,OAAO,UAAU;AAIjB,eAAe,mBAAmB,UAA0C;AAC1E,MAAI,aAAa;AACjB,QAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AAEpC,SAAO,eAAe,MAAM;AAC1B,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,WAAW,YAAY,GAAG;AAClC,aAAO;AAAA,IACT;AACA,iBAAa,KAAK,QAAQ,UAAU;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,CAAC,qCAAqC;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,YAAW;AAC5B,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAK,IAAI,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/version/show.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport { getPluginVersion, findPluginManifest } from \"../../lib/plugins/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\n\nexport default class VersionShow extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description = \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(VersionShow);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAGA,OAAO,UAAU;AAGjB,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,CAAC,qCAAqC;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,YAAW;AAC5B,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAK,IAAI,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Confirm
4
- } from "../../chunk-RTE64SJA.js";
5
- import "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-IXBCRT3F.js";
5
+ import "../../chunk-AWKZ5BDL.js";
6
6
  export {
7
7
  Confirm
8
8
  };
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ENTER,
4
+ KEY_N,
5
+ KEY_Y,
6
+ RENDER_DELAY_MS,
7
+ delay
8
+ } from "../../chunk-DBRUQQUF.js";
9
+ import {
10
+ render
11
+ } from "../../chunk-REJGRCVQ.js";
12
+ import {
13
+ Confirm
14
+ } from "../../chunk-IXBCRT3F.js";
15
+ import {
16
+ afterEach,
17
+ describe,
18
+ globalExpect,
19
+ it,
20
+ vi
21
+ } from "../../chunk-QR2EBWL2.js";
22
+ import {
23
+ init_esm_shims
24
+ } from "../../chunk-AWKZ5BDL.js";
25
+
26
+ // src/cli/components/common/confirm.test.tsx
27
+ init_esm_shims();
28
+ import { jsx } from "react/jsx-runtime";
29
+ var CONFIRM_INPUT_DELAY_MS = 100;
30
+ describe("Confirm component", () => {
31
+ let cleanup;
32
+ afterEach(() => {
33
+ cleanup?.();
34
+ cleanup = void 0;
35
+ });
36
+ describe("rendering", () => {
37
+ it("should render the message", () => {
38
+ const { lastFrame, unmount } = render(
39
+ /* @__PURE__ */ jsx(Confirm, { message: "Do you want to proceed?", onConfirm: () => {
40
+ }, onCancel: () => {
41
+ } })
42
+ );
43
+ cleanup = unmount;
44
+ const output = lastFrame();
45
+ globalExpect(output).toContain("Do you want to proceed?");
46
+ });
47
+ it("should show y/n prompt", () => {
48
+ const { lastFrame, unmount } = render(
49
+ /* @__PURE__ */ jsx(Confirm, { message: "Continue?", onConfirm: () => {
50
+ }, onCancel: () => {
51
+ } })
52
+ );
53
+ cleanup = unmount;
54
+ const output = lastFrame();
55
+ globalExpect(output?.toLowerCase()).toMatch(/[yn]/);
56
+ });
57
+ it("should show Y/n when default is confirm (true)", () => {
58
+ const { lastFrame, unmount } = render(
59
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
60
+ }, onCancel: () => {
61
+ }, defaultValue: true })
62
+ );
63
+ cleanup = unmount;
64
+ const output = lastFrame();
65
+ globalExpect(output).toContain("Y/n");
66
+ });
67
+ it("should show y/N when default is cancel (false)", () => {
68
+ const { lastFrame, unmount } = render(
69
+ /* @__PURE__ */ jsx(
70
+ Confirm,
71
+ {
72
+ message: "Confirm?",
73
+ onConfirm: () => {
74
+ },
75
+ onCancel: () => {
76
+ },
77
+ defaultValue: false
78
+ }
79
+ )
80
+ );
81
+ cleanup = unmount;
82
+ const output = lastFrame();
83
+ globalExpect(output).toContain("y/N");
84
+ });
85
+ });
86
+ describe("keyboard interactions", () => {
87
+ it("should call onConfirm when pressing y", async () => {
88
+ const onConfirm = vi.fn();
89
+ const onCancel = vi.fn();
90
+ const { stdin, unmount } = render(
91
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm, onCancel })
92
+ );
93
+ cleanup = unmount;
94
+ await delay(RENDER_DELAY_MS);
95
+ await stdin.write(KEY_Y);
96
+ await delay(CONFIRM_INPUT_DELAY_MS);
97
+ globalExpect(onConfirm).toHaveBeenCalled();
98
+ globalExpect(onCancel).not.toHaveBeenCalled();
99
+ });
100
+ it("should call onCancel when pressing n", async () => {
101
+ const onConfirm = vi.fn();
102
+ const onCancel = vi.fn();
103
+ const { stdin, unmount } = render(
104
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm, onCancel })
105
+ );
106
+ cleanup = unmount;
107
+ await delay(RENDER_DELAY_MS);
108
+ await stdin.write(KEY_N);
109
+ await delay(CONFIRM_INPUT_DELAY_MS);
110
+ globalExpect(onCancel).toHaveBeenCalled();
111
+ globalExpect(onConfirm).not.toHaveBeenCalled();
112
+ });
113
+ it("should call onConfirm when default is true and enter pressed", async () => {
114
+ const onConfirm = vi.fn();
115
+ const onCancel = vi.fn();
116
+ const { stdin, unmount } = render(
117
+ /* @__PURE__ */ jsx(
118
+ Confirm,
119
+ {
120
+ message: "Confirm?",
121
+ onConfirm,
122
+ onCancel,
123
+ defaultValue: true
124
+ }
125
+ )
126
+ );
127
+ cleanup = unmount;
128
+ await delay(RENDER_DELAY_MS);
129
+ await stdin.write(ENTER);
130
+ await delay(CONFIRM_INPUT_DELAY_MS);
131
+ globalExpect(onConfirm).toHaveBeenCalled();
132
+ globalExpect(onCancel).not.toHaveBeenCalled();
133
+ });
134
+ it("should call onCancel when default is false and enter pressed", async () => {
135
+ const onConfirm = vi.fn();
136
+ const onCancel = vi.fn();
137
+ const { stdin, unmount } = render(
138
+ /* @__PURE__ */ jsx(
139
+ Confirm,
140
+ {
141
+ message: "Confirm?",
142
+ onConfirm,
143
+ onCancel,
144
+ defaultValue: false
145
+ }
146
+ )
147
+ );
148
+ cleanup = unmount;
149
+ await delay(RENDER_DELAY_MS);
150
+ await stdin.write(ENTER);
151
+ await delay(CONFIRM_INPUT_DELAY_MS);
152
+ globalExpect(onCancel).toHaveBeenCalled();
153
+ globalExpect(onConfirm).not.toHaveBeenCalled();
154
+ });
155
+ it("should handle uppercase Y", async () => {
156
+ const onConfirm = vi.fn();
157
+ const { stdin, unmount } = render(
158
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm, onCancel: () => {
159
+ } })
160
+ );
161
+ cleanup = unmount;
162
+ await delay(RENDER_DELAY_MS);
163
+ await stdin.write("Y");
164
+ await delay(CONFIRM_INPUT_DELAY_MS);
165
+ globalExpect(onConfirm).toHaveBeenCalled();
166
+ });
167
+ it("should handle uppercase N", async () => {
168
+ const onCancel = vi.fn();
169
+ const { stdin, unmount } = render(
170
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
171
+ }, onCancel })
172
+ );
173
+ cleanup = unmount;
174
+ await delay(RENDER_DELAY_MS);
175
+ await stdin.write("N");
176
+ await delay(CONFIRM_INPUT_DELAY_MS);
177
+ globalExpect(onCancel).toHaveBeenCalled();
178
+ });
179
+ });
180
+ describe("default value", () => {
181
+ it("should default to false when not specified", () => {
182
+ const { lastFrame, unmount } = render(
183
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
184
+ }, onCancel: () => {
185
+ } })
186
+ );
187
+ cleanup = unmount;
188
+ const output = lastFrame();
189
+ globalExpect(output).toContain("y/N");
190
+ });
191
+ it("should render with specified default value of true", () => {
192
+ const { lastFrame, unmount } = render(
193
+ /* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
194
+ }, onCancel: () => {
195
+ }, defaultValue: true })
196
+ );
197
+ cleanup = unmount;
198
+ const output = lastFrame();
199
+ globalExpect(output).toContain("Y/n");
200
+ });
201
+ });
202
+ });
203
+ //# sourceMappingURL=confirm.test.js.map