@agents-inc/cli 0.48.0 → 0.60.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 (306) hide show
  1. package/CHANGELOG.md +181 -5
  2. package/README.md +1 -2
  3. package/dist/{chunk-2DNDAXF6.js → chunk-52M2XF3W.js} +57 -27
  4. package/dist/chunk-52M2XF3W.js.map +1 -0
  5. package/dist/{chunk-WSGKCBY5.js → chunk-52XO4ULK.js} +6 -9
  6. package/dist/chunk-52XO4ULK.js.map +1 -0
  7. package/dist/{chunk-AMNCCZSG.js → chunk-6G3KZSO4.js} +82 -63
  8. package/dist/chunk-6G3KZSO4.js.map +1 -0
  9. package/dist/{chunk-LESHL6SM.js → chunk-6OWHQ7HM.js} +21 -13
  10. package/dist/chunk-6OWHQ7HM.js.map +1 -0
  11. package/dist/{chunk-X3SZIBVW.js → chunk-7FMEMXJ4.js} +71 -71
  12. package/dist/chunk-7FMEMXJ4.js.map +1 -0
  13. package/dist/{chunk-I52THVF6.js → chunk-AJJJE7F7.js} +2 -2
  14. package/dist/{chunk-ZML3OCYA.js → chunk-AX3SZZWA.js} +2 -2
  15. package/dist/{chunk-NJVJ7VO5.js → chunk-BFD5NZQ4.js} +5 -4
  16. package/dist/chunk-BFD5NZQ4.js.map +1 -0
  17. package/dist/{chunk-GSPPOXMG.js → chunk-BKJHAJQW.js} +2 -2
  18. package/dist/{chunk-GSPPOXMG.js.map → chunk-BKJHAJQW.js.map} +1 -1
  19. package/dist/{chunk-FPTUCWBY.js → chunk-BMJZBLP7.js} +46 -30
  20. package/dist/chunk-BMJZBLP7.js.map +1 -0
  21. package/dist/chunk-BNQ5O6LE.js +74 -0
  22. package/dist/chunk-BNQ5O6LE.js.map +1 -0
  23. package/dist/{chunk-W62XVWXB.js → chunk-C577AJE7.js} +3 -3
  24. package/dist/chunk-CIG7IKX3.js +118 -0
  25. package/dist/chunk-CIG7IKX3.js.map +1 -0
  26. package/dist/chunk-EC3UJRKZ.js +1534 -0
  27. package/dist/chunk-EC3UJRKZ.js.map +1 -0
  28. package/dist/{chunk-IS7GP6XC.js → chunk-EMIUPGPL.js} +57 -52
  29. package/dist/chunk-EMIUPGPL.js.map +1 -0
  30. package/dist/chunk-G6WHCALR.js +593 -0
  31. package/dist/chunk-G6WHCALR.js.map +1 -0
  32. package/dist/{chunk-OTTITQ7C.js → chunk-H7WJK7NJ.js} +48 -95
  33. package/dist/chunk-H7WJK7NJ.js.map +1 -0
  34. package/dist/chunk-HGTC76BX.js +16 -0
  35. package/dist/chunk-HGTC76BX.js.map +1 -0
  36. package/dist/{chunk-G5OZQ376.js → chunk-K6OLORQL.js} +6 -6
  37. package/dist/{chunk-OHDEJEYB.js → chunk-KIWFEBKH.js} +41 -11
  38. package/dist/chunk-KIWFEBKH.js.map +1 -0
  39. package/dist/{chunk-YMUWTPOM.js → chunk-LWXRUR6B.js} +92 -100
  40. package/dist/chunk-LWXRUR6B.js.map +1 -0
  41. package/dist/{chunk-U2AEK4ZL.js → chunk-MGNYPVOJ.js} +2 -2
  42. package/dist/chunk-MKCHLXMY.js +40 -0
  43. package/dist/chunk-MKCHLXMY.js.map +1 -0
  44. package/dist/{chunk-37QYD33C.js → chunk-MMFQNJPE.js} +2 -2
  45. package/dist/{chunk-DG2U2WY3.js → chunk-MR6OBL3B.js} +3 -11
  46. package/dist/{chunk-DG2U2WY3.js.map → chunk-MR6OBL3B.js.map} +1 -1
  47. package/dist/{chunk-7IAKVZL5.js → chunk-O6BA7Q2B.js} +28 -59
  48. package/dist/chunk-O6BA7Q2B.js.map +1 -0
  49. package/dist/chunk-OCEFD7V6.js +201 -0
  50. package/dist/chunk-OCEFD7V6.js.map +1 -0
  51. package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
  52. package/dist/chunk-PUT7X3GA.js.map +1 -0
  53. package/dist/chunk-RO6LX3UV.js +342 -0
  54. package/dist/chunk-RO6LX3UV.js.map +1 -0
  55. package/dist/{chunk-34BP5BC4.js → chunk-SDKCQXWE.js} +2 -2
  56. package/dist/{chunk-VBAAATPU.js → chunk-SEJF7CGJ.js} +41 -28
  57. package/dist/chunk-SEJF7CGJ.js.map +1 -0
  58. package/dist/{chunk-5O6GKXAN.js → chunk-SZRK3VOR.js} +24 -14
  59. package/dist/chunk-SZRK3VOR.js.map +1 -0
  60. package/dist/{chunk-5MN5S3DV.js → chunk-TC3NHO34.js} +22 -17
  61. package/dist/chunk-TC3NHO34.js.map +1 -0
  62. package/dist/{chunk-SPVSWDFM.js → chunk-TGLRDEEL.js} +8 -14
  63. package/dist/chunk-TGLRDEEL.js.map +1 -0
  64. package/dist/{chunk-P2SFRDWI.js → chunk-TZXYBG3R.js} +3634 -2875
  65. package/dist/chunk-TZXYBG3R.js.map +1 -0
  66. package/dist/{chunk-2BVZOYJP.js → chunk-VR3CDXDT.js} +2 -6
  67. package/dist/chunk-VR3CDXDT.js.map +1 -0
  68. package/dist/{chunk-KPJJOLAQ.js → chunk-WF6RM73R.js} +272 -40
  69. package/dist/chunk-WF6RM73R.js.map +1 -0
  70. package/dist/chunk-WYVDNGJB.js +31 -0
  71. package/dist/chunk-WYVDNGJB.js.map +1 -0
  72. package/dist/{chunk-F7KTUFGU.js → chunk-X5EG4EFP.js} +3 -2
  73. package/dist/chunk-X5EG4EFP.js.map +1 -0
  74. package/dist/{chunk-FHKNG3UA.js → chunk-XUDTFI4M.js} +2 -2
  75. package/dist/{chunk-AXV7NFFJ.js → chunk-YHCYKUA3.js} +14 -10
  76. package/dist/chunk-YHCYKUA3.js.map +1 -0
  77. package/dist/commands/build/marketplace.js +4 -4
  78. package/dist/commands/build/plugins.js +9 -7
  79. package/dist/commands/build/plugins.js.map +1 -1
  80. package/dist/commands/build/stack.js +13 -10
  81. package/dist/commands/build/stack.js.map +1 -1
  82. package/dist/commands/compile.js +45 -72
  83. package/dist/commands/compile.js.map +1 -1
  84. package/dist/commands/config/index.js +7 -5
  85. package/dist/commands/config/index.js.map +1 -1
  86. package/dist/commands/config/path.js +8 -6
  87. package/dist/commands/config/path.js.map +1 -1
  88. package/dist/commands/config/show.js +7 -5
  89. package/dist/commands/diff.js +9 -7
  90. package/dist/commands/diff.js.map +1 -1
  91. package/dist/commands/doctor.js +20 -16
  92. package/dist/commands/doctor.js.map +1 -1
  93. package/dist/commands/edit.js +196 -94
  94. package/dist/commands/edit.js.map +1 -1
  95. package/dist/commands/eject.js +20 -41
  96. package/dist/commands/eject.js.map +1 -1
  97. package/dist/commands/import/skill.js +10 -18
  98. package/dist/commands/import/skill.js.map +1 -1
  99. package/dist/commands/info.js +21 -20
  100. package/dist/commands/info.js.map +1 -1
  101. package/dist/commands/init.js +41 -435
  102. package/dist/commands/init.js.map +1 -1
  103. package/dist/commands/list.js +8 -6
  104. package/dist/commands/list.js.map +1 -1
  105. package/dist/commands/new/agent.js +28 -15
  106. package/dist/commands/new/agent.js.map +1 -1
  107. package/dist/commands/new/marketplace.js +67 -31
  108. package/dist/commands/new/marketplace.js.map +1 -1
  109. package/dist/commands/new/skill.js +17 -208
  110. package/dist/commands/new/skill.js.map +1 -1
  111. package/dist/commands/outdated.js +16 -10
  112. package/dist/commands/outdated.js.map +1 -1
  113. package/dist/commands/search.js +45 -35
  114. package/dist/commands/search.js.map +1 -1
  115. package/dist/commands/uninstall.js +93 -123
  116. package/dist/commands/uninstall.js.map +1 -1
  117. package/dist/commands/update.js +11 -9
  118. package/dist/commands/update.js.map +1 -1
  119. package/dist/commands/validate.js +42 -267
  120. package/dist/commands/validate.js.map +1 -1
  121. package/dist/components/common/confirm.test.js +4 -4
  122. package/dist/components/skill-search/skill-search.js +3 -3
  123. package/dist/components/wizard/category-grid.js +3 -2
  124. package/dist/components/wizard/category-grid.test.js +113 -59
  125. package/dist/components/wizard/category-grid.test.js.map +1 -1
  126. package/dist/components/wizard/checkbox-grid.js +5 -3
  127. package/dist/components/wizard/checkbox-grid.test.js +6 -5
  128. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  129. package/dist/components/wizard/domain-selection.js +12 -9
  130. package/dist/components/wizard/help-modal.js +2 -2
  131. package/dist/components/wizard/menu-item.js +1 -1
  132. package/dist/components/wizard/search-modal.js +2 -2
  133. package/dist/components/wizard/search-modal.test.js +3 -3
  134. package/dist/components/wizard/search-modal.test.js.map +1 -1
  135. package/dist/components/wizard/section-progress.js +2 -2
  136. package/dist/components/wizard/section-progress.test.js +4 -4
  137. package/dist/components/wizard/section-progress.test.js.map +1 -1
  138. package/dist/components/wizard/selection-card.js +2 -2
  139. package/dist/components/wizard/source-grid.js +4 -3
  140. package/dist/components/wizard/source-grid.test.js +5 -4
  141. package/dist/components/wizard/source-grid.test.js.map +1 -1
  142. package/dist/components/wizard/stack-selection.js +9 -8
  143. package/dist/components/wizard/step-agents.js +11 -8
  144. package/dist/components/wizard/step-agents.test.js +20 -18
  145. package/dist/components/wizard/step-agents.test.js.map +1 -1
  146. package/dist/components/wizard/step-build.js +11 -8
  147. package/dist/components/wizard/step-build.test.js +18 -36
  148. package/dist/components/wizard/step-build.test.js.map +1 -1
  149. package/dist/components/wizard/step-confirm.js +4 -4
  150. package/dist/components/wizard/step-confirm.test.js +83 -23
  151. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  152. package/dist/components/wizard/step-refine.js +2 -2
  153. package/dist/components/wizard/step-refine.test.js +3 -3
  154. package/dist/components/wizard/step-settings.js +9 -5
  155. package/dist/components/wizard/step-settings.test.js +13 -9
  156. package/dist/components/wizard/step-settings.test.js.map +1 -1
  157. package/dist/components/wizard/step-sources.js +13 -10
  158. package/dist/components/wizard/step-sources.test.js +19 -16
  159. package/dist/components/wizard/step-sources.test.js.map +1 -1
  160. package/dist/components/wizard/step-stack.js +16 -12
  161. package/dist/components/wizard/step-stack.test.js +18 -14
  162. package/dist/components/wizard/step-stack.test.js.map +1 -1
  163. package/dist/components/wizard/view-title.js +2 -2
  164. package/dist/components/wizard/wizard-layout.js +10 -8
  165. package/dist/components/wizard/wizard-tabs.js +2 -2
  166. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  167. package/dist/components/wizard/wizard.js +29 -25
  168. package/dist/config-exports.js +20 -0
  169. package/dist/config-exports.js.map +1 -0
  170. package/dist/hooks/init.js +56 -3
  171. package/dist/hooks/init.js.map +1 -1
  172. package/dist/loader-2O32KKAQ.js +19 -0
  173. package/dist/source-loader-A6B3NDI4.js +16 -0
  174. package/dist/source-loader-A6B3NDI4.js.map +1 -0
  175. package/dist/source-manager-Q7IQSGIX.js +18 -0
  176. package/dist/source-manager-Q7IQSGIX.js.map +1 -0
  177. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  178. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  179. package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
  180. package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
  181. package/dist/src/agents/meta/agent-summoner/workflow.md +8 -10
  182. package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
  183. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  184. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  185. package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
  186. package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
  187. package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
  188. package/dist/stores/wizard-store.js +6 -5
  189. package/dist/stores/wizard-store.test.js +367 -75
  190. package/dist/stores/wizard-store.test.js.map +1 -1
  191. package/package.json +5 -1
  192. package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  193. package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  194. package/src/agents/meta/agent-summoner/examples.md +2 -2
  195. package/src/agents/meta/agent-summoner/output-format.md +1 -1
  196. package/src/agents/meta/agent-summoner/workflow.md +8 -10
  197. package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
  198. package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  199. package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  200. package/src/agents/meta/skill-summoner/intro.md +1 -1
  201. package/src/agents/meta/skill-summoner/output-format.md +3 -3
  202. package/src/agents/meta/skill-summoner/workflow.md +8 -8
  203. package/src/schemas/agent.schema.json +1 -1
  204. package/src/schemas/metadata.schema.json +6 -0
  205. package/src/schemas/project-config.schema.json +0 -3
  206. package/src/schemas/stacks.schema.json +1 -1
  207. package/config/skill-categories.yaml +0 -344
  208. package/config/skill-rules.yaml +0 -740
  209. package/config/stacks.yaml +0 -1865
  210. package/dist/chunk-2BVZOYJP.js.map +0 -1
  211. package/dist/chunk-2DNDAXF6.js.map +0 -1
  212. package/dist/chunk-5MN5S3DV.js.map +0 -1
  213. package/dist/chunk-5O6GKXAN.js.map +0 -1
  214. package/dist/chunk-7IAKVZL5.js.map +0 -1
  215. package/dist/chunk-AMNCCZSG.js.map +0 -1
  216. package/dist/chunk-AXV7NFFJ.js.map +0 -1
  217. package/dist/chunk-AXZNJ5PN.js +0 -99
  218. package/dist/chunk-AXZNJ5PN.js.map +0 -1
  219. package/dist/chunk-C7DLY64D.js +0 -115
  220. package/dist/chunk-C7DLY64D.js.map +0 -1
  221. package/dist/chunk-F7KTUFGU.js.map +0 -1
  222. package/dist/chunk-FPTUCWBY.js.map +0 -1
  223. package/dist/chunk-IS7GP6XC.js.map +0 -1
  224. package/dist/chunk-KPJJOLAQ.js.map +0 -1
  225. package/dist/chunk-LESHL6SM.js.map +0 -1
  226. package/dist/chunk-NJVJ7VO5.js.map +0 -1
  227. package/dist/chunk-OHDEJEYB.js.map +0 -1
  228. package/dist/chunk-OTTITQ7C.js.map +0 -1
  229. package/dist/chunk-P2SFRDWI.js.map +0 -1
  230. package/dist/chunk-PY2XZUBF.js +0 -29
  231. package/dist/chunk-PY2XZUBF.js.map +0 -1
  232. package/dist/chunk-SPVSWDFM.js.map +0 -1
  233. package/dist/chunk-VBAAATPU.js.map +0 -1
  234. package/dist/chunk-WSGKCBY5.js.map +0 -1
  235. package/dist/chunk-X3SZIBVW.js.map +0 -1
  236. package/dist/chunk-YDASDMTH.js +0 -183
  237. package/dist/chunk-YDASDMTH.js.map +0 -1
  238. package/dist/chunk-YMUWTPOM.js.map +0 -1
  239. package/dist/chunk-YZTWZVGX.js.map +0 -1
  240. package/dist/commands/config/get.js +0 -61
  241. package/dist/commands/config/get.js.map +0 -1
  242. package/dist/commands/config/set-project.js +0 -61
  243. package/dist/commands/config/set-project.js.map +0 -1
  244. package/dist/commands/config/unset-project.js +0 -57
  245. package/dist/commands/config/unset-project.js.map +0 -1
  246. package/dist/config/skill-categories.yaml +0 -344
  247. package/dist/config/skill-rules.yaml +0 -740
  248. package/dist/config/stacks.yaml +0 -1865
  249. package/dist/source-manager-Y7R6WPOW.js +0 -16
  250. package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
  251. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  252. package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  253. package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  254. package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  255. package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
  256. package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
  257. package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
  258. package/src/agents/migration/cli-migrator/agent.yaml +0 -12
  259. package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  260. package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  261. package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  262. package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  263. package/src/agents/migration/cli-migrator/intro.md +0 -15
  264. package/src/agents/migration/cli-migrator/output-format.md +0 -164
  265. package/src/agents/migration/cli-migrator/workflow.md +0 -230
  266. /package/dist/{chunk-I52THVF6.js.map → chunk-AJJJE7F7.js.map} +0 -0
  267. /package/dist/{chunk-ZML3OCYA.js.map → chunk-AX3SZZWA.js.map} +0 -0
  268. /package/dist/{chunk-W62XVWXB.js.map → chunk-C577AJE7.js.map} +0 -0
  269. /package/dist/{chunk-G5OZQ376.js.map → chunk-K6OLORQL.js.map} +0 -0
  270. /package/dist/{chunk-U2AEK4ZL.js.map → chunk-MGNYPVOJ.js.map} +0 -0
  271. /package/dist/{chunk-37QYD33C.js.map → chunk-MMFQNJPE.js.map} +0 -0
  272. /package/dist/{chunk-34BP5BC4.js.map → chunk-SDKCQXWE.js.map} +0 -0
  273. /package/dist/{chunk-FHKNG3UA.js.map → chunk-XUDTFI4M.js.map} +0 -0
  274. /package/dist/{source-manager-Y7R6WPOW.js.map → loader-2O32KKAQ.js.map} +0 -0
  275. /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  276. /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  277. /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  278. /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  279. /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  280. /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  281. /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  282. /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  283. /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  284. /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  285. /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  286. /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  287. /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  288. /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  289. /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  290. /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
  291. /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  292. /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  293. /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  294. /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  295. /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  296. /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  297. /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  298. /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  299. /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  300. /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  301. /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  302. /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  303. /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  304. /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  305. /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  306. /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
@@ -1,52 +1,45 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ERROR_MESSAGES
4
- } from "../chunk-DG2U2WY3.js";
5
- import {
6
- BaseCommand,
7
- EXIT_CODES
8
- } from "../chunk-2BVZOYJP.js";
4
+ } from "../chunk-MR6OBL3B.js";
9
5
  import {
10
6
  checkMatrixHealth,
11
7
  extractAllSkills,
12
- extractFrontmatter,
13
8
  loadProjectSourceConfig,
14
9
  loadSkillCategories,
15
10
  loadSkillRules,
16
11
  mergeMatrixWithSkills,
17
- parseFrontmatter,
18
12
  printPluginValidationResult,
13
+ printValidationResults,
19
14
  validateAllPlugins,
15
+ validateAllSchemas,
20
16
  validatePlugin
21
- } from "../chunk-P2SFRDWI.js";
17
+ } from "../chunk-TZXYBG3R.js";
18
+ import {
19
+ parseFrontmatter
20
+ } from "../chunk-OCEFD7V6.js";
22
21
  import "../chunk-T4EXUIBY.js";
22
+ import {
23
+ BaseCommand,
24
+ EXIT_CODES
25
+ } from "../chunk-VR3CDXDT.js";
23
26
  import {
24
27
  SKILL_ID_PATTERN,
25
- agentFrontmatterValidationSchema,
26
- agentYamlGenerationSchema,
27
28
  directoryExists,
28
29
  fileExists,
29
30
  getErrorMessage,
30
31
  glob,
31
- log,
32
32
  metadataValidationSchema,
33
- pluginManifestSchema,
34
- projectSourceConfigSchema,
35
33
  readFile,
36
- skillCategoriesFileSchema,
37
- skillFrontmatterValidationSchema,
38
- skillRulesFileSchema,
39
- stackConfigValidationSchema,
40
- stacksConfigSchema,
41
34
  verbose
42
- } from "../chunk-YMUWTPOM.js";
35
+ } from "../chunk-LWXRUR6B.js";
43
36
  import {
44
- CLAUDE_DIR,
45
- CLAUDE_SRC_DIR,
46
- SKILL_CATEGORIES_YAML_PATH,
47
- SKILL_RULES_YAML_PATH,
37
+ SKILLS_DIR_PATH,
38
+ SKILL_CATEGORIES_PATH,
39
+ SKILL_RULES_PATH,
48
40
  STANDARD_FILES
49
- } from "../chunk-LESHL6SM.js";
41
+ } from "../chunk-6OWHQ7HM.js";
42
+ import "../chunk-EC3UJRKZ.js";
50
43
  import {
51
44
  init_esm_shims
52
45
  } from "../chunk-DHET7RCE.js";
@@ -54,228 +47,18 @@ import {
54
47
  // src/cli/commands/validate.ts
55
48
  init_esm_shims();
56
49
  import { Args, Flags } from "@oclif/core";
57
- import path3 from "path";
50
+ import path2 from "path";
58
51
 
59
- // src/cli/lib/schema-validator.ts
52
+ // src/cli/lib/source-validator.ts
60
53
  init_esm_shims();
61
- import { sumBy } from "remeda";
62
54
  import path from "path";
63
55
  import { parse as parseYaml } from "yaml";
64
- import fg from "fast-glob";
65
- var VALIDATION_TARGETS = [
66
- {
67
- name: "Skill Categories",
68
- schema: skillCategoriesFileSchema,
69
- pattern: STANDARD_FILES.SKILL_CATEGORIES_YAML,
70
- baseDir: "config"
71
- },
72
- {
73
- name: "Skill Rules",
74
- schema: skillRulesFileSchema,
75
- pattern: STANDARD_FILES.SKILL_RULES_YAML,
76
- baseDir: "config"
77
- },
78
- {
79
- name: "Skill Metadata",
80
- schema: metadataValidationSchema,
81
- pattern: `**/${STANDARD_FILES.METADATA_YAML}`,
82
- baseDir: "src/skills"
83
- },
84
- {
85
- name: "Stack Skill Metadata",
86
- schema: metadataValidationSchema,
87
- pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,
88
- baseDir: "src/stacks"
89
- },
90
- {
91
- name: "Stack Config",
92
- schema: stackConfigValidationSchema,
93
- pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,
94
- baseDir: "src/stacks"
95
- },
96
- {
97
- name: "Agent Definition",
98
- schema: agentYamlGenerationSchema,
99
- pattern: `**/${STANDARD_FILES.AGENT_YAML}`,
100
- baseDir: "src/agents"
101
- },
102
- {
103
- name: "Skill Frontmatter",
104
- schema: skillFrontmatterValidationSchema,
105
- pattern: `**/${STANDARD_FILES.SKILL_MD}`,
106
- baseDir: "src/skills",
107
- extractor: extractFrontmatter
108
- },
109
- {
110
- name: "Stack Skill Frontmatter",
111
- schema: skillFrontmatterValidationSchema,
112
- pattern: `**/skills/**/${STANDARD_FILES.SKILL_MD}`,
113
- baseDir: "src/stacks",
114
- extractor: extractFrontmatter
115
- },
116
- {
117
- name: "Stacks Config",
118
- schema: stacksConfigSchema,
119
- pattern: "stacks.yaml",
120
- baseDir: "config"
121
- },
122
- {
123
- name: "Project Source Config",
124
- schema: projectSourceConfigSchema,
125
- pattern: STANDARD_FILES.CONFIG_YAML,
126
- baseDir: CLAUDE_SRC_DIR
127
- },
128
- {
129
- name: "Project Skill Metadata",
130
- schema: metadataValidationSchema,
131
- pattern: `*/${STANDARD_FILES.METADATA_YAML}`,
132
- baseDir: `${CLAUDE_DIR}/skills`
133
- },
134
- {
135
- name: "Project Skill Frontmatter",
136
- schema: skillFrontmatterValidationSchema,
137
- pattern: `*/${STANDARD_FILES.SKILL_MD}`,
138
- baseDir: `${CLAUDE_DIR}/skills`,
139
- extractor: extractFrontmatter
140
- },
141
- {
142
- name: "Project Agent Frontmatter",
143
- schema: agentFrontmatterValidationSchema,
144
- pattern: "*.md",
145
- baseDir: `${CLAUDE_DIR}/agents`,
146
- extractor: extractFrontmatter
147
- },
148
- {
149
- name: "Plugin Manifest",
150
- schema: pluginManifestSchema,
151
- pattern: `*/${STANDARD_FILES.PLUGIN_JSON}`,
152
- baseDir: `${CLAUDE_DIR}/plugins`,
153
- extractor: (content) => JSON.parse(content)
154
- }
155
- ];
156
- function formatZodErrors(error) {
157
- return error.issues.map((issue) => {
158
- const path4 = issue.path.join(".");
159
- if (issue.code === "unrecognized_keys") {
160
- return `Unrecognized key: "${issue.keys.join('", "')}"`;
161
- }
162
- return path4 ? `${path4}: ${issue.message}` : issue.message;
163
- });
164
- }
165
- async function validateFile(filePath, schema, extractor) {
166
- try {
167
- if (!await fileExists(filePath)) {
168
- return { valid: false, errors: [`File not found: ${filePath}`] };
169
- }
170
- const content = await readFile(filePath);
171
- let parsed;
172
- if (extractor) {
173
- parsed = extractor(content);
174
- if (parsed === null) {
175
- return {
176
- valid: false,
177
- errors: ["Failed to extract content (no valid frontmatter found)"]
178
- };
179
- }
180
- } else {
181
- parsed = parseYaml(content);
182
- }
183
- const result = schema.safeParse(parsed);
184
- if (result.success) {
185
- return { valid: true, errors: [] };
186
- }
187
- return { valid: false, errors: formatZodErrors(result.error) };
188
- } catch (error) {
189
- const message = getErrorMessage(error);
190
- return { valid: false, errors: [`Failed to parse content: ${message}`] };
191
- }
192
- }
193
- async function validateTarget(target, rootDir = process.cwd()) {
194
- const baseDir = path.join(rootDir, target.baseDir);
195
- const pattern = path.join(baseDir, target.pattern);
196
- const files = await fg(pattern, { absolute: true });
197
- const result = {
198
- schemaName: target.name,
199
- valid: true,
200
- totalFiles: files.length,
201
- validFiles: 0,
202
- invalidFiles: []
203
- };
204
- if (files.length === 0) {
205
- return result;
206
- }
207
- for (const file of files) {
208
- const validation = await validateFile(file, target.schema, target.extractor);
209
- const relativePath = path.relative(rootDir, file);
210
- if (validation.valid) {
211
- result.validFiles++;
212
- } else {
213
- result.valid = false;
214
- result.invalidFiles.push({
215
- file: relativePath,
216
- errors: validation.errors
217
- });
218
- }
219
- }
220
- return result;
221
- }
222
- async function validateAllSchemas(rootDir = process.cwd()) {
223
- const results = [];
224
- for (const target of VALIDATION_TARGETS) {
225
- const result = await validateTarget(target, rootDir);
226
- results.push(result);
227
- }
228
- const summary = {
229
- totalSchemas: results.length,
230
- totalFiles: sumBy(results, (r) => r.totalFiles),
231
- validFiles: sumBy(results, (r) => r.validFiles),
232
- invalidFiles: sumBy(results, (r) => r.invalidFiles.length)
233
- };
234
- return {
235
- valid: results.every((r) => r.valid),
236
- results,
237
- summary
238
- };
239
- }
240
- function printValidationResults(result) {
241
- log("\n Schema Validation Summary:");
242
- log(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
243
- log(` Total schemas checked: ${result.summary.totalSchemas}`);
244
- log(` Total files: ${result.summary.totalFiles}`);
245
- log(` Valid: ${result.summary.validFiles}`);
246
- log(` Invalid: ${result.summary.invalidFiles}`);
247
- for (const schemaResult of result.results) {
248
- if (schemaResult.totalFiles === 0) continue;
249
- const status = schemaResult.valid ? "\u2713" : "\u2717";
250
- log(
251
- `
252
- ${status} ${schemaResult.schemaName}: ${schemaResult.validFiles}/${schemaResult.totalFiles} valid`
253
- );
254
- if (schemaResult.invalidFiles.length > 0) {
255
- for (const file of schemaResult.invalidFiles) {
256
- log(`
257
- ${file.file}:`);
258
- file.errors.forEach((e) => log(` - ${e}`));
259
- }
260
- }
261
- }
262
- if (result.valid) {
263
- log("\n \u2713 All schemas validated successfully\n");
264
- } else {
265
- log("\n \u2717 Validation failed\n");
266
- }
267
- }
268
-
269
- // src/cli/lib/source-validator.ts
270
- init_esm_shims();
271
- import path2 from "path";
272
- import { parse as parseYaml2 } from "yaml";
273
56
  function isSnakeCase(key) {
274
57
  return /[a-z]_[a-z]/.test(key);
275
58
  }
276
59
  async function validateSource(sourcePath) {
277
60
  const issues = [];
278
- const resolvedPath = path2.isAbsolute(sourcePath) ? sourcePath : path2.resolve(sourcePath);
61
+ const resolvedPath = path.isAbsolute(sourcePath) ? sourcePath : path.resolve(sourcePath);
279
62
  if (!await directoryExists(resolvedPath)) {
280
63
  issues.push({
281
64
  severity: "error",
@@ -285,8 +68,8 @@ async function validateSource(sourcePath) {
285
68
  return buildResult(issues, 0);
286
69
  }
287
70
  const sourceProjectConfig = await loadProjectSourceConfig(resolvedPath);
288
- const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? "src/skills";
289
- const skillsDir = path2.join(resolvedPath, skillsDirRelPath);
71
+ const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? SKILLS_DIR_PATH;
72
+ const skillsDir = path.join(resolvedPath, skillsDirRelPath);
290
73
  if (!await directoryExists(skillsDir)) {
291
74
  issues.push({
292
75
  severity: "error",
@@ -297,13 +80,13 @@ async function validateSource(sourcePath) {
297
80
  }
298
81
  const skillMdFiles = await glob(`**/${STANDARD_FILES.SKILL_MD}`, skillsDir);
299
82
  const metadataFiles = await glob(`**/${STANDARD_FILES.METADATA_YAML}`, skillsDir);
300
- const skillMdDirs = new Set(skillMdFiles.map((f) => path2.dirname(f)));
301
- const metadataDirs = new Set(metadataFiles.map((f) => path2.dirname(f)));
83
+ const skillMdDirs = new Set(skillMdFiles.map((f) => path.dirname(f)));
84
+ const metadataDirs = new Set(metadataFiles.map((f) => path.dirname(f)));
302
85
  for (const dir of skillMdDirs) {
303
86
  if (!metadataDirs.has(dir)) {
304
87
  issues.push({
305
88
  severity: "error",
306
- file: path2.join(skillsDir, dir),
89
+ file: path.join(skillsDir, dir),
307
90
  message: `Missing ${STANDARD_FILES.METADATA_YAML} \u2014 skill directory has ${STANDARD_FILES.SKILL_MD} but no metadata`
308
91
  });
309
92
  }
@@ -312,25 +95,25 @@ async function validateSource(sourcePath) {
312
95
  if (!skillMdDirs.has(dir)) {
313
96
  issues.push({
314
97
  severity: "error",
315
- file: path2.join(skillsDir, dir),
98
+ file: path.join(skillsDir, dir),
316
99
  message: `Missing ${STANDARD_FILES.SKILL_MD} \u2014 skill directory has ${STANDARD_FILES.METADATA_YAML} but no SKILL.md`
317
100
  });
318
101
  }
319
102
  }
320
103
  let skillCount = 0;
321
104
  for (const metadataFile of metadataFiles) {
322
- const metadataPath = path2.join(skillsDir, metadataFile);
323
- const skillDir = path2.dirname(metadataFile);
324
- const skillMdPath = path2.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);
105
+ const metadataPath = path.join(skillsDir, metadataFile);
106
+ const skillDir = path.dirname(metadataFile);
107
+ const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);
325
108
  if (!await fileExists(skillMdPath)) {
326
109
  continue;
327
110
  }
328
111
  skillCount++;
329
- const relPath = path2.join(skillsDirRelPath, metadataFile);
112
+ const relPath = path.join(skillsDirRelPath, metadataFile);
330
113
  let rawMetadata;
331
114
  try {
332
115
  const metadataContent = await readFile(metadataPath);
333
- rawMetadata = parseYaml2(metadataContent);
116
+ rawMetadata = parseYaml(metadataContent);
334
117
  } catch (error) {
335
118
  issues.push({
336
119
  severity: "error",
@@ -363,7 +146,7 @@ async function validateSource(sourcePath) {
363
146
  continue;
364
147
  }
365
148
  const metadata = result.data;
366
- const dirName = path2.basename(skillDir);
149
+ const dirName = path.basename(skillDir);
367
150
  if (metadata.displayName !== dirName) {
368
151
  issues.push({
369
152
  severity: "warning",
@@ -377,8 +160,8 @@ async function validateSource(sourcePath) {
377
160
  if (!SKILL_ID_PATTERN.test(frontmatter.name)) {
378
161
  issues.push({
379
162
  severity: "warning",
380
- file: path2.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD),
381
- message: `SKILL.md name '${frontmatter.name}' does not match expected skill ID pattern (domain-subcategory-name)`
163
+ file: path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD),
164
+ message: `SKILL.md name '${frontmatter.name}' does not match expected skill ID pattern (domain-category-name)`
382
165
  });
383
166
  }
384
167
  }
@@ -391,8 +174,8 @@ async function validateSource(sourcePath) {
391
174
  }
392
175
  }
393
176
  try {
394
- const categoriesPath = path2.join(resolvedPath, SKILL_CATEGORIES_YAML_PATH);
395
- const rulesPath = path2.join(resolvedPath, SKILL_RULES_YAML_PATH);
177
+ const categoriesPath = path.join(resolvedPath, SKILL_CATEGORIES_PATH);
178
+ const rulesPath = path.join(resolvedPath, SKILL_RULES_PATH);
396
179
  const hasCats = await fileExists(categoriesPath);
397
180
  const hasRules = await fileExists(rulesPath);
398
181
  if (hasCats || hasRules) {
@@ -406,23 +189,15 @@ async function validateSource(sourcePath) {
406
189
  };
407
190
  const rules = hasRules ? await loadSkillRules(rulesPath) : {
408
191
  version: "1.0.0",
409
- aliases: {},
410
- relationships: defaultRelationships,
411
- perSkill: {}
192
+ relationships: defaultRelationships
412
193
  };
413
194
  const skills = await extractAllSkills(skillsDir);
414
- const mergedMatrix = await mergeMatrixWithSkills(
415
- cats,
416
- rules.relationships,
417
- rules.aliases,
418
- skills,
419
- rules.perSkill
420
- );
195
+ const mergedMatrix = await mergeMatrixWithSkills(cats, rules.relationships, skills);
421
196
  const healthIssues = checkMatrixHealth(mergedMatrix);
422
197
  for (const healthIssue of healthIssues) {
423
198
  issues.push({
424
199
  severity: healthIssue.severity,
425
- file: SKILL_CATEGORIES_YAML_PATH,
200
+ file: SKILL_CATEGORIES_PATH,
426
201
  message: healthIssue.details
427
202
  });
428
203
  }
@@ -434,7 +209,7 @@ async function validateSource(sourcePath) {
434
209
  } catch (error) {
435
210
  issues.push({
436
211
  severity: "warning",
437
- file: SKILL_CATEGORIES_YAML_PATH,
212
+ file: SKILL_CATEGORIES_PATH,
438
213
  message: `Cross-reference validation skipped: failed to load categories/rules`
439
214
  });
440
215
  }
@@ -528,7 +303,7 @@ var Validate = class _Validate extends BaseCommand {
528
303
  }
529
304
  }
530
305
  async validatePlugins(pluginPath, verbose2, all) {
531
- const targetPath = pluginPath ? path3.resolve(pluginPath) : process.cwd();
306
+ const targetPath = pluginPath ? path2.resolve(pluginPath) : process.cwd();
532
307
  if (all) {
533
308
  await this.validateAllPluginsInDirectory(targetPath, verbose2);
534
309
  } else {
@@ -574,7 +349,7 @@ var Validate = class _Validate extends BaseCommand {
574
349
  const result = await validatePlugin(targetPath);
575
350
  const summary = result.valid ? "Done: Plugin is valid" : "Done: Plugin has errors";
576
351
  this.log(summary);
577
- printPluginValidationResult(path3.basename(targetPath), result, true);
352
+ printPluginValidationResult(path2.basename(targetPath), result, true);
578
353
  if (result.valid && result.warnings.length === 0) {
579
354
  this.log("");
580
355
  this.logSuccess("Plugin validated successfully");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/schema-validator.ts","../../src/cli/lib/source-validator.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { ERROR_MESSAGES } from \"../utils/messages.js\";\nimport { validateAllSchemas, printValidationResults } from \"../lib/schema-validator.js\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugins/index.js\";\nimport { validateSource } from \"../lib/source-validator.js\";\n\nexport default class Validate extends BaseCommand {\n static summary =\n \"Validate YAML files against schemas, validate compiled plugins, or validate a skills source\";\n static description =\n \"Validates skill/agent YAML files against JSON schemas, validates compiled plugin structure and content, \" +\n \"or validates a skills source repository for metadata correctness. \" +\n \"Without arguments, validates all YAML files in the current directory against their schemas. \" +\n \"With --source, validates all skills in the source for schema compliance, cross-references, and conventions. \" +\n \"With a path argument or --plugins flag, validates plugin(s) instead.\";\n\n static examples = [\n {\n description: \"Validate all YAML schemas\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Validate a skills source repository\",\n command: \"<%= config.bin %> <%= command.id %> --source .\",\n },\n {\n description: \"Validate a remote skills source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:acme-corp/skills\",\n },\n {\n description: \"Validate a specific plugin\",\n command: \"<%= config.bin %> <%= command.id %> ./path/to/plugin\",\n },\n {\n description: \"Validate all plugins in a directory\",\n command: \"<%= config.bin %> <%= command.id %> ./plugins --all\",\n },\n {\n description: \"Validate plugins with verbose output\",\n command: \"<%= config.bin %> <%= command.id %> --plugins --verbose\",\n },\n ];\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 (flags.source) {\n await this.validateSkillsSource(flags.source);\n } else 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 = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.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(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.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(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateSkillsSource(source: string): Promise<void> {\n this.log(\"\");\n this.log(`Validating source: ${source}`);\n this.log(\"\");\n\n try {\n const result = await validateSource(source);\n\n this.log(`Checked ${result.skillCount} skill(s)`);\n this.log(\"\");\n\n for (const issue of result.issues) {\n const prefix = issue.severity === \"error\" ? \"ERROR\" : \"WARN\";\n this.log(` [${prefix}] ${issue.file}: ${issue.message}`);\n }\n\n if (result.issues.length > 0) {\n this.log(\"\");\n }\n\n this.log(`Result: ${result.errorCount} error(s), ${result.warningCount} warning(s)`);\n\n if (result.errorCount > 0) {\n this.log(\"\");\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n } else if (result.warningCount > 0) {\n this.log(\"\");\n this.logWarning(\"Source valid with warnings\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.logSuccess(\"Source validated successfully\");\n this.log(\"\");\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n","import { sumBy } from \"remeda\";\nimport { z } from \"zod\";\nimport path from \"path\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport { extractFrontmatter } from \"../utils/frontmatter\";\nimport { log } from \"../utils/logger\";\nimport {\n skillCategoriesFileSchema,\n skillRulesFileSchema,\n metadataValidationSchema,\n stackConfigValidationSchema,\n skillFrontmatterValidationSchema,\n agentFrontmatterValidationSchema,\n agentYamlGenerationSchema,\n stacksConfigSchema,\n projectSourceConfigSchema,\n pluginManifestSchema,\n} from \"./schemas\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, STANDARD_FILES } from \"../consts\";\n\ntype FileValidationError = {\n file: string;\n errors: string[];\n};\n\ntype 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: \"Skill Categories\",\n schema: skillCategoriesFileSchema,\n pattern: STANDARD_FILES.SKILL_CATEGORIES_YAML,\n baseDir: \"config\",\n },\n {\n name: \"Skill Rules\",\n schema: skillRulesFileSchema,\n pattern: STANDARD_FILES.SKILL_RULES_YAML,\n baseDir: \"config\",\n },\n {\n name: \"Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: `**/${STANDARD_FILES.METADATA_YAML}`,\n baseDir: \"src/skills\",\n },\n {\n name: \"Stack Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,\n baseDir: \"src/stacks\",\n },\n {\n name: \"Stack Config\",\n schema: stackConfigValidationSchema,\n pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,\n baseDir: \"src/stacks\",\n },\n {\n name: \"Agent Definition\",\n schema: agentYamlGenerationSchema,\n pattern: `**/${STANDARD_FILES.AGENT_YAML}`,\n baseDir: \"src/agents\",\n },\n {\n name: \"Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: `**/${STANDARD_FILES.SKILL_MD}`,\n baseDir: \"src/skills\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stack Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: `**/skills/**/${STANDARD_FILES.SKILL_MD}`,\n baseDir: \"src/stacks\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stacks Config\",\n schema: stacksConfigSchema,\n pattern: \"stacks.yaml\",\n baseDir: \"config\",\n },\n {\n name: \"Project Source Config\",\n schema: projectSourceConfigSchema,\n pattern: STANDARD_FILES.CONFIG_YAML,\n baseDir: CLAUDE_SRC_DIR,\n },\n {\n name: \"Project Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: `*/${STANDARD_FILES.METADATA_YAML}`,\n baseDir: `${CLAUDE_DIR}/skills`,\n },\n {\n name: \"Project Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: `*/${STANDARD_FILES.SKILL_MD}`,\n baseDir: `${CLAUDE_DIR}/skills`,\n extractor: extractFrontmatter,\n },\n {\n name: \"Project Agent Frontmatter\",\n schema: agentFrontmatterValidationSchema,\n pattern: \"*.md\",\n baseDir: `${CLAUDE_DIR}/agents`,\n extractor: extractFrontmatter,\n },\n {\n name: \"Plugin Manifest\",\n schema: pluginManifestSchema,\n pattern: `*/${STANDARD_FILES.PLUGIN_JSON}`,\n baseDir: `${CLAUDE_DIR}/plugins`,\n extractor: (content: string) => JSON.parse(content) as unknown,\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 = getErrorMessage(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 log(\"\\n Schema Validation Summary:\");\n log(\" ─────────────────────────\");\n log(` Total schemas checked: ${result.summary.totalSchemas}`);\n log(` Total files: ${result.summary.totalFiles}`);\n log(` Valid: ${result.summary.validFiles}`);\n 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 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 log(`\\n ${file.file}:`);\n file.errors.forEach((e) => log(` - ${e}`));\n }\n }\n }\n\n if (result.valid) {\n log(\"\\n ✓ All schemas validated successfully\\n\");\n } else {\n log(\"\\n ✗ Validation failed\\n\");\n }\n}\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { glob, readFile, fileExists, directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { SKILL_CATEGORIES_YAML_PATH, SKILL_RULES_YAML_PATH, STANDARD_FILES } from \"../consts\";\nimport { metadataValidationSchema, formatZodErrors, SKILL_ID_PATTERN } from \"./schemas\";\nimport { parseFrontmatter } from \"./loading/loader\";\nimport { loadProjectSourceConfig } from \"./configuration\";\nimport {\n checkMatrixHealth,\n extractAllSkills,\n loadSkillCategories,\n loadSkillRules,\n mergeMatrixWithSkills,\n} from \"./matrix\";\n\nexport type SourceValidationIssue = {\n severity: \"error\" | \"warning\";\n file: string;\n message: string;\n};\n\nexport type SourceValidationResult = {\n issues: SourceValidationIssue[];\n skillCount: number;\n errorCount: number;\n warningCount: number;\n};\n\n/** Checks if a key uses snake_case (has underscore between lowercase letters) */\nfunction isSnakeCase(key: string): boolean {\n return /[a-z]_[a-z]/.test(key);\n}\n\n/**\n * Validates a skills source repository for metadata correctness.\n *\n * Checks:\n * 1. Every metadata.yaml against the strict validation schema\n * 2. displayName format and directory name consistency\n * 3. category values against known domain-prefixed patterns\n * 4. Cross-references resolve to existing skill IDs (via checkMatrixHealth)\n * 5. camelCase key convention (no snake_case)\n * 7. Every skill directory has both SKILL.md and metadata.yaml\n */\nexport async function validateSource(sourcePath: string): Promise<SourceValidationResult> {\n const issues: SourceValidationIssue[] = [];\n\n const resolvedPath = path.isAbsolute(sourcePath) ? sourcePath : path.resolve(sourcePath);\n\n if (!(await directoryExists(resolvedPath))) {\n issues.push({\n severity: \"error\",\n file: resolvedPath,\n message: \"Source directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n const sourceProjectConfig = await loadProjectSourceConfig(resolvedPath);\n const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? \"src/skills\";\n const skillsDir = path.join(resolvedPath, skillsDirRelPath);\n\n if (!(await directoryExists(skillsDir))) {\n issues.push({\n severity: \"error\",\n file: skillsDir,\n message: \"Skills directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n // Phase 1: Check every skill directory has both SKILL.md and metadata.yaml\n const skillMdFiles = await glob(`**/${STANDARD_FILES.SKILL_MD}`, skillsDir);\n const metadataFiles = await glob(`**/${STANDARD_FILES.METADATA_YAML}`, skillsDir);\n\n const skillMdDirs = new Set(skillMdFiles.map((f) => path.dirname(f)));\n const metadataDirs = new Set(metadataFiles.map((f) => path.dirname(f)));\n\n // Dirs with SKILL.md but no metadata.yaml\n for (const dir of skillMdDirs) {\n if (!metadataDirs.has(dir)) {\n issues.push({\n severity: \"error\",\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.METADATA_YAML} — skill directory has ${STANDARD_FILES.SKILL_MD} but no metadata`,\n });\n }\n }\n\n // Dirs with metadata.yaml but no SKILL.md\n for (const dir of metadataDirs) {\n if (!skillMdDirs.has(dir)) {\n issues.push({\n severity: \"error\",\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.SKILL_MD} — skill directory has ${STANDARD_FILES.METADATA_YAML} but no SKILL.md`,\n });\n }\n }\n\n // Phase 2: Validate each metadata.yaml against strict schema and conventions\n let skillCount = 0;\n for (const metadataFile of metadataFiles) {\n const metadataPath = path.join(skillsDir, metadataFile);\n const skillDir = path.dirname(metadataFile);\n const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);\n\n if (!(await fileExists(skillMdPath))) {\n // Already reported above\n continue;\n }\n\n skillCount++;\n const relPath = path.join(skillsDirRelPath, metadataFile);\n\n // Read and parse metadata.yaml\n let rawMetadata: unknown;\n try {\n const metadataContent = await readFile(metadataPath);\n rawMetadata = parseYaml(metadataContent);\n } catch (error) {\n issues.push({\n severity: \"error\",\n file: relPath,\n message: \"Failed to parse YAML\",\n });\n continue;\n }\n\n // Check for snake_case keys\n if (rawMetadata && typeof rawMetadata === \"object\" && !Array.isArray(rawMetadata)) {\n for (const key of Object.keys(rawMetadata as Record<string, unknown>)) {\n if (isSnakeCase(key)) {\n issues.push({\n severity: \"error\",\n file: relPath,\n message: `Key '${key}' uses snake_case — use camelCase instead`,\n });\n }\n }\n }\n\n // Validate against strict metadata schema\n const result = metadataValidationSchema.safeParse(rawMetadata);\n if (!result.success) {\n for (const issue of result.error.issues) {\n const fieldPath = issue.path.join(\".\");\n issues.push({\n severity: \"error\",\n file: relPath,\n message: `${fieldPath}: ${issue.message}`,\n });\n }\n continue;\n }\n\n const metadata = result.data;\n\n // Check displayName matches directory name\n const dirName = path.basename(skillDir);\n if (metadata.displayName !== dirName) {\n issues.push({\n severity: \"warning\",\n file: relPath,\n message: `displayName '${metadata.displayName}' does not match directory name '${dirName}'`,\n });\n }\n\n // Parse SKILL.md frontmatter and check name matches displayName\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\n if (frontmatter) {\n if (!SKILL_ID_PATTERN.test(frontmatter.name)) {\n issues.push({\n severity: \"warning\",\n file: path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD),\n message: `SKILL.md name '${frontmatter.name}' does not match expected skill ID pattern (domain-subcategory-name)`,\n });\n }\n }\n\n // Check category follows domain-prefixed pattern\n if (\n metadata.category &&\n !/^(web|api|cli|mobile|infra|meta|security|shared)-.+$/.test(metadata.category)\n ) {\n issues.push({\n severity: \"warning\",\n file: relPath,\n message: `Category '${metadata.category}' does not follow domain-prefixed pattern (e.g., 'web-framework', 'api-database')`,\n });\n }\n }\n\n // Phase 3: Cross-reference validation via matrix health check\n try {\n const categoriesPath = path.join(resolvedPath, SKILL_CATEGORIES_YAML_PATH);\n const rulesPath = path.join(resolvedPath, SKILL_RULES_YAML_PATH);\n\n const hasCats = await fileExists(categoriesPath);\n const hasRules = await fileExists(rulesPath);\n\n if (hasCats || hasRules) {\n const cats = hasCats ? await loadSkillCategories(categoriesPath) : {};\n const defaultRelationships = {\n conflicts: [],\n discourages: [],\n recommends: [],\n requires: [],\n alternatives: [],\n };\n const rules = hasRules\n ? await loadSkillRules(rulesPath)\n : {\n version: \"1.0.0\",\n aliases: {},\n relationships: defaultRelationships,\n perSkill: {},\n };\n const skills = await extractAllSkills(skillsDir);\n const mergedMatrix = await mergeMatrixWithSkills(\n cats,\n rules.relationships,\n rules.aliases,\n skills,\n rules.perSkill,\n );\n const healthIssues = checkMatrixHealth(mergedMatrix);\n\n for (const healthIssue of healthIssues) {\n issues.push({\n severity: healthIssue.severity,\n file: SKILL_CATEGORIES_YAML_PATH,\n message: healthIssue.details,\n });\n }\n } else {\n verbose(\n `No categories/rules files at '${resolvedPath}' — skipping cross-reference validation`,\n );\n }\n } catch (error) {\n issues.push({\n severity: \"warning\",\n file: SKILL_CATEGORIES_YAML_PATH,\n message: `Cross-reference validation skipped: failed to load categories/rules`,\n });\n }\n\n return buildResult(issues, skillCount);\n}\n\nfunction buildResult(issues: SourceValidationIssue[], skillCount: number): SourceValidationResult {\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter((i) => i.severity === \"warning\").length;\n return { issues, skillCount, errorCount, warningCount };\n}\n"],"mappings":"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","names":["path","path","path","parseYaml","path","parseYaml","verbose","path"]}
1
+ {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/source-validator.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { ERROR_MESSAGES } from \"../utils/messages.js\";\nimport { validateAllSchemas, printValidationResults } from \"../lib/schema-validator.js\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugins/index.js\";\nimport { validateSource } from \"../lib/source-validator.js\";\n\nexport default class Validate extends BaseCommand {\n static summary =\n \"Validate YAML files against schemas, validate compiled plugins, or validate a skills source\";\n static description =\n \"Validates skill/agent YAML files against JSON schemas, validates compiled plugin structure and content, \" +\n \"or validates a skills source repository for metadata correctness. \" +\n \"Without arguments, validates all YAML files in the current directory against their schemas. \" +\n \"With --source, validates all skills in the source for schema compliance, cross-references, and conventions. \" +\n \"With a path argument or --plugins flag, validates plugin(s) instead.\";\n\n static examples = [\n {\n description: \"Validate all YAML schemas\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Validate a skills source repository\",\n command: \"<%= config.bin %> <%= command.id %> --source .\",\n },\n {\n description: \"Validate a remote skills source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:acme-corp/skills\",\n },\n {\n description: \"Validate a specific plugin\",\n command: \"<%= config.bin %> <%= command.id %> ./path/to/plugin\",\n },\n {\n description: \"Validate all plugins in a directory\",\n command: \"<%= config.bin %> <%= command.id %> ./plugins --all\",\n },\n {\n description: \"Validate plugins with verbose output\",\n command: \"<%= config.bin %> <%= command.id %> --plugins --verbose\",\n },\n ];\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 (flags.source) {\n await this.validateSkillsSource(flags.source);\n } else 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 = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.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(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.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(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateSkillsSource(source: string): Promise<void> {\n this.log(\"\");\n this.log(`Validating source: ${source}`);\n this.log(\"\");\n\n try {\n const result = await validateSource(source);\n\n this.log(`Checked ${result.skillCount} skill(s)`);\n this.log(\"\");\n\n for (const issue of result.issues) {\n const prefix = issue.severity === \"error\" ? \"ERROR\" : \"WARN\";\n this.log(` [${prefix}] ${issue.file}: ${issue.message}`);\n }\n\n if (result.issues.length > 0) {\n this.log(\"\");\n }\n\n this.log(`Result: ${result.errorCount} error(s), ${result.warningCount} warning(s)`);\n\n if (result.errorCount > 0) {\n this.log(\"\");\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n } else if (result.warningCount > 0) {\n this.log(\"\");\n this.logWarning(\"Source valid with warnings\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.logSuccess(\"Source validated successfully\");\n this.log(\"\");\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { glob, readFile, fileExists, directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport {\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STANDARD_FILES,\n} from \"../consts\";\nimport { metadataValidationSchema, formatZodErrors, SKILL_ID_PATTERN } from \"./schemas\";\nimport { parseFrontmatter } from \"./loading/loader\";\nimport { loadProjectSourceConfig } from \"./configuration\";\nimport {\n checkMatrixHealth,\n extractAllSkills,\n loadSkillCategories,\n loadSkillRules,\n mergeMatrixWithSkills,\n} from \"./matrix\";\n\nexport type SourceValidationIssue = {\n severity: \"error\" | \"warning\";\n file: string;\n message: string;\n};\n\nexport type SourceValidationResult = {\n issues: SourceValidationIssue[];\n skillCount: number;\n errorCount: number;\n warningCount: number;\n};\n\n/** Checks if a key uses snake_case (has underscore between lowercase letters) */\nfunction isSnakeCase(key: string): boolean {\n return /[a-z]_[a-z]/.test(key);\n}\n\n/**\n * Validates a skills source repository for metadata correctness.\n *\n * Checks:\n * 1. Every metadata.yaml against the strict validation schema\n * 2. displayName format and directory name consistency\n * 3. category values against known domain-prefixed patterns\n * 4. Cross-references resolve to existing skill IDs (via checkMatrixHealth)\n * 5. camelCase key convention (no snake_case)\n * 7. Every skill directory has both SKILL.md and metadata.yaml\n */\nexport async function validateSource(sourcePath: string): Promise<SourceValidationResult> {\n const issues: SourceValidationIssue[] = [];\n\n const resolvedPath = path.isAbsolute(sourcePath) ? sourcePath : path.resolve(sourcePath);\n\n if (!(await directoryExists(resolvedPath))) {\n issues.push({\n severity: \"error\",\n file: resolvedPath,\n message: \"Source directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n const sourceProjectConfig = await loadProjectSourceConfig(resolvedPath);\n const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? SKILLS_DIR_PATH;\n const skillsDir = path.join(resolvedPath, skillsDirRelPath);\n\n if (!(await directoryExists(skillsDir))) {\n issues.push({\n severity: \"error\",\n file: skillsDir,\n message: \"Skills directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n // Phase 1: Check every skill directory has both SKILL.md and metadata.yaml\n const skillMdFiles = await glob(`**/${STANDARD_FILES.SKILL_MD}`, skillsDir);\n const metadataFiles = await glob(`**/${STANDARD_FILES.METADATA_YAML}`, skillsDir);\n\n const skillMdDirs = new Set(skillMdFiles.map((f) => path.dirname(f)));\n const metadataDirs = new Set(metadataFiles.map((f) => path.dirname(f)));\n\n // Dirs with SKILL.md but no metadata.yaml\n for (const dir of skillMdDirs) {\n if (!metadataDirs.has(dir)) {\n issues.push({\n severity: \"error\",\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.METADATA_YAML} — skill directory has ${STANDARD_FILES.SKILL_MD} but no metadata`,\n });\n }\n }\n\n // Dirs with metadata.yaml but no SKILL.md\n for (const dir of metadataDirs) {\n if (!skillMdDirs.has(dir)) {\n issues.push({\n severity: \"error\",\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.SKILL_MD} — skill directory has ${STANDARD_FILES.METADATA_YAML} but no SKILL.md`,\n });\n }\n }\n\n // Phase 2: Validate each metadata.yaml against strict schema and conventions\n let skillCount = 0;\n for (const metadataFile of metadataFiles) {\n const metadataPath = path.join(skillsDir, metadataFile);\n const skillDir = path.dirname(metadataFile);\n const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);\n\n if (!(await fileExists(skillMdPath))) {\n // Already reported above\n continue;\n }\n\n skillCount++;\n const relPath = path.join(skillsDirRelPath, metadataFile);\n\n // Read and parse metadata.yaml\n let rawMetadata: unknown;\n try {\n const metadataContent = await readFile(metadataPath);\n rawMetadata = parseYaml(metadataContent);\n } catch (error) {\n issues.push({\n severity: \"error\",\n file: relPath,\n message: \"Failed to parse YAML\",\n });\n continue;\n }\n\n // Check for snake_case keys\n if (rawMetadata && typeof rawMetadata === \"object\" && !Array.isArray(rawMetadata)) {\n for (const key of Object.keys(rawMetadata as Record<string, unknown>)) {\n if (isSnakeCase(key)) {\n issues.push({\n severity: \"error\",\n file: relPath,\n message: `Key '${key}' uses snake_case — use camelCase instead`,\n });\n }\n }\n }\n\n // Validate against strict metadata schema\n const result = metadataValidationSchema.safeParse(rawMetadata);\n if (!result.success) {\n for (const issue of result.error.issues) {\n const fieldPath = issue.path.join(\".\");\n issues.push({\n severity: \"error\",\n file: relPath,\n message: `${fieldPath}: ${issue.message}`,\n });\n }\n continue;\n }\n\n const metadata = result.data;\n\n // Check displayName matches directory name\n const dirName = path.basename(skillDir);\n if (metadata.displayName !== dirName) {\n issues.push({\n severity: \"warning\",\n file: relPath,\n message: `displayName '${metadata.displayName}' does not match directory name '${dirName}'`,\n });\n }\n\n // Parse SKILL.md frontmatter and check name matches displayName\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\n if (frontmatter) {\n if (!SKILL_ID_PATTERN.test(frontmatter.name)) {\n issues.push({\n severity: \"warning\",\n file: path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD),\n message: `SKILL.md name '${frontmatter.name}' does not match expected skill ID pattern (domain-category-name)`,\n });\n }\n }\n\n // Check category follows domain-prefixed pattern\n if (\n metadata.category &&\n !/^(web|api|cli|mobile|infra|meta|security|shared)-.+$/.test(metadata.category)\n ) {\n issues.push({\n severity: \"warning\",\n file: relPath,\n message: `Category '${metadata.category}' does not follow domain-prefixed pattern (e.g., 'web-framework', 'api-database')`,\n });\n }\n }\n\n // Phase 3: Cross-reference validation via matrix health check\n try {\n const categoriesPath = path.join(resolvedPath, SKILL_CATEGORIES_PATH);\n const rulesPath = path.join(resolvedPath, SKILL_RULES_PATH);\n\n const hasCats = await fileExists(categoriesPath);\n const hasRules = await fileExists(rulesPath);\n\n if (hasCats || hasRules) {\n const cats = hasCats ? await loadSkillCategories(categoriesPath) : {};\n const defaultRelationships = {\n conflicts: [],\n discourages: [],\n recommends: [],\n requires: [],\n alternatives: [],\n };\n const rules = hasRules\n ? await loadSkillRules(rulesPath)\n : {\n version: \"1.0.0\",\n relationships: defaultRelationships,\n };\n const skills = await extractAllSkills(skillsDir);\n const mergedMatrix = await mergeMatrixWithSkills(cats, rules.relationships, skills);\n const healthIssues = checkMatrixHealth(mergedMatrix);\n\n for (const healthIssue of healthIssues) {\n issues.push({\n severity: healthIssue.severity,\n file: SKILL_CATEGORIES_PATH,\n message: healthIssue.details,\n });\n }\n } else {\n verbose(\n `No categories/rules files at '${resolvedPath}' — skipping cross-reference validation`,\n );\n }\n } catch (error) {\n issues.push({\n severity: \"warning\",\n file: SKILL_CATEGORIES_PATH,\n message: `Cross-reference validation skipped: failed to load categories/rules`,\n });\n }\n\n return buildResult(issues, skillCount);\n}\n\nfunction buildResult(issues: SourceValidationIssue[], skillCount: number): SourceValidationResult {\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter((i) => i.severity === \"warning\").length;\n return { issues, skillCount, errorCount, warningCount };\n}\n"],"mappings":"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","names":["path","verbose","path"]}
@@ -6,13 +6,10 @@ import {
6
6
  KEY_Y,
7
7
  RENDER_DELAY_MS,
8
8
  delay
9
- } from "../../chunk-YZTWZVGX.js";
9
+ } from "../../chunk-PUT7X3GA.js";
10
10
  import {
11
11
  render
12
12
  } from "../../chunk-66UDJBF6.js";
13
- import {
14
- Confirm
15
- } from "../../chunk-N6S7ZRIL.js";
16
13
  import {
17
14
  afterEach,
18
15
  describe,
@@ -20,6 +17,9 @@ import {
20
17
  it,
21
18
  vi
22
19
  } from "../../chunk-XY3XDVMI.js";
20
+ import {
21
+ Confirm
22
+ } from "../../chunk-N6S7ZRIL.js";
23
23
  import {
24
24
  init_esm_shims
25
25
  } from "../../chunk-DHET7RCE.js";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillSearch
4
- } from "../../chunk-NJVJ7VO5.js";
5
- import "../../chunk-FHKNG3UA.js";
4
+ } from "../../chunk-BFD5NZQ4.js";
5
+ import "../../chunk-XUDTFI4M.js";
6
6
  import "../../chunk-U3IGFMCY.js";
7
- import "../../chunk-LESHL6SM.js";
7
+ import "../../chunk-6OWHQ7HM.js";
8
8
  import "../../chunk-DHET7RCE.js";
9
9
  export {
10
10
  SkillSearch
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CategoryGrid
4
- } from "../../chunk-OTTITQ7C.js";
4
+ } from "../../chunk-H7WJK7NJ.js";
5
5
  import "../../chunk-GG4BSB6S.js";
6
- import "../../chunk-LESHL6SM.js";
6
+ import "../../chunk-BNQ5O6LE.js";
7
+ import "../../chunk-6OWHQ7HM.js";
7
8
  import "../../chunk-DHET7RCE.js";
8
9
  export {
9
10
  CategoryGrid