agents-inc 0.150.0 → 0.152.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{chunk-FWT3CBLL.js → chunk-5GUOIJSG.js} +3 -7
  3. package/dist/{chunk-FWT3CBLL.js.map → chunk-5GUOIJSG.js.map} +1 -1
  4. package/dist/{chunk-MC5DUZ3V.js → chunk-5UWKOOIS.js} +6 -26
  5. package/dist/chunk-5UWKOOIS.js.map +1 -0
  6. package/dist/{chunk-O5ASLZ2K.js → chunk-76ADG7LQ.js} +1 -5
  7. package/dist/{chunk-O5ASLZ2K.js.map → chunk-76ADG7LQ.js.map} +1 -1
  8. package/dist/{chunk-7URSGJLE.js → chunk-BNSRA6HL.js} +13 -18
  9. package/dist/{chunk-7URSGJLE.js.map → chunk-BNSRA6HL.js.map} +1 -1
  10. package/dist/{chunk-FYPUUYSG.js → chunk-DTSG5XZB.js} +3 -7
  11. package/dist/{chunk-FYPUUYSG.js.map → chunk-DTSG5XZB.js.map} +1 -1
  12. package/dist/{chunk-YKKIJHZB.js → chunk-E5X6RJ4E.js} +5 -15
  13. package/dist/chunk-E5X6RJ4E.js.map +1 -0
  14. package/dist/{chunk-KH7MOIM5.js → chunk-EEPELKOM.js} +3665 -3737
  15. package/dist/chunk-EEPELKOM.js.map +1 -0
  16. package/dist/{chunk-NIKUMXE7.js → chunk-F7T5AFFN.js} +1 -5
  17. package/dist/{chunk-NIKUMXE7.js.map → chunk-F7T5AFFN.js.map} +1 -1
  18. package/dist/{chunk-4GL2F5AB.js → chunk-FVDKAVOL.js} +57 -48
  19. package/dist/chunk-FVDKAVOL.js.map +1 -0
  20. package/dist/{chunk-UZRISDBZ.js → chunk-GRVKW3CC.js} +2 -6
  21. package/dist/{chunk-UZRISDBZ.js.map → chunk-GRVKW3CC.js.map} +1 -1
  22. package/dist/{chunk-CDMHSHBN.js → chunk-IHUY4M22.js} +4 -8
  23. package/dist/{chunk-CDMHSHBN.js.map → chunk-IHUY4M22.js.map} +1 -1
  24. package/dist/{chunk-OZZGXBCN.js → chunk-IUQBOCSU.js} +1 -5
  25. package/dist/{chunk-OZZGXBCN.js.map → chunk-IUQBOCSU.js.map} +1 -1
  26. package/dist/{chunk-LYYXX2W5.js → chunk-J27W6TXS.js} +4 -6
  27. package/dist/{chunk-LYYXX2W5.js.map → chunk-J27W6TXS.js.map} +1 -1
  28. package/dist/chunk-JFLVEFFP.js +16 -0
  29. package/dist/chunk-JFLVEFFP.js.map +1 -0
  30. package/dist/{chunk-4LPJZNT7.js → chunk-KFB5CRXZ.js} +7 -12
  31. package/dist/{chunk-4LPJZNT7.js.map → chunk-KFB5CRXZ.js.map} +1 -1
  32. package/dist/{chunk-SYUOXSPU.js → chunk-KR65TPKC.js} +168 -14
  33. package/dist/chunk-KR65TPKC.js.map +1 -0
  34. package/dist/{chunk-KOPEM3Q7.js → chunk-KXYVJGJP.js} +2 -6
  35. package/dist/{chunk-KOPEM3Q7.js.map → chunk-KXYVJGJP.js.map} +1 -1
  36. package/dist/{chunk-ZHTXPFDK.js → chunk-L7SZXUBJ.js} +9 -14
  37. package/dist/{chunk-ZHTXPFDK.js.map → chunk-L7SZXUBJ.js.map} +1 -1
  38. package/dist/{chunk-LRYNF3J7.js → chunk-LASI35KT.js} +4 -9
  39. package/dist/{chunk-LRYNF3J7.js.map → chunk-LASI35KT.js.map} +1 -1
  40. package/dist/{chunk-VG2TVBFN.js → chunk-LDP5ASDM.js} +2 -6
  41. package/dist/{chunk-VG2TVBFN.js.map → chunk-LDP5ASDM.js.map} +1 -1
  42. package/dist/{chunk-GRPSDKIS.js → chunk-LZ52XEPR.js} +4 -8
  43. package/dist/{chunk-GRPSDKIS.js.map → chunk-LZ52XEPR.js.map} +1 -1
  44. package/dist/{chunk-CFQT72MJ.js → chunk-M7HO7NBK.js} +4 -8
  45. package/dist/{chunk-CFQT72MJ.js.map → chunk-M7HO7NBK.js.map} +1 -1
  46. package/dist/{chunk-XA57SX4T.js → chunk-MJ2KHG24.js} +4 -8
  47. package/dist/{chunk-XA57SX4T.js.map → chunk-MJ2KHG24.js.map} +1 -1
  48. package/dist/{chunk-DAG2ULNF.js → chunk-MM7CTTAV.js} +2 -6
  49. package/dist/chunk-MM7CTTAV.js.map +1 -0
  50. package/dist/{chunk-F3756A5B.js → chunk-MQ7FLIYS.js} +2 -6
  51. package/dist/{chunk-F3756A5B.js.map → chunk-MQ7FLIYS.js.map} +1 -1
  52. package/dist/{chunk-NUIZ6ZUO.js → chunk-MVR3SYMN.js} +6 -8
  53. package/dist/chunk-MVR3SYMN.js.map +1 -0
  54. package/dist/{chunk-ZKJAJWK6.js → chunk-MWG4VU64.js} +12 -17
  55. package/dist/{chunk-ZKJAJWK6.js.map → chunk-MWG4VU64.js.map} +1 -1
  56. package/dist/{chunk-ES3NJZON.js → chunk-NR3OZGL4.js} +1 -5
  57. package/dist/{chunk-ES3NJZON.js.map → chunk-NR3OZGL4.js.map} +1 -1
  58. package/dist/{chunk-GYG5SE2D.js → chunk-ODNDXQH2.js} +2 -6
  59. package/dist/{chunk-GYG5SE2D.js.map → chunk-ODNDXQH2.js.map} +1 -1
  60. package/dist/{chunk-2RSNKBXC.js → chunk-P44SXVH3.js} +6 -10
  61. package/dist/{chunk-2RSNKBXC.js.map → chunk-P44SXVH3.js.map} +1 -1
  62. package/dist/{chunk-3LIU2ZEF.js → chunk-PMM2MYMA.js} +3 -16
  63. package/dist/{chunk-3LIU2ZEF.js.map → chunk-PMM2MYMA.js.map} +1 -1
  64. package/dist/{chunk-6I6RZHYP.js → chunk-PZIZNMHK.js} +24 -36
  65. package/dist/chunk-PZIZNMHK.js.map +1 -0
  66. package/dist/{chunk-C55DN7GE.js → chunk-Q2KG7UV3.js} +3 -5
  67. package/dist/chunk-Q2KG7UV3.js.map +1 -0
  68. package/dist/{chunk-QQLRX4KI.js → chunk-Q45ZU6HD.js} +2 -6
  69. package/dist/{chunk-QQLRX4KI.js.map → chunk-Q45ZU6HD.js.map} +1 -1
  70. package/dist/{chunk-HIPGKIT3.js → chunk-QRDTLVXG.js} +9 -14
  71. package/dist/{chunk-HIPGKIT3.js.map → chunk-QRDTLVXG.js.map} +1 -1
  72. package/dist/{chunk-VIFZ6NFH.js → chunk-QZZJFYUQ.js} +3 -7
  73. package/dist/{chunk-VIFZ6NFH.js.map → chunk-QZZJFYUQ.js.map} +1 -1
  74. package/dist/{chunk-E4FT2KFV.js → chunk-R5NOI2LP.js} +13 -17
  75. package/dist/{chunk-E4FT2KFV.js.map → chunk-R5NOI2LP.js.map} +1 -1
  76. package/dist/{chunk-DUVWGO6E.js → chunk-RNJWAKMO.js} +3 -7
  77. package/dist/{chunk-DUVWGO6E.js.map → chunk-RNJWAKMO.js.map} +1 -1
  78. package/dist/{chunk-N4IZ6GBO.js → chunk-SBHBBZKF.js} +7 -23
  79. package/dist/chunk-SBHBBZKF.js.map +1 -0
  80. package/dist/{chunk-EN2GCPW7.js → chunk-SKQWRUPX.js} +10 -14
  81. package/dist/{chunk-EN2GCPW7.js.map → chunk-SKQWRUPX.js.map} +1 -1
  82. package/dist/{chunk-DDG4F3FE.js → chunk-STMHDOZD.js} +4 -21
  83. package/dist/chunk-STMHDOZD.js.map +1 -0
  84. package/dist/{chunk-5K5RBRTD.js → chunk-SX5H6TSC.js} +7 -11
  85. package/dist/chunk-SX5H6TSC.js.map +1 -0
  86. package/dist/{chunk-RBHYLCUB.js → chunk-TJJPWUMA.js} +2 -6
  87. package/dist/{chunk-RBHYLCUB.js.map → chunk-TJJPWUMA.js.map} +1 -1
  88. package/dist/{chunk-IOJR5TOY.js → chunk-TSIU7DME.js} +1 -5
  89. package/dist/{chunk-IOJR5TOY.js.map → chunk-TSIU7DME.js.map} +1 -1
  90. package/dist/{chunk-RP7R73JO.js → chunk-TUPYW2IQ.js} +3 -7
  91. package/dist/{chunk-RP7R73JO.js.map → chunk-TUPYW2IQ.js.map} +1 -1
  92. package/dist/{chunk-YU2VGX5R.js → chunk-UBEDZ4FD.js} +1 -8
  93. package/dist/{chunk-YU2VGX5R.js.map → chunk-UBEDZ4FD.js.map} +1 -1
  94. package/dist/{chunk-VEP23B5W.js → chunk-VASLW636.js} +1 -5
  95. package/dist/{chunk-VEP23B5W.js.map → chunk-VASLW636.js.map} +1 -1
  96. package/dist/{chunk-PG4G4IIK.js → chunk-VY6MNOXL.js} +2 -6
  97. package/dist/{chunk-PG4G4IIK.js.map → chunk-VY6MNOXL.js.map} +1 -1
  98. package/dist/{chunk-IHO75PMZ.js → chunk-WBCPLH66.js} +15 -13
  99. package/dist/chunk-WBCPLH66.js.map +1 -0
  100. package/dist/{chunk-DJAZE4PD.js → chunk-WKTHWQKM.js} +297 -302
  101. package/dist/chunk-WKTHWQKM.js.map +1 -0
  102. package/dist/{chunk-RJN7W2C7.js → chunk-XHUODHZ4.js} +19 -25
  103. package/dist/{chunk-RJN7W2C7.js.map → chunk-XHUODHZ4.js.map} +1 -1
  104. package/dist/{chunk-KIR7VYQD.js → chunk-XVAQG2CV.js} +1 -5
  105. package/dist/{chunk-KIR7VYQD.js.map → chunk-XVAQG2CV.js.map} +1 -1
  106. package/dist/{chunk-P3PN5SVI.js → chunk-ZL7PFNHN.js} +2 -6
  107. package/dist/{chunk-P3PN5SVI.js.map → chunk-ZL7PFNHN.js.map} +1 -1
  108. package/dist/{chunk-ZDLTLNU2.js → chunk-ZPPHXXAP.js} +9 -15
  109. package/dist/{chunk-ZDLTLNU2.js.map → chunk-ZPPHXXAP.js.map} +1 -1
  110. package/dist/commands/build/marketplace.js +10 -15
  111. package/dist/commands/build/marketplace.js.map +1 -1
  112. package/dist/commands/build/plugins.js +9 -14
  113. package/dist/commands/build/plugins.js.map +1 -1
  114. package/dist/commands/compile.js +14 -19
  115. package/dist/commands/compile.js.map +1 -1
  116. package/dist/commands/doctor.js +13 -18
  117. package/dist/commands/doctor.js.map +1 -1
  118. package/dist/commands/edit.js +51 -55
  119. package/dist/commands/edit.js.map +1 -1
  120. package/dist/commands/eject.js +13 -18
  121. package/dist/commands/eject.js.map +1 -1
  122. package/dist/commands/import/skill.js +9 -14
  123. package/dist/commands/import/skill.js.map +1 -1
  124. package/dist/commands/init.js +50 -51
  125. package/dist/commands/list.js +14 -16
  126. package/dist/commands/list.js.map +1 -1
  127. package/dist/commands/new/agent.js +12 -16
  128. package/dist/commands/new/agent.js.map +1 -1
  129. package/dist/commands/new/marketplace.js +15 -20
  130. package/dist/commands/new/marketplace.js.map +1 -1
  131. package/dist/commands/new/skill.js +11 -13
  132. package/dist/commands/search.js +14 -19
  133. package/dist/commands/search.js.map +1 -1
  134. package/dist/commands/uninstall.js +17 -21
  135. package/dist/commands/uninstall.js.map +1 -1
  136. package/dist/commands/update.js +17 -21
  137. package/dist/commands/update.js.map +1 -1
  138. package/dist/commands/validate.js +10 -16
  139. package/dist/commands/validate.js.map +1 -1
  140. package/dist/components/common/confirm.js +1 -2
  141. package/dist/components/common/prompt-confirm.js +2 -2
  142. package/dist/components/common/select-list.js +3 -4
  143. package/dist/components/common/spinner.js +1 -2
  144. package/dist/components/wizard/category-grid.js +8 -9
  145. package/dist/components/wizard/checkbox-grid.js +6 -7
  146. package/dist/components/wizard/domain-selection.js +14 -15
  147. package/dist/components/wizard/run-wizard-session.js +40 -40
  148. package/dist/components/wizard/scroll-affordance.js +2 -3
  149. package/dist/components/wizard/search-modal.js +6 -7
  150. package/dist/components/wizard/selection-card.js +2 -3
  151. package/dist/components/wizard/skill-agent-summary.js +8 -9
  152. package/dist/components/wizard/source-grid.js +13 -14
  153. package/dist/components/wizard/stack-selection.js +12 -13
  154. package/dist/components/wizard/step-agents.js +14 -15
  155. package/dist/components/wizard/step-build.js +14 -15
  156. package/dist/components/wizard/step-confirm.js +13 -14
  157. package/dist/components/wizard/step-settings.js +11 -12
  158. package/dist/components/wizard/step-sources.js +20 -21
  159. package/dist/components/wizard/step-stack.js +13 -14
  160. package/dist/components/wizard/summary-panel.js +12 -13
  161. package/dist/components/wizard/toast.js +2 -3
  162. package/dist/components/wizard/wizard-layout.js +18 -19
  163. package/dist/components/wizard/wizard-tabs.js +8 -9
  164. package/dist/components/wizard/wizard.js +38 -39
  165. package/dist/config-exports.js +1 -7
  166. package/dist/config-exports.js.map +1 -1
  167. package/dist/copy-local-skills-6EMVN7RB.js +14 -0
  168. package/dist/hooks/init.js +50 -54
  169. package/dist/hooks/init.js.map +1 -1
  170. package/dist/index.js +0 -4
  171. package/dist/index.js.map +1 -1
  172. package/dist/load-agent-defs-BWOUVEAR.js +15 -0
  173. package/dist/{loader-E2ERJYVA.js → loader-5JP4S7CJ.js} +4 -5
  174. package/dist/recompile-project-agents-6DL45TDI.js +19 -0
  175. package/dist/{source-loader-VVHMQEX5.js → source-loader-MZYCPL2S.js} +7 -8
  176. package/dist/stores/wizard-store.js +7 -8
  177. package/package.json +22 -21
  178. package/dist/chunk-4GL2F5AB.js.map +0 -1
  179. package/dist/chunk-5K5RBRTD.js.map +0 -1
  180. package/dist/chunk-6I6RZHYP.js.map +0 -1
  181. package/dist/chunk-C55DN7GE.js.map +0 -1
  182. package/dist/chunk-DAG2ULNF.js.map +0 -1
  183. package/dist/chunk-DDG4F3FE.js.map +0 -1
  184. package/dist/chunk-DIBCRIMR.js +0 -36
  185. package/dist/chunk-DIBCRIMR.js.map +0 -1
  186. package/dist/chunk-DJAZE4PD.js.map +0 -1
  187. package/dist/chunk-EKWAUOQB.js +0 -96
  188. package/dist/chunk-EKWAUOQB.js.map +0 -1
  189. package/dist/chunk-I3XKEGHM.js +0 -16383
  190. package/dist/chunk-I3XKEGHM.js.map +0 -1
  191. package/dist/chunk-IHO75PMZ.js.map +0 -1
  192. package/dist/chunk-K3OU6TGX.js +0 -77
  193. package/dist/chunk-K3OU6TGX.js.map +0 -1
  194. package/dist/chunk-KH7MOIM5.js.map +0 -1
  195. package/dist/chunk-KSZ6PCY4.js +0 -43
  196. package/dist/chunk-KSZ6PCY4.js.map +0 -1
  197. package/dist/chunk-MC5DUZ3V.js.map +0 -1
  198. package/dist/chunk-N4IZ6GBO.js.map +0 -1
  199. package/dist/chunk-NUIZ6ZUO.js.map +0 -1
  200. package/dist/chunk-OA5SUEQD.js +0 -181
  201. package/dist/chunk-OA5SUEQD.js.map +0 -1
  202. package/dist/chunk-P56WJ5FA.js +0 -50
  203. package/dist/chunk-P56WJ5FA.js.map +0 -1
  204. package/dist/chunk-SYUOXSPU.js.map +0 -1
  205. package/dist/chunk-THKIOI32.js +0 -939
  206. package/dist/chunk-THKIOI32.js.map +0 -1
  207. package/dist/chunk-V7QOSGQA.js +0 -298
  208. package/dist/chunk-V7QOSGQA.js.map +0 -1
  209. package/dist/chunk-YKKIJHZB.js.map +0 -1
  210. package/dist/components/common/confirm.test.js +0 -203
  211. package/dist/components/common/confirm.test.js.map +0 -1
  212. package/dist/components/wizard/category-grid.test.js +0 -1253
  213. package/dist/components/wizard/category-grid.test.js.map +0 -1
  214. package/dist/components/wizard/checkbox-grid.test.js +0 -264
  215. package/dist/components/wizard/checkbox-grid.test.js.map +0 -1
  216. package/dist/components/wizard/search-modal.test.js +0 -212
  217. package/dist/components/wizard/search-modal.test.js.map +0 -1
  218. package/dist/components/wizard/source-grid.test.js +0 -1094
  219. package/dist/components/wizard/source-grid.test.js.map +0 -1
  220. package/dist/components/wizard/step-agents.test.js +0 -204
  221. package/dist/components/wizard/step-agents.test.js.map +0 -1
  222. package/dist/components/wizard/step-build.test.js +0 -552
  223. package/dist/components/wizard/step-build.test.js.map +0 -1
  224. package/dist/components/wizard/step-confirm.test.js +0 -744
  225. package/dist/components/wizard/step-confirm.test.js.map +0 -1
  226. package/dist/components/wizard/step-settings.test.js +0 -244
  227. package/dist/components/wizard/step-settings.test.js.map +0 -1
  228. package/dist/components/wizard/step-sources.test.js +0 -155
  229. package/dist/components/wizard/step-sources.test.js.map +0 -1
  230. package/dist/components/wizard/step-stack.test.js +0 -262
  231. package/dist/components/wizard/step-stack.test.js.map +0 -1
  232. package/dist/components/wizard/summary-panel.test.js +0 -317
  233. package/dist/components/wizard/summary-panel.test.js.map +0 -1
  234. package/dist/components/wizard/wizard-layout.test.js +0 -200
  235. package/dist/components/wizard/wizard-layout.test.js.map +0 -1
  236. package/dist/components/wizard/wizard-tabs.test.js +0 -290
  237. package/dist/components/wizard/wizard-tabs.test.js.map +0 -1
  238. package/dist/copy-local-skills-CA7P73RZ.js +0 -15
  239. package/dist/dist-VNJNNJK7.js +0 -550
  240. package/dist/dist-VNJNNJK7.js.map +0 -1
  241. package/dist/load-agent-defs-6MAY5ABI.js +0 -16
  242. package/dist/magic-string.es-5TV73NJD.js +0 -1316
  243. package/dist/magic-string.es-5TV73NJD.js.map +0 -1
  244. package/dist/recompile-project-agents-VYQJ6UZB.js +0 -20
  245. package/dist/source-manager-TPDXV5FO.js +0 -18
  246. package/dist/source-manager-TPDXV5FO.js.map +0 -1
  247. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +0 -118
  248. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +0 -1
  249. package/dist/stores/wizard-store.test.js +0 -3053
  250. package/dist/stores/wizard-store.test.js.map +0 -1
  251. /package/dist/{copy-local-skills-CA7P73RZ.js.map → copy-local-skills-6EMVN7RB.js.map} +0 -0
  252. /package/dist/{load-agent-defs-6MAY5ABI.js.map → load-agent-defs-BWOUVEAR.js.map} +0 -0
  253. /package/dist/{loader-E2ERJYVA.js.map → loader-5JP4S7CJ.js.map} +0 -0
  254. /package/dist/{recompile-project-agents-VYQJ6UZB.js.map → recompile-project-agents-6DL45TDI.js.map} +0 -0
  255. /package/dist/{source-loader-VVHMQEX5.js.map → source-loader-MZYCPL2S.js.map} +0 -0
@@ -1,16 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ERROR_MESSAGES
4
- } from "../chunk-GYG5SE2D.js";
4
+ } from "../chunk-ODNDXQH2.js";
5
5
  import {
6
6
  listAgentMdFiles
7
- } from "../chunk-YKKIJHZB.js";
7
+ } from "../chunk-E5X6RJ4E.js";
8
8
  import {
9
9
  BaseCommand,
10
10
  EXIT_CODES
11
- } from "../chunk-OA5SUEQD.js";
12
- import "../chunk-SYUOXSPU.js";
13
- import "../chunk-P3PN5SVI.js";
11
+ } from "../chunk-KR65TPKC.js";
12
+ import "../chunk-ZL7PFNHN.js";
14
13
  import {
15
14
  checkMatrixHealth,
16
15
  getInstalledPluginsRegistryPath,
@@ -30,7 +29,7 @@ import {
30
29
  validateAllPlugins,
31
30
  validatePlugin,
32
31
  validateSkillFrontmatter
33
- } from "../chunk-KH7MOIM5.js";
32
+ } from "../chunk-EEPELKOM.js";
34
33
  import {
35
34
  agentYamlGenerationSchema,
36
35
  directoryExists,
@@ -48,11 +47,11 @@ import {
48
47
  stackConfigValidationSchema,
49
48
  stacksConfigSchema,
50
49
  validateSkillMetadata
51
- } from "../chunk-3LIU2ZEF.js";
50
+ } from "../chunk-PMM2MYMA.js";
52
51
  import {
53
52
  matrix
54
- } from "../chunk-DJAZE4PD.js";
55
- import "../chunk-VEP23B5W.js";
53
+ } from "../chunk-WKTHWQKM.js";
54
+ import "../chunk-VASLW636.js";
56
55
  import {
57
56
  DIRS,
58
57
  PLUGIN_MANIFEST_DIR,
@@ -61,20 +60,15 @@ import {
61
60
  SKILL_RULES_PATH,
62
61
  STACKS_FILE_PATH,
63
62
  STANDARD_FILES
64
- } from "../chunk-O5ASLZ2K.js";
65
- import "../chunk-YU2VGX5R.js";
66
- import {
67
- init_esm_shims
68
- } from "../chunk-P56WJ5FA.js";
63
+ } from "../chunk-76ADG7LQ.js";
64
+ import "../chunk-UBEDZ4FD.js";
69
65
 
70
66
  // src/cli/commands/validate.ts
71
- init_esm_shims();
72
67
  import os from "os";
73
68
  import path2 from "path";
74
69
  import { parse as parseYaml2 } from "yaml";
75
70
 
76
71
  // src/cli/lib/source-validator.ts
77
- init_esm_shims();
78
72
  import path from "path";
79
73
  import { parse as parseYaml } from "yaml";
80
74
  function isSnakeCase(key) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/source-validator.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\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 {\n validateAllPlugins,\n validatePlugin,\n printPluginValidationResult,\n validateSkillFrontmatter,\n validateAgentFrontmatter,\n getUserPluginsDir,\n getProjectPluginsDir,\n getInstalledPluginsRegistryPath,\n listRegisteredPluginInstalls,\n type ResolvedPlugin,\n} from \"../lib/plugins/index.js\";\nimport { validateSource } from \"../lib/source-validator.js\";\nimport { isLocalSource, resolveAllSources, type SourceEntry } from \"../lib/configuration/index.js\";\nimport { resolveInstallPaths, isHomeDirectory } from \"../lib/installation/index.js\";\nimport { splitMetadataValidationIssues, validateSkillMetadata } from \"../lib/schemas.js\";\nimport { PLUGIN_MANIFEST_DIR, STANDARD_FILES } from \"../consts.js\";\nimport type { ValidationResult } from \"../types/index.js\";\nimport { directoryExists, fileExists, listDirectories, readFile } from \"../utils/fs.js\";\nimport { listAgentMdFiles } from \"../lib/agents/index.js\";\n\nconst COL_NAME_WIDTH = 30;\nconst COL_URL_WIDTH = 40;\nconst COL_PATH_WIDTH = 50;\n\nconst VALIDATE_STATUS = {\n SKIPPED_REMOTE: \"— skipped (remote source)\",\n NOT_PRESENT: \"— not present\",\n EMPTY: \"— none\",\n NO_PLUGINS: \"— no plugins\",\n} as const;\n\ntype AggregateCounts = {\n errors: number;\n warnings: number;\n};\n\nconst NO_ISSUES: AggregateCounts = { errors: 0, warnings: 0 };\n\nfunction sumCounts(counts: AggregateCounts[]): AggregateCounts {\n return counts.reduce(\n (acc, c) => ({ errors: acc.errors + c.errors, warnings: acc.warnings + c.warnings }),\n NO_ISSUES,\n );\n}\n\n/** Prints each named validation result and sums its error/warning counts. */\nfunction printAndSumResults(\n results: Array<{ name: string; result: ValidationResult }>,\n): AggregateCounts {\n return sumCounts(\n results.map(({ name, result }) => {\n printPluginValidationResult(name, result);\n return {\n errors: result.valid ? 0 : result.errors.length,\n warnings: result.warnings.length,\n };\n }),\n );\n}\n\nexport default class Validate extends BaseCommand {\n static summary =\n \"Validate every registered source, installed plugin, installed skill, and installed agent\";\n static description =\n \"Read-only validation. Walks every registered source, every installed plugin, \" +\n \"every installed skill, and every installed agent. Prints a summary table with \" +\n \"per-directory counts; exits non-zero if any pass produced an error.\";\n\n static examples = [\n { description: \"Validate everything\", command: \"<%= config.bin %> <%= command.id %>\" },\n ];\n\n // Override parent baseFlags to drop --source (validate is a zero-flag command)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Validate);\n\n let totals: AggregateCounts = NO_ISSUES;\n\n try {\n totals = await this.validateAllRegistered();\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n\n this.log(\"\");\n this.log(`Result: ${totals.errors} error(s), ${totals.warnings} warning(s)`);\n this.log(\"\");\n\n if (totals.errors > 0) {\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateAllRegistered(): Promise<AggregateCounts> {\n const projectDir = process.cwd();\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n\n const inHome = isHomeDirectory(projectDir);\n\n this.log(\"\");\n this.log(\"Validating sources\");\n\n const { primary, extras } = await resolveAllSources(projectDir);\n const sources: SourceEntry[] = [primary, ...extras];\n\n const counts: AggregateCounts[] = [];\n for (const source of sources) {\n counts.push(await this.validateRegisteredSource(source));\n }\n\n this.log(\"\");\n this.log(\"Validating plugins\");\n\n counts.push(await this.validatePluginsDirectory(getUserPluginsDir()));\n if (!inHome) {\n counts.push(await this.validatePluginsDirectory(getProjectPluginsDir(projectDir)));\n }\n\n this.log(\"\");\n this.log(\"Validating skills\");\n\n counts.push(await this.validateInstalledSkillsDirectory(globalPaths.skillsDir));\n if (!inHome) {\n counts.push(await this.validateInstalledSkillsDirectory(projectPaths.skillsDir));\n }\n\n this.log(\"\");\n this.log(\"Validating agents\");\n\n counts.push(await this.validateInstalledAgentsDirectory(globalPaths.agentsDir));\n if (!inHome) {\n counts.push(await this.validateInstalledAgentsDirectory(projectPaths.agentsDir));\n }\n\n return sumCounts(counts);\n }\n\n private async validateRegisteredSource(source: SourceEntry): Promise<AggregateCounts> {\n if (!isLocalSource(source.url)) {\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${VALIDATE_STATUS.SKIPPED_REMOTE}`,\n );\n return NO_ISSUES;\n }\n\n try {\n const result = await validateSource(source.url);\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${result.skillCount} skill(s), ${result.errorCount} error(s), ${result.warningCount} warning(s)`,\n );\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 return { errors: result.errorCount, warnings: result.warningCount };\n } catch (error) {\n const message = getErrorMessage(error);\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} failed: ${message}`,\n );\n return { errors: 1, warnings: 0 };\n }\n }\n\n private async validatePluginsDirectory(pluginsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(pluginsDir);\n\n if (!(await directoryExists(pluginsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n if (await fileExists(getInstalledPluginsRegistryPath(pluginsDir))) {\n const registryCounts = await this.validateRegistryPlugins(pluginsDir, displayPath);\n if (registryCounts !== undefined) return registryCounts;\n }\n\n const pluginDirs = await findPluginDirectories(pluginsDir);\n if (pluginDirs.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NO_PLUGINS}`);\n return NO_ISSUES;\n }\n\n const result = await validateAllPlugins(pluginsDir);\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${result.summary.total} plugin(s), ${result.summary.invalid} invalid, ${result.summary.withWarnings} with warnings`,\n );\n\n return printAndSumResults(result.results);\n }\n\n /**\n * Validates the installs recorded in the plugins directory's\n * `installed_plugins.json` (claude CLI >=2.1.220 cache layout). Returns\n * undefined when the registry records no installs so the caller can fall\n * back to the direct-children scan (older/manual layouts).\n */\n private async validateRegistryPlugins(\n pluginsDir: string,\n displayPath: string,\n ): Promise<AggregateCounts | undefined> {\n let installs: ResolvedPlugin[];\n try {\n installs = await listRegisteredPluginInstalls(pluginsDir);\n } catch (error) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} failed: ${getErrorMessage(error)}`);\n return { errors: 1, warnings: 0 };\n }\n\n if (installs.length === 0) return undefined;\n\n // A recorded installPath that no longer exists surfaces as an invalid\n // plugin via validatePlugin's structure check, not a crash.\n const results = await Promise.all(\n installs.map(async ({ pluginKey, installPath }) => ({\n name: pluginKey,\n result: await validatePlugin(installPath),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${results.length} plugin(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n\n private async validateInstalledSkillsDirectory(skillsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(skillsDir);\n\n if (!(await directoryExists(skillsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n const skillDirs = await listDirectories(skillsDir);\n if (skillDirs.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);\n return NO_ISSUES;\n }\n\n const results = await Promise.all(\n skillDirs.map(async (name) => ({\n name,\n result: await validateInstalledSkill(path.join(skillsDir, name)),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${skillDirs.length} skill(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n\n private async validateInstalledAgentsDirectory(agentsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(agentsDir);\n\n if (!(await directoryExists(agentsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n const agentFiles = await listAgentMdFiles(agentsDir);\n if (agentFiles.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);\n return NO_ISSUES;\n }\n\n const results = await Promise.all(\n agentFiles.map(async (fileName) => ({\n name: fileName,\n result: await validateAgentFrontmatter(path.join(agentsDir, fileName)),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${agentFiles.length} agent(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n}\n\n/** Render an absolute path with a `~/` prefix when it's under the user's home directory. */\nfunction displayDir(absolutePath: string): string {\n const home = os.homedir();\n if (absolutePath === home) return \"~\";\n if (absolutePath.startsWith(home + path.sep)) {\n return `~${path.sep}${path.relative(home, absolutePath)}`;\n }\n return absolutePath;\n}\n\nasync function validateInstalledSkill(skillDir: string): Promise<ValidationResult> {\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(skillMdPath))) {\n errors.push(`Missing ${STANDARD_FILES.SKILL_MD}`);\n } else {\n const frontmatterResult = await validateSkillFrontmatter(skillMdPath);\n errors.push(...frontmatterResult.errors);\n warnings.push(...frontmatterResult.warnings);\n }\n\n if (!(await fileExists(metadataPath))) {\n errors.push(`Missing ${STANDARD_FILES.METADATA_YAML}`);\n } else {\n const metadataResult = await validateInstalledSkillMetadata(metadataPath);\n errors.push(...metadataResult.errors);\n warnings.push(...metadataResult.warnings);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nasync function validateInstalledSkillMetadata(metadataPath: string): Promise<ValidationResult> {\n let rawMetadata: unknown;\n try {\n const content = await readFile(metadataPath);\n rawMetadata = parseYaml(content);\n } catch (err) {\n return {\n valid: false,\n errors: [`${STANDARD_FILES.METADATA_YAML}: ${getErrorMessage(err)}`],\n warnings: [],\n };\n }\n\n const result = validateSkillMetadata(rawMetadata);\n if (result.success) {\n return { valid: true, errors: [], warnings: [] };\n }\n\n // Over-length cliDescription is advisory — only hard schema violations invalidate the skill\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n return {\n valid: errors.length === 0,\n errors: errors.map((e) => `${STANDARD_FILES.METADATA_YAML}: ${e}`),\n warnings: warnings.map((w) => `${STANDARD_FILES.METADATA_YAML}: ${w}`),\n };\n}\n\nasync function findPluginDirectories(pluginsDir: string): Promise<string[]> {\n const entries = await listDirectories(pluginsDir);\n const checks = await Promise.all(\n entries.map(async (name) => ({\n name,\n isPlugin: await directoryExists(path.join(pluginsDir, name, PLUGIN_MANIFEST_DIR)),\n })),\n );\n return checks.filter((check) => check.isPlugin).map((check) => check.name);\n}\n","import path from \"path\";\nimport { isRecord } from \"../utils/type-guards.js\";\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { glob, readFile, fileExists, directoryExists } from \"../utils/fs\";\nimport {\n DIRS,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n} from \"../consts\";\nimport {\n agentYamlGenerationSchema,\n metadataValidationSchema,\n splitMetadataValidationIssues,\n validateSkillMetadata,\n skillCategoriesFileSchema,\n skillRulesFileSchema,\n stackConfigValidationSchema,\n stacksConfigSchema,\n} from \"./schemas\";\nimport { parseFrontmatter } from \"./loading/loader\";\nimport { loadConfig, loadProjectSourceConfig } from \"./configuration\";\nimport { checkMatrixHealth } from \"./matrix\";\nimport { loadSkillsMatrixFromSource } from \"./loading/source-loader\";\nimport { matrix } from \"./matrix/matrix-provider\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { formatZodErrors } from \"./schema-validator\";\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) */\nexport function isSnakeCase(key: string): boolean {\n return /[a-z]_[a-z]/.test(key);\n}\n\n/**\n * Checks top-level keys for snake_case usage (camelCase is the convention).\n * Non-object input yields no issues.\n */\nexport function checkSnakeCaseKeys(rawMetadata: unknown, relPath: string): SourceValidationIssue[] {\n if (!isRecord(rawMetadata)) return [];\n\n return Object.keys(rawMetadata)\n .filter(isSnakeCase)\n .map((key) => ({\n severity: \"error\" as const,\n file: relPath,\n message: `Key '${key}' uses snake_case — use camelCase instead`,\n }));\n}\n\n/**\n * Warns when a skill directory's name does not equal the skill's machine id\n * (SKILL.md frontmatter `name`) — the key the loader registers the skill under.\n * Warning, not error: the loader still loads the skill by its id, but the\n * directory no longer signals which skill it contains.\n */\nexport function checkDirNameMatchesSkillId(\n skillId: string,\n relPath: string,\n dirName: string,\n): SourceValidationIssue[] {\n if (skillId === dirName) return [];\n return [\n {\n severity: \"warning\",\n file: relPath,\n message: `Directory name '${dirName}' does not match skill id '${skillId}'`,\n },\n ];\n}\n\n/**\n * Reads a skill directory's SKILL.md frontmatter and checks the directory name\n * against the skill's machine id. When the id cannot be read (unreadable file or\n * missing/invalid frontmatter), reports that the check could not run.\n */\nasync function checkSkillDirName(\n skillsDir: string,\n skillsDirRelPath: string,\n skillDir: string,\n): Promise<SourceValidationIssue[]> {\n const dirName = path.basename(skillDir);\n const skillMdRelPath = path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD);\n\n try {\n const content = await readFile(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD));\n const frontmatter = parseFrontmatter(content, skillMdRelPath);\n\n if (frontmatter === null) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': missing or invalid ${STANDARD_FILES.SKILL_MD} frontmatter`,\n },\n ];\n }\n\n return checkDirNameMatchesSkillId(frontmatter.name, skillMdRelPath, dirName);\n } catch (error) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': ${getErrorMessage(error)}`,\n },\n ];\n }\n}\n\n/**\n * Finds missing SKILL.md / metadata.yaml pairs (pure function, no I/O).\n *\n * Returns issues for:\n * - Directories with SKILL.md but no metadata.yaml\n * - Directories with metadata.yaml but no SKILL.md\n */\nexport function validateSkillFilePairs(\n skillMdDirs: Set<string>,\n metadataDirs: Set<string>,\n skillsDir: string,\n): SourceValidationIssue[] {\n const missingMetadata = [...skillMdDirs]\n .filter((dir) => !metadataDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\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 const missingSkillMd = [...metadataDirs]\n .filter((dir) => !skillMdDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\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 return [...missingMetadata, ...missingSkillMd];\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 * (over-length cliDescription is downgraded to a warning)\n * 2. Directory name equals the skill's machine id (SKILL.md frontmatter name)\n * 3. Cross-references resolve to existing skill IDs (via checkMatrixHealth)\n * 4. camelCase key convention (no snake_case)\n * 5. 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 issues.push(...validateSkillFilePairs(skillMdDirs, metadataDirs, skillsDir));\n\n // Phase 2: Validate each metadata.yaml against strict schema and conventions.\n // Pair violations were already reported by phase 1 — validate only complete pairs.\n const validMetadataFiles = metadataFiles.filter((f) => skillMdDirs.has(path.dirname(f)));\n for (const metadataFile of validMetadataFiles) {\n const metadataPath = path.join(skillsDir, metadataFile);\n const skillDir = path.dirname(metadataFile);\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: ${getErrorMessage(error)}`,\n });\n continue;\n }\n\n issues.push(...checkSnakeCaseKeys(rawMetadata, relPath));\n\n const result = validateSkillMetadata(rawMetadata);\n if (!result.success) {\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n issues.push(\n ...errors.map((message) => ({ severity: \"error\" as const, file: relPath, message })),\n ...warnings.map((message) => ({ severity: \"warning\" as const, file: relPath, message })),\n );\n }\n\n // Independent of metadata validity — the id lives in SKILL.md frontmatter\n issues.push(...(await checkSkillDirName(skillsDir, skillsDirRelPath, skillDir)));\n }\n\n // Phase 3: Cross-reference validation via matrix health check\n try {\n await loadSkillsMatrixFromSource({ sourceFlag: resolvedPath, skipExtraSources: true });\n issues.push(\n ...checkMatrixHealth(matrix).map((healthIssue) => ({\n severity: healthIssue.severity,\n file: SKILL_CATEGORIES_PATH,\n message: healthIssue.details,\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: ${getErrorMessage(error)}`,\n });\n }\n\n // Phases 4–6: optional source-repo targets — run in parallel\n // Phase 4: stack skill metadata + stack configs\n // Phase 5: agent metadata\n // Phase 6: config/*.ts runtime exports\n const extraIssues = await Promise.all([\n validateStacks(resolvedPath),\n validateAgents(resolvedPath),\n validateConfigFiles(resolvedPath),\n ]);\n issues.push(...extraIssues.flat());\n\n return buildResult(issues, validMetadataFiles.length);\n}\n\n/**\n * Validates stack-embedded skill metadata.yaml files and stack config.yaml files.\n * Skips silently when src/stacks/ does not exist.\n */\nasync function validateStacks(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const stacksDir = path.join(resolvedPath, DIRS.stacks);\n if (!(await directoryExists(stacksDir))) return [];\n\n const [skillMetaIssues, configIssues] = await Promise.all([\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,\n schema: metadataValidationSchema,\n }),\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,\n schema: stackConfigValidationSchema,\n }),\n ]);\n return [...skillMetaIssues, ...configIssues];\n}\n\n/**\n * Validates agent metadata.yaml files against the compiled agent output schema.\n * Skips silently when src/agents/ does not exist.\n */\nasync function validateAgents(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const agentsDir = path.join(resolvedPath, DIRS.agents);\n if (!(await directoryExists(agentsDir))) return [];\n\n return validateYamlFiles({\n baseDir: agentsDir,\n relBaseDir: DIRS.agents,\n pattern: `**/${STANDARD_FILES.AGENT_METADATA_YAML}`,\n schema: agentYamlGenerationSchema,\n });\n}\n\n/**\n * Validates TypeScript config files (skill-categories.ts, skill-rules.ts, stacks.ts)\n * by runtime-loading them via loadConfig and validating the default export.\n * Skips silently when a file does not exist.\n */\nasync function validateConfigFiles(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const results = await Promise.all([\n validateTsConfig(resolvedPath, SKILL_CATEGORIES_PATH, skillCategoriesFileSchema),\n validateTsConfig(resolvedPath, SKILL_RULES_PATH, skillRulesFileSchema),\n validateTsConfig(resolvedPath, STACKS_FILE_PATH, stacksConfigSchema),\n ]);\n return results.flat();\n}\n\n/**\n * Globs YAML files under baseDir and validates each against the given schema.\n * Reports parse errors, schema errors (as field-path messages), and uses relBaseDir\n * for display paths so issue locations match the project-relative form used elsewhere.\n */\nasync function validateYamlFiles(opts: {\n baseDir: string;\n relBaseDir: string;\n pattern: string;\n schema: z.ZodType<unknown>;\n}): Promise<SourceValidationIssue[]> {\n const issues: SourceValidationIssue[] = [];\n const files = await glob(opts.pattern, opts.baseDir);\n\n for (const relFile of files) {\n const absPath = path.join(opts.baseDir, relFile);\n const displayPath = path.join(opts.relBaseDir, relFile);\n\n let parsed: unknown;\n try {\n parsed = parseYaml(await readFile(absPath));\n } catch {\n issues.push({ severity: \"error\", file: displayPath, message: \"Failed to parse YAML\" });\n continue;\n }\n\n const result = opts.schema.safeParse(parsed);\n if (result.success) continue;\n\n issues.push(\n ...formatZodErrors(result.error).map((message) => ({\n severity: \"error\" as const,\n file: displayPath,\n message,\n })),\n );\n }\n return issues;\n}\n\n/**\n * Runtime-loads a TypeScript config file via loadConfig and reports validation failures.\n * Absent files are not errors — only report when the file exists but fails to load or validate.\n *\n * loadConfig already unwraps the default export (via jiti's `{ default: true }` + interopDefault),\n * so a returned `null` means the module has no default export (named-only modules surface here).\n */\nasync function validateTsConfig(\n resolvedPath: string,\n relConfigPath: string,\n schema: z.ZodType<unknown>,\n): Promise<SourceValidationIssue[]> {\n const absPath = path.join(resolvedPath, relConfigPath);\n if (!(await fileExists(absPath))) return [];\n\n try {\n const loaded = await loadConfig(absPath, schema);\n if (loaded === null) {\n return [{ severity: \"error\", file: relConfigPath, message: \"Config has no default export\" }];\n }\n return [];\n } catch (error) {\n return [\n { severity: \"error\", file: relConfigPath, message: formatLoadError(relConfigPath, error) },\n ];\n }\n}\n\n/**\n * Normalizes a loadConfig error so the message references the relative config path,\n * not the absolute path embedded by loadConfig's own template string.\n */\nfunction formatLoadError(relConfigPath: string, error: unknown): string {\n const raw = getErrorMessage(error);\n const stripped = raw.replace(/Failed to load config from '[^']+':\\s*/, \"\");\n return `Failed to load ${relConfigPath}: ${stripped}`;\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","parseYaml","path","parseYaml"]}
1
+ {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/source-validator.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\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 {\n validateAllPlugins,\n validatePlugin,\n printPluginValidationResult,\n validateSkillFrontmatter,\n validateAgentFrontmatter,\n getUserPluginsDir,\n getProjectPluginsDir,\n getInstalledPluginsRegistryPath,\n listRegisteredPluginInstalls,\n type ResolvedPlugin,\n} from \"../lib/plugins/index.js\";\nimport { validateSource } from \"../lib/source-validator.js\";\nimport { isLocalSource, resolveAllSources, type SourceEntry } from \"../lib/configuration/index.js\";\nimport { resolveInstallPaths, isHomeDirectory } from \"../lib/installation/index.js\";\nimport { splitMetadataValidationIssues, validateSkillMetadata } from \"../lib/schemas.js\";\nimport { PLUGIN_MANIFEST_DIR, STANDARD_FILES } from \"../consts.js\";\nimport type { ValidationResult } from \"../types/index.js\";\nimport { directoryExists, fileExists, listDirectories, readFile } from \"../utils/fs.js\";\nimport { listAgentMdFiles } from \"../lib/agents/index.js\";\n\nconst COL_NAME_WIDTH = 30;\nconst COL_URL_WIDTH = 40;\nconst COL_PATH_WIDTH = 50;\n\nconst VALIDATE_STATUS = {\n SKIPPED_REMOTE: \"— skipped (remote source)\",\n NOT_PRESENT: \"— not present\",\n EMPTY: \"— none\",\n NO_PLUGINS: \"— no plugins\",\n} as const;\n\ntype AggregateCounts = {\n errors: number;\n warnings: number;\n};\n\nconst NO_ISSUES: AggregateCounts = { errors: 0, warnings: 0 };\n\nfunction sumCounts(counts: AggregateCounts[]): AggregateCounts {\n return counts.reduce(\n (acc, c) => ({ errors: acc.errors + c.errors, warnings: acc.warnings + c.warnings }),\n NO_ISSUES,\n );\n}\n\n/** Prints each named validation result and sums its error/warning counts. */\nfunction printAndSumResults(\n results: Array<{ name: string; result: ValidationResult }>,\n): AggregateCounts {\n return sumCounts(\n results.map(({ name, result }) => {\n printPluginValidationResult(name, result);\n return {\n errors: result.valid ? 0 : result.errors.length,\n warnings: result.warnings.length,\n };\n }),\n );\n}\n\nexport default class Validate extends BaseCommand {\n static summary =\n \"Validate every registered source, installed plugin, installed skill, and installed agent\";\n static description =\n \"Read-only validation. Walks every registered source, every installed plugin, \" +\n \"every installed skill, and every installed agent. Prints a summary table with \" +\n \"per-directory counts; exits non-zero if any pass produced an error.\";\n\n static examples = [\n { description: \"Validate everything\", command: \"<%= config.bin %> <%= command.id %>\" },\n ];\n\n // Override parent baseFlags to drop --source (validate is a zero-flag command)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Validate);\n\n let totals: AggregateCounts = NO_ISSUES;\n\n try {\n totals = await this.validateAllRegistered();\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n\n this.log(\"\");\n this.log(`Result: ${totals.errors} error(s), ${totals.warnings} warning(s)`);\n this.log(\"\");\n\n if (totals.errors > 0) {\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateAllRegistered(): Promise<AggregateCounts> {\n const projectDir = process.cwd();\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n\n const inHome = isHomeDirectory(projectDir);\n\n this.log(\"\");\n this.log(\"Validating sources\");\n\n const { primary, extras } = await resolveAllSources(projectDir);\n const sources: SourceEntry[] = [primary, ...extras];\n\n const counts: AggregateCounts[] = [];\n for (const source of sources) {\n counts.push(await this.validateRegisteredSource(source));\n }\n\n this.log(\"\");\n this.log(\"Validating plugins\");\n\n counts.push(await this.validatePluginsDirectory(getUserPluginsDir()));\n if (!inHome) {\n counts.push(await this.validatePluginsDirectory(getProjectPluginsDir(projectDir)));\n }\n\n this.log(\"\");\n this.log(\"Validating skills\");\n\n counts.push(await this.validateInstalledSkillsDirectory(globalPaths.skillsDir));\n if (!inHome) {\n counts.push(await this.validateInstalledSkillsDirectory(projectPaths.skillsDir));\n }\n\n this.log(\"\");\n this.log(\"Validating agents\");\n\n counts.push(await this.validateInstalledAgentsDirectory(globalPaths.agentsDir));\n if (!inHome) {\n counts.push(await this.validateInstalledAgentsDirectory(projectPaths.agentsDir));\n }\n\n return sumCounts(counts);\n }\n\n private async validateRegisteredSource(source: SourceEntry): Promise<AggregateCounts> {\n if (!isLocalSource(source.url)) {\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${VALIDATE_STATUS.SKIPPED_REMOTE}`,\n );\n return NO_ISSUES;\n }\n\n try {\n const result = await validateSource(source.url);\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${result.skillCount} skill(s), ${result.errorCount} error(s), ${result.warningCount} warning(s)`,\n );\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 return { errors: result.errorCount, warnings: result.warningCount };\n } catch (error) {\n const message = getErrorMessage(error);\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} failed: ${message}`,\n );\n return { errors: 1, warnings: 0 };\n }\n }\n\n private async validatePluginsDirectory(pluginsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(pluginsDir);\n\n if (!(await directoryExists(pluginsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n if (await fileExists(getInstalledPluginsRegistryPath(pluginsDir))) {\n const registryCounts = await this.validateRegistryPlugins(pluginsDir, displayPath);\n if (registryCounts !== undefined) return registryCounts;\n }\n\n const pluginDirs = await findPluginDirectories(pluginsDir);\n if (pluginDirs.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NO_PLUGINS}`);\n return NO_ISSUES;\n }\n\n const result = await validateAllPlugins(pluginsDir);\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${result.summary.total} plugin(s), ${result.summary.invalid} invalid, ${result.summary.withWarnings} with warnings`,\n );\n\n return printAndSumResults(result.results);\n }\n\n /**\n * Validates the installs recorded in the plugins directory's\n * `installed_plugins.json` (claude CLI >=2.1.220 cache layout). Returns\n * undefined when the registry records no installs so the caller can fall\n * back to the direct-children scan (older/manual layouts).\n */\n private async validateRegistryPlugins(\n pluginsDir: string,\n displayPath: string,\n ): Promise<AggregateCounts | undefined> {\n let installs: ResolvedPlugin[];\n try {\n installs = await listRegisteredPluginInstalls(pluginsDir);\n } catch (error) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} failed: ${getErrorMessage(error)}`);\n return { errors: 1, warnings: 0 };\n }\n\n if (installs.length === 0) return undefined;\n\n // A recorded installPath that no longer exists surfaces as an invalid\n // plugin via validatePlugin's structure check, not a crash.\n const results = await Promise.all(\n installs.map(async ({ pluginKey, installPath }) => ({\n name: pluginKey,\n result: await validatePlugin(installPath),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${results.length} plugin(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n\n private async validateInstalledSkillsDirectory(skillsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(skillsDir);\n\n if (!(await directoryExists(skillsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n const skillDirs = await listDirectories(skillsDir);\n if (skillDirs.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);\n return NO_ISSUES;\n }\n\n const results = await Promise.all(\n skillDirs.map(async (name) => ({\n name,\n result: await validateInstalledSkill(path.join(skillsDir, name)),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${skillDirs.length} skill(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n\n private async validateInstalledAgentsDirectory(agentsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(agentsDir);\n\n if (!(await directoryExists(agentsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n const agentFiles = await listAgentMdFiles(agentsDir);\n if (agentFiles.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);\n return NO_ISSUES;\n }\n\n const results = await Promise.all(\n agentFiles.map(async (fileName) => ({\n name: fileName,\n result: await validateAgentFrontmatter(path.join(agentsDir, fileName)),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${agentFiles.length} agent(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n}\n\n/** Render an absolute path with a `~/` prefix when it's under the user's home directory. */\nfunction displayDir(absolutePath: string): string {\n const home = os.homedir();\n if (absolutePath === home) return \"~\";\n if (absolutePath.startsWith(home + path.sep)) {\n return `~${path.sep}${path.relative(home, absolutePath)}`;\n }\n return absolutePath;\n}\n\nasync function validateInstalledSkill(skillDir: string): Promise<ValidationResult> {\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(skillMdPath))) {\n errors.push(`Missing ${STANDARD_FILES.SKILL_MD}`);\n } else {\n const frontmatterResult = await validateSkillFrontmatter(skillMdPath);\n errors.push(...frontmatterResult.errors);\n warnings.push(...frontmatterResult.warnings);\n }\n\n if (!(await fileExists(metadataPath))) {\n errors.push(`Missing ${STANDARD_FILES.METADATA_YAML}`);\n } else {\n const metadataResult = await validateInstalledSkillMetadata(metadataPath);\n errors.push(...metadataResult.errors);\n warnings.push(...metadataResult.warnings);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nasync function validateInstalledSkillMetadata(metadataPath: string): Promise<ValidationResult> {\n let rawMetadata: unknown;\n try {\n const content = await readFile(metadataPath);\n rawMetadata = parseYaml(content);\n } catch (err) {\n return {\n valid: false,\n errors: [`${STANDARD_FILES.METADATA_YAML}: ${getErrorMessage(err)}`],\n warnings: [],\n };\n }\n\n const result = validateSkillMetadata(rawMetadata);\n if (result.success) {\n return { valid: true, errors: [], warnings: [] };\n }\n\n // Over-length cliDescription is advisory — only hard schema violations invalidate the skill\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n return {\n valid: errors.length === 0,\n errors: errors.map((e) => `${STANDARD_FILES.METADATA_YAML}: ${e}`),\n warnings: warnings.map((w) => `${STANDARD_FILES.METADATA_YAML}: ${w}`),\n };\n}\n\nasync function findPluginDirectories(pluginsDir: string): Promise<string[]> {\n const entries = await listDirectories(pluginsDir);\n const checks = await Promise.all(\n entries.map(async (name) => ({\n name,\n isPlugin: await directoryExists(path.join(pluginsDir, name, PLUGIN_MANIFEST_DIR)),\n })),\n );\n return checks.filter((check) => check.isPlugin).map((check) => check.name);\n}\n","import path from \"path\";\nimport { isRecord } from \"../utils/type-guards.js\";\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { glob, readFile, fileExists, directoryExists } from \"../utils/fs\";\nimport {\n DIRS,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n} from \"../consts\";\nimport {\n agentYamlGenerationSchema,\n metadataValidationSchema,\n splitMetadataValidationIssues,\n validateSkillMetadata,\n skillCategoriesFileSchema,\n skillRulesFileSchema,\n stackConfigValidationSchema,\n stacksConfigSchema,\n} from \"./schemas\";\nimport { parseFrontmatter } from \"./loading/loader\";\nimport { loadConfig, loadProjectSourceConfig } from \"./configuration\";\nimport { checkMatrixHealth } from \"./matrix\";\nimport { loadSkillsMatrixFromSource } from \"./loading/source-loader\";\nimport { matrix } from \"./matrix/matrix-provider\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { formatZodErrors } from \"./schema-validator\";\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) */\nexport function isSnakeCase(key: string): boolean {\n return /[a-z]_[a-z]/.test(key);\n}\n\n/**\n * Checks top-level keys for snake_case usage (camelCase is the convention).\n * Non-object input yields no issues.\n */\nexport function checkSnakeCaseKeys(rawMetadata: unknown, relPath: string): SourceValidationIssue[] {\n if (!isRecord(rawMetadata)) return [];\n\n return Object.keys(rawMetadata)\n .filter(isSnakeCase)\n .map((key) => ({\n severity: \"error\" as const,\n file: relPath,\n message: `Key '${key}' uses snake_case — use camelCase instead`,\n }));\n}\n\n/**\n * Warns when a skill directory's name does not equal the skill's machine id\n * (SKILL.md frontmatter `name`) — the key the loader registers the skill under.\n * Warning, not error: the loader still loads the skill by its id, but the\n * directory no longer signals which skill it contains.\n */\nexport function checkDirNameMatchesSkillId(\n skillId: string,\n relPath: string,\n dirName: string,\n): SourceValidationIssue[] {\n if (skillId === dirName) return [];\n return [\n {\n severity: \"warning\",\n file: relPath,\n message: `Directory name '${dirName}' does not match skill id '${skillId}'`,\n },\n ];\n}\n\n/**\n * Reads a skill directory's SKILL.md frontmatter and checks the directory name\n * against the skill's machine id. When the id cannot be read (unreadable file or\n * missing/invalid frontmatter), reports that the check could not run.\n */\nasync function checkSkillDirName(\n skillsDir: string,\n skillsDirRelPath: string,\n skillDir: string,\n): Promise<SourceValidationIssue[]> {\n const dirName = path.basename(skillDir);\n const skillMdRelPath = path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD);\n\n try {\n const content = await readFile(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD));\n const frontmatter = parseFrontmatter(content, skillMdRelPath);\n\n if (frontmatter === null) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': missing or invalid ${STANDARD_FILES.SKILL_MD} frontmatter`,\n },\n ];\n }\n\n return checkDirNameMatchesSkillId(frontmatter.name, skillMdRelPath, dirName);\n } catch (error) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': ${getErrorMessage(error)}`,\n },\n ];\n }\n}\n\n/**\n * Finds missing SKILL.md / metadata.yaml pairs (pure function, no I/O).\n *\n * Returns issues for:\n * - Directories with SKILL.md but no metadata.yaml\n * - Directories with metadata.yaml but no SKILL.md\n */\nexport function validateSkillFilePairs(\n skillMdDirs: Set<string>,\n metadataDirs: Set<string>,\n skillsDir: string,\n): SourceValidationIssue[] {\n const missingMetadata = [...skillMdDirs]\n .filter((dir) => !metadataDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\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 const missingSkillMd = [...metadataDirs]\n .filter((dir) => !skillMdDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\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 return [...missingMetadata, ...missingSkillMd];\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 * (over-length cliDescription is downgraded to a warning)\n * 2. Directory name equals the skill's machine id (SKILL.md frontmatter name)\n * 3. Cross-references resolve to existing skill IDs (via checkMatrixHealth)\n * 4. camelCase key convention (no snake_case)\n * 5. 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 issues.push(...validateSkillFilePairs(skillMdDirs, metadataDirs, skillsDir));\n\n // Phase 2: Validate each metadata.yaml against strict schema and conventions.\n // Pair violations were already reported by phase 1 — validate only complete pairs.\n const validMetadataFiles = metadataFiles.filter((f) => skillMdDirs.has(path.dirname(f)));\n for (const metadataFile of validMetadataFiles) {\n const metadataPath = path.join(skillsDir, metadataFile);\n const skillDir = path.dirname(metadataFile);\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: ${getErrorMessage(error)}`,\n });\n continue;\n }\n\n issues.push(...checkSnakeCaseKeys(rawMetadata, relPath));\n\n const result = validateSkillMetadata(rawMetadata);\n if (!result.success) {\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n issues.push(\n ...errors.map((message) => ({ severity: \"error\" as const, file: relPath, message })),\n ...warnings.map((message) => ({ severity: \"warning\" as const, file: relPath, message })),\n );\n }\n\n // Independent of metadata validity — the id lives in SKILL.md frontmatter\n issues.push(...(await checkSkillDirName(skillsDir, skillsDirRelPath, skillDir)));\n }\n\n // Phase 3: Cross-reference validation via matrix health check\n try {\n await loadSkillsMatrixFromSource({ sourceFlag: resolvedPath, skipExtraSources: true });\n issues.push(\n ...checkMatrixHealth(matrix).map((healthIssue) => ({\n severity: healthIssue.severity,\n file: SKILL_CATEGORIES_PATH,\n message: healthIssue.details,\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: ${getErrorMessage(error)}`,\n });\n }\n\n // Phases 4–6: optional source-repo targets — run in parallel\n // Phase 4: stack skill metadata + stack configs\n // Phase 5: agent metadata\n // Phase 6: config/*.ts runtime exports\n const extraIssues = await Promise.all([\n validateStacks(resolvedPath),\n validateAgents(resolvedPath),\n validateConfigFiles(resolvedPath),\n ]);\n issues.push(...extraIssues.flat());\n\n return buildResult(issues, validMetadataFiles.length);\n}\n\n/**\n * Validates stack-embedded skill metadata.yaml files and stack config.yaml files.\n * Skips silently when src/stacks/ does not exist.\n */\nasync function validateStacks(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const stacksDir = path.join(resolvedPath, DIRS.stacks);\n if (!(await directoryExists(stacksDir))) return [];\n\n const [skillMetaIssues, configIssues] = await Promise.all([\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,\n schema: metadataValidationSchema,\n }),\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,\n schema: stackConfigValidationSchema,\n }),\n ]);\n return [...skillMetaIssues, ...configIssues];\n}\n\n/**\n * Validates agent metadata.yaml files against the compiled agent output schema.\n * Skips silently when src/agents/ does not exist.\n */\nasync function validateAgents(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const agentsDir = path.join(resolvedPath, DIRS.agents);\n if (!(await directoryExists(agentsDir))) return [];\n\n return validateYamlFiles({\n baseDir: agentsDir,\n relBaseDir: DIRS.agents,\n pattern: `**/${STANDARD_FILES.AGENT_METADATA_YAML}`,\n schema: agentYamlGenerationSchema,\n });\n}\n\n/**\n * Validates TypeScript config files (skill-categories.ts, skill-rules.ts, stacks.ts)\n * by runtime-loading them via loadConfig and validating the default export.\n * Skips silently when a file does not exist.\n */\nasync function validateConfigFiles(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const results = await Promise.all([\n validateTsConfig(resolvedPath, SKILL_CATEGORIES_PATH, skillCategoriesFileSchema),\n validateTsConfig(resolvedPath, SKILL_RULES_PATH, skillRulesFileSchema),\n validateTsConfig(resolvedPath, STACKS_FILE_PATH, stacksConfigSchema),\n ]);\n return results.flat();\n}\n\n/**\n * Globs YAML files under baseDir and validates each against the given schema.\n * Reports parse errors, schema errors (as field-path messages), and uses relBaseDir\n * for display paths so issue locations match the project-relative form used elsewhere.\n */\nasync function validateYamlFiles(opts: {\n baseDir: string;\n relBaseDir: string;\n pattern: string;\n schema: z.ZodType<unknown>;\n}): Promise<SourceValidationIssue[]> {\n const issues: SourceValidationIssue[] = [];\n const files = await glob(opts.pattern, opts.baseDir);\n\n for (const relFile of files) {\n const absPath = path.join(opts.baseDir, relFile);\n const displayPath = path.join(opts.relBaseDir, relFile);\n\n let parsed: unknown;\n try {\n parsed = parseYaml(await readFile(absPath));\n } catch {\n issues.push({ severity: \"error\", file: displayPath, message: \"Failed to parse YAML\" });\n continue;\n }\n\n const result = opts.schema.safeParse(parsed);\n if (result.success) continue;\n\n issues.push(\n ...formatZodErrors(result.error).map((message) => ({\n severity: \"error\" as const,\n file: displayPath,\n message,\n })),\n );\n }\n return issues;\n}\n\n/**\n * Runtime-loads a TypeScript config file via loadConfig and reports validation failures.\n * Absent files are not errors — only report when the file exists but fails to load or validate.\n *\n * loadConfig already unwraps the default export (via jiti's `{ default: true }` + interopDefault),\n * so a returned `null` means the module has no default export (named-only modules surface here).\n */\nasync function validateTsConfig(\n resolvedPath: string,\n relConfigPath: string,\n schema: z.ZodType<unknown>,\n): Promise<SourceValidationIssue[]> {\n const absPath = path.join(resolvedPath, relConfigPath);\n if (!(await fileExists(absPath))) return [];\n\n try {\n const loaded = await loadConfig(absPath, schema);\n if (loaded === null) {\n return [{ severity: \"error\", file: relConfigPath, message: \"Config has no default export\" }];\n }\n return [];\n } catch (error) {\n return [\n { severity: \"error\", file: relConfigPath, message: formatLoadError(relConfigPath, error) },\n ];\n }\n}\n\n/**\n * Normalizes a loadConfig error so the message references the relative config path,\n * not the absolute path embedded by loadConfig's own template string.\n */\nfunction formatLoadError(relConfigPath: string, error: unknown): string {\n const raw = getErrorMessage(error);\n const stripped = raw.replace(/Failed to load config from '[^']+':\\s*/, \"\");\n return `Failed to load ${relConfigPath}: ${stripped}`;\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","parseYaml","path","parseYaml"]}
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Confirm
4
- } from "../../chunk-ES3NJZON.js";
5
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-NR3OZGL4.js";
6
5
  export {
7
6
  Confirm
8
7
  };
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  promptConfirm,
4
4
  promptValue
5
- } from "../../chunk-C55DN7GE.js";
6
- import "../../chunk-P56WJ5FA.js";
5
+ } from "../../chunk-Q2KG7UV3.js";
6
+ import "../../chunk-JFLVEFFP.js";
7
7
  export {
8
8
  promptConfirm,
9
9
  promptValue
@@ -1,10 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SelectList
4
- } from "../../chunk-DUVWGO6E.js";
5
- import "../../chunk-KIR7VYQD.js";
6
- import "../../chunk-O5ASLZ2K.js";
7
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-RNJWAKMO.js";
5
+ import "../../chunk-XVAQG2CV.js";
6
+ import "../../chunk-76ADG7LQ.js";
8
7
  export {
9
8
  SelectList
10
9
  };
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Spinner
4
- } from "../../chunk-OZZGXBCN.js";
5
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-IUQBOCSU.js";
6
5
  export {
7
6
  Spinner
8
7
  };
@@ -1,15 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CategoryGrid
4
- } from "../../chunk-HIPGKIT3.js";
5
- import "../../chunk-LYYXX2W5.js";
6
- import "../../chunk-DAG2ULNF.js";
7
- import "../../chunk-VG2TVBFN.js";
8
- import "../../chunk-IHO75PMZ.js";
9
- import "../../chunk-DJAZE4PD.js";
10
- import "../../chunk-VEP23B5W.js";
11
- import "../../chunk-O5ASLZ2K.js";
12
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-QRDTLVXG.js";
5
+ import "../../chunk-J27W6TXS.js";
6
+ import "../../chunk-MM7CTTAV.js";
7
+ import "../../chunk-LDP5ASDM.js";
8
+ import "../../chunk-WBCPLH66.js";
9
+ import "../../chunk-WKTHWQKM.js";
10
+ import "../../chunk-VASLW636.js";
11
+ import "../../chunk-76ADG7LQ.js";
13
12
  export {
14
13
  CategoryGrid
15
14
  };
@@ -1,13 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CheckboxGrid
4
- } from "../../chunk-XA57SX4T.js";
5
- import "../../chunk-FYPUUYSG.js";
6
- import "../../chunk-DAG2ULNF.js";
7
- import "../../chunk-VG2TVBFN.js";
8
- import "../../chunk-IHO75PMZ.js";
9
- import "../../chunk-O5ASLZ2K.js";
10
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-MJ2KHG24.js";
5
+ import "../../chunk-DTSG5XZB.js";
6
+ import "../../chunk-MM7CTTAV.js";
7
+ import "../../chunk-LDP5ASDM.js";
8
+ import "../../chunk-WBCPLH66.js";
9
+ import "../../chunk-76ADG7LQ.js";
11
10
  export {
12
11
  CheckboxGrid
13
12
  };
@@ -1,21 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DomainSelection
4
- } from "../../chunk-5K5RBRTD.js";
5
- import "../../chunk-FWT3CBLL.js";
6
- import "../../chunk-XA57SX4T.js";
7
- import "../../chunk-FYPUUYSG.js";
8
- import "../../chunk-DAG2ULNF.js";
9
- import "../../chunk-VG2TVBFN.js";
10
- import "../../chunk-IHO75PMZ.js";
11
- import "../../chunk-MC5DUZ3V.js";
12
- import "../../chunk-KH7MOIM5.js";
13
- import "../../chunk-3LIU2ZEF.js";
14
- import "../../chunk-DJAZE4PD.js";
15
- import "../../chunk-VEP23B5W.js";
16
- import "../../chunk-O5ASLZ2K.js";
17
- import "../../chunk-YU2VGX5R.js";
18
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-SX5H6TSC.js";
5
+ import "../../chunk-5GUOIJSG.js";
6
+ import "../../chunk-MJ2KHG24.js";
7
+ import "../../chunk-DTSG5XZB.js";
8
+ import "../../chunk-MM7CTTAV.js";
9
+ import "../../chunk-LDP5ASDM.js";
10
+ import "../../chunk-WBCPLH66.js";
11
+ import "../../chunk-5UWKOOIS.js";
12
+ import "../../chunk-EEPELKOM.js";
13
+ import "../../chunk-PMM2MYMA.js";
14
+ import "../../chunk-WKTHWQKM.js";
15
+ import "../../chunk-VASLW636.js";
16
+ import "../../chunk-76ADG7LQ.js";
17
+ import "../../chunk-UBEDZ4FD.js";
19
18
  export {
20
19
  DomainSelection
21
20
  };
@@ -1,46 +1,46 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runWizardSession
4
- } from "../../chunk-NUIZ6ZUO.js";
5
- import "../../chunk-RJN7W2C7.js";
6
- import "../../chunk-ZKJAJWK6.js";
7
- import "../../chunk-RP7R73JO.js";
8
- import "../../chunk-E4FT2KFV.js";
9
- import "../../chunk-F3756A5B.js";
10
- import "../../chunk-RBHYLCUB.js";
11
- import "../../chunk-4GL2F5AB.js";
12
- import "../../chunk-EN2GCPW7.js";
13
- import "../../chunk-LRYNF3J7.js";
14
- import "../../chunk-UZRISDBZ.js";
15
- import "../../chunk-ZHTXPFDK.js";
16
- import "../../chunk-IOJR5TOY.js";
17
- import "../../chunk-ZDLTLNU2.js";
18
- import "../../chunk-QQLRX4KI.js";
19
- import "../../chunk-7URSGJLE.js";
20
- import "../../chunk-NIKUMXE7.js";
21
- import "../../chunk-KOPEM3Q7.js";
22
- import "../../chunk-2RSNKBXC.js";
23
- import "../../chunk-DUVWGO6E.js";
24
- import "../../chunk-KIR7VYQD.js";
25
- import "../../chunk-HIPGKIT3.js";
26
- import "../../chunk-LYYXX2W5.js";
27
- import "../../chunk-5K5RBRTD.js";
28
- import "../../chunk-FWT3CBLL.js";
29
- import "../../chunk-XA57SX4T.js";
30
- import "../../chunk-FYPUUYSG.js";
31
- import "../../chunk-DAG2ULNF.js";
32
- import "../../chunk-VG2TVBFN.js";
33
- import "../../chunk-IHO75PMZ.js";
34
- import "../../chunk-GRPSDKIS.js";
35
- import "../../chunk-MC5DUZ3V.js";
36
- import "../../chunk-P3PN5SVI.js";
37
- import "../../chunk-KH7MOIM5.js";
38
- import "../../chunk-3LIU2ZEF.js";
39
- import "../../chunk-DJAZE4PD.js";
40
- import "../../chunk-VEP23B5W.js";
41
- import "../../chunk-O5ASLZ2K.js";
42
- import "../../chunk-YU2VGX5R.js";
43
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-MVR3SYMN.js";
5
+ import "../../chunk-XHUODHZ4.js";
6
+ import "../../chunk-MWG4VU64.js";
7
+ import "../../chunk-TJJPWUMA.js";
8
+ import "../../chunk-TUPYW2IQ.js";
9
+ import "../../chunk-SKQWRUPX.js";
10
+ import "../../chunk-LASI35KT.js";
11
+ import "../../chunk-GRVKW3CC.js";
12
+ import "../../chunk-L7SZXUBJ.js";
13
+ import "../../chunk-ZPPHXXAP.js";
14
+ import "../../chunk-R5NOI2LP.js";
15
+ import "../../chunk-BNSRA6HL.js";
16
+ import "../../chunk-F7T5AFFN.js";
17
+ import "../../chunk-MQ7FLIYS.js";
18
+ import "../../chunk-FVDKAVOL.js";
19
+ import "../../chunk-TSIU7DME.js";
20
+ import "../../chunk-QRDTLVXG.js";
21
+ import "../../chunk-J27W6TXS.js";
22
+ import "../../chunk-SX5H6TSC.js";
23
+ import "../../chunk-5GUOIJSG.js";
24
+ import "../../chunk-MJ2KHG24.js";
25
+ import "../../chunk-DTSG5XZB.js";
26
+ import "../../chunk-MM7CTTAV.js";
27
+ import "../../chunk-KXYVJGJP.js";
28
+ import "../../chunk-P44SXVH3.js";
29
+ import "../../chunk-LDP5ASDM.js";
30
+ import "../../chunk-Q45ZU6HD.js";
31
+ import "../../chunk-WBCPLH66.js";
32
+ import "../../chunk-RNJWAKMO.js";
33
+ import "../../chunk-XVAQG2CV.js";
34
+ import "../../chunk-LZ52XEPR.js";
35
+ import "../../chunk-JFLVEFFP.js";
36
+ import "../../chunk-5UWKOOIS.js";
37
+ import "../../chunk-ZL7PFNHN.js";
38
+ import "../../chunk-EEPELKOM.js";
39
+ import "../../chunk-PMM2MYMA.js";
40
+ import "../../chunk-WKTHWQKM.js";
41
+ import "../../chunk-VASLW636.js";
42
+ import "../../chunk-76ADG7LQ.js";
43
+ import "../../chunk-UBEDZ4FD.js";
44
44
  export {
45
45
  runWizardSession
46
46
  };
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScrollAffordance
4
- } from "../../chunk-KOPEM3Q7.js";
5
- import "../../chunk-O5ASLZ2K.js";
6
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-KXYVJGJP.js";
5
+ import "../../chunk-76ADG7LQ.js";
7
6
  export {
8
7
  ScrollAffordance
9
8
  };
@@ -1,13 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SearchModal
4
- } from "../../chunk-2RSNKBXC.js";
5
- import "../../chunk-DUVWGO6E.js";
6
- import "../../chunk-KIR7VYQD.js";
7
- import "../../chunk-VG2TVBFN.js";
8
- import "../../chunk-IHO75PMZ.js";
9
- import "../../chunk-O5ASLZ2K.js";
10
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-P44SXVH3.js";
5
+ import "../../chunk-LDP5ASDM.js";
6
+ import "../../chunk-WBCPLH66.js";
7
+ import "../../chunk-RNJWAKMO.js";
8
+ import "../../chunk-XVAQG2CV.js";
9
+ import "../../chunk-76ADG7LQ.js";
11
10
  export {
12
11
  SearchModal
13
12
  };
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SelectionCard
4
- } from "../../chunk-QQLRX4KI.js";
5
- import "../../chunk-O5ASLZ2K.js";
6
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-Q45ZU6HD.js";
5
+ import "../../chunk-76ADG7LQ.js";
7
6
  export {
8
7
  SelectionCard
9
8
  };
@@ -1,15 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillAgentSummary
4
- } from "../../chunk-GRPSDKIS.js";
5
- import "../../chunk-MC5DUZ3V.js";
6
- import "../../chunk-KH7MOIM5.js";
7
- import "../../chunk-3LIU2ZEF.js";
8
- import "../../chunk-DJAZE4PD.js";
9
- import "../../chunk-VEP23B5W.js";
10
- import "../../chunk-O5ASLZ2K.js";
11
- import "../../chunk-YU2VGX5R.js";
12
- import "../../chunk-P56WJ5FA.js";
4
+ } from "../../chunk-LZ52XEPR.js";
5
+ import "../../chunk-5UWKOOIS.js";
6
+ import "../../chunk-EEPELKOM.js";
7
+ import "../../chunk-PMM2MYMA.js";
8
+ import "../../chunk-WKTHWQKM.js";
9
+ import "../../chunk-VASLW636.js";
10
+ import "../../chunk-76ADG7LQ.js";
11
+ import "../../chunk-UBEDZ4FD.js";
13
12
  export {
14
13
  SkillAgentSummary
15
14
  };
@@ -2,20 +2,19 @@
2
2
  import {
3
3
  SourceGrid,
4
4
  isRowInert
5
- } from "../../chunk-7URSGJLE.js";
6
- import "../../chunk-NIKUMXE7.js";
7
- import "../../chunk-KOPEM3Q7.js";
8
- import "../../chunk-2RSNKBXC.js";
9
- import "../../chunk-DUVWGO6E.js";
10
- import "../../chunk-KIR7VYQD.js";
11
- import "../../chunk-LYYXX2W5.js";
12
- import "../../chunk-DAG2ULNF.js";
13
- import "../../chunk-VG2TVBFN.js";
14
- import "../../chunk-IHO75PMZ.js";
15
- import "../../chunk-DJAZE4PD.js";
16
- import "../../chunk-VEP23B5W.js";
17
- import "../../chunk-O5ASLZ2K.js";
18
- import "../../chunk-P56WJ5FA.js";
5
+ } from "../../chunk-BNSRA6HL.js";
6
+ import "../../chunk-F7T5AFFN.js";
7
+ import "../../chunk-J27W6TXS.js";
8
+ import "../../chunk-MM7CTTAV.js";
9
+ import "../../chunk-KXYVJGJP.js";
10
+ import "../../chunk-P44SXVH3.js";
11
+ import "../../chunk-LDP5ASDM.js";
12
+ import "../../chunk-WBCPLH66.js";
13
+ import "../../chunk-RNJWAKMO.js";
14
+ import "../../chunk-XVAQG2CV.js";
15
+ import "../../chunk-WKTHWQKM.js";
16
+ import "../../chunk-VASLW636.js";
17
+ import "../../chunk-76ADG7LQ.js";
19
18
  export {
20
19
  SourceGrid,
21
20
  isRowInert