@skaile/workspaces 5.6.1 → 5.7.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 (260) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +4 -2
  3. package/dist/{asset-feeds-LU7NHOAP.js → asset-feeds-K36CR52Q.js} +17 -17
  4. package/dist/{asset-feeds-LU7NHOAP.js.map → asset-feeds-K36CR52Q.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +9 -9
  6. package/dist/asset-manager/index.js +14 -14
  7. package/dist/asset-manager/installer.js +10 -10
  8. package/dist/asset-manager/renderers.js +9 -9
  9. package/dist/asset-manager/src/index.d.ts +106 -16
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/asset-manager/src/installer.d.ts +4 -1
  12. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  13. package/dist/bridge/drivers/claude-sdk.js +11 -11
  14. package/dist/bridge/drivers/codex.js +10 -10
  15. package/dist/bridge/drivers/continue.js +12 -12
  16. package/dist/bridge/drivers/echo.js +1 -1
  17. package/dist/bridge/drivers/gemini.js +5 -5
  18. package/dist/bridge/drivers/goose.js +12 -12
  19. package/dist/bridge/drivers/omp.js +2 -2
  20. package/dist/bridge/drivers/opencode.js +12 -12
  21. package/dist/bridge/drivers/qwen.js +5 -5
  22. package/dist/bridge/index.js +12 -12
  23. package/dist/{chunk-VX3INFBA.js → chunk-34C42MJX.js} +3 -3
  24. package/dist/{chunk-VX3INFBA.js.map → chunk-34C42MJX.js.map} +1 -1
  25. package/dist/{chunk-QD772CGQ.js → chunk-53MSCGR2.js} +5 -5
  26. package/dist/{chunk-QD772CGQ.js.map → chunk-53MSCGR2.js.map} +1 -1
  27. package/dist/chunk-6C654TFI.js +84 -0
  28. package/dist/chunk-6C654TFI.js.map +1 -0
  29. package/dist/{chunk-6NPINANG.js → chunk-6UFFKMVC.js} +5 -5
  30. package/dist/{chunk-6NPINANG.js.map → chunk-6UFFKMVC.js.map} +1 -1
  31. package/dist/{chunk-XOGG7VDZ.js → chunk-6VRJH4MR.js} +16 -24
  32. package/dist/chunk-6VRJH4MR.js.map +1 -0
  33. package/dist/{chunk-2KOKBTR4.js → chunk-74EEFB52.js} +15 -8
  34. package/dist/chunk-74EEFB52.js.map +1 -0
  35. package/dist/{chunk-OGLDAJFL.js → chunk-7FJQT3GT.js} +4 -4
  36. package/dist/{chunk-OGLDAJFL.js.map → chunk-7FJQT3GT.js.map} +1 -1
  37. package/dist/{chunk-VKSXST23.js → chunk-AVCUPPG6.js} +3 -3
  38. package/dist/{chunk-VKSXST23.js.map → chunk-AVCUPPG6.js.map} +1 -1
  39. package/dist/{chunk-5B5IZVEP.js → chunk-BTK7ECLH.js} +2 -2
  40. package/dist/{chunk-5B5IZVEP.js.map → chunk-BTK7ECLH.js.map} +1 -1
  41. package/dist/{chunk-GP6ZL7PE.js → chunk-BWZF2ZIF.js} +3 -3
  42. package/dist/{chunk-GP6ZL7PE.js.map → chunk-BWZF2ZIF.js.map} +1 -1
  43. package/dist/{chunk-PJS2YWGG.js → chunk-CWM3MYGX.js} +6 -6
  44. package/dist/{chunk-PJS2YWGG.js.map → chunk-CWM3MYGX.js.map} +1 -1
  45. package/dist/{chunk-PTO2YDDG.js → chunk-D5HOETOB.js} +410 -96
  46. package/dist/chunk-D5HOETOB.js.map +1 -0
  47. package/dist/{chunk-MX3UQXLU.js → chunk-DFFD4BFG.js} +96 -20
  48. package/dist/chunk-DFFD4BFG.js.map +1 -0
  49. package/dist/{chunk-KXTO7HON.js → chunk-EAZECHPM.js} +3 -3
  50. package/dist/{chunk-KXTO7HON.js.map → chunk-EAZECHPM.js.map} +1 -1
  51. package/dist/{chunk-ZBBM6O6P.js → chunk-EB4XN3KE.js} +3 -3
  52. package/dist/{chunk-ZBBM6O6P.js.map → chunk-EB4XN3KE.js.map} +1 -1
  53. package/dist/{chunk-WIHQWVWL.js → chunk-EU3Q5AQ4.js} +26 -18
  54. package/dist/chunk-EU3Q5AQ4.js.map +1 -0
  55. package/dist/{chunk-BTISGSK4.js → chunk-FAP63KV7.js} +4 -4
  56. package/dist/{chunk-BTISGSK4.js.map → chunk-FAP63KV7.js.map} +1 -1
  57. package/dist/{chunk-46OVMT76.js → chunk-G67BOI2J.js} +3 -3
  58. package/dist/{chunk-46OVMT76.js.map → chunk-G67BOI2J.js.map} +1 -1
  59. package/dist/{chunk-I4QBZLOR.js → chunk-GIC3G5YG.js} +6 -6
  60. package/dist/{chunk-I4QBZLOR.js.map → chunk-GIC3G5YG.js.map} +1 -1
  61. package/dist/{chunk-27HS2DHB.js → chunk-GWXFSLBK.js} +3 -3
  62. package/dist/{chunk-27HS2DHB.js.map → chunk-GWXFSLBK.js.map} +1 -1
  63. package/dist/{chunk-VSQFGU5D.js → chunk-ILFGVSTJ.js} +3 -3
  64. package/dist/{chunk-VSQFGU5D.js.map → chunk-ILFGVSTJ.js.map} +1 -1
  65. package/dist/{chunk-KYXOGHY6.js → chunk-IUUYRXT6.js} +4 -4
  66. package/dist/{chunk-KYXOGHY6.js.map → chunk-IUUYRXT6.js.map} +1 -1
  67. package/dist/{chunk-D2V42LUE.js → chunk-IZLQ4GDO.js} +63 -44
  68. package/dist/chunk-IZLQ4GDO.js.map +1 -0
  69. package/dist/{chunk-LLKKLKZJ.js → chunk-JLSCA5T5.js} +3 -3
  70. package/dist/{chunk-LLKKLKZJ.js.map → chunk-JLSCA5T5.js.map} +1 -1
  71. package/dist/{chunk-SX4UIDKT.js → chunk-KM7XWC4Y.js} +3 -3
  72. package/dist/{chunk-SX4UIDKT.js.map → chunk-KM7XWC4Y.js.map} +1 -1
  73. package/dist/{chunk-KUFNKVBM.js → chunk-KNWCFEWU.js} +3 -3
  74. package/dist/{chunk-KUFNKVBM.js.map → chunk-KNWCFEWU.js.map} +1 -1
  75. package/dist/{chunk-MFHKHXDE.js → chunk-L5VSIPQD.js} +5 -5
  76. package/dist/chunk-L5VSIPQD.js.map +1 -0
  77. package/dist/{chunk-AOAZCSDI.js → chunk-LBQ4BBX4.js} +3 -3
  78. package/dist/{chunk-AOAZCSDI.js.map → chunk-LBQ4BBX4.js.map} +1 -1
  79. package/dist/{chunk-2W4LBLIN.js → chunk-LCU5U5IW.js} +6 -6
  80. package/dist/{chunk-2W4LBLIN.js.map → chunk-LCU5U5IW.js.map} +1 -1
  81. package/dist/{chunk-65EYRFZJ.js → chunk-LXY4BUA3.js} +5 -5
  82. package/dist/{chunk-65EYRFZJ.js.map → chunk-LXY4BUA3.js.map} +1 -1
  83. package/dist/{chunk-7KLC4LZO.js → chunk-MKLBK7HI.js} +8 -8
  84. package/dist/{chunk-7KLC4LZO.js.map → chunk-MKLBK7HI.js.map} +1 -1
  85. package/dist/{chunk-4GNJELPH.js → chunk-N6FBTXQ5.js} +2 -2
  86. package/dist/{chunk-4GNJELPH.js.map → chunk-N6FBTXQ5.js.map} +1 -1
  87. package/dist/{chunk-2XFUXGV6.js → chunk-NWQB7UTY.js} +3 -3
  88. package/dist/{chunk-2XFUXGV6.js.map → chunk-NWQB7UTY.js.map} +1 -1
  89. package/dist/{chunk-SDFROXSA.js → chunk-O4Z7MAW7.js} +3 -3
  90. package/dist/{chunk-SDFROXSA.js.map → chunk-O4Z7MAW7.js.map} +1 -1
  91. package/dist/{chunk-AO7VJ6G6.js → chunk-O7VPNKYN.js} +8 -3
  92. package/dist/chunk-O7VPNKYN.js.map +1 -0
  93. package/dist/{chunk-TZCQ7ZWQ.js → chunk-OOLT6HGP.js} +10 -11
  94. package/dist/chunk-OOLT6HGP.js.map +1 -0
  95. package/dist/{chunk-2GRB5ITE.js → chunk-PSA6ONFB.js} +4 -4
  96. package/dist/{chunk-2GRB5ITE.js.map → chunk-PSA6ONFB.js.map} +1 -1
  97. package/dist/{chunk-45VFGT7A.js → chunk-RNPHRRLG.js} +3 -3
  98. package/dist/{chunk-45VFGT7A.js.map → chunk-RNPHRRLG.js.map} +1 -1
  99. package/dist/{chunk-7ZHLYXTI.js → chunk-RVIZQ5XD.js} +3 -3
  100. package/dist/{chunk-7ZHLYXTI.js.map → chunk-RVIZQ5XD.js.map} +1 -1
  101. package/dist/{chunk-BF33SCLY.js → chunk-SWO25LTO.js} +4 -4
  102. package/dist/{chunk-BF33SCLY.js.map → chunk-SWO25LTO.js.map} +1 -1
  103. package/dist/{chunk-UAP2XHRF.js → chunk-SZWRPEF7.js} +8 -8
  104. package/dist/{chunk-UAP2XHRF.js.map → chunk-SZWRPEF7.js.map} +1 -1
  105. package/dist/{chunk-VJENKWXF.js → chunk-THEJJBOU.js} +3 -3
  106. package/dist/{chunk-VJENKWXF.js.map → chunk-THEJJBOU.js.map} +1 -1
  107. package/dist/{chunk-PA7WLID3.js → chunk-TTPSDC2G.js} +33 -3
  108. package/dist/chunk-TTPSDC2G.js.map +1 -0
  109. package/dist/{chunk-VBBBZDI7.js → chunk-UX3K4RKE.js} +3 -3
  110. package/dist/{chunk-VBBBZDI7.js.map → chunk-UX3K4RKE.js.map} +1 -1
  111. package/dist/{chunk-RGXVQZOV.js → chunk-VOOI7B2L.js} +23 -21
  112. package/dist/chunk-VOOI7B2L.js.map +1 -0
  113. package/dist/{chunk-OLLAQLFJ.js → chunk-WIEC3ZE4.js} +5 -5
  114. package/dist/{chunk-OLLAQLFJ.js.map → chunk-WIEC3ZE4.js.map} +1 -1
  115. package/dist/cli/index.js +901 -589
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  118. package/dist/cli/src/commands/catalog.d.ts +12 -3
  119. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  120. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  121. package/dist/cli/src/commands/library-index.d.ts +41 -4
  122. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  123. package/dist/cli/src/commands/library-publish.d.ts +9 -0
  124. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  125. package/dist/cli/src/commands/manage.d.ts +8 -2
  126. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  127. package/dist/cli/src/commands/outdated.d.ts +3 -2
  128. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  129. package/dist/cli/src/commands/project.d.ts +13 -4
  130. package/dist/cli/src/commands/project.d.ts.map +1 -1
  131. package/dist/cli/src/commands/source.d.ts +4 -3
  132. package/dist/cli/src/commands/source.d.ts.map +1 -1
  133. package/dist/cli/src/commands/update.d.ts +1 -1
  134. package/dist/cli/src/commands/update.d.ts.map +1 -1
  135. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  136. package/dist/cli/src/skill-checks.d.ts +21 -10
  137. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  138. package/dist/connectors/config.js +6 -6
  139. package/dist/connectors/index.js +15 -15
  140. package/dist/{connectors-HWENZFKW.js → connectors-SSOTIDHT.js} +18 -18
  141. package/dist/{connectors-HWENZFKW.js.map → connectors-SSOTIDHT.js.map} +1 -1
  142. package/dist/core/index.js +8 -8
  143. package/dist/core/manifest.js +2 -2
  144. package/dist/core/models.js +1 -1
  145. package/dist/core/publish-manifest.js +2 -2
  146. package/dist/core/ref.js +1 -1
  147. package/dist/core/runtime-assets.js +6 -6
  148. package/dist/core/src/cache-paths.d.ts.map +1 -1
  149. package/dist/core/src/index.d.ts +1 -1
  150. package/dist/core/src/index.d.ts.map +1 -1
  151. package/dist/core/src/lock.d.ts +3 -3
  152. package/dist/core/src/lock.d.ts.map +1 -1
  153. package/dist/core/src/manifest.d.ts +6 -1
  154. package/dist/core/src/manifest.d.ts.map +1 -1
  155. package/dist/core/src/models.d.ts +8 -0
  156. package/dist/core/src/models.d.ts.map +1 -1
  157. package/dist/core/store.js +2 -2
  158. package/dist/core/workspace-config.js +5 -5
  159. package/dist/deploy/index.js +8 -8
  160. package/dist/discovery/index.js +4 -4
  161. package/dist/discovery/src/index.d.ts +1 -1
  162. package/dist/discovery/src/index.d.ts.map +1 -1
  163. package/dist/discovery/src/source-config.d.ts +12 -0
  164. package/dist/discovery/src/source-config.d.ts.map +1 -1
  165. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  166. package/dist/{ensure-sources-DSTSXJWK.js → ensure-sources-277VI7R3.js} +17 -17
  167. package/dist/{ensure-sources-DSTSXJWK.js.map → ensure-sources-277VI7R3.js.map} +1 -1
  168. package/dist/factory-assets/connectors/box.js +15 -15
  169. package/dist/factory-assets/connectors/deploy.js +15 -15
  170. package/dist/factory-assets/connectors/devserver.js +15 -15
  171. package/dist/factory-assets/connectors/flow/adapter.js +15 -15
  172. package/dist/factory-assets/connectors/flow/engine.js +9 -9
  173. package/dist/factory-assets/connectors/flow/run-flow.js +17 -17
  174. package/dist/factory-assets/connectors/flow.js +15 -15
  175. package/dist/factory-assets/connectors/git.js +15 -15
  176. package/dist/factory-assets/connectors/gmail.js +15 -15
  177. package/dist/factory-assets/connectors/googledrive.js +15 -15
  178. package/dist/factory-assets/connectors/local.js +15 -15
  179. package/dist/factory-assets/connectors/mattermost.js +15 -15
  180. package/dist/factory-assets/connectors/memory.js +15 -15
  181. package/dist/factory-assets/connectors/minio.js +15 -15
  182. package/dist/factory-assets/connectors/postgres.js +15 -15
  183. package/dist/factory-assets/connectors/s3.js +15 -15
  184. package/dist/factory-assets/connectors/sharepoint.js +15 -15
  185. package/dist/factory-assets/connectors/sqlite.js +15 -15
  186. package/dist/factory-assets/connectors/static-server.js +15 -15
  187. package/dist/factory-assets/connectors/tunnel.js +15 -15
  188. package/dist/factory-assets/connectors/webdav.js +15 -15
  189. package/dist/factory-assets/connectors/xstate-store.js +15 -15
  190. package/dist/factory-assets/connectors/xstate.js +15 -15
  191. package/dist/{flows-ENQY2DV7.js → flows-J2UEU2QM.js} +13 -13
  192. package/dist/{flows-ENQY2DV7.js.map → flows-J2UEU2QM.js.map} +1 -1
  193. package/dist/{helpers-R44RUTDY.js → helpers-KC5O7CML.js} +17 -17
  194. package/dist/{helpers-R44RUTDY.js.map → helpers-KC5O7CML.js.map} +1 -1
  195. package/dist/library/index.js +11 -11
  196. package/dist/library/install.js +3 -3
  197. package/dist/library/src/index.d.ts +3 -3
  198. package/dist/library/src/index.d.ts.map +1 -1
  199. package/dist/library/src/local/library-manager.d.ts +6 -0
  200. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  201. package/dist/library/src/local/local-catalog-source.d.ts +5 -2
  202. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  203. package/dist/library/src/manifest-writer.d.ts +23 -1
  204. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  205. package/dist/library/src/sync/git-driver.d.ts +12 -0
  206. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  207. package/dist/{library-publish-LFOJJVMK.js → library-publish-FGXF5TJO.js} +85 -41
  208. package/dist/library-publish-FGXF5TJO.js.map +1 -0
  209. package/dist/{open-library-4WUMQHES.js → open-library-P3D337NH.js} +20 -20
  210. package/dist/{open-library-4WUMQHES.js.map → open-library-P3D337NH.js.map} +1 -1
  211. package/dist/open-registry-Z3P2X2AB.js +32 -0
  212. package/dist/{open-registry-NVPCQPND.js.map → open-registry-Z3P2X2AB.js.map} +1 -1
  213. package/dist/paths-JKEKXM52.js +22 -0
  214. package/dist/{paths-YUCP7K6U.js.map → paths-JKEKXM52.js.map} +1 -1
  215. package/dist/{plugin-store-66QFBNEO.js → plugin-store-WI4MZJLP.js} +10 -10
  216. package/dist/{plugin-store-66QFBNEO.js.map → plugin-store-WI4MZJLP.js.map} +1 -1
  217. package/dist/project-WFUDVYNN.js +41 -0
  218. package/dist/{project-VMOHUXBD.js.map → project-WFUDVYNN.js.map} +1 -1
  219. package/dist/resolver/index.js +9 -9
  220. package/dist/runner/index.js +28 -28
  221. package/dist/runner/src/serve.d.ts.map +1 -1
  222. package/dist/sdk/asset-manager.js +14 -14
  223. package/dist/sdk/bridge.js +12 -12
  224. package/dist/sdk/core.js +8 -8
  225. package/dist/sdk/flow.js +9 -9
  226. package/dist/sdk/index.js +28 -28
  227. package/dist/sdk/resolver.js +9 -9
  228. package/dist/sdk/runner.js +28 -28
  229. package/dist/secrets/index.js +2 -2
  230. package/dist/{setup-PYY23HGZ.js → setup-RAMLTORM.js} +22 -22
  231. package/dist/{setup-PYY23HGZ.js.map → setup-RAMLTORM.js.map} +1 -1
  232. package/dist/skills-EOHZ2DZ4.js +26 -0
  233. package/dist/{skills-CS7NE5TT.js.map → skills-EOHZ2DZ4.js.map} +1 -1
  234. package/dist/{source-JCF6KSQN.js → source-FYVSFYEI.js} +21 -21
  235. package/dist/{source-JCF6KSQN.js.map → source-FYVSFYEI.js.map} +1 -1
  236. package/dist/{source-manifest-publish-O6P7G2M7.js → source-manifest-publish-4FPIPPLV.js} +23 -23
  237. package/dist/{source-manifest-publish-O6P7G2M7.js.map → source-manifest-publish-4FPIPPLV.js.map} +1 -1
  238. package/dist/tui/index.js +28 -28
  239. package/dist/workspace-plugin/adapters/mcp.js +22 -22
  240. package/dist/workspace-plugin/adapters/omp.js +14 -14
  241. package/dist/workspace-plugin/index.js +1 -1
  242. package/package.json +1 -1
  243. package/dist/chunk-2KOKBTR4.js.map +0 -1
  244. package/dist/chunk-2NYXQYHN.js +0 -22
  245. package/dist/chunk-2NYXQYHN.js.map +0 -1
  246. package/dist/chunk-AO7VJ6G6.js.map +0 -1
  247. package/dist/chunk-D2V42LUE.js.map +0 -1
  248. package/dist/chunk-MFHKHXDE.js.map +0 -1
  249. package/dist/chunk-MX3UQXLU.js.map +0 -1
  250. package/dist/chunk-PA7WLID3.js.map +0 -1
  251. package/dist/chunk-PTO2YDDG.js.map +0 -1
  252. package/dist/chunk-RGXVQZOV.js.map +0 -1
  253. package/dist/chunk-TZCQ7ZWQ.js.map +0 -1
  254. package/dist/chunk-WIHQWVWL.js.map +0 -1
  255. package/dist/chunk-XOGG7VDZ.js.map +0 -1
  256. package/dist/library-publish-LFOJJVMK.js.map +0 -1
  257. package/dist/open-registry-NVPCQPND.js +0 -32
  258. package/dist/paths-YUCP7K6U.js +0 -22
  259. package/dist/project-VMOHUXBD.js +0 -41
  260. package/dist/skills-CS7NE5TT.js +0 -26
package/dist/cli/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import { makeProvidersCommand, loadRegistryView, addProviderEntry, ProviderRegistryWriteError } from '../chunk-QD772CGQ.js';
3
- import { makeSourceCommand, syncProjectSources } from '../chunk-D2V42LUE.js';
4
- import { AI_RESOURCES } from '../chunk-OGLDAJFL.js';
5
- import { checkSkillManifest } from '../chunk-2NYXQYHN.js';
6
- import { getStoreConfig, storeFetch, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, isStoreAuthenticated, getStoreToken, getStoreIdentity, assetEntryRef, refFor } from '../chunk-65EYRFZJ.js';
7
- import { makeInstallCommand, makeCheckCommand, makeCleanCommand, reportInstalledSoftDeps } from '../chunk-WIHQWVWL.js';
2
+ import { makeProvidersCommand, loadRegistryView, addProviderEntry, ProviderRegistryWriteError } from '../chunk-53MSCGR2.js';
3
+ import { makeSourceCommand, syncProjectSources } from '../chunk-IZLQ4GDO.js';
4
+ import { makeInstallCommand, makeCheckCommand, makeCleanCommand, REF_HINT, reportInstalledSoftDeps } from '../chunk-EU3Q5AQ4.js';
8
5
  import { createSpinner } from '../chunk-NESV47MF.js';
9
- import { openCatalogSource, openLibraryManager, openLibrary } from '../chunk-I4QBZLOR.js';
10
- import { logErr, S, logOk, logInfo, logWarn, TARGET_DEFAULT_HINT, deferredWarnings, warnLegacyClaudeCopies, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth, KIND_COL_WIDTH } from '../chunk-VJENKWXF.js';
11
- import { getKindRegistry, getKnownKinds } from '../chunk-OLLAQLFJ.js';
12
- import { LocalSecretsProvider } from '../chunk-VSQFGU5D.js';
13
- import { runAgentChat, isCompositionError, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, hashAgentFiles, createCompositionContentSource, compileComposition, instanceForSession, resolveAgentInstance, describeComposition, MarkdownStreamer } from '../chunk-RGXVQZOV.js';
14
- import { buildClaudePluginFiles } from '../chunk-4GNJELPH.js';
15
- import '../chunk-6NPINANG.js';
16
- import '../chunk-SX4UIDKT.js';
6
+ import { AI_RESOURCES } from '../chunk-7FJQT3GT.js';
7
+ import { findAssetManifestFile, declaredVersion, checkAssetManifest } from '../chunk-6C654TFI.js';
8
+ import { getStoreConfig, storeFetch, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, isStoreAuthenticated, getStoreToken, getStoreIdentity, assetEntryRef, refFor } from '../chunk-LXY4BUA3.js';
9
+ import { openCatalogSource, LocalCatalogDisabledError, openLibraryManager, openLibrary } from '../chunk-GIC3G5YG.js';
10
+ import { logErr, S, logOk, logInfo, logWarn, TARGET_DEFAULT_HINT, deferredWarnings, warnLegacyClaudeCopies, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth, KIND_COL_WIDTH } from '../chunk-THEJJBOU.js';
11
+ import { getKindRegistry, getKnownKinds } from '../chunk-WIEC3ZE4.js';
12
+ import { LocalSecretsProvider } from '../chunk-ILFGVSTJ.js';
13
+ import { runAgentChat, isCompositionError, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, hashAgentFiles, createCompositionContentSource, compileComposition, instanceForSession, resolveAgentInstance, describeComposition, MarkdownStreamer } from '../chunk-VOOI7B2L.js';
14
+ import { buildClaudePluginFiles } from '../chunk-N6FBTXQ5.js';
15
+ import '../chunk-6UFFKMVC.js';
16
+ import '../chunk-KM7XWC4Y.js';
17
17
  import '../chunk-R6O6YWU7.js';
18
- import '../chunk-KYXOGHY6.js';
19
- import '../chunk-45VFGT7A.js';
18
+ import '../chunk-IUUYRXT6.js';
19
+ import '../chunk-RNPHRRLG.js';
20
20
  import '../chunk-4ZTPYIBE.js';
21
- import '../chunk-2XFUXGV6.js';
21
+ import '../chunk-NWQB7UTY.js';
22
22
  import '../chunk-X5YPJV4N.js';
23
23
  import '../chunk-O7SG5PC2.js';
24
24
  import '../chunk-7QBNJTTQ.js';
@@ -27,67 +27,67 @@ import '../chunk-5LKOAX7I.js';
27
27
  import '../chunk-32NA4TVC.js';
28
28
  import '../chunk-W3UDISS2.js';
29
29
  import '../chunk-HCYS7GFP.js';
30
- import { runFlow, resumeFlow } from '../chunk-7KLC4LZO.js';
30
+ import { runFlow, resumeFlow } from '../chunk-MKLBK7HI.js';
31
31
  import '../chunk-4R6DROGN.js';
32
- import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-ZBBM6O6P.js';
33
- import '../chunk-SDFROXSA.js';
32
+ import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-EB4XN3KE.js';
33
+ import '../chunk-O4Z7MAW7.js';
34
34
  import '../chunk-CT6NQSA4.js';
35
- import '../chunk-UAP2XHRF.js';
35
+ import '../chunk-SZWRPEF7.js';
36
36
  import '../chunk-FK6HPLQA.js';
37
- import '../chunk-2GRB5ITE.js';
38
- import '../chunk-VX3INFBA.js';
39
- import '../chunk-VBBBZDI7.js';
37
+ import '../chunk-PSA6ONFB.js';
38
+ import '../chunk-34C42MJX.js';
39
+ import '../chunk-UX3K4RKE.js';
40
40
  import '../chunk-EINLFFP6.js';
41
41
  import '../chunk-LOO5CB5M.js';
42
42
  import '../chunk-NARITJS2.js';
43
- import '../chunk-27HS2DHB.js';
43
+ import '../chunk-GWXFSLBK.js';
44
44
  import '../chunk-XBSQ4KMC.js';
45
45
  import '../chunk-YROR332M.js';
46
- import { getProviderPreset, AI_PROVIDER_PRESETS } from '../chunk-5B5IZVEP.js';
46
+ import { getProviderPreset, AI_PROVIDER_PRESETS } from '../chunk-BTK7ECLH.js';
47
47
  import '../chunk-6E6PKKAD.js';
48
48
  import '../chunk-IFGTRL2I.js';
49
- import { projectAiAssetsRoots, loadFlow, loadAllFlowEntries, findFlowFileInRoots } from '../chunk-AOAZCSDI.js';
49
+ import { projectAiAssetsRoots, loadFlow, loadAllFlowEntries, findFlowFileInRoots } from '../chunk-LBQ4BBX4.js';
50
50
  import '../chunk-37FTLYFP.js';
51
51
  import '../chunk-QZLWJETK.js';
52
52
  import '../chunk-XUUYAS3Z.js';
53
53
  import { nodeLabel, nodeSkillAsset, nodeIsInert, nodeIsOptional, nodeRunKind, flowSkillVersionPins } from '../chunk-NFGRW3L7.js';
54
54
  import '../chunk-QCI6D7E4.js';
55
55
  import '../chunk-DMLDYFDS.js';
56
- import { AssetManager, MissingManifestError, parseRefTolerant, normalizeRepoUrl, FACTORY_SOURCE_URL } from '../chunk-PTO2YDDG.js';
57
- import { cloneOrInitGitRepo, ensureGitRepo, setManifestPublisher, syncManifestWithDisk, isGitRepo, assertManifestEditable, installLibraryAsset, missingRootAssets, stampManifestPublisher, upsertManifestAsset, getStoreManifestsDir, getDefaultValue, isSecretPlaceholder } from '../chunk-MX3UQXLU.js';
58
- import { parseManifestFile } from '../chunk-XOGG7VDZ.js';
59
- import '../chunk-BTISGSK4.js';
56
+ import { AssetManager, MissingManifestError, parseRefTolerant, normalizeRepoUrl, FACTORY_SOURCE_URL } from '../chunk-D5HOETOB.js';
57
+ import { cloneOrInitGitRepo, trackOriginBranch, ensureGitRepo, setManifestPublisher, LIBRARY_OWNERSHIPS, syncManifestWithDisk, isGitRepo, assertManifestEditable, installLibraryAsset, missingRootAssets, assertValidLibraryName, stampManifestPublisher, upsertManifestAsset, getStoreManifestsDir, getDefaultValue, isSecretPlaceholder } from '../chunk-DFFD4BFG.js';
58
+ import { parseManifestFile, requiresSyntaxErrors, SEMVER_RE } from '../chunk-6VRJH4MR.js';
59
+ import '../chunk-FAP63KV7.js';
60
60
  import '../chunk-R7FOF242.js';
61
61
  import '../chunk-3TXEJN4W.js';
62
- import { installTargetOf } from '../chunk-2KOKBTR4.js';
62
+ import { installTargetOf, SCAFFOLD_KINDS } from '../chunk-74EEFB52.js';
63
63
  import '../chunk-CGYEHQOX.js';
64
64
  import '../chunk-KTBKW2FI.js';
65
65
  import '../chunk-UQ6LFBPZ.js';
66
- import '../chunk-VKSXST23.js';
66
+ import '../chunk-AVCUPPG6.js';
67
67
  import { effectiveComposes, validatePreset, composeSlotDiagnostics, agentDeprecationDiagnostics, validateAgent, SLOT_ID_PATTERN } from '../chunk-FRHE7FFB.js';
68
- import { resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, WorkspaceYamlEditor, resolveLibraryDir, checkAgentSkillConformance, globalInstallDir, GLOBAL_INSTALL_DIR_NAME, readLock, aiResourceRoots, workspaceProviderRegistryPath, userProviderRegistryPath, loadProviderRegistryFile } from '../chunk-TZCQ7ZWQ.js';
68
+ import { resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, WorkspaceYamlEditor, resolveLibraryDir, checkAgentSkillConformance, globalInstallDir, GLOBAL_INSTALL_DIR_NAME, readLock, aiResourceRoots, workspaceProviderRegistryPath, userProviderRegistryPath, loadProviderRegistryFile } from '../chunk-OOLT6HGP.js';
69
69
  import '../chunk-4GY63JU6.js';
70
- import { factoryAssetRoots } from '../chunk-BF33SCLY.js';
71
- import '../chunk-46OVMT76.js';
70
+ import { factoryAssetRoots } from '../chunk-SWO25LTO.js';
71
+ import '../chunk-G67BOI2J.js';
72
72
  import { DEFAULT_DRIVER_ID, DRIVER_DEFAULTS } from '../chunk-5BEFNLOR.js';
73
73
  import { findKindDirs } from '../chunk-A2ULN3KX.js';
74
- import { sourceCacheKey, getGlobalCacheDir, resolveAgentDir, AgentRefResolutionError, resolveAgentDefinitionDir, resolveSkWorkspaceConfig, matchPin, coerceVersion, loadSkWorkspaceConfig, normalizeAgentInstances, agentInstanceDiagnostics, storeManifestSlug, isWorkspaceConfigFilename } from '../chunk-2W4LBLIN.js';
75
- import { globalCacheRoot, globalSkaileDir, userConfigPath } from '../chunk-MFHKHXDE.js';
74
+ import { sourceCacheKey, getGlobalCacheDir, resolveAgentDir, AgentRefResolutionError, resolveAgentDefinitionDir, resolveSkWorkspaceConfig, matchPin, coerceVersion, loadSkWorkspaceConfig, normalizeAgentInstances, agentInstanceDiagnostics, storeManifestSlug, isWorkspaceConfigFilename } from '../chunk-LCU5U5IW.js';
75
+ import { globalCacheRoot, globalSkaileDir, userConfigPath } from '../chunk-L5VSIPQD.js';
76
76
  import { SUPPORTED_DRIVER_TARGETS, driverTargetForDriver } from '../chunk-CPSIPIX7.js';
77
- import { loadSkPublishManifest, SKAILE_MANIFEST_FILENAME, decodeSkaileManifest, encodeSkaileManifest } from '../chunk-7ZHLYXTI.js';
77
+ import { SKAILE_MANIFEST_FILENAME, loadSkPublishManifest, decodeSkaileManifest, encodeSkaileManifest } from '../chunk-RVIZQ5XD.js';
78
78
  import { pluginTitle } from '../chunk-RVRB27AN.js';
79
- import { parseFrontmatter, scanDirectory } from '../chunk-PA7WLID3.js';
80
- import { parseAssetRef, isValidAssetName, slugifyAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-AO7VJ6G6.js';
79
+ import { parseFrontmatter, scanDirectory } from '../chunk-TTPSDC2G.js';
80
+ import { parseAssetRef, isValidPublisher, PUBLISHER_HINT, isValidAssetName, ASSET_NAME_HINT, slugifyAssetName, parseAssetRefLoose, assetRefToStr } from '../chunk-O7VPNKYN.js';
81
81
  import { portableSpawn, portableSpawnSync } from '../chunk-ICSCSM5D.js';
82
82
  import { openSqlite } from '../chunk-JMKB7IB4.js';
83
83
  import { parseModelRef, resolveEntryBaseUrl } from '../chunk-MJHSLODD.js';
84
84
  import '../chunk-C3CAXQMA.js';
85
85
  import '../chunk-BOFL7GIF.js';
86
86
  import '../chunk-NSBPE2FW.js';
87
- import * as fs11 from 'fs';
88
- import fs11__default, { readFileSync, existsSync, mkdirSync, writeFileSync, lstatSync, rmSync, readdirSync, statSync } from 'fs';
89
- import * as path25 from 'path';
90
- import path25__default, { resolve, join } from 'path';
87
+ import * as fs9 from 'fs';
88
+ import fs9__default, { readFileSync, existsSync, mkdirSync, writeFileSync, lstatSync, rmSync, readdirSync, statSync } from 'fs';
89
+ import * as path23 from 'path';
90
+ import path23__default, { resolve, join } from 'path';
91
91
  import { fileURLToPath } from 'url';
92
92
  import { Help, Command, Option } from 'commander';
93
93
  import { rcompare } from 'semver';
@@ -99,7 +99,7 @@ import * as readline from 'readline';
99
99
  import { createInterface } from 'readline';
100
100
  import fs6 from 'fs/promises';
101
101
  import { parse as parse$1, stringify as stringify$1 } from 'smol-toml';
102
- import { execSync, spawnSync } from 'child_process';
102
+ import { execSync, spawnSync, execFileSync } from 'child_process';
103
103
  import * as readline2 from 'readline/promises';
104
104
  import { createTRPCUntypedClient, httpLink, httpSubscriptionLink } from '@trpc/client';
105
105
 
@@ -176,7 +176,7 @@ async function runSearch(kind, query, opts) {
176
176
  const showLocal = !opts.store;
177
177
  const showStore = !opts.local;
178
178
  const { resolveConfig } = await import('../library/index.js');
179
- const airGapped = resolveConfig({ projectDir: path25__default.resolve(opts.projectDir) }).catalog.cache_ttl === 0;
179
+ const airGapped = resolveConfig({ projectDir: path23__default.resolve(opts.projectDir) }).catalog.cache_ttl === 0;
180
180
  if (showLocal) {
181
181
  await searchLocal(query, kind, opts, showStore, airGapped);
182
182
  }
@@ -185,10 +185,11 @@ async function runSearch(kind, query, opts) {
185
185
  }
186
186
  }
187
187
  async function searchIndex(query, kind) {
188
- const { openLibrary: openLibrary2 } = await import('../open-library-4WUMQHES.js');
188
+ const { openLibrary: openLibrary2 } = await import('../open-library-P3D337NH.js');
189
189
  const library = await openLibrary2();
190
190
  try {
191
191
  const defs = await library.listAssetDefs(kind ? { kind } : {});
192
+ const libraryNames = new Map((await library.listSources()).map((l) => [l.id, l.name]));
192
193
  let entries = defs.map(
193
194
  (d) => ({
194
195
  name: d.name,
@@ -202,7 +203,8 @@ async function searchIndex(query, kind) {
202
203
  requires: [],
203
204
  dependencies: [],
204
205
  license: d.license,
205
- category: d.category
206
+ category: d.category,
207
+ library: d.libraryId ? libraryNames.get(d.libraryId) : void 0
206
208
  })
207
209
  );
208
210
  if (query) {
@@ -217,7 +219,7 @@ async function searchIndex(query, kind) {
217
219
  }
218
220
  }
219
221
  async function searchFactory(projectDir, query, kind) {
220
- const prefixes = factoryAssetRoots().map((r) => r.endsWith(path25__default.sep) ? r : r + path25__default.sep);
222
+ const prefixes = factoryAssetRoots().map((r) => r.endsWith(path23__default.sep) ? r : r + path23__default.sep);
221
223
  const isFactoryPath = (p6) => prefixes.some((fp) => p6 === fp.slice(0, -1) || p6.startsWith(fp));
222
224
  try {
223
225
  const entries = await new AssetManager({ registry: getKindRegistry(), projectDir }).search(
@@ -237,11 +239,11 @@ function unionEntries(indexed, factory) {
237
239
  return [...indexed, ...factory.filter((e) => !seen.has(entryDedupKey(e)))];
238
240
  }
239
241
  async function searchLocal(query, kind, opts, showStore, airGapped) {
240
- const projectDir = path25__default.resolve(opts.projectDir);
242
+ const projectDir = path23__default.resolve(opts.projectDir);
241
243
  const factory = await searchFactory(projectDir, query, kind);
242
244
  let entries = unionEntries(await searchIndex(query, kind), factory);
243
245
  if (entries.length === 0 && !query && !kind && !airGapped) {
244
- const { autoSyncForSearch } = await import('../source-JCF6KSQN.js');
246
+ const { autoSyncForSearch } = await import('../source-FYVSFYEI.js');
245
247
  if (await autoSyncForSearch(projectDir)) {
246
248
  entries = unionEntries(await searchIndex(query, kind), factory);
247
249
  }
@@ -264,40 +266,48 @@ var MIN_LOCAL_DESCRIPTION_WIDTH = 10;
264
266
  function layoutLocalTable(rows, width, style = {}) {
265
267
  const styleRef = style.ref ?? ((s) => s);
266
268
  const styleVer = style.version ?? ((s) => s);
269
+ const styleLib = style.library ?? ((s) => s);
267
270
  const gap = COLUMN_GAP.length;
268
271
  const indent = 2;
269
272
  const pad = " ".repeat(indent);
270
273
  const nameW = Math.max(4, ...rows.map((r) => r.ref.length));
271
274
  const verW = Math.max(0, ...rows.map((r) => r.version.length));
272
- const verSpan = verW > 0 ? gap + verW : 0;
275
+ const libW = Math.max(0, ...rows.map((r) => (r.library ?? "").length));
276
+ const tailSpan = (verW > 0 ? gap + verW : 0) + (libW > 0 ? gap + libW : 0);
273
277
  const refCell = (ref) => styleRef(ref) + " ".repeat(nameW - ref.length);
278
+ const tail = (r) => {
279
+ if (libW === 0) return r.version ? `${COLUMN_GAP}${styleVer(r.version)}` : "";
280
+ const verCell = `${COLUMN_GAP}${styleVer(r.version)}${" ".repeat(verW - r.version.length)}`;
281
+ const ver = verW > 0 ? verCell : "";
282
+ return `${ver}${COLUMN_GAP}${r.library ? styleLib(r.library) : ""}`;
283
+ };
274
284
  const lines = [];
275
- const descW = width - (indent + nameW + gap + verSpan);
285
+ const descW = width - (indent + nameW + gap + tailSpan);
276
286
  if (descW >= MIN_LOCAL_DESCRIPTION_WIDTH) {
277
287
  for (const r of rows) {
278
288
  const desc = truncateText(r.description, descW);
279
- const descCell = verW > 0 ? desc.padEnd(descW) : desc;
280
- lines.push(
281
- `${pad}${refCell(r.ref)}${COLUMN_GAP}${descCell}${r.version ? `${COLUMN_GAP}${styleVer(r.version)}` : ""}`
282
- );
289
+ const descCell = tailSpan > 0 ? desc.padEnd(descW) : desc;
290
+ lines.push(`${pad}${refCell(r.ref)}${COLUMN_GAP}${descCell}${tail(r)}`);
283
291
  }
284
- return { ruleWidth: nameW + gap + descW + verSpan, lines };
292
+ return { ruleWidth: nameW + gap + descW + tailSpan, lines };
285
293
  }
286
- if (indent + nameW + verSpan <= width) {
294
+ if (indent + nameW + tailSpan <= width) {
287
295
  for (const r of rows) {
288
- lines.push(
289
- verW > 0 ? `${pad}${refCell(r.ref)}${r.version ? `${COLUMN_GAP}${styleVer(r.version)}` : ""}` : `${pad}${styleRef(r.ref)}`
290
- );
296
+ lines.push(tailSpan > 0 ? `${pad}${refCell(r.ref)}${tail(r)}` : `${pad}${styleRef(r.ref)}`);
291
297
  }
292
- return { ruleWidth: nameW + verSpan, lines };
298
+ return { ruleWidth: nameW + tailSpan, lines };
293
299
  }
294
300
  const subPad = " ".repeat(indent + 2);
295
- const subDescW = width - (indent + 2) - verSpan;
301
+ const subDescW = width - (indent + 2) - tailSpan;
296
302
  for (const r of rows) {
297
303
  lines.push(`${pad}${styleRef(r.ref)}`);
298
304
  const desc = subDescW >= MIN_LOCAL_DESCRIPTION_WIDTH ? truncateText(r.description, subDescW) : "";
299
- const descCell = r.version && desc ? desc.padEnd(subDescW) : desc;
300
- const parts = [descCell, r.version ? styleVer(r.version) : ""].filter((s) => s !== "");
305
+ const descCell = (r.version || r.library) && desc ? desc.padEnd(subDescW) : desc;
306
+ const parts = [
307
+ descCell,
308
+ r.version ? styleVer(r.version) : "",
309
+ r.library ? styleLib(r.library) : ""
310
+ ].filter((s) => s !== "");
301
311
  if (parts.length > 0) lines.push(`${subPad}${parts.join(COLUMN_GAP)}`);
302
312
  }
303
313
  return { ruleWidth: Math.max(1, Math.min(nameW, width - indent)), lines };
@@ -313,10 +323,11 @@ function printLocalEntries(entries, width = terminalWidth()) {
313
323
  items.map((e) => ({
314
324
  ref: localEntryRef(e),
315
325
  description: e.description,
316
- version: e.version ? `v${e.version}` : ""
326
+ version: e.version ? `v${e.version}` : "",
327
+ library: e.library
317
328
  })),
318
329
  width,
319
- { ref: S.cmd, version: S.dim }
330
+ { ref: S.cmd, version: S.dim, library: S.dim }
320
331
  );
321
332
  console.log();
322
333
  console.log(
@@ -350,9 +361,9 @@ async function searchStore(query, kind, opts, airGapped) {
350
361
  logInfo("air-gapped (cache_ttl: 0) \u2014 local sources only");
351
362
  return;
352
363
  }
353
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-4WUMQHES.js');
364
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-P3D337NH.js');
354
365
  try {
355
- const remote = await openCatalogSource2({ projectDir: path25__default.resolve(opts.projectDir) });
366
+ const remote = await openCatalogSource2({ projectDir: path23__default.resolve(opts.projectDir) });
356
367
  const assets = await remote.listAssets(kind ? { kind } : {});
357
368
  const results = filterCatalogAssets(assets, query);
358
369
  if (results.length > 0) {
@@ -363,7 +374,7 @@ async function searchStore(query, kind, opts, airGapped) {
363
374
  logInfo("No results in store");
364
375
  }
365
376
  } catch (e) {
366
- const local = e instanceof LocalCatalogDisabledError;
377
+ const local = e instanceof LocalCatalogDisabledError2;
367
378
  if (opts.store) {
368
379
  logErr(
369
380
  local ? "remote catalog disabled (catalog.url: local) \u2014 set catalog.url: https://skaile.store to search the store" : `Store search failed: ${e.message}`
@@ -470,7 +481,7 @@ function makeAddCommand() {
470
481
  const warnings = deferredWarnings();
471
482
  const am2 = new AssetManager({
472
483
  registry: getKindRegistry(),
473
- projectDir: path25__default.resolve(opts.projectDir),
484
+ projectDir: path23__default.resolve(opts.projectDir),
474
485
  global: opts.global || harnesses !== void 0,
475
486
  harnesses,
476
487
  driverTarget: opts.target,
@@ -527,14 +538,15 @@ function makeRemoveCommand() {
527
538
  const harnesses = parseHarnessFilter(opts.harness);
528
539
  const am2 = new AssetManager({
529
540
  registry: getKindRegistry(),
530
- projectDir: path25__default.resolve(opts.projectDir),
541
+ projectDir: path23__default.resolve(opts.projectDir),
531
542
  global: opts.global || harnesses !== void 0,
532
543
  harnesses,
533
544
  driverTarget: opts.target
534
545
  });
535
546
  const ok = am2.remove(ref);
536
547
  if (!ok) {
537
- logErr(`Not deployed: ${ref}`);
548
+ logErr(`Not deployed or declared: ${ref}`);
549
+ process.exitCode = 1;
538
550
  return;
539
551
  }
540
552
  logOk(`Removed ${ref}`);
@@ -570,7 +582,7 @@ function makeListCommand() {
570
582
  }
571
583
  const am2 = new AssetManager({
572
584
  registry: getKindRegistry(),
573
- projectDir: path25__default.resolve(opts.projectDir),
585
+ projectDir: path23__default.resolve(opts.projectDir),
574
586
  driverTarget: opts.target
575
587
  });
576
588
  let declared;
@@ -618,7 +630,7 @@ function makeListCommand() {
618
630
  function runGlobalList(kind, opts, harnesses) {
619
631
  const am2 = new AssetManager({
620
632
  registry: getKindRegistry(),
621
- projectDir: path25__default.resolve(opts.projectDir),
633
+ projectDir: path23__default.resolve(opts.projectDir),
622
634
  global: true,
623
635
  harnesses
624
636
  });
@@ -691,7 +703,7 @@ async function resolveInfoEntry(am2, ref, opts) {
691
703
  return { entry: match ?? deployed };
692
704
  }
693
705
  const lookup = opts.storeLookup ?? (async (filter) => {
694
- const { resolveCatalogSource } = await import('../open-library-4WUMQHES.js');
706
+ const { resolveCatalogSource } = await import('../open-library-P3D337NH.js');
695
707
  const { source, close } = await resolveCatalogSource({ projectDir: opts.projectDir });
696
708
  try {
697
709
  return await source.listAssets(filter);
@@ -707,9 +719,9 @@ async function resolveInfoEntry(am2, ref, opts) {
707
719
  );
708
720
  return { entry: hit ? catalogAssetToEntry(hit) : null };
709
721
  } catch (err2) {
710
- const { LocalCatalogDisabledError } = await import('../open-library-4WUMQHES.js');
722
+ const { LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-P3D337NH.js');
711
723
  const storeNote = err2 instanceof Error ? err2.message : String(err2);
712
- const disabled = err2 instanceof LocalCatalogDisabledError || /catalog\.url/i.test(storeNote);
724
+ const disabled = err2 instanceof LocalCatalogDisabledError2 || /catalog\.url/i.test(storeNote);
713
725
  return { entry: null, storeNote, ...disabled ? { storeDisabled: true } : {} };
714
726
  }
715
727
  }
@@ -723,7 +735,7 @@ function infoNotFoundHint(ref, lookup) {
723
735
  }
724
736
  function makeInfoCommand() {
725
737
  return new Command("info").description("Show asset metadata, deps, deploy status").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
726
- const projectDir = path25__default.resolve(opts.projectDir);
738
+ const projectDir = path23__default.resolve(opts.projectDir);
727
739
  const am2 = new AssetManager({ registry: getKindRegistry(), projectDir });
728
740
  const lookup = await resolveInfoEntry(am2, ref, { projectDir });
729
741
  const entry = lookup.entry;
@@ -756,10 +768,10 @@ function makeInfoCommand() {
756
768
  }
757
769
  function makeCreateCommand() {
758
770
  return new Command("create").description("Scaffold a new asset").argument("<name>", "Asset name").addOption(
759
- new Option("-k, --kind <kind>", "Asset kind").default("skill").choices(getKindRegistry().getAllKinds())
771
+ new Option("-k, --kind <kind>", "Asset kind").default("skill").choices([...SCAFFOLD_KINDS])
760
772
  ).option("-d, --dir <dir>", "Target directory (default: cwd)").action((name, opts) => {
761
773
  const am2 = new AssetManager({ registry: getKindRegistry(), projectDir: process.cwd() });
762
- const destDir = opts.dir ? path25__default.resolve(opts.dir) : process.cwd();
774
+ const destDir = opts.dir ? path23__default.resolve(opts.dir) : process.cwd();
763
775
  const result = am2.create(name, opts.kind, destDir);
764
776
  if (result.ok) logOk(`Created ${kindColor(opts.kind)}: ${pc5.dim(result.path)}`);
765
777
  else {
@@ -772,21 +784,29 @@ function makeDoctorCommand() {
772
784
  return new Command("doctor").description("Scan for missing dependency chains").argument("[name]", "Check a specific asset (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action(async (name, opts) => {
773
785
  const am2 = new AssetManager({
774
786
  registry: getKindRegistry(),
775
- projectDir: path25__default.resolve(opts.projectDir)
787
+ projectDir: path23__default.resolve(opts.projectDir)
776
788
  });
777
789
  const issues = await am2.doctor();
778
790
  if (issues.length === 0) {
779
791
  logOk("No missing dependencies.");
780
792
  return;
781
793
  }
782
- const assetW = Math.max(5, ...issues.map((i) => `${i.assetKind}:${i.assetName}`.length));
783
- const depW = Math.max(11, ...issues.map((i) => `${i.depKind}:${i.depName}`.length));
794
+ const unresolved = issues.filter((i) => i.unresolved);
795
+ const missing = issues.filter((i) => !i.unresolved);
796
+ for (const i of unresolved) {
797
+ logErr(
798
+ `${i.assetKind}:${i.assetName}: locked, but no source or library provides it \u2014 run skaile install`
799
+ );
800
+ }
801
+ if (missing.length === 0) return;
802
+ const assetW = Math.max(5, ...missing.map((i) => `${i.assetKind}:${i.assetName}`.length));
803
+ const depW = Math.max(11, ...missing.map((i) => `${i.depKind}:${i.depName}`.length));
784
804
  console.log();
785
805
  console.log(
786
806
  ` ${S.dim("ASSET".padEnd(assetW))} ${S.dim("MISSING DEP".padEnd(depW))} ${S.dim("IN REPOS")}`
787
807
  );
788
808
  console.log(` ${S.rule(assetW + depW + 15)}`);
789
- for (const i of issues) {
809
+ for (const i of missing) {
790
810
  const asset = `${i.assetKind}:${i.assetName}`;
791
811
  const dep = `${i.depKind}:${i.depName}`;
792
812
  const status4 = i.inRepos ? S.warn("fixable") : S.err("not found");
@@ -795,12 +815,37 @@ function makeDoctorCommand() {
795
815
  console.log();
796
816
  });
797
817
  }
798
- async function indexLibrary(lib, index) {
818
+ function manifestRequiresProblems(dir) {
819
+ const file = path23.join(dir, "skaile.manifest.yaml");
820
+ let doc;
821
+ try {
822
+ doc = parse(fs9.readFileSync(file, "utf-8"));
823
+ } catch {
824
+ return [];
825
+ }
826
+ const assets = doc?.assets;
827
+ if (!Array.isArray(assets)) return [];
828
+ const problems = [];
829
+ for (const a of assets) {
830
+ if (!a || typeof a !== "object") continue;
831
+ const { kind, name, dependencies } = a;
832
+ if (!Array.isArray(dependencies)) continue;
833
+ const entries = dependencies.map((d) => typeof d === "string" ? d : String(d));
834
+ for (const message of requiresSyntaxErrors(entries)) {
835
+ problems.push({
836
+ asset: `${String(kind)}:${String(name)}`,
837
+ message: `ManifestRequiresError: ${message}`
838
+ });
839
+ }
840
+ }
841
+ return problems;
842
+ }
843
+ async function indexLibrary(lib, index, opts = {}) {
799
844
  const { LocalCatalogSource } = await import('../library/index.js');
800
845
  const own = index ?? await openLibrary();
801
846
  try {
802
847
  const source = new LocalCatalogSource(own, lib.id, lib.path, getKindRegistry());
803
- const res = await source.sync();
848
+ const res = await source.sync({ exclude: opts.exclude });
804
849
  return {
805
850
  assetsFound: res.assetsFound,
806
851
  assetsUpdated: res.assetsUpdated,
@@ -823,31 +868,23 @@ function resolveLibraryPublisherDetailed(lib, opts, storeIdentity) {
823
868
  return { publisher: "library", source: "library-name" };
824
869
  }
825
870
  }
826
- function resolveLibraryPublisher(lib, opts, storeIdentity) {
827
- return resolveLibraryPublisherDetailed(lib, opts, storeIdentity).publisher;
871
+ function warnLibraryNameFallback(libName, resolved) {
872
+ if (resolved.source !== "library-name") return;
873
+ logWarn(
874
+ `No publisher given and not signed in \u2014 using the library name "${resolved.publisher}" as the publisher. Pass --publisher <name> or run \`skaile store login\`; change it later with \`skaile library set ${libName} publisher=<name>\`.`
875
+ );
828
876
  }
829
- function stampAssetPublisher(assetDir, publisher) {
830
- const markers = ["SKILL.md", "AGENT.md", "CONTRACT.md"];
831
- let markerFile;
832
- for (const m of markers) {
833
- if (fs11.existsSync(path25.join(assetDir, m))) {
834
- markerFile = path25.join(assetDir, m);
835
- break;
836
- }
837
- }
877
+ function normalizeAssetFrontmatter(assetDir) {
878
+ let markerFile = ["SKILL.md", "AGENT.md", "CONTRACT.md"].map((m) => path23.join(assetDir, m)).find((f) => fs9.existsSync(f));
838
879
  if (!markerFile) {
839
- const promptMd = fs11.readdirSync(assetDir).find((f) => f.endsWith(".prompt.md"));
840
- if (promptMd) markerFile = path25.join(assetDir, promptMd);
880
+ const promptMd = fs9.readdirSync(assetDir).find((f) => f.endsWith(".prompt.md"));
881
+ if (promptMd) markerFile = path23.join(assetDir, promptMd);
841
882
  }
842
883
  if (!markerFile) return;
843
884
  try {
844
- const { data, body } = parseFrontmatter(fs11.readFileSync(markerFile, "utf8"));
845
- const meta = data.metadata && typeof data.metadata === "object" && !Array.isArray(data.metadata) ? { ...data.metadata } : {};
846
- if (meta.publisher != null) return;
847
- meta.publisher = publisher;
848
- data.metadata = meta;
885
+ const { data, body } = parseFrontmatter(fs9.readFileSync(markerFile, "utf8"));
849
886
  const fm = stringify(data).trimEnd();
850
- fs11.writeFileSync(markerFile, `---
887
+ fs9.writeFileSync(markerFile, `---
851
888
  ${fm}
852
889
  ---
853
890
 
@@ -862,17 +899,13 @@ async function registerLibraryAsset(lib, index, input) {
862
899
  { publisher: input.publisher },
863
900
  getStoreIdentity()
864
901
  );
865
- if (source === "library-name") {
866
- logWarn(
867
- `No publisher given and not signed in \u2014 using the library name "${publisher}" as the publisher. Pass --publisher <name> or run \`skaile store login\`; change it later with \`skaile library set ${lib.name} publisher=<name>\`.`
868
- );
869
- }
870
- stampAssetPublisher(input.assetDir, publisher);
902
+ warnLibraryNameFallback(lib.name, { publisher, source });
903
+ normalizeAssetFrontmatter(input.assetDir);
871
904
  stampManifestPublisher(lib.path, publisher);
872
905
  upsertManifestAsset(lib.path, {
873
906
  kind: input.kind,
874
907
  name: input.name,
875
- root: path25.relative(lib.path, input.assetDir) || input.name,
908
+ root: path23.relative(lib.path, input.assetDir) || input.name,
876
909
  version: input.version,
877
910
  publisher
878
911
  });
@@ -882,19 +915,27 @@ async function registerLibraryAsset(lib, index, input) {
882
915
  }
883
916
  var LIBRARY_UPGRADE_DOCS = "https://github.com/skaile-ai/workspaces/blob/main/docs/sections/cli/commands/library.md#upgrading-a-4x-library";
884
917
  var DOMAIN_REMOVED_HINT = `Domains were removed in 5.0 \u2014 delete DOMAIN.md files; group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`;
918
+ function removedDomainOption() {
919
+ return new Option("--domain <domain>", "Removed in 5.0").hideHelp();
920
+ }
921
+ function rejectRemovedDomainOption(opts) {
922
+ if (opts.domain === void 0) return;
923
+ logErr(DOMAIN_REMOVED_HINT);
924
+ process.exit(1);
925
+ }
885
926
  function countDomainFiles(root) {
886
927
  let count = 0;
887
928
  const walk = (dir) => {
888
929
  let entries;
889
930
  try {
890
- entries = fs11.readdirSync(dir, { withFileTypes: true });
931
+ entries = fs9.readdirSync(dir, { withFileTypes: true });
891
932
  } catch {
892
933
  return;
893
934
  }
894
935
  for (const entry of entries) {
895
936
  if (entry.isDirectory()) {
896
937
  if (!entry.name.startsWith(".") && entry.name !== "node_modules") {
897
- walk(path25.join(dir, entry.name));
938
+ walk(path23.join(dir, entry.name));
898
939
  }
899
940
  } else if (entry.name === "DOMAIN.md") {
900
941
  count++;
@@ -919,21 +960,21 @@ function claudeSkillRoots() {
919
960
  const roots = [];
920
961
  const override = process.env.SKAILE_CLAUDE_SKILLS_DIR;
921
962
  if (override) roots.push(override);
922
- roots.push(path25.join(os.homedir(), ".claude", "skills"));
963
+ roots.push(path23.join(os.homedir(), ".claude", "skills"));
923
964
  return roots;
924
965
  }
925
966
  function resolveImportSource(nameOrPath) {
926
- const asPath = path25.resolve(nameOrPath);
927
- if (fs11.existsSync(asPath)) {
928
- const dir = fs11.statSync(asPath).isDirectory() ? asPath : path25.dirname(asPath);
929
- const skillFile = path25.join(dir, "SKILL.md");
930
- if (fs11.existsSync(skillFile)) return { dir, skillFile, via: "path" };
967
+ const asPath = path23.resolve(nameOrPath);
968
+ if (fs9.existsSync(asPath)) {
969
+ const dir = fs9.statSync(asPath).isDirectory() ? asPath : path23.dirname(asPath);
970
+ const skillFile = path23.join(dir, "SKILL.md");
971
+ if (fs9.existsSync(skillFile)) return { dir, skillFile, via: "path" };
931
972
  }
932
- if (!nameOrPath.includes(path25.sep) && !nameOrPath.startsWith(".")) {
973
+ if (!nameOrPath.includes(path23.sep) && !nameOrPath.startsWith(".")) {
933
974
  for (const root of claudeSkillRoots()) {
934
- const dir = path25.join(root, nameOrPath);
935
- const skillFile = path25.join(dir, "SKILL.md");
936
- if (fs11.existsSync(skillFile)) return { dir, skillFile, via: "claude-skills" };
975
+ const dir = path23.join(root, nameOrPath);
976
+ const skillFile = path23.join(dir, "SKILL.md");
977
+ if (fs9.existsSync(skillFile)) return { dir, skillFile, via: "claude-skills" };
937
978
  }
938
979
  }
939
980
  return null;
@@ -989,15 +1030,16 @@ ${body}
989
1030
 
990
1031
  // cli/src/commands/asset-cmd.ts
991
1032
  async function resolveDefByRef(library, ref, opts) {
992
- const inScope = (d) => !opts?.fromLibraryId || d.libraryId === opts.fromLibraryId;
993
- const direct = await library.getAssetDef(ref);
994
- if (direct && inScope(direct)) return direct;
995
1033
  let parsed;
996
1034
  try {
997
1035
  parsed = parseAssetRef(ref);
998
- } catch {
999
- return null;
1036
+ } catch (err2) {
1037
+ logErr(
1038
+ `malformed asset ref '${ref}' \u2014 expected ${REF_HINT}: ${err2 instanceof Error ? err2.message : String(err2)}`
1039
+ );
1040
+ process.exit(1);
1000
1041
  }
1042
+ const inScope = (d) => !opts?.fromLibraryId || d.libraryId === opts.fromLibraryId;
1001
1043
  const wantPublisher = parsed.publisher?.replace(/^@/, "");
1002
1044
  const defs = await library.listAssetDefs({ kind: parsed.kind });
1003
1045
  const matches = defs.filter(
@@ -1008,7 +1050,8 @@ async function resolveDefByRef(library, ref, opts) {
1008
1050
  return matches[0];
1009
1051
  }
1010
1052
  function withCanonicalRef(def) {
1011
- return { ref: catalogAssetRef(def), ...def };
1053
+ const { id: _storageId, ...rest } = def;
1054
+ return { ref: catalogAssetRef(def), ...rest };
1012
1055
  }
1013
1056
  function resolveLibraryOption(opts) {
1014
1057
  if (opts.library && opts.to && opts.library !== opts.to) {
@@ -1021,11 +1064,12 @@ function resolveLibraryOption(opts) {
1021
1064
  }
1022
1065
  function makeAssetCommand() {
1023
1066
  const cmd = new Command("asset").description("Author and install AI assets");
1024
- cmd.command("import <name-or-path>").description("Import + skailify an existing coding-agent skill into a library").option("--library <library>", "Target library (default: auto / personal)").addOption(new Option("--to <library>", "Alias for --library").hideHelp()).option("--version <semver>", "Version to stamp when the skill ships none").option("--stage <stage>", "Lifecycle stage to stamp (default: alpha)").option("--no-normalize", "Copy verbatim \u2014 skip frontmatter normalization").option(
1067
+ cmd.command("import <name-or-path>").description("Import + skailify an existing coding-agent skill into a library").option("--library <library>", "Target library (default: auto / personal)").addOption(new Option("--to <library>", "Alias for --library").hideHelp()).addOption(removedDomainOption()).option("--version <semver>", "Version to stamp when the skill ships none").option("--stage <stage>", "Lifecycle stage to stamp (default: alpha)").option("--no-normalize", "Copy verbatim \u2014 skip frontmatter normalization").option(
1025
1068
  "--publisher <name>",
1026
1069
  "Publisher for the imported skill (default: the library's, else your store login)"
1027
1070
  ).option("--commit", "Auto-commit in git-backed libraries", false).action(
1028
1071
  async (nameOrPath, opts) => {
1072
+ rejectRemovedDomainOption(opts);
1029
1073
  const src = resolveImportSource(nameOrPath);
1030
1074
  if (!src) {
1031
1075
  logErr(
@@ -1055,24 +1099,24 @@ function makeAssetCommand() {
1055
1099
  logErr(err2 instanceof Error ? err2.message : String(err2));
1056
1100
  process.exit(1);
1057
1101
  }
1058
- const rawSkill = fs11.readFileSync(src.skillFile, "utf8");
1102
+ const rawSkill = fs9.readFileSync(src.skillFile, "utf8");
1059
1103
  const norm = opts.normalize ? normalizeSkillContent(rawSkill, {
1060
- fallbackName: path25.basename(src.dir),
1104
+ fallbackName: path23.basename(src.dir),
1061
1105
  version: opts.version,
1062
1106
  stage: opts.stage
1063
- }) : { content: rawSkill, name: path25.basename(src.dir), changed: false, notes: [] };
1107
+ }) : { content: rawSkill, name: path23.basename(src.dir), changed: false, notes: [] };
1064
1108
  if (!opts.normalize && !isValidAssetName(norm.name)) {
1065
1109
  logWarn(
1066
1110
  `Name "${norm.name}" is not canonical (kebab-case); \`skaile validate\` will reject this manifest entry. Drop --no-normalize to slugify it.`
1067
1111
  );
1068
1112
  }
1069
- const destDir = path25.join(target.path, norm.name);
1070
- if (fs11.existsSync(destDir)) {
1113
+ const destDir = path23.join(target.path, norm.name);
1114
+ if (fs9.existsSync(destDir)) {
1071
1115
  logErr(`Destination already exists: ${destDir}`);
1072
1116
  process.exit(1);
1073
1117
  }
1074
- fs11.cpSync(src.dir, destDir, { recursive: true });
1075
- fs11.writeFileSync(path25.join(destDir, "SKILL.md"), norm.content, "utf8");
1118
+ fs9.cpSync(src.dir, destDir, { recursive: true });
1119
+ fs9.writeFileSync(path23.join(destDir, "SKILL.md"), norm.content, "utf8");
1076
1120
  for (const note of norm.notes) logInfo(` \u2022 ${note}`);
1077
1121
  const fm = parseFrontmatter(norm.content).data;
1078
1122
  for (const f of checkAgentSkillConformance(fm, { dirName: norm.name })) {
@@ -1105,13 +1149,14 @@ function makeAssetCommand() {
1105
1149
  }
1106
1150
  }
1107
1151
  );
1108
- cmd.command("migrate <path>").description("Move/copy/link a workspace asset into a library").option("--library <library>", "Target library (default: auto)").addOption(new Option("--to <library>", "Alias for --library").hideHelp()).option("--mode <mode>", "copy | move | link", "copy").option("--commit", "Auto-commit in git-backed libraries", false).action(
1152
+ cmd.command("migrate <path>").description("Move/copy/link a workspace asset into a library").option("--library <library>", "Target library (default: auto)").addOption(new Option("--to <library>", "Alias for --library").hideHelp()).addOption(removedDomainOption()).option("--mode <mode>", "copy | move | link", "copy").option("--commit", "Auto-commit in git-backed libraries", false).action(
1109
1153
  async (srcPath, opts) => {
1154
+ rejectRemovedDomainOption(opts);
1110
1155
  if (!["copy", "move", "link"].includes(opts.mode)) {
1111
1156
  logErr(`Invalid --mode "${opts.mode}". Expected: copy | move | link.`);
1112
1157
  process.exit(1);
1113
1158
  }
1114
- if (!fs11.existsSync(srcPath)) {
1159
+ if (!fs9.existsSync(srcPath)) {
1115
1160
  logErr(`Source path does not exist: ${srcPath}`);
1116
1161
  process.exit(1);
1117
1162
  }
@@ -1137,23 +1182,23 @@ function makeAssetCommand() {
1137
1182
  );
1138
1183
  process.exit(1);
1139
1184
  }
1140
- const basename2 = path25.basename(srcPath);
1185
+ const basename2 = path23.basename(srcPath);
1141
1186
  const destDir = target.path;
1142
- fs11.mkdirSync(destDir, { recursive: true });
1143
- const destPath = path25.join(destDir, basename2);
1144
- if (fs11.existsSync(destPath)) {
1187
+ fs9.mkdirSync(destDir, { recursive: true });
1188
+ const destPath = path23.join(destDir, basename2);
1189
+ if (fs9.existsSync(destPath)) {
1145
1190
  logErr(`Destination already exists: ${destPath}`);
1146
1191
  process.exit(1);
1147
1192
  }
1148
1193
  switch (opts.mode) {
1149
1194
  case "copy":
1150
- fs11.cpSync(srcPath, destPath, { recursive: true });
1195
+ fs9.cpSync(srcPath, destPath, { recursive: true });
1151
1196
  break;
1152
1197
  case "move":
1153
- fs11.renameSync(srcPath, destPath);
1198
+ fs9.renameSync(srcPath, destPath);
1154
1199
  break;
1155
1200
  case "link":
1156
- fs11.symlinkSync(path25.resolve(srcPath), destPath);
1201
+ fs9.symlinkSync(path23.resolve(srcPath), destPath);
1157
1202
  break;
1158
1203
  }
1159
1204
  if (target.backend === "git" && opts.commit) {
@@ -1283,14 +1328,14 @@ function makeAuthCommand() {
1283
1328
  }
1284
1329
  function collectCacheTargets(scope) {
1285
1330
  const out = [];
1286
- out.push(path25__default.join(scope.projectDir, ".skaile", "cache"));
1287
- out.push(path25__default.join(scope.projectDir, ".skaile", "store-cache"));
1288
- out.push(path25__default.join(scope.projectDir, ".skaile", "repos"));
1331
+ out.push(path23__default.join(scope.projectDir, ".skaile", "cache"));
1332
+ out.push(path23__default.join(scope.projectDir, ".skaile", "store-cache"));
1333
+ out.push(path23__default.join(scope.projectDir, ".skaile", "repos"));
1289
1334
  if (scope.global) {
1290
1335
  out.push(globalCacheRoot());
1291
1336
  const home = globalSkaileDir();
1292
- out.push(path25__default.join(home, "repos"));
1293
- out.push(path25__default.join(home, "catalog-cache"));
1337
+ out.push(path23__default.join(home, "repos"));
1338
+ out.push(path23__default.join(home, "catalog-cache"));
1294
1339
  }
1295
1340
  return out;
1296
1341
  }
@@ -1304,7 +1349,7 @@ function dirSize(target) {
1304
1349
  function dirSizeOfDir(dir) {
1305
1350
  let total = 0;
1306
1351
  for (const ent of readdirSync(dir, { withFileTypes: true })) {
1307
- const child = path25__default.join(dir, ent.name);
1352
+ const child = path23__default.join(dir, ent.name);
1308
1353
  if (ent.isSymbolicLink()) continue;
1309
1354
  if (ent.isDirectory()) total += dirSizeOfDir(child);
1310
1355
  else if (ent.isFile()) total += statSync(child).size;
@@ -1330,7 +1375,7 @@ function makeCacheCommand() {
1330
1375
  const cmd = new Command("cache").description("Inspect and reclaim the re-derivable cache");
1331
1376
  cmd.command("clean").description("Remove the project cache (.skaile/cache); --global also clears ~/.skaile/cache").option("--global", "Also clear the global cache (sources + catalog) and legacy dirs").option("--dry-run", "Show what would be removed without doing it").option("-y, --yes", "Skip confirmation prompt").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
1332
1377
  const targets = collectCacheTargets({
1333
- projectDir: path25__default.resolve(opts.projectDir),
1378
+ projectDir: path23__default.resolve(opts.projectDir),
1334
1379
  global: opts.global
1335
1380
  }).filter((t) => existsSync(t));
1336
1381
  if (targets.length === 0) {
@@ -1360,12 +1405,12 @@ function makeCacheCommand() {
1360
1405
  for (const r of removed) logOk(`Removed ${r}`);
1361
1406
  });
1362
1407
  cmd.command("dir").description("Print the resolved cache roots").option("--global", "Include the global cache root").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
1363
- console.log(path25__default.join(path25__default.resolve(opts.projectDir), ".skaile", "cache"));
1408
+ console.log(path23__default.join(path23__default.resolve(opts.projectDir), ".skaile", "cache"));
1364
1409
  if (opts.global) console.log(globalCacheRoot());
1365
1410
  });
1366
1411
  cmd.command("size").description("Show cache disk usage per directory").option("--global", "Include the global cache").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
1367
1412
  const targets = collectCacheTargets({
1368
- projectDir: path25__default.resolve(opts.projectDir),
1413
+ projectDir: path23__default.resolve(opts.projectDir),
1369
1414
  global: opts.global
1370
1415
  });
1371
1416
  console.log();
@@ -1381,7 +1426,7 @@ function makeCatalogCommand() {
1381
1426
  const catalog = new Command("catalog").description("Catalog source health and configuration");
1382
1427
  catalog.command("test").description("Probe the configured catalog source and report status").option("--project-dir <path>", "Project directory (for project-level config overlay)").option("--url <url>", "Override the catalog URL for this probe").option("--force", "Probe the network even in air-gapped mode (cache_ttl: 0)").action(async (opts) => {
1383
1428
  const { resolveConfig, isLocalCatalogUrl, trpcGetUrl } = await import('../library/index.js');
1384
- const projectDir = opts.projectDir ? path25__default.resolve(opts.projectDir) : void 0;
1429
+ const projectDir = opts.projectDir ? path23__default.resolve(opts.projectDir) : void 0;
1385
1430
  const cfg = resolveConfig({ projectDir });
1386
1431
  const baseUrl = opts.url ?? cfg.catalog.url;
1387
1432
  if (isLocalCatalogUrl(baseUrl)) {
@@ -1399,7 +1444,7 @@ function makeCatalogCommand() {
1399
1444
  });
1400
1445
  catalog.command("info").description("Print the resolved catalog configuration (url, framing, cacheTtlMs)").option("--project-dir <path>", "Project directory (for project-level config overlay)").action(async (opts) => {
1401
1446
  const { resolveConfig } = await import('../library/index.js');
1402
- const projectDir = opts.projectDir ? path25__default.resolve(opts.projectDir) : void 0;
1447
+ const projectDir = opts.projectDir ? path23__default.resolve(opts.projectDir) : void 0;
1403
1448
  const cfg = resolveConfig({ projectDir });
1404
1449
  console.log(`url: ${cfg.catalog.url}`);
1405
1450
  console.log(`framing: ${cfg.catalog.framing}`);
@@ -1408,7 +1453,7 @@ function makeCatalogCommand() {
1408
1453
  return catalog;
1409
1454
  }
1410
1455
  async function runLocalCatalogTest(projectDir) {
1411
- const { resolveCatalogSource } = await import('../open-library-4WUMQHES.js');
1456
+ const { resolveCatalogSource } = await import('../open-library-P3D337NH.js');
1412
1457
  let resolved;
1413
1458
  try {
1414
1459
  resolved = await resolveCatalogSource({ projectDir });
@@ -1552,8 +1597,8 @@ async function scanLibraryFlowEntries() {
1552
1597
  const indexPath = resolveIndexPath();
1553
1598
  if (!existsSync(indexPath)) return entries;
1554
1599
  const [{ authoringLibraries }, { getKindRegistry: getKindRegistry2 }] = await Promise.all([
1555
- import('../open-library-4WUMQHES.js'),
1556
- import('../open-registry-NVPCQPND.js')
1600
+ import('../open-library-P3D337NH.js'),
1601
+ import('../open-registry-Z3P2X2AB.js')
1557
1602
  ]);
1558
1603
  const index = new LocalIndex({ indexPath });
1559
1604
  try {
@@ -1610,11 +1655,11 @@ function findSkills() {
1610
1655
  return deduped;
1611
1656
  }
1612
1657
  function walkSkills(dir, out) {
1613
- for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
1614
- const full = path25__default.join(dir, entry.name);
1658
+ for (const entry of fs9__default.readdirSync(dir, { withFileTypes: true })) {
1659
+ const full = path23__default.join(dir, entry.name);
1615
1660
  if (entry.isDirectory()) {
1616
- const skillMd = path25__default.join(full, "SKILL.md");
1617
- if (fs11__default.existsSync(skillMd)) {
1661
+ const skillMd = path23__default.join(full, "SKILL.md");
1662
+ if (fs9__default.existsSync(skillMd)) {
1618
1663
  out.push({ name: entry.name, path: full, skillPath: skillMd });
1619
1664
  } else {
1620
1665
  walkSkills(full, out);
@@ -1635,10 +1680,10 @@ function resolveFlowIds() {
1635
1680
  }
1636
1681
  }
1637
1682
  function resolveSessionIds(projectDir) {
1638
- const sessionsDir = path25__default.join(projectDir, ".skaile", "sessions");
1639
- if (!fs11__default.existsSync(sessionsDir)) return [];
1683
+ const sessionsDir = path23__default.join(projectDir, ".skaile", "sessions");
1684
+ if (!fs9__default.existsSync(sessionsDir)) return [];
1640
1685
  try {
1641
- return fs11__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
1686
+ return fs9__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
1642
1687
  } catch {
1643
1688
  return [];
1644
1689
  }
@@ -1777,7 +1822,7 @@ function printResolvedPathsSection(config) {
1777
1822
  console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
1778
1823
  }
1779
1824
  async function showConfig(opts) {
1780
- const projectDir = opts.projectDir ? path25__default.resolve(opts.projectDir) : process.cwd();
1825
+ const projectDir = opts.projectDir ? path23__default.resolve(opts.projectDir) : process.cwd();
1781
1826
  let config;
1782
1827
  let wsDefaults;
1783
1828
  try {
@@ -1822,13 +1867,13 @@ function makeConfigCommand() {
1822
1867
  const cmd = new Command("config").description("Manage personal config (.skaile/settings.json)");
1823
1868
  cmd.command("show").description("Show effective config with sources").option("--project-dir <path>", "Project directory").action((opts) => showConfig(opts));
1824
1869
  cmd.command("get <key>").description("Get an effective config value").option("--project-dir <path>", "Project directory").action(async (key, opts) => {
1825
- const projectDir = opts.projectDir ? path25__default.resolve(opts.projectDir) : process.cwd();
1870
+ const projectDir = opts.projectDir ? path23__default.resolve(opts.projectDir) : process.cwd();
1826
1871
  const config = await resolveSettings(projectDir);
1827
1872
  const value = config[key];
1828
1873
  console.log(value ?? S.dim("(not set)"));
1829
1874
  });
1830
1875
  cmd.command("set <key> <value>").description("Set a personal config value (driver, model, apiKey.<provider>)").option("--project-dir <path>", "Project directory").option("--global", "Write to ~/.skaile/settings.json instead of project-local").action(async (key, value, opts) => {
1831
- const projectDir = opts.projectDir ? path25__default.resolve(opts.projectDir) : process.cwd();
1876
+ const projectDir = opts.projectDir ? path23__default.resolve(opts.projectDir) : process.cwd();
1832
1877
  if (key === "provider" || key === "cloud" || key === "cloudConfig") {
1833
1878
  logErr(
1834
1879
  `'${key}' is no longer a setting \u2014 an endpoint is an AI provider registry entry and a session selects one with a model reference.
@@ -2168,8 +2213,8 @@ function makeConnectorCommand() {
2168
2213
  async (driver, opts) => {
2169
2214
  const { installNpmPackages } = await import('../connectors/index.js');
2170
2215
  const { scanDirectory: scanDirectory2, factoryAssetRoots: factoryAssetRoots2, WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
2171
- const projectDir = path25__default.resolve(opts.projectDir);
2172
- const yamlPath = path25__default.join(projectDir, "skaile.yaml");
2216
+ const projectDir = path23__default.resolve(opts.projectDir);
2217
+ const yamlPath = path23__default.join(projectDir, "skaile.yaml");
2173
2218
  if (!existsSync(yamlPath)) {
2174
2219
  logErr("No skaile.yaml found in current directory. Run 'skaile init' first.");
2175
2220
  process.exit(1);
@@ -2229,8 +2274,8 @@ ${installResult.output}`);
2229
2274
  );
2230
2275
  cmd.command("remove <id>").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Remove a connector from skaile.yaml by its instance ID").action(async (id, opts) => {
2231
2276
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
2232
- const projectDir = path25__default.resolve(opts.projectDir);
2233
- const yamlPath = path25__default.join(projectDir, "skaile.yaml");
2277
+ const projectDir = path23__default.resolve(opts.projectDir);
2278
+ const yamlPath = path23__default.join(projectDir, "skaile.yaml");
2234
2279
  if (!existsSync(yamlPath)) {
2235
2280
  logErr("No skaile.yaml found in current directory.");
2236
2281
  process.exit(1);
@@ -2247,7 +2292,7 @@ ${installResult.output}`);
2247
2292
  cmd.command("status [id]").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Connect and report health status for one or all connectors").action(async (id, opts) => {
2248
2293
  const res = await import('../connectors/index.js');
2249
2294
  res.registerBuiltinConnectors();
2250
- const projectDir = path25__default.resolve(opts.projectDir);
2295
+ const projectDir = path23__default.resolve(opts.projectDir);
2251
2296
  const declarations = res.loadConnectorDeclarations(projectDir);
2252
2297
  if (declarations.length === 0) {
2253
2298
  console.log("No connectors configured in skaile.yaml.");
@@ -2271,7 +2316,7 @@ ${installResult.output}`);
2271
2316
  await manager.disconnectAll();
2272
2317
  });
2273
2318
  cmd.command("list").description("List all configured connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (opts) => {
2274
- const projectDir = path25__default.resolve(opts.projectDir);
2319
+ const projectDir = path23__default.resolve(opts.projectDir);
2275
2320
  const manager = await connectConnectors(projectDir);
2276
2321
  try {
2277
2322
  console.log(JSON.stringify(manager.listConnectors(), null, 2));
@@ -2280,7 +2325,7 @@ ${installResult.output}`);
2280
2325
  }
2281
2326
  });
2282
2327
  cmd.command("sync [id]").description("Re-sync a filesystem-face connector or all of them (git pull, S3 refresh, etc.)").option("--all", "Sync all connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, opts) => {
2283
- const projectDir = path25__default.resolve(opts.projectDir);
2328
+ const projectDir = path23__default.resolve(opts.projectDir);
2284
2329
  const manager = await connectConnectors(projectDir);
2285
2330
  try {
2286
2331
  if (opts.all) {
@@ -2304,7 +2349,7 @@ ${installResult.output}`);
2304
2349
  }
2305
2350
  });
2306
2351
  cmd.command("ops <id>").description("List available operations for a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, opts) => {
2307
- const projectDir = path25__default.resolve(opts.projectDir);
2352
+ const projectDir = path23__default.resolve(opts.projectDir);
2308
2353
  const manager = await connectConnectors(projectDir);
2309
2354
  try {
2310
2355
  if (!manager.has(id)) {
@@ -2319,7 +2364,7 @@ ${installResult.output}`);
2319
2364
  }
2320
2365
  });
2321
2366
  cmd.command("read <id> <resource-path>").description("Read content from a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, opts) => {
2322
- const projectDir = path25__default.resolve(opts.projectDir);
2367
+ const projectDir = path23__default.resolve(opts.projectDir);
2323
2368
  const manager = await connectConnectors(projectDir);
2324
2369
  try {
2325
2370
  const content = await manager.read(id, resourcePath);
@@ -2329,7 +2374,7 @@ ${installResult.output}`);
2329
2374
  }
2330
2375
  });
2331
2376
  cmd.command("write <id> <resource-path> <content>").description("Write content to a connector at a path").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, content, opts) => {
2332
- const projectDir = path25__default.resolve(opts.projectDir);
2377
+ const projectDir = path23__default.resolve(opts.projectDir);
2333
2378
  const manager = await connectConnectors(projectDir);
2334
2379
  try {
2335
2380
  await manager.write(id, resourcePath, { data: content });
@@ -2339,7 +2384,7 @@ ${installResult.output}`);
2339
2384
  }
2340
2385
  });
2341
2386
  cmd.command("entries <id> [resource-path]").description("List entries in a connector (files, keys, rows, etc)").option("--project-dir <path>", "Workspace directory", process.cwd()).option("--recursive", "Include nested entries").option("--limit <n>", "Maximum entries to return", parsePositiveIntOption).action(async (id, resourcePath, opts) => {
2342
- const projectDir = path25__default.resolve(opts.projectDir);
2387
+ const projectDir = path23__default.resolve(opts.projectDir);
2343
2388
  const manager = await connectConnectors(projectDir);
2344
2389
  try {
2345
2390
  const entries = await manager.list(id, resourcePath, {
@@ -2352,7 +2397,7 @@ ${installResult.output}`);
2352
2397
  }
2353
2398
  });
2354
2399
  cmd.command("search <id> <query>").description("Search within a connector for matching content").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, query, opts) => {
2355
- const projectDir = path25__default.resolve(opts.projectDir);
2400
+ const projectDir = path23__default.resolve(opts.projectDir);
2356
2401
  const manager = await connectConnectors(projectDir);
2357
2402
  try {
2358
2403
  const results = await manager.search(id, query);
@@ -2362,7 +2407,7 @@ ${installResult.output}`);
2362
2407
  }
2363
2408
  });
2364
2409
  cmd.command("delete <id> <resource-path>").description("Delete an entry from a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, opts) => {
2365
- const projectDir = path25__default.resolve(opts.projectDir);
2410
+ const projectDir = path23__default.resolve(opts.projectDir);
2366
2411
  const manager = await connectConnectors(projectDir);
2367
2412
  try {
2368
2413
  const ok = await manager.delete(id, resourcePath);
@@ -2372,7 +2417,7 @@ ${installResult.output}`);
2372
2417
  }
2373
2418
  });
2374
2419
  cmd.command("run <id> <op> [args...]").description("Run a custom adapter operation (e.g. git log, sqlite query)").option("--project-dir <path>", "Workspace directory", process.cwd()).allowUnknownOption().action(async (id, op, args, opts) => {
2375
- const projectDir = path25__default.resolve(opts.projectDir);
2420
+ const projectDir = path23__default.resolve(opts.projectDir);
2376
2421
  const manager = await connectConnectors(projectDir);
2377
2422
  try {
2378
2423
  if (!manager.has(id)) {
@@ -2481,7 +2526,7 @@ function envRecord() {
2481
2526
  async function buildDeployContext(projectDir) {
2482
2527
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
2483
2528
  const config = resolveSkWorkspaceConfig2(projectDir);
2484
- const workspaceId = config.name ?? path25__default.basename(projectDir);
2529
+ const workspaceId = config.name ?? path23__default.basename(projectDir);
2485
2530
  let log;
2486
2531
  try {
2487
2532
  const { createLogger } = await import('../core/logging.js');
@@ -2513,13 +2558,13 @@ async function ensureTargetsRegistered(projectDir) {
2513
2558
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
2514
2559
  const config = resolveSkWorkspaceConfig2(projectDir);
2515
2560
  if (config.plugins && config.plugins.length > 0) {
2516
- const { ensurePluginsLoaded } = await import('../plugin-store-66QFBNEO.js');
2561
+ const { ensurePluginsLoaded } = await import('../plugin-store-WI4MZJLP.js');
2517
2562
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
2518
2563
  for (const f of result.failed) logWarn(f.error);
2519
2564
  }
2520
2565
  }
2521
2566
  async function runUp(opts) {
2522
- const projectDir = path25__default.resolve(opts.projectDir);
2567
+ const projectDir = path23__default.resolve(opts.projectDir);
2523
2568
  await ensureTargetsRegistered(projectDir);
2524
2569
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
2525
2570
  const { resolveDeployTarget, pluginRegistry } = await import('../plugin-registry/index.js');
@@ -2587,7 +2632,7 @@ async function restoreFromHandle(projectDir) {
2587
2632
  return { target, handle, ctx };
2588
2633
  }
2589
2634
  async function runDown(opts) {
2590
- const projectDir = path25__default.resolve(opts.projectDir);
2635
+ const projectDir = path23__default.resolve(opts.projectDir);
2591
2636
  const restored = await restoreFromHandle(projectDir);
2592
2637
  if (!restored) return;
2593
2638
  await restored.handle.stop();
@@ -2596,7 +2641,7 @@ async function runDown(opts) {
2596
2641
  logOk(`Stopped ${S.cmd(restored.target.id)} and cleared the handle.`);
2597
2642
  }
2598
2643
  async function runStatus(opts) {
2599
- const projectDir = path25__default.resolve(opts.projectDir);
2644
+ const projectDir = path23__default.resolve(opts.projectDir);
2600
2645
  const restored = await restoreFromHandle(projectDir);
2601
2646
  if (!restored) return;
2602
2647
  const health = await restored.handle.health();
@@ -2610,7 +2655,7 @@ async function runStatus(opts) {
2610
2655
  console.log();
2611
2656
  }
2612
2657
  async function runLogs(opts) {
2613
- const projectDir = path25__default.resolve(opts.projectDir);
2658
+ const projectDir = path23__default.resolve(opts.projectDir);
2614
2659
  const restored = await restoreFromHandle(projectDir);
2615
2660
  if (!restored) return;
2616
2661
  if (!restored.handle.logs) {
@@ -2636,7 +2681,7 @@ function makeDiffCommand() {
2636
2681
  return new Command("diff").description("Show changes between deployed and source versions").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
2637
2682
  const am2 = new AssetManager({
2638
2683
  registry: getKindRegistry(),
2639
- projectDir: path25__default.resolve(opts.projectDir)
2684
+ projectDir: path23__default.resolve(opts.projectDir)
2640
2685
  });
2641
2686
  const result = await am2.diff(ref);
2642
2687
  switch (result.status) {
@@ -2659,7 +2704,7 @@ function makeDiffCommand() {
2659
2704
  function makeFlowCommand() {
2660
2705
  const cmd = new Command("flow").description("Manage flows");
2661
2706
  cmd.command("list").description("List available flows").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
2662
- const flows = await discoverFlowsWithLibraries(path25__default.resolve(opts.projectDir));
2707
+ const flows = await discoverFlowsWithLibraries(path23__default.resolve(opts.projectDir));
2663
2708
  if (flows.length === 0) {
2664
2709
  logInfo("No flows found.");
2665
2710
  return;
@@ -2674,7 +2719,7 @@ function makeFlowCommand() {
2674
2719
  console.log();
2675
2720
  });
2676
2721
  cmd.command("show <id>").description("Show flow details and node graph").option("--project-dir <path>", "Project directory", process.cwd()).action(async (id, opts) => {
2677
- const flows = await discoverFlowsWithLibraries(path25__default.resolve(opts.projectDir));
2722
+ const flows = await discoverFlowsWithLibraries(path23__default.resolve(opts.projectDir));
2678
2723
  const flow = flows.find((f) => f.id === id);
2679
2724
  if (!flow) {
2680
2725
  logErr(`Flow not found: ${id}`);
@@ -2708,7 +2753,7 @@ function makeHistoryCommand() {
2708
2753
  cmd.argument("[limit]", "Number of entries to show", "20").option("--project-dir <path>", "Project directory", process.cwd()).action((limitStr, opts) => {
2709
2754
  const am2 = new AssetManager({
2710
2755
  registry: getKindRegistry(),
2711
- projectDir: path25__default.resolve(opts.projectDir)
2756
+ projectDir: path23__default.resolve(opts.projectDir)
2712
2757
  });
2713
2758
  const limit = parseInt(limitStr, 10) || 20;
2714
2759
  const entries = am2.history(limit);
@@ -2731,7 +2776,7 @@ function makeHistoryCommand() {
2731
2776
  cmd.command("clear").description("Clear action history").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
2732
2777
  const am2 = new AssetManager({
2733
2778
  registry: getKindRegistry(),
2734
- projectDir: path25__default.resolve(opts.projectDir)
2779
+ projectDir: path23__default.resolve(opts.projectDir)
2735
2780
  });
2736
2781
  am2.clearHistory();
2737
2782
  logOk("History cleared.");
@@ -2745,7 +2790,7 @@ var MCP_SERVER_ENTRY = {
2745
2790
  env: {}
2746
2791
  };
2747
2792
  function pluginDir(projectDir) {
2748
- return path25__default.join(projectDir, ".claude", "plugins", "skaile");
2793
+ return path23__default.join(projectDir, ".claude", "plugins", "skaile");
2749
2794
  }
2750
2795
  async function readJsonStrict(p6) {
2751
2796
  let raw;
@@ -2763,7 +2808,7 @@ async function readJsonStrict(p6) {
2763
2808
  }
2764
2809
  }
2765
2810
  async function writeJson(p6, value) {
2766
- await fs6.mkdir(path25__default.dirname(p6), { recursive: true });
2811
+ await fs6.mkdir(path23__default.dirname(p6), { recursive: true });
2767
2812
  await fs6.writeFile(p6, `${JSON.stringify(value, null, 2)}
2768
2813
  `);
2769
2814
  }
@@ -2771,8 +2816,8 @@ async function copyDir(src, dest) {
2771
2816
  await fs6.mkdir(dest, { recursive: true });
2772
2817
  const entries = await fs6.readdir(src, { withFileTypes: true });
2773
2818
  for (const entry of entries) {
2774
- const srcPath = path25__default.join(src, entry.name);
2775
- const destPath = path25__default.join(dest, entry.name);
2819
+ const srcPath = path23__default.join(src, entry.name);
2820
+ const destPath = path23__default.join(dest, entry.name);
2776
2821
  if (entry.isDirectory()) await copyDir(srcPath, destPath);
2777
2822
  else await fs6.copyFile(srcPath, destPath);
2778
2823
  }
@@ -2781,14 +2826,14 @@ async function install(projectDir, opts) {
2781
2826
  return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);
2782
2827
  }
2783
2828
  async function installMcp(projectDir) {
2784
- const mcpPath = path25__default.join(projectDir, ".claude", "mcp.json");
2829
+ const mcpPath = path23__default.join(projectDir, ".claude", "mcp.json");
2785
2830
  const existing = await readJsonStrict(mcpPath) ?? {};
2786
2831
  const mcpServers = { ...existing.mcpServers ?? {} };
2787
2832
  const previous = mcpServers[SKAILE_MCP_NAME];
2788
2833
  const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);
2789
2834
  let warning;
2790
2835
  if (previous && !matches) {
2791
- warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path25__default.relative(projectDir, mcpPath)}`;
2836
+ warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path23__default.relative(projectDir, mcpPath)}`;
2792
2837
  }
2793
2838
  mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;
2794
2839
  await writeJson(mcpPath, { ...existing, mcpServers });
@@ -2797,15 +2842,15 @@ async function installMcp(projectDir) {
2797
2842
  async function installFullPlugin(projectDir) {
2798
2843
  const dir = pluginDir(projectDir);
2799
2844
  for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {
2800
- const dest = path25__default.join(dir, rel);
2801
- await fs6.mkdir(path25__default.dirname(dest), { recursive: true });
2845
+ const dest = path23__default.join(dir, rel);
2846
+ await fs6.mkdir(path23__default.dirname(dest), { recursive: true });
2802
2847
  await fs6.writeFile(dest, content);
2803
2848
  }
2804
- const projectSkillsDir = path25__default.join(projectDir, ".skaile", "skills");
2849
+ const projectSkillsDir = path23__default.join(projectDir, ".skaile", "skills");
2805
2850
  if (existsSync(projectSkillsDir)) {
2806
- await copyDir(projectSkillsDir, path25__default.join(dir, "skills"));
2851
+ await copyDir(projectSkillsDir, path23__default.join(dir, "skills"));
2807
2852
  }
2808
- const settingsPath = path25__default.join(projectDir, ".claude", "settings.json");
2853
+ const settingsPath = path23__default.join(projectDir, ".claude", "settings.json");
2809
2854
  const settings = await readJsonStrict(settingsPath) ?? {};
2810
2855
  const plugins = settings.plugins ?? [];
2811
2856
  if (!plugins.includes(dir)) plugins.push(dir);
@@ -2813,8 +2858,8 @@ async function installFullPlugin(projectDir) {
2813
2858
  return { changed: true, method: "plugin" };
2814
2859
  }
2815
2860
  async function uninstall(projectDir) {
2816
- const settingsPath = path25__default.join(projectDir, ".claude", "settings.json");
2817
- const mcpPath = path25__default.join(projectDir, ".claude", "mcp.json");
2861
+ const settingsPath = path23__default.join(projectDir, ".claude", "settings.json");
2862
+ const mcpPath = path23__default.join(projectDir, ".claude", "mcp.json");
2818
2863
  const dir = pluginDir(projectDir);
2819
2864
  let changed = false;
2820
2865
  const settings = await readJsonStrict(settingsPath);
@@ -2848,12 +2893,12 @@ async function uninstall(projectDir) {
2848
2893
  async function detectInstall(projectDir) {
2849
2894
  const dir = pluginDir(projectDir);
2850
2895
  const settings = await readJsonStrict(
2851
- path25__default.join(projectDir, ".claude", "settings.json")
2896
+ path23__default.join(projectDir, ".claude", "settings.json")
2852
2897
  );
2853
- if (existsSync(path25__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
2898
+ if (existsSync(path23__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
2854
2899
  return { method: "plugin", pluginPath: dir };
2855
2900
  }
2856
- const mcp = await readJsonStrict(path25__default.join(projectDir, ".claude", "mcp.json"));
2901
+ const mcp = await readJsonStrict(path23__default.join(projectDir, ".claude", "mcp.json"));
2857
2902
  if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {
2858
2903
  return { method: "mcp" };
2859
2904
  }
@@ -2862,7 +2907,7 @@ async function detectInstall(projectDir) {
2862
2907
  async function enable(projectDir) {
2863
2908
  const detected = await detectInstall(projectDir);
2864
2909
  if (!detected) throw new Error("plugin not installed for claude-code");
2865
- const settingsPath = path25__default.join(projectDir, ".claude", "settings.json");
2910
+ const settingsPath = path23__default.join(projectDir, ".claude", "settings.json");
2866
2911
  const settings = await readJsonStrict(settingsPath) ?? {};
2867
2912
  if (detected.method === "plugin") {
2868
2913
  const disabled2 = settings.disabledPlugins ?? [];
@@ -2884,7 +2929,7 @@ async function enable(projectDir) {
2884
2929
  async function disable(projectDir) {
2885
2930
  const detected = await detectInstall(projectDir);
2886
2931
  if (!detected) throw new Error("plugin not installed for claude-code");
2887
- const settingsPath = path25__default.join(projectDir, ".claude", "settings.json");
2932
+ const settingsPath = path23__default.join(projectDir, ".claude", "settings.json");
2888
2933
  const settings = await readJsonStrict(settingsPath) ?? {};
2889
2934
  if (detected.method === "plugin") {
2890
2935
  const list2 = settings.disabledPlugins ?? [];
@@ -2904,12 +2949,12 @@ async function disable(projectDir) {
2904
2949
  return { changed: true };
2905
2950
  }
2906
2951
  async function status(projectDir) {
2907
- const settingsPath = path25__default.join(projectDir, ".claude", "settings.json");
2908
- const mcpPath = path25__default.join(projectDir, ".claude", "mcp.json");
2952
+ const settingsPath = path23__default.join(projectDir, ".claude", "settings.json");
2953
+ const mcpPath = path23__default.join(projectDir, ".claude", "mcp.json");
2909
2954
  const dir = pluginDir(projectDir);
2910
2955
  const settings = await readJsonStrict(settingsPath);
2911
2956
  const mcp = await readJsonStrict(mcpPath);
2912
- const pluginInstalled = !!(existsSync(path25__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
2957
+ const pluginInstalled = !!(existsSync(path23__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
2913
2958
  const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);
2914
2959
  if (!pluginInstalled && !mcpInstalled) {
2915
2960
  return {
@@ -2927,7 +2972,7 @@ async function status(projectDir) {
2927
2972
  installed: "yes",
2928
2973
  enabled: disabled2 ? "no" : "yes",
2929
2974
  method: "plugin",
2930
- location: path25__default.relative(projectDir, dir)
2975
+ location: path23__default.relative(projectDir, dir)
2931
2976
  };
2932
2977
  }
2933
2978
  const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;
@@ -2936,7 +2981,7 @@ async function status(projectDir) {
2936
2981
  installed: "yes",
2937
2982
  enabled: disabled ? "no" : "yes",
2938
2983
  method: "mcp",
2939
- location: path25__default.relative(projectDir, mcpPath)
2984
+ location: path23__default.relative(projectDir, mcpPath)
2940
2985
  };
2941
2986
  }
2942
2987
  var SKAILE_MCP_NAME2 = "skaile-workspace";
@@ -2963,7 +3008,7 @@ async function readConfig(p6) {
2963
3008
  }
2964
3009
  }
2965
3010
  async function writeConfig(p6, value) {
2966
- await fs6.mkdir(path25__default.dirname(p6), { recursive: true });
3011
+ await fs6.mkdir(path23__default.dirname(p6), { recursive: true });
2967
3012
  const cleaned = {};
2968
3013
  for (const [k, v] of Object.entries(value)) {
2969
3014
  if (v === void 0) continue;
@@ -2972,7 +3017,7 @@ async function writeConfig(p6, value) {
2972
3017
  await fs6.writeFile(p6, stringify$1(cleaned));
2973
3018
  }
2974
3019
  function configPath(projectDir) {
2975
- return path25__default.join(projectDir, ".codex", "config.toml");
3020
+ return path23__default.join(projectDir, ".codex", "config.toml");
2976
3021
  }
2977
3022
  async function install2(projectDir) {
2978
3023
  const p6 = configPath(projectDir);
@@ -2983,7 +3028,7 @@ async function install2(projectDir) {
2983
3028
  const matches = previous && JSON.stringify(previous) === JSON.stringify(next);
2984
3029
  let warning;
2985
3030
  if (previous && !matches) {
2986
- warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path25__default.relative(projectDir, p6)}`;
3031
+ warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path23__default.relative(projectDir, p6)}`;
2987
3032
  }
2988
3033
  if (matches) return { changed: false, method: "toml" };
2989
3034
  servers[SKAILE_MCP_NAME2] = next;
@@ -3024,12 +3069,12 @@ async function status2(projectDir) {
3024
3069
  installed: "yes",
3025
3070
  enabled: "n/a",
3026
3071
  method: "mcp",
3027
- location: path25__default.relative(projectDir, p6)
3072
+ location: path23__default.relative(projectDir, p6)
3028
3073
  };
3029
3074
  }
3030
3075
  async function install3(projectDir) {
3031
- const extDir = path25__default.join(projectDir, ".omp", "extensions");
3032
- const extPath = path25__default.join(extDir, "skaile.ts");
3076
+ const extDir = path23__default.join(projectDir, ".omp", "extensions");
3077
+ const extPath = path23__default.join(extDir, "skaile.ts");
3033
3078
  await fs6.mkdir(extDir, { recursive: true });
3034
3079
  const { WorkspacePlugin } = await import('../workspace-plugin/index.js');
3035
3080
  const plugin = new WorkspacePlugin({ projectDir });
@@ -3044,7 +3089,7 @@ async function install3(projectDir) {
3044
3089
  return { changed: true, method: "generated" };
3045
3090
  }
3046
3091
  async function uninstall3(projectDir) {
3047
- const extPath = path25__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3092
+ const extPath = path23__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3048
3093
  try {
3049
3094
  await fs6.unlink(extPath);
3050
3095
  return { changed: true };
@@ -3053,14 +3098,14 @@ async function uninstall3(projectDir) {
3053
3098
  }
3054
3099
  }
3055
3100
  async function status3(projectDir) {
3056
- const extPath = path25__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3101
+ const extPath = path23__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3057
3102
  if (existsSync(extPath)) {
3058
3103
  return {
3059
3104
  harness: "omp",
3060
3105
  installed: "yes",
3061
3106
  enabled: "n/a",
3062
3107
  method: "extension",
3063
- location: path25__default.relative(projectDir, extPath)
3108
+ location: path23__default.relative(projectDir, extPath)
3064
3109
  };
3065
3110
  }
3066
3111
  return {
@@ -3123,7 +3168,7 @@ async function installCodex(projectDir) {
3123
3168
  console.log(` ${S.dim("\u2192")} Restart Codex CLI to pick up the change.`);
3124
3169
  }
3125
3170
  async function runInstall(opts) {
3126
- const projectDir = path25__default.resolve(opts.projectDir);
3171
+ const projectDir = path23__default.resolve(opts.projectDir);
3127
3172
  const targets = resolveDriver(opts.driver);
3128
3173
  let exitCode = 0;
3129
3174
  if (targets.includes("claude-code")) {
@@ -3157,7 +3202,7 @@ async function uninstallCodex(projectDir) {
3157
3202
  else logInfo(`codex: not installed`);
3158
3203
  }
3159
3204
  async function runUninstall(opts) {
3160
- const projectDir = path25__default.resolve(opts.projectDir);
3205
+ const projectDir = path23__default.resolve(opts.projectDir);
3161
3206
  const targets = resolveDriver(opts.driver);
3162
3207
  let exitCode = 0;
3163
3208
  if (targets.includes("claude-code")) {
@@ -3200,7 +3245,7 @@ async function toggleTarget(t, projectDir, action3) {
3200
3245
  });
3201
3246
  }
3202
3247
  async function runToggle(opts, action3) {
3203
- const projectDir = path25__default.resolve(opts.projectDir);
3248
+ const projectDir = path23__default.resolve(opts.projectDir);
3204
3249
  const requestedAll = opts.driver === "all";
3205
3250
  const targets = resolveDriver(opts.driver);
3206
3251
  const usageError = checkToggleSupported(targets, requestedAll, action3);
@@ -3212,7 +3257,7 @@ async function runToggle(opts, action3) {
3212
3257
  return exitCode;
3213
3258
  }
3214
3259
  async function runStatus2(opts) {
3215
- const projectDir = path25__default.resolve(opts.projectDir);
3260
+ const projectDir = path23__default.resolve(opts.projectDir);
3216
3261
  const targets = resolveDriver(opts.driver);
3217
3262
  const rows = [];
3218
3263
  let exitCode = 0;
@@ -3283,7 +3328,7 @@ async function runHook(event) {
3283
3328
  await plugin.shutdown();
3284
3329
  return;
3285
3330
  }
3286
- const store = new PluginStore(path25__default.join(projectDir, ".skaile", "plugin-state.json"));
3331
+ const store = new PluginStore(path23__default.join(projectDir, ".skaile", "plugin-state.json"));
3287
3332
  await store.load();
3288
3333
  const status4 = store.get("connector:status");
3289
3334
  if (status4 && typeof status4 === "object" && Object.keys(status4).length > 0) {
@@ -3347,6 +3392,25 @@ function exitOnSyncError(err2) {
3347
3392
  logErr(err2 instanceof Error ? err2.message : String(err2));
3348
3393
  process.exit(1);
3349
3394
  }
3395
+ var UNFINISHED_GIT_ENTRIES = {
3396
+ MERGE_HEAD: "a merge in progress",
3397
+ REBASE_HEAD: "a rebase in progress",
3398
+ "rebase-merge": "a rebase in progress",
3399
+ "rebase-apply": "a rebase in progress",
3400
+ CHERRY_PICK_HEAD: "a cherry-pick in progress",
3401
+ REVERT_HEAD: "a revert in progress"
3402
+ };
3403
+ function unfinishedGitState(dir) {
3404
+ const unmerged = spawnSync("git", ["ls-files", "-u"], { cwd: dir, encoding: "utf-8" });
3405
+ if (unmerged.status !== 0) return "the git index could not be read";
3406
+ if (unmerged.stdout.trim() !== "") return "unmerged files";
3407
+ for (const [entry, state2] of Object.entries(UNFINISHED_GIT_ENTRIES)) {
3408
+ const p6 = spawnSync("git", ["rev-parse", "--git-path", entry], { cwd: dir, encoding: "utf-8" });
3409
+ if (p6.status !== 0) return "the git directory could not be read";
3410
+ if (fs9.existsSync(path23.resolve(dir, p6.stdout.trim()))) return state2;
3411
+ }
3412
+ return null;
3413
+ }
3350
3414
  function assertManifestEditableOrExit(libraryPath) {
3351
3415
  try {
3352
3416
  assertManifestEditable(libraryPath);
@@ -3356,18 +3420,18 @@ function assertManifestEditableOrExit(libraryPath) {
3356
3420
  }
3357
3421
  async function assertLibraryPathFree(manager, dir, exceptId) {
3358
3422
  const clash = (await manager.listLibraries()).find(
3359
- (l) => l.id !== exceptId && path25.resolve(l.path) === dir
3423
+ (l) => l.id !== exceptId && path23.resolve(l.path) === dir
3360
3424
  );
3361
3425
  if (clash) throw new Error(`${dir} is already registered as library "${clash.name}".`);
3362
3426
  }
3363
3427
  function canonicalDir(dir) {
3364
- const abs = path25.resolve(dir);
3365
- return fs11.existsSync(abs) ? fs11.realpathSync(abs) : abs;
3428
+ const abs = path23.resolve(dir);
3429
+ return fs9.existsSync(abs) ? fs9.realpathSync(abs) : abs;
3366
3430
  }
3367
3431
  function refuseGlobalInstallFolder(name, dir) {
3368
3432
  const reserved = globalInstallDir();
3369
- const rel = path25.relative(canonicalDir(reserved), canonicalDir(dir));
3370
- const inside = rel === "" || !rel.startsWith("..") && !path25.isAbsolute(rel);
3433
+ const rel = path23.relative(canonicalDir(reserved), canonicalDir(dir));
3434
+ const inside = rel === "" || !rel.startsWith("..") && !path23.isAbsolute(rel);
3371
3435
  if (name === GLOBAL_INSTALL_DIR_NAME || inside) {
3372
3436
  logErr(
3373
3437
  `"${GLOBAL_INSTALL_DIR_NAME}" is reserved: ${reserved} holds assets from \`skaile install\`, not a library you author.`
@@ -3388,10 +3452,35 @@ function readOriginTracking(dir) {
3388
3452
  }
3389
3453
  function requireGitBackend(lib, verb) {
3390
3454
  if (lib.backend !== "git") {
3391
- logErr(`\`library ${verb}\` only applies to git-backed libraries.`);
3455
+ logErr(
3456
+ `\`library ${verb}\` only applies to git-backed libraries. Run \`skaile library link ${lib.name} <url>\` to attach a remote first.`
3457
+ );
3392
3458
  process.exit(1);
3393
3459
  }
3394
3460
  }
3461
+ function requireValidLibraryName(name) {
3462
+ try {
3463
+ assertValidLibraryName(name);
3464
+ } catch (err2) {
3465
+ exitOnSyncError(err2);
3466
+ }
3467
+ }
3468
+ var LOCAL_OWNERSHIP_REASON = "ownership only governs sync with a git remote, and a local library is always owned by you.";
3469
+ function pruneEmptyLibraryParents(libPath) {
3470
+ const root = canonicalDir(resolveLibraryDir());
3471
+ let dir = path23.dirname(path23.resolve(libPath));
3472
+ for (; ; ) {
3473
+ const rel = path23.relative(root, canonicalDir(dir));
3474
+ if (rel === "" || rel.startsWith("..") || path23.isAbsolute(rel)) return;
3475
+ if (!fs9.existsSync(dir) || fs9.readdirSync(dir).length > 0) return;
3476
+ fs9.rmdirSync(dir);
3477
+ dir = path23.dirname(dir);
3478
+ }
3479
+ }
3480
+ async function warnIfNotGithubRemote(name, url) {
3481
+ const { isGithubRemote, notGithubRemoteMessage } = await import('../library-publish-FGXF5TJO.js');
3482
+ if (!isGithubRemote(url)) logWarn(notGithubRemoteMessage(name, url));
3483
+ }
3395
3484
  function scaffoldLibraryFiles(dir, name) {
3396
3485
  const readme = `# ${name}
3397
3486
 
@@ -3421,9 +3510,9 @@ by the same ref.
3421
3510
  ];
3422
3511
  const written = [];
3423
3512
  for (const [file, content] of files) {
3424
- const target = path25.join(dir, file);
3425
- if (fs11.existsSync(target)) continue;
3426
- fs11.writeFileSync(target, content, "utf8");
3513
+ const target = path23.join(dir, file);
3514
+ if (fs9.existsSync(target)) continue;
3515
+ fs9.writeFileSync(target, content, "utf8");
3427
3516
  written.push(file);
3428
3517
  }
3429
3518
  return written;
@@ -3486,22 +3575,23 @@ function makeLibraryCommand() {
3486
3575
  });
3487
3576
  cmd.command("init <name>").description("Create (or adopt) a library \u2014 default location ~/.skaile/libraries/<name>").option("--git <url>", "Initialize as a git library tracking <url>").option("--path <dir>", "Register the library at <dir> (created if missing) instead").option("--owner", "Mark as owner (the default)").option("--contributor", "Mark as contributor (needs --git or an existing git clone)").option("--reader", "Mark as reader (needs --git or an existing git clone)").action(
3488
3577
  async (name, opts) => {
3578
+ requireValidLibraryName(name);
3489
3579
  const flagged = ["owner", "contributor", "reader"].filter((o) => opts[o]);
3490
3580
  if (flagged.length > 1) {
3491
3581
  logErr("Pick one of --owner, --contributor, --reader.");
3492
3582
  process.exit(1);
3493
3583
  }
3494
3584
  const ownership = flagged[0] ?? "owner";
3495
- const libPath = opts.path ? path25.resolve(opts.path) : path25.join(resolveLibraryDir(), name);
3585
+ const libPath = opts.path ? path23.resolve(opts.path) : path23.join(resolveLibraryDir(), name);
3496
3586
  refuseGlobalInstallFolder(name, libPath);
3497
- if (fs11.existsSync(libPath) && !fs11.statSync(libPath).isDirectory()) {
3587
+ if (fs9.existsSync(libPath) && !fs9.statSync(libPath).isDirectory()) {
3498
3588
  logErr(`${libPath} exists and is not a directory.`);
3499
3589
  process.exit(1);
3500
3590
  }
3501
3591
  const adopted = opts.git ? null : readOriginTracking(libPath);
3502
3592
  if (ownership !== "owner" && !opts.git && !adopted) {
3503
3593
  logErr(
3504
- `--${ownership} needs --git <url> or an existing git clone: ownership only governs sync with a git remote, and a local library is always owned by you.`
3594
+ `--${ownership} needs --git <url> or an existing git clone: ${LOCAL_OWNERSHIP_REASON}`
3505
3595
  );
3506
3596
  process.exit(1);
3507
3597
  }
@@ -3522,15 +3612,17 @@ function makeLibraryCommand() {
3522
3612
  `Could not clone ${opts.git}; initialised an empty repo with that origin instead. git said: ${reason}`
3523
3613
  );
3524
3614
  }
3615
+ await warnIfNotGithubRemote(name, opts.git);
3616
+ trackOriginBranch(libPath, branch);
3525
3617
  backend = "git";
3526
3618
  backendConfig = { url: opts.git, branch, authHint: "ssh" };
3527
3619
  } else if (adopted) {
3528
3620
  backend = "git";
3529
3621
  backendConfig = { url: adopted.url, branch: adopted.branch, authHint: "ssh" };
3530
3622
  } else {
3531
- fs11.mkdirSync(libPath, { recursive: true });
3623
+ fs9.mkdirSync(libPath, { recursive: true });
3532
3624
  }
3533
- const blank = fs11.readdirSync(libPath).every((entry) => entry === ".git");
3625
+ const blank = fs9.readdirSync(libPath).every((entry) => entry === ".git");
3534
3626
  const isDefault = !hasDefault && ownership !== "reader";
3535
3627
  await manager.addLibrary({
3536
3628
  name,
@@ -3557,6 +3649,13 @@ function makeLibraryCommand() {
3557
3649
  }
3558
3650
  if (!blank) {
3559
3651
  const lib = await manager.requireLibrary(name);
3652
+ const resolved = resolveLibraryPublisherDetailed(lib, {}, getStoreIdentity());
3653
+ if (resolved.source === "manifest" && !isValidPublisher(resolved.publisher)) {
3654
+ logWarn(
3655
+ `${SKAILE_MANIFEST_FILENAME} declares publisher "${resolved.publisher}": ${PUBLISHER_HINT}. Fix it with \`skaile library set ${name} publisher=<name>\`.`
3656
+ );
3657
+ }
3658
+ warnLibraryNameFallback(name, resolved);
3560
3659
  const res = await indexLibrary(lib, library);
3561
3660
  for (const e of res.errors) logWarn(e);
3562
3661
  logOk(`Indexed ${res.assetsUpdated} asset(s) from ${name}.`);
@@ -3580,29 +3679,42 @@ function makeLibraryCommand() {
3580
3679
  process.exit(1);
3581
3680
  }
3582
3681
  ensureGitRepo(lib.path, url, opts.branch);
3682
+ trackOriginBranch(lib.path, opts.branch, { fetch: true });
3583
3683
  await manager.updateLibrary(name, {
3584
3684
  backend: "git",
3585
3685
  backendConfig: { url, branch: opts.branch, authHint: "ssh" }
3586
3686
  });
3587
3687
  logOk(`Library "${name}" linked to ${url}.`);
3688
+ await warnIfNotGithubRemote(name, url);
3588
3689
  } catch (err2) {
3589
3690
  exitOnSyncError(err2);
3590
3691
  } finally {
3591
3692
  close();
3592
3693
  }
3593
3694
  });
3594
- cmd.command("create <kind> <name>").description("Scaffold a new asset inside the default (or named) library").addOption(
3595
- new Option("--kind <kind>", "Asset kind override").choices(getKindRegistry().getAllKinds())
3596
- ).option("--library <name>", "Target library (default: the default-marked one)").option("--dir <dir>", "Target directory inside the library (default: library root)").option("--publisher <name>", "Publisher for the new asset (default: the library's default)").option(
3695
+ cmd.command("create <kind> <name>").description("Scaffold a new asset inside the default (or named) library").addOption(new Option("--kind <kind>", "Asset kind override").choices([...SCAFFOLD_KINDS])).addOption(removedDomainOption()).option("--library <name>", "Target library (default: the default-marked one)").option("--dir <dir>", "Target directory inside the library (default: library root)").option("--publisher <name>", "Publisher for the new asset (default: the library's default)").option(
3597
3696
  "--description <text>",
3598
3697
  "Description for the asset's frontmatter \u2014 say what it does and when to use it (default: a TODO placeholder `skaile validate` rejects)"
3599
3698
  ).action(
3600
3699
  async (kind, name, opts) => {
3601
- const registeredKinds = getKindRegistry().getAllKinds();
3602
- if (!registeredKinds.includes(kind)) {
3603
- logErr(`Unknown asset kind "${kind}". Expected: ${registeredKinds.join(", ")}.`);
3700
+ rejectRemovedDomainOption(opts);
3701
+ for (const k of [kind, opts.kind]) {
3702
+ if (k !== void 0 && !SCAFFOLD_KINDS.includes(k)) {
3703
+ logErr(`Cannot scaffold kind "${k}". Expected: ${SCAFFOLD_KINDS.join(", ")}.`);
3704
+ process.exit(1);
3705
+ }
3706
+ }
3707
+ if (!isValidAssetName(name)) {
3708
+ logErr(`Invalid asset name "${name}": ${ASSET_NAME_HINT}.`);
3604
3709
  process.exit(1);
3605
3710
  }
3711
+ if (opts.publisher !== void 0) {
3712
+ const bare = opts.publisher.trim().replace(/^@/, "");
3713
+ if (!isValidPublisher(bare)) {
3714
+ logErr(`Invalid publisher "${opts.publisher}": ${PUBLISHER_HINT}.`);
3715
+ process.exit(1);
3716
+ }
3717
+ }
3606
3718
  if (opts.description !== void 0) {
3607
3719
  const len = opts.description.trim().length;
3608
3720
  if (len === 0 || len > 1024) {
@@ -3616,7 +3728,13 @@ function makeLibraryCommand() {
3616
3728
  assertManifestEditableOrExit(target.path);
3617
3729
  const effectiveKind = opts.kind ?? kind;
3618
3730
  const am2 = new AssetManager({ registry: getKindRegistry(), projectDir: process.cwd() });
3619
- const destDir = opts.dir ? path25.join(target.path, opts.dir) : target.path;
3731
+ const libRoot = path23.resolve(target.path);
3732
+ const destDir = opts.dir ? path23.resolve(libRoot, opts.dir) : libRoot;
3733
+ const relDest = path23.relative(libRoot, destDir);
3734
+ if (relDest === ".." || relDest.startsWith(`..${path23.sep}`) || path23.isAbsolute(relDest)) {
3735
+ logErr(`--dir "${opts.dir}" must stay inside the library (${libRoot}).`);
3736
+ process.exit(1);
3737
+ }
3620
3738
  const res = am2.create(name, effectiveKind, destDir, { description: opts.description });
3621
3739
  if (!res.ok) {
3622
3740
  logErr(res.path);
@@ -3661,38 +3779,48 @@ function makeLibraryCommand() {
3661
3779
  close();
3662
3780
  }
3663
3781
  });
3782
+ async function renameLibrary(manager, lib, newName) {
3783
+ requireValidLibraryName(newName);
3784
+ if (await manager.getLibrary(newName)) {
3785
+ logErr(`A library named "${newName}" is already registered.`);
3786
+ process.exit(1);
3787
+ }
3788
+ const newPath = path23.join(path23.dirname(lib.path), newName);
3789
+ refuseGlobalInstallFolder(newName, newPath);
3790
+ if (fs9.existsSync(newPath)) {
3791
+ logErr(`Target directory already exists: ${newPath}`);
3792
+ process.exit(1);
3793
+ }
3794
+ fs9.renameSync(lib.path, newPath);
3795
+ await manager.updateLibrary(lib.id, { name: newName, path: newPath });
3796
+ logOk(`Renamed ${lib.name} \u2192 ${newName}`);
3797
+ }
3664
3798
  cmd.command("rename <old> <new>").description("Rename a library (also moves the directory)").action(async (oldName, newName) => {
3665
3799
  const { manager, close } = await openLibraryManager();
3666
3800
  try {
3667
- const lib = await manager.requireLibrary(oldName);
3668
- const parent = path25.dirname(lib.path);
3669
- const newPath = path25.join(parent, newName);
3670
- refuseGlobalInstallFolder(newName, newPath);
3671
- if (fs11.existsSync(newPath)) {
3672
- logErr(`Target directory already exists: ${newPath}`);
3673
- process.exit(1);
3674
- }
3675
- fs11.renameSync(lib.path, newPath);
3676
- await manager.updateLibrary(lib.id, { name: newName, path: newPath });
3677
- logOk(`Renamed ${oldName} \u2192 ${newName}`);
3801
+ await renameLibrary(manager, await manager.requireLibrary(oldName), newName);
3802
+ } catch (err2) {
3803
+ exitOnSyncError(err2);
3678
3804
  } finally {
3679
3805
  close();
3680
3806
  }
3681
3807
  });
3682
3808
  cmd.command("set <name> <field=value>").description(
3683
- "Update a single library field (ownership, isDefault, path, publisher, backendConfig.<key>)"
3809
+ "Update a single library field (name, ownership, isDefault, path, publisher, backendConfig.<key>)"
3684
3810
  ).action(async (name, expr) => {
3685
3811
  const [field, ...rest] = expr.split("=");
3812
+ if (field === "structure") {
3813
+ logErr(DOMAIN_REMOVED_HINT);
3814
+ process.exit(1);
3815
+ }
3686
3816
  const value = rest.join("=");
3687
3817
  const { manager, library, close } = await openLibraryManager();
3688
3818
  try {
3689
3819
  const lib = await manager.requireLibrary(name);
3690
3820
  if (field === "publisher") {
3691
3821
  const publisher = value.trim().replace(/^@/, "");
3692
- if (!/^[^\s/#@]+$/.test(publisher)) {
3693
- logErr(
3694
- `Invalid publisher "${value}": expected a bare name like "acme" (no @, /, # or spaces).`
3695
- );
3822
+ if (!isValidPublisher(publisher)) {
3823
+ logErr(`Invalid publisher "${value}": ${PUBLISHER_HINT}.`);
3696
3824
  process.exit(1);
3697
3825
  }
3698
3826
  if (lib.ownership === "reader") {
@@ -3709,11 +3837,42 @@ function makeLibraryCommand() {
3709
3837
  return;
3710
3838
  }
3711
3839
  const patch = {};
3712
- if (field === "ownership") patch.ownership = value;
3713
- else if (field === "isDefault") patch.isDefault = value === "true";
3714
- else if (field === "path") {
3715
- const dir = path25.resolve(value);
3716
- if (!fs11.existsSync(dir) || !fs11.statSync(dir).isDirectory()) {
3840
+ if (field === "name") {
3841
+ await renameLibrary(manager, lib, value);
3842
+ return;
3843
+ }
3844
+ if (field === "ownership") {
3845
+ if (!LIBRARY_OWNERSHIPS.includes(value)) {
3846
+ logErr(
3847
+ `Invalid ownership "${value}": expected one of ${LIBRARY_OWNERSHIPS.join(", ")}.`
3848
+ );
3849
+ process.exit(1);
3850
+ }
3851
+ if (value !== "owner" && lib.backend !== "git") {
3852
+ logErr(`ownership=${value} needs a git-backed library: ${LOCAL_OWNERSHIP_REASON}`);
3853
+ process.exit(1);
3854
+ }
3855
+ patch.ownership = value;
3856
+ } else if (field === "isDefault") {
3857
+ if (value !== "true" && value !== "false") {
3858
+ logErr(`Invalid isDefault "${value}": expected true or false.`);
3859
+ process.exit(1);
3860
+ }
3861
+ if (value === "true") {
3862
+ await manager.setDefault(lib.id);
3863
+ logOk(`Updated ${name}.isDefault`);
3864
+ return;
3865
+ }
3866
+ if (lib.isDefault) {
3867
+ logErr(
3868
+ `Library "${lib.name}" is the default; make another library the default with \`skaile library default <name>\` instead of unsetting it.`
3869
+ );
3870
+ process.exit(1);
3871
+ }
3872
+ patch.isDefault = false;
3873
+ } else if (field === "path") {
3874
+ const dir = path23.resolve(value);
3875
+ if (!fs9.existsSync(dir) || !fs9.statSync(dir).isDirectory()) {
3717
3876
  logErr(`Directory does not exist: ${dir}. \`library set path=\` does not move files.`);
3718
3877
  process.exit(1);
3719
3878
  }
@@ -3722,6 +3881,10 @@ function makeLibraryCommand() {
3722
3881
  patch.path = dir;
3723
3882
  } else if (field.startsWith("backendConfig.")) {
3724
3883
  const key = field.split(".")[1];
3884
+ if (key === "url" && lib.backend !== "git") {
3885
+ logErr("backendConfig.url only applies to git-backed libraries.");
3886
+ process.exit(1);
3887
+ }
3725
3888
  if (key === "url" && lib.backend === "git") {
3726
3889
  const branch = lib.backendConfig.branch ?? "main";
3727
3890
  ensureGitRepo(lib.path, value, branch);
@@ -3743,6 +3906,10 @@ function makeLibraryCommand() {
3743
3906
  }
3744
3907
  });
3745
3908
  cmd.command("remove <name>").description("Unregister a library (use --purge to also delete files)").option("--purge", "Also delete the library directory from disk", false).option("-y, --yes", "Skip confirmation", false).action(async (name, opts) => {
3909
+ if (!opts.yes && !process.stdin.isTTY) {
3910
+ logErr("library remove needs confirmation: pass -y");
3911
+ process.exit(1);
3912
+ }
3746
3913
  const { manager, close } = await openLibraryManager();
3747
3914
  try {
3748
3915
  if (!opts.yes) {
@@ -3755,8 +3922,12 @@ function makeLibraryCommand() {
3755
3922
  return;
3756
3923
  }
3757
3924
  }
3925
+ const lib = await manager.requireLibrary(name);
3758
3926
  await manager.removeLibrary(name, { purge: opts.purge });
3927
+ if (opts.purge) pruneEmptyLibraryParents(lib.path);
3759
3928
  logOk(`Removed ${name}.`);
3929
+ } catch (err2) {
3930
+ exitOnSyncError(err2);
3760
3931
  } finally {
3761
3932
  close();
3762
3933
  }
@@ -3768,6 +3939,7 @@ function makeLibraryCommand() {
3768
3939
  requireGitBackend(lib, "sync");
3769
3940
  const drv = manager.driverFor(lib.backend);
3770
3941
  const pull = await drv.pull(lib);
3942
+ if (pull.conflicts.length > 0) exitOnSyncError(new Error(pull.conflicts[0].reason));
3771
3943
  logInfo(`Pulled: applied=${pull.applied}, conflicts=${pull.conflicts.length}`);
3772
3944
  if (lib.ownership === "owner") {
3773
3945
  const push = await drv.push(lib);
@@ -3786,9 +3958,12 @@ function makeLibraryCommand() {
3786
3958
  try {
3787
3959
  const lib = await manager.requireLibrary(name);
3788
3960
  assertManifestEditableOrExit(lib.path);
3789
- const removed = await syncManifestWithDisk(
3961
+ const badRequires = manifestRequiresProblems(lib.path);
3962
+ const resolved = resolveLibraryPublisherDetailed(lib, {}, getStoreIdentity());
3963
+ warnLibraryNameFallback(name, resolved);
3964
+ const { removed, skipped } = await syncManifestWithDisk(
3790
3965
  lib.path,
3791
- resolveLibraryPublisher(lib, {}, getStoreIdentity()),
3966
+ resolved.publisher,
3792
3967
  getKindRegistry()
3793
3968
  );
3794
3969
  const manifest = loadSkPublishManifest(lib.path);
@@ -3796,13 +3971,35 @@ function makeLibraryCommand() {
3796
3971
  const ref = manifest ? assetEntryRef(a, manifest) : `${a.kind}:${a.name}`;
3797
3972
  logInfo(`Removed manifest entry ${ref} (root ${a.root} is gone)`);
3798
3973
  }
3799
- const res = await indexLibrary(lib, library);
3974
+ for (const s of skipped.filter((x) => x.reason === "invalid-version")) {
3975
+ logWarn(
3976
+ `${s.kind}:${s.name} skipped: ${s.detail}. Set a valid \`metadata.version\` (e.g. 0.1.0) and re-run \`skaile library index ${name}\`.`
3977
+ );
3978
+ }
3979
+ const skippedKeys = new Set(skipped.map((s) => `${s.kind}:${s.name}`));
3980
+ const res = await indexLibrary(lib, library, {
3981
+ exclude: (a) => skippedKeys.has(`${a.kind}:${a.name}`)
3982
+ });
3800
3983
  const unparsable = res.errors.filter((e) => e.includes("ManifestSchemaError:"));
3801
3984
  for (const e of res.errors) (unparsable.includes(e) ? logErr : logWarn)(e);
3985
+ const syncUnparsable = skipped.filter(
3986
+ (s) => s.reason === "unparsable" && !unparsable.some((e) => e.includes(s.file))
3987
+ );
3988
+ for (const s of syncUnparsable) {
3989
+ logErr(`${s.kind}:${s.name} skipped: manifest file ${s.file} could not be parsed.`);
3990
+ }
3991
+ for (const p6 of badRequires) logErr(`${p6.asset}: ${p6.message}`);
3802
3992
  logOk(`Indexed ${res.assetsUpdated} asset(s) from ${name}.`);
3803
3993
  warnIgnoredDomainFiles(lib.path);
3804
- if (unparsable.length > 0) {
3805
- logErr(`${unparsable.length} asset(s) skipped: manifest could not be parsed.`);
3994
+ const skippedUnparsable = unparsable.length + syncUnparsable.length;
3995
+ if (skippedUnparsable > 0) {
3996
+ logErr(`${skippedUnparsable} asset(s) skipped: manifest could not be parsed.`);
3997
+ process.exitCode = 1;
3998
+ }
3999
+ if (badRequires.length > 0) {
4000
+ logErr(
4001
+ `${badRequires.length} invalid requires entr${badRequires.length === 1 ? "y" : "ies"} ignored: use the \`kind:@<publisher>/name[#version]\` form.`
4002
+ );
3806
4003
  process.exitCode = 1;
3807
4004
  }
3808
4005
  } finally {
@@ -3816,7 +4013,7 @@ function makeLibraryCommand() {
3816
4013
  requireGitBackend(lib, "pull");
3817
4014
  const res = await manager.driverFor(lib.backend).pull(lib);
3818
4015
  if (res.conflicts.length > 0) {
3819
- logWarn(`Conflicts: ${res.conflicts.map((c) => c.path).join(", ")}`);
4016
+ exitOnSyncError(new Error(res.conflicts[0].reason));
3820
4017
  } else {
3821
4018
  logOk(`Pulled ${res.applied} change(s).`);
3822
4019
  }
@@ -3862,6 +4059,13 @@ function makeLibraryCommand() {
3862
4059
  );
3863
4060
  process.exit(1);
3864
4061
  }
4062
+ const unfinished = unfinishedGitState(lib.path);
4063
+ if (unfinished) {
4064
+ logErr(
4065
+ `library commit refused: ${unfinished} in ${lib.path}. Resolve the conflicts (\`skaile library git ${name} status\`), finish or abort the rebase/merge, then commit again.`
4066
+ );
4067
+ process.exit(1);
4068
+ }
3865
4069
  const add = spawnSync("git", ["add", "-A"], { cwd: lib.path, stdio: "inherit" });
3866
4070
  if (add.status !== 0) {
3867
4071
  logErr(`git add failed in ${lib.path}.`);
@@ -3916,16 +4120,16 @@ function makeLibraryCommand() {
3916
4120
  "With --create-repo: create the repo private (the store only accepts public repos)"
3917
4121
  ).option("--ref <gitref>", "Git ref to ingest (default: the library branch or main)").option("--dry-run", "Print the plan; push nothing and call no store endpoint").action(
3918
4122
  async (lib, opts) => {
3919
- const { runLibraryPublish } = await import('../library-publish-LFOJJVMK.js');
4123
+ const { runLibraryPublish } = await import('../library-publish-FGXF5TJO.js');
3920
4124
  await withStoreErrorHandling(() => runLibraryPublish(lib, opts));
3921
4125
  }
3922
4126
  );
3923
4127
  cmd.command("register <lib>").description("Register the library's manifest without pushing (bytes already on github)").option("--asset <ref>", "Publish only the single asset matching this ref/name").option("--ref <gitref>", "Git ref to ingest (default: the library branch or main)").option("--dry-run", "Print the plan; call no store endpoint").action(async (lib, opts) => {
3924
- const { runLibraryRegister } = await import('../library-publish-LFOJJVMK.js');
4128
+ const { runLibraryRegister } = await import('../library-publish-FGXF5TJO.js');
3925
4129
  await withStoreErrorHandling(() => runLibraryRegister(lib, opts));
3926
4130
  });
3927
4131
  cmd.command("yank <lib>").description("Retract the library's published assets from the store").option("--asset <ref>", "Yank only the single asset matching this ref/name").action(async (lib, opts) => {
3928
- const { runLibraryYank } = await import('../library-publish-LFOJJVMK.js');
4132
+ const { runLibraryYank } = await import('../library-publish-FGXF5TJO.js');
3929
4133
  await withStoreErrorHandling(() => runLibraryYank(lib, opts));
3930
4134
  });
3931
4135
  return cmd;
@@ -3976,9 +4180,9 @@ async function printOverallStatus(projectDir, asJson) {
3976
4180
  } catch {
3977
4181
  secretsStrategy = "unavailable";
3978
4182
  }
3979
- const resolvedProjectDir = path25.resolve(projectDir);
3980
- const hasWorkspaceConfig = existsSync(path25.join(resolvedProjectDir, "skaile.yaml"));
3981
- const hasLockFile = existsSync(path25.join(resolvedProjectDir, "skaile.lock.yaml"));
4183
+ const resolvedProjectDir = path23.resolve(projectDir);
4184
+ const hasWorkspaceConfig = existsSync(path23.join(resolvedProjectDir, "skaile.yaml"));
4185
+ const hasLockFile = existsSync(path23.join(resolvedProjectDir, "skaile.lock.yaml"));
3982
4186
  let assignments = [];
3983
4187
  if (hasWorkspaceConfig) {
3984
4188
  try {
@@ -4585,13 +4789,18 @@ function scheduleSoftDepPreview() {
4585
4789
  }
4586
4790
  async function loadAssets() {
4587
4791
  softDepPreviewCache.clear();
4588
- const { gatherAssetFeeds } = await import('../asset-feeds-LU7NHOAP.js');
4792
+ const { gatherAssetFeeds } = await import('../asset-feeds-K36CR52Q.js');
4589
4793
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
4590
4794
  if (notes.length > 0) {
4591
4795
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
4592
4796
  }
4593
4797
  const installed = new Set(am.listDeployed().map((e) => `${e.kind}:${e.name}`));
4594
- const rows = buildAssetRows(entries, installed);
4798
+ let lock = null;
4799
+ try {
4800
+ lock = readLock(path23__default.join(am.projectDir, "skaile.lock.yaml"));
4801
+ } catch {
4802
+ }
4803
+ const rows = buildAssetRows(entries, installed, lockedLibraryByIdentity(lock));
4595
4804
  state.assetRows = rows;
4596
4805
  reconcileCollapsedSets(rows);
4597
4806
  rebuildVisible();
@@ -4605,7 +4814,7 @@ function rebuildSourceTree() {
4605
4814
  rebuildVisibleSources();
4606
4815
  }
4607
4816
  function sourceOrgRepo(s) {
4608
- const parts = s.path.split(path25__default.sep).filter(Boolean);
4817
+ const parts = s.path.split(path23__default.sep).filter(Boolean);
4609
4818
  if (parts.length < 2) return null;
4610
4819
  return { org: parts[parts.length - 2], repo: parts[parts.length - 1] };
4611
4820
  }
@@ -4678,7 +4887,22 @@ function rebuildVisibleLibraries() {
4678
4887
  );
4679
4888
  clampCursor();
4680
4889
  }
4681
- function buildAssetRows(entries, installed) {
4890
+ function lockedLibraryByIdentity(lock) {
4891
+ const out = /* @__PURE__ */ new Map();
4892
+ for (const [key, locked] of Object.entries(lock?.assets ?? {})) {
4893
+ if (!locked.library) continue;
4894
+ const ref = parseAssetRefLoose(key);
4895
+ if (ref?.publisher) out.set(`${ref.kind}:${ref.publisher}/${ref.name}`, locked.library.name);
4896
+ }
4897
+ return out;
4898
+ }
4899
+ function isRowInstalled(origin, group, entry, installed, lockedLibrary) {
4900
+ if (!installed.has(`${entry.kind}:${entry.name}`)) return false;
4901
+ const publisher = entry.publisher?.replace(/^@/, "");
4902
+ const locked = publisher ? lockedLibrary.get(`${entry.kind}:${publisher}/${entry.name}`) : void 0;
4903
+ return locked === void 0 || origin === "library" && group === locked;
4904
+ }
4905
+ function buildAssetRows(entries, installed, lockedLibrary = /* @__PURE__ */ new Map()) {
4682
4906
  const byOrigin = /* @__PURE__ */ new Map();
4683
4907
  for (const { origin, entry, group } of entries) {
4684
4908
  const publisher = group || entry.publisher || "other";
@@ -4706,7 +4930,7 @@ function buildAssetRows(entries, installed) {
4706
4930
  source: group,
4707
4931
  org: entry.repo?.includes("/") ? entry.repo.slice(0, entry.repo.indexOf("/")) : void 0,
4708
4932
  entry,
4709
- installed: installed.has(`${entry.kind}:${entry.name}`),
4933
+ installed: isRowInstalled(origin, group, entry, installed, lockedLibrary),
4710
4934
  plugin
4711
4935
  });
4712
4936
  }
@@ -4752,13 +4976,13 @@ function reconcileCollapsedSets(rows) {
4752
4976
  async function loadSourcesAndLibraries() {
4753
4977
  try {
4754
4978
  const [{ openLibraryManager: openLibraryManager2 }, { getGlobalCacheDir: getGlobalCacheDir2, globalSkaileDir: globalSkaileDir2 }] = await Promise.all([
4755
- import('../open-library-4WUMQHES.js'),
4979
+ import('../open-library-P3D337NH.js'),
4756
4980
  import('../core/index.js')
4757
4981
  ]);
4758
4982
  const { manager, library, close } = await openLibraryManager2();
4759
4983
  try {
4760
4984
  const newRoot = getGlobalCacheDir2();
4761
- const legacyRoot = path25__default.join(globalSkaileDir2(), "sources");
4985
+ const legacyRoot = path23__default.join(globalSkaileDir2(), "sources");
4762
4986
  const isSourceRow = (l) => l.path.startsWith(newRoot) || l.path.startsWith(legacyRoot);
4763
4987
  const libs = await manager.listLibraries();
4764
4988
  const defs = await library.listAssetDefs();
@@ -5694,7 +5918,7 @@ async function run(projectDir) {
5694
5918
  }
5695
5919
  function makeManageCommand() {
5696
5920
  return new Command("manage").description("Interactive TUI for managing assets, sources, and libraries").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
5697
- await run(path25__default.resolve(opts.projectDir));
5921
+ await run(path23__default.resolve(opts.projectDir));
5698
5922
  });
5699
5923
  }
5700
5924
  function makeMcpServerCommand() {
@@ -5747,10 +5971,10 @@ function walkFiles(root, match) {
5747
5971
  return;
5748
5972
  }
5749
5973
  for (const entry of entries) {
5750
- const full = path25__default.join(dir, entry.name);
5974
+ const full = path23__default.join(dir, entry.name);
5751
5975
  if (entry.isDirectory()) {
5752
5976
  if (SKIPPED_DIRS.has(entry.name)) continue;
5753
- if (entry.name === "cache" && path25__default.basename(dir) === ".skaile") continue;
5977
+ if (entry.name === "cache" && path23__default.basename(dir) === ".skaile") continue;
5754
5978
  visit(full);
5755
5979
  } else if (entry.isFile() && match(entry.name)) {
5756
5980
  out.push(full);
@@ -5768,14 +5992,14 @@ function applyChanges2(changes) {
5768
5992
  switch (change.type) {
5769
5993
  case "write":
5770
5994
  case "create":
5771
- mkdirSync(path25__default.dirname(change.path), { recursive: true });
5995
+ mkdirSync(path23__default.dirname(change.path), { recursive: true });
5772
5996
  writeFileSync(change.path, change.after, "utf-8");
5773
5997
  break;
5774
5998
  case "delete":
5775
5999
  rmSync(change.path, { force: true });
5776
6000
  break;
5777
6001
  case "move":
5778
- mkdirSync(path25__default.dirname(change.to), { recursive: true });
6002
+ mkdirSync(path23__default.dirname(change.to), { recursive: true });
5779
6003
  writeFileSync(change.to, change.after, "utf-8");
5780
6004
  rmSync(change.from, { force: true });
5781
6005
  break;
@@ -5868,7 +6092,7 @@ function unifiedDiff(before, after, oldLabel, newLabel, context = 3) {
5868
6092
  return `${out.join("\n")}
5869
6093
  `;
5870
6094
  }
5871
- var posix = (p6) => p6.split(path25__default.sep).join("/");
6095
+ var posix = (p6) => p6.split(path23__default.sep).join("/");
5872
6096
  function colorizeDiff(diff) {
5873
6097
  return diff.split("\n").map((line) => {
5874
6098
  if (line.startsWith("+++") || line.startsWith("---")) return S.bold(line);
@@ -5879,7 +6103,7 @@ function colorizeDiff(diff) {
5879
6103
  }).join("\n");
5880
6104
  }
5881
6105
  function renderChange(change, base) {
5882
- const rel = (p6) => posix(path25__default.relative(base, p6) || path25__default.basename(p6));
6106
+ const rel = (p6) => posix(path23__default.relative(base, p6) || path23__default.basename(p6));
5883
6107
  switch (change.type) {
5884
6108
  case "write":
5885
6109
  return unifiedDiff(
@@ -5906,7 +6130,7 @@ ${diff}`;
5906
6130
  }
5907
6131
  }
5908
6132
  function changeLabel(change, base) {
5909
- const rel = (p6) => posix(path25__default.relative(base, p6) || path25__default.basename(p6));
6133
+ const rel = (p6) => posix(path23__default.relative(base, p6) || path23__default.basename(p6));
5910
6134
  switch (change.type) {
5911
6135
  case "write":
5912
6136
  return `modify ${rel(change.path)}`;
@@ -5966,10 +6190,10 @@ function loadAsset(projectDir, id, ref) {
5966
6190
  )
5967
6191
  };
5968
6192
  }
5969
- const manifestPath = path25__default.join(dir, AGENT_MANIFEST_FILE);
6193
+ const manifestPath = path23__default.join(dir, AGENT_MANIFEST_FILE);
5970
6194
  let text;
5971
6195
  try {
5972
- text = fs11__default.readFileSync(manifestPath, "utf-8");
6196
+ text = fs9__default.readFileSync(manifestPath, "utf-8");
5973
6197
  } catch {
5974
6198
  return {
5975
6199
  diagnostic: err(
@@ -6148,12 +6372,12 @@ function findManifestCandidates(rootPath) {
6148
6372
  function walk(dir) {
6149
6373
  let entries;
6150
6374
  try {
6151
- entries = fs11__default.readdirSync(dir, { withFileTypes: true });
6375
+ entries = fs9__default.readdirSync(dir, { withFileTypes: true });
6152
6376
  } catch {
6153
6377
  return;
6154
6378
  }
6155
6379
  for (const entry of entries) {
6156
- const fullPath = path25__default.join(dir, entry.name);
6380
+ const fullPath = path23__default.join(dir, entry.name);
6157
6381
  if (entry.isDirectory()) {
6158
6382
  if (!SKIP_DIRS.has(entry.name)) walk(fullPath);
6159
6383
  } else if (entry.isFile()) {
@@ -6189,10 +6413,10 @@ function checkManifestIdentity(kind, parsed) {
6189
6413
  return null;
6190
6414
  }
6191
6415
  function parseManifestCandidate(c, absRoot) {
6192
- const content = fs11__default.readFileSync(c.filePath, "utf-8");
6416
+ const content = fs9__default.readFileSync(c.filePath, "utf-8");
6193
6417
  const res = parseManifestFile(c.filePath, content);
6194
6418
  if (!res.ok) {
6195
- logErr(`${path25__default.relative(absRoot, c.filePath)} [${c.kind}] \u2014 parse error: ${res.reason}`);
6419
+ logErr(`${path23__default.relative(absRoot, c.filePath)} [${c.kind}] \u2014 parse error: ${res.reason}`);
6196
6420
  return { kind: "error" };
6197
6421
  }
6198
6422
  return {
@@ -6222,7 +6446,7 @@ function checkComposeKinds(parsed, registry) {
6222
6446
  return diagnostics;
6223
6447
  }
6224
6448
  function validateManifestCandidate(c, parsed, body, absRoot, registry, strictConformance) {
6225
- const relPath = path25__default.relative(absRoot, c.filePath);
6449
+ const relPath = path23__default.relative(absRoot, c.filePath);
6226
6450
  let errors = 0;
6227
6451
  let warnings = 0;
6228
6452
  const identityError = checkManifestIdentity(c.kind, parsed);
@@ -6230,9 +6454,15 @@ function validateManifestCandidate(c, parsed, body, absRoot, registry, strictCon
6230
6454
  logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
6231
6455
  errors++;
6232
6456
  }
6233
- if (c.kind === "skill" && parsed && typeof parsed === "object") {
6234
- const dirName = path25__default.basename(path25__default.dirname(c.filePath));
6235
- for (const f of checkSkillManifest(parsed, body, dirName)) {
6457
+ if (parsed && typeof parsed === "object") {
6458
+ const manifest = parsed;
6459
+ const version = declaredVersion(manifest);
6460
+ if (version !== void 0 && !isValidSemver(version)) {
6461
+ logErr(`${relPath} [${c.kind}] \u2014 version "${version}" is not valid semver`);
6462
+ errors++;
6463
+ }
6464
+ const dirName = path23__default.basename(path23__default.dirname(c.filePath));
6465
+ for (const f of checkAssetManifest(c.kind, manifest, body, dirName)) {
6236
6466
  const line = `${relPath} [${f.tag}] \u2014 ${f.text}`;
6237
6467
  if (f.conformance && strictConformance) {
6238
6468
  logErr(line);
@@ -6243,7 +6473,7 @@ function validateManifestCandidate(c, parsed, body, absRoot, registry, strictCon
6243
6473
  }
6244
6474
  }
6245
6475
  }
6246
- if (c.kind === "agent" && path25__default.basename(c.filePath) === "agent.yaml") {
6476
+ if (c.kind === "agent" && path23__default.basename(c.filePath) === "agent.yaml") {
6247
6477
  for (const d of [
6248
6478
  ...checkComposeKinds(parsed, registry),
6249
6479
  ...composeSlotDiagnostics(parsed),
@@ -6274,8 +6504,8 @@ function validateManifestCandidate(c, parsed, body, absRoot, registry, strictCon
6274
6504
  return { errors, warnings };
6275
6505
  }
6276
6506
  function validateManifests(rootPath, strictConformance) {
6277
- const absRoot = path25__default.resolve(rootPath);
6278
- if (!fs11__default.existsSync(absRoot)) {
6507
+ const absRoot = path23__default.resolve(rootPath);
6508
+ if (!fs9__default.existsSync(absRoot)) {
6279
6509
  logErr(`Path does not exist: ${absRoot}`);
6280
6510
  return { total: 0, errors: 1, warnings: 0 };
6281
6511
  }
@@ -6307,12 +6537,12 @@ function findWorkspaceManifests(rootPath) {
6307
6537
  function walk(dir) {
6308
6538
  let entries;
6309
6539
  try {
6310
- entries = fs11__default.readdirSync(dir, { withFileTypes: true });
6540
+ entries = fs9__default.readdirSync(dir, { withFileTypes: true });
6311
6541
  } catch {
6312
6542
  return;
6313
6543
  }
6314
6544
  for (const entry of entries) {
6315
- const full = path25__default.join(dir, entry.name);
6545
+ const full = path23__default.join(dir, entry.name);
6316
6546
  if (entry.isDirectory()) {
6317
6547
  if (!SKIP_DIRS.has(entry.name)) walk(full);
6318
6548
  } else if (entry.isFile() && /(^|\.)skaile\.yaml$/.test(entry.name)) {
@@ -6375,14 +6605,14 @@ function validateWorkspaceAssets(parsed, relPath) {
6375
6605
  return errors;
6376
6606
  }
6377
6607
  function validateWorkspaceManifests(rootPath) {
6378
- const absRoot = path25__default.resolve(rootPath);
6608
+ const absRoot = path23__default.resolve(rootPath);
6379
6609
  const files = findWorkspaceManifests(absRoot);
6380
6610
  let errors = 0;
6381
6611
  for (const file of files) {
6382
- const relPath = path25__default.relative(absRoot, file);
6612
+ const relPath = path23__default.relative(absRoot, file);
6383
6613
  let parsed;
6384
6614
  try {
6385
- parsed = parse(fs11__default.readFileSync(file, "utf-8")) ?? {};
6615
+ parsed = parse(fs9__default.readFileSync(file, "utf-8")) ?? {};
6386
6616
  } catch (e) {
6387
6617
  logErr(`${relPath} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
6388
6618
  errors++;
@@ -6390,7 +6620,7 @@ function validateWorkspaceManifests(rootPath) {
6390
6620
  }
6391
6621
  errors += validateWorkspaceRefs(collectWorkspaceRefFields(parsed), relPath);
6392
6622
  errors += validateWorkspaceAssets(parsed, relPath);
6393
- for (const d of checkAgentInstances(path25__default.dirname(file), parsed)) {
6623
+ for (const d of checkAgentInstances(path23__default.dirname(file), parsed)) {
6394
6624
  const line = `${relPath} [agents] \u2014 ${d.code}: ${d.path ? `${d.path}: ` : ""}${d.message}`;
6395
6625
  if (d.severity === "error") {
6396
6626
  logErr(line);
@@ -6403,7 +6633,7 @@ function validateWorkspaceManifests(rootPath) {
6403
6633
  return { total: files.length, errors };
6404
6634
  }
6405
6635
  function validatePublishManifestRoots(rootPath) {
6406
- const absRoot = path25__default.resolve(rootPath);
6636
+ const absRoot = path23__default.resolve(rootPath);
6407
6637
  const manifest = loadSkPublishManifest(absRoot);
6408
6638
  if (!manifest) return 0;
6409
6639
  const missing = missingRootAssets(absRoot, manifest);
@@ -6414,99 +6644,128 @@ function validatePublishManifestRoots(rootPath) {
6414
6644
  }
6415
6645
  return missing.length;
6416
6646
  }
6647
+ function validatePublishManifestRequires(rootPath) {
6648
+ const problems = manifestRequiresProblems(path23__default.resolve(rootPath));
6649
+ for (const p6 of problems) {
6650
+ logErr(
6651
+ `${SKAILE_MANIFEST_FILENAME} [assets] \u2014 ${p6.asset}: ${p6.message}. Use the \`kind:@<publisher>/name[#version]\` form.`
6652
+ );
6653
+ }
6654
+ return problems.length;
6655
+ }
6656
+ function validatePublishManifestVersions(rootPath) {
6657
+ const absRoot = path23__default.resolve(rootPath);
6658
+ const manifest = loadSkPublishManifest(absRoot);
6659
+ if (!manifest || manifest.source) return 0;
6660
+ let warnings = 0;
6661
+ for (const a of manifest.assets ?? []) {
6662
+ if (!a.root || a.source || !a.version) continue;
6663
+ const file = findAssetManifestFile(path23__default.join(absRoot, a.root), a.kind, a.name);
6664
+ if (!file) continue;
6665
+ const res = parseManifestFile(file, fs9__default.readFileSync(file, "utf-8"));
6666
+ if (!res.ok) continue;
6667
+ const fileVersion = declaredVersion(res.data);
6668
+ if (fileVersion === void 0 || fileVersion === a.version) continue;
6669
+ logWarn(
6670
+ `${SKAILE_MANIFEST_FILENAME} [assets] \u2014 ${assetEntryRef(a, manifest)}: manifest version ${a.version} differs from ${toPosix(path23__default.relative(absRoot, file))} (${fileVersion}). The file is the source of truth: bump the version there, then run \`skaile library index <library>\`.`
6671
+ );
6672
+ warnings++;
6673
+ }
6674
+ return warnings;
6675
+ }
6676
+ function validatePublishManifestPublishers(rootPath) {
6677
+ const absRoot = path23__default.resolve(rootPath);
6678
+ const manifest = loadSkPublishManifest(absRoot);
6679
+ if (!manifest || manifest.source) return 0;
6680
+ const bare = (p6) => p6.trim().replace(/^@/, "");
6681
+ let warnings = 0;
6682
+ for (const a of manifest.assets ?? []) {
6683
+ const resolved = a.publisher ?? manifest.publisher;
6684
+ if (!a.root || a.source || !resolved) continue;
6685
+ const file = findAssetManifestFile(path23__default.join(absRoot, a.root), a.kind, a.name);
6686
+ if (!file) continue;
6687
+ const res = parseManifestFile(file, fs9__default.readFileSync(file, "utf-8"));
6688
+ if (!res.ok) continue;
6689
+ const meta = res.data.metadata;
6690
+ const declared = meta !== null && typeof meta === "object" ? meta.publisher : null;
6691
+ if (typeof declared !== "string" || bare(declared) === bare(resolved)) continue;
6692
+ logWarn(
6693
+ `${toPosix(path23__default.relative(absRoot, file))} [publisher] \u2014 metadata.publisher "${bare(declared)}" differs from the manifest publisher "${bare(resolved)}" for ${assetEntryRef(a, manifest)}. The manifest wins and the file value is ignored: delete \`metadata.publisher\` from the file, or set the publisher in ${SKAILE_MANIFEST_FILENAME}.`
6694
+ );
6695
+ warnings++;
6696
+ }
6697
+ return warnings;
6698
+ }
6417
6699
  var EXCLUDED_PATHS = ["skaileup-shared/", "external/", "docs/"];
6418
6700
  function toPosix(p6) {
6419
- return p6.split(path25__default.sep).join("/");
6701
+ return p6.split(path23__default.sep).join("/");
6420
6702
  }
6421
6703
  function isExcludedPath(relPath) {
6422
6704
  const rel = toPosix(relPath);
6423
6705
  return EXCLUDED_PATHS.some((prefix) => rel.startsWith(prefix));
6424
6706
  }
6425
- function collectAssetVersions() {
6426
- const assets = [];
6427
- if (!fs11__default.existsSync(AI_RESOURCES)) return assets;
6428
- const kindDirs = (kindDirName) => findKindDirs(AI_RESOURCES, kindDirName).filter(
6429
- (dir) => !isExcludedPath(path25__default.relative(AI_RESOURCES, dir))
6430
- );
6431
- for (const dir of kindDirs("skills")) collectSkillVersions(dir, assets);
6432
- for (const dir of kindDirs("agents")) collectAgentVersions(dir, assets);
6433
- for (const dir of kindDirs("flows")) collectFlowVersions(dir, assets);
6434
- for (const dir of kindDirs("prompts")) collectPromptVersions(dir, assets);
6435
- const seen = /* @__PURE__ */ new Set();
6436
- return assets.filter((a) => !seen.has(a.filePath) && seen.add(a.filePath));
6437
- }
6438
- function collectFlowVersions(dir, out) {
6439
- for (const f of fs11__default.readdirSync(dir)) {
6440
- if (!f.endsWith(".flow.yaml")) continue;
6441
- const fp = path25__default.join(dir, f);
6442
- const content = fs11__default.readFileSync(fp, "utf-8");
6443
- const parsed = parse(content);
6444
- out.push({
6445
- kind: "flow",
6446
- name: parsed?.id ?? f.replace(".flow.yaml", ""),
6447
- version: parsed?.version ?? "",
6448
- filePath: fp
6449
- });
6450
- }
6451
- }
6452
- function collectPromptVersions(dir, out) {
6453
- for (const f of fs11__default.readdirSync(dir)) {
6454
- if (!f.endsWith(".prompt.md")) continue;
6455
- const fp = path25__default.join(dir, f);
6456
- const content = fs11__default.readFileSync(fp, "utf-8");
6707
+ var VERSIONED_KINDS = {
6708
+ skill: true,
6709
+ agent: true,
6710
+ flow: true,
6711
+ prompt: true
6712
+ };
6713
+ function readAssetVersion(c) {
6714
+ const kind = c.kind;
6715
+ const fileName = path23__default.basename(c.filePath);
6716
+ const dirName = path23__default.basename(path23__default.dirname(c.filePath));
6717
+ const content = fs9__default.readFileSync(c.filePath, "utf-8");
6718
+ if (c.filePath.endsWith(".md")) {
6457
6719
  const fm = parseSkillFrontmatter(content);
6458
- out.push({
6459
- kind: "prompt",
6460
- name: fm?.name ?? f.replace(".prompt.md", ""),
6720
+ const stem = fileName.replace(/\.prompt\.md$/, "");
6721
+ return {
6722
+ kind,
6723
+ name: fm?.name ?? (kind === "prompt" ? stem : dirName),
6461
6724
  version: fm?.metadata?.version ?? "",
6462
- filePath: fp
6463
- });
6725
+ filePath: c.filePath
6726
+ };
6464
6727
  }
6465
- }
6466
- function collectSkillVersions(dir, out) {
6467
- for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
6468
- if (!entry.isDirectory()) continue;
6469
- const full = path25__default.join(dir, entry.name);
6470
- const skillMd = path25__default.join(full, "SKILL.md");
6471
- if (fs11__default.existsSync(skillMd)) {
6472
- const content = fs11__default.readFileSync(skillMd, "utf-8");
6473
- const fm = parseSkillFrontmatter(content);
6474
- out.push({
6475
- kind: "skill",
6476
- name: fm?.name ?? entry.name,
6477
- version: fm?.metadata?.version ?? "",
6478
- filePath: skillMd
6479
- });
6480
- } else {
6481
- collectSkillVersions(full, out);
6482
- }
6728
+ let parsed = null;
6729
+ try {
6730
+ parsed = parse(content);
6731
+ } catch {
6732
+ }
6733
+ if (kind === "flow") {
6734
+ return {
6735
+ kind,
6736
+ name: String(parsed?.id ?? fileName.replace(".flow.yaml", "")),
6737
+ version: String(parsed?.version ?? ""),
6738
+ filePath: c.filePath
6739
+ };
6483
6740
  }
6741
+ return {
6742
+ kind,
6743
+ name: String(parsed?.name ?? dirName),
6744
+ version: String(parsed?.version ?? ""),
6745
+ filePath: c.filePath
6746
+ };
6484
6747
  }
6485
- function collectAgentVersions(dir, out) {
6486
- for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
6487
- if (!entry.isDirectory()) continue;
6488
- const agentYaml = path25__default.join(dir, entry.name, "agent.yaml");
6489
- if (!fs11__default.existsSync(agentYaml)) continue;
6490
- const content = fs11__default.readFileSync(agentYaml, "utf-8");
6491
- const parsed = parse(content);
6492
- out.push({
6493
- kind: "agent",
6494
- name: parsed?.name ?? entry.name,
6495
- version: parsed?.version ?? "",
6496
- filePath: agentYaml
6497
- });
6748
+ function collectAssetVersions(root) {
6749
+ if (!fs9__default.existsSync(root)) return [];
6750
+ const assets = [];
6751
+ for (const c of findManifestCandidates(root)) {
6752
+ if (!VERSIONED_KINDS[c.kind]) continue;
6753
+ if (c.filePath.endsWith(".flow.json")) continue;
6754
+ if (isExcludedPath(path23__default.relative(root, c.filePath))) continue;
6755
+ assets.push(readAssetVersion(c));
6498
6756
  }
6757
+ return assets;
6499
6758
  }
6500
- function assetLocation(a) {
6501
- return toPosix(path25__default.relative(AI_RESOURCES, a.filePath));
6759
+ function assetLocation(a, root) {
6760
+ return toPosix(path23__default.relative(root, a.filePath));
6502
6761
  }
6503
6762
  function findChangelogUnit(assetRelPath, root) {
6504
- let dir = path25__default.posix.dirname(toPosix(assetRelPath));
6763
+ let dir = path23__default.posix.dirname(toPosix(assetRelPath));
6505
6764
  for (; ; ) {
6506
6765
  const candidate = dir === "." ? "CHANGELOG.md" : `${dir}/CHANGELOG.md`;
6507
- if (fs11__default.existsSync(path25__default.join(root, candidate))) return candidate;
6766
+ if (fs9__default.existsSync(path23__default.join(root, candidate))) return candidate;
6508
6767
  if (dir === ".") return null;
6509
- dir = path25__default.posix.dirname(dir);
6768
+ dir = path23__default.posix.dirname(dir);
6510
6769
  }
6511
6770
  }
6512
6771
  function checkChangelogUnits(modifiedFiles, root) {
@@ -6525,7 +6784,7 @@ function checkChangelogUnits(modifiedFiles, root) {
6525
6784
  return { updated, stale, orphans };
6526
6785
  }
6527
6786
  function isValidSemver(v) {
6528
- return /^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(v);
6787
+ return SEMVER_RE.test(v);
6529
6788
  }
6530
6789
  function extractVersionFromContent(filePath, content) {
6531
6790
  if (filePath.endsWith(".yaml")) {
@@ -6537,51 +6796,37 @@ function extractVersionFromContent(filePath, content) {
6537
6796
  const parsed = parse(fmMatch[1]);
6538
6797
  return parsed?.metadata?.version ?? parsed?.version ?? null;
6539
6798
  }
6540
- function filterToChangedAssets(assets) {
6541
- try {
6542
- const diffOutput = execSync("git diff --name-only HEAD", {
6543
- cwd: AI_RESOURCES,
6544
- encoding: "utf-8"
6545
- });
6546
- const changedFiles = new Set(
6547
- diffOutput.trim().split("\n").filter(Boolean).map((f) => path25__default.resolve(AI_RESOURCES, f))
6548
- );
6549
- return assets.filter((a) => changedFiles.has(a.filePath));
6550
- } catch {
6551
- logErr("Failed to run git diff \u2014 are you in a git repository?");
6552
- process.exit(1);
6553
- }
6554
- }
6555
- function checkAssetVersions(assets) {
6799
+ function checkAssetVersions(assets, root) {
6556
6800
  let errors = 0;
6557
- let warnings = 0;
6801
+ const warnings = 0;
6558
6802
  for (const a of assets) {
6559
6803
  if (!a.version) {
6560
- logErr(`${a.kind}:${a.name} (${assetLocation(a)}) \u2014 missing version`);
6804
+ logErr(`${a.kind}:${a.name} (${assetLocation(a, root)}) \u2014 missing version`);
6561
6805
  errors++;
6562
6806
  } else if (!isValidSemver(a.version)) {
6563
- logWarn(
6564
- `${a.kind}:${a.name} (${assetLocation(a)}) \u2014 version "${a.version}" is not valid semver`
6807
+ logErr(
6808
+ `${a.kind}:${a.name} (${assetLocation(a, root)}) \u2014 version "${a.version}" is not valid semver`
6565
6809
  );
6566
- warnings++;
6810
+ errors++;
6567
6811
  }
6568
6812
  }
6569
6813
  return { errors, warnings };
6570
6814
  }
6571
- function checkVersionBumps(assets) {
6815
+ function checkVersionBumps(assets, root) {
6572
6816
  let warnings = 0;
6573
6817
  for (const a of assets) {
6574
6818
  if (!a.version) continue;
6575
- const relPath = path25__default.relative(AI_RESOURCES, a.filePath);
6819
+ const relPath = toPosix(path23__default.relative(root, a.filePath));
6576
6820
  try {
6577
- const headContent = execSync(`git show HEAD:${relPath}`, {
6578
- cwd: AI_RESOURCES,
6579
- encoding: "utf-8"
6821
+ const headContent = execFileSync("git", ["show", `HEAD:./${relPath}`], {
6822
+ cwd: root,
6823
+ encoding: "utf-8",
6824
+ stdio: ["ignore", "pipe", "pipe"]
6580
6825
  });
6581
6826
  const headVersion = extractVersionFromContent(a.filePath, headContent);
6582
6827
  if (headVersion && headVersion === a.version) {
6583
6828
  logWarn(
6584
- `${a.kind}:${a.name} (${assetLocation(a)}) \u2014 file changed but version not bumped (${a.version})`
6829
+ `${a.kind}:${a.name} (${assetLocation(a, root)}) \u2014 file changed but version not bumped (${a.version})`
6585
6830
  );
6586
6831
  warnings++;
6587
6832
  }
@@ -6590,7 +6835,7 @@ function checkVersionBumps(assets) {
6590
6835
  }
6591
6836
  return warnings;
6592
6837
  }
6593
- function checkFlowVersionPins(assets) {
6838
+ function checkFlowVersionPins(assets, root) {
6594
6839
  const flows = assets.filter((a) => a.kind === "flow");
6595
6840
  const skillVersionMap = /* @__PURE__ */ new Map();
6596
6841
  for (const a of assets.filter((a2) => a2.kind === "skill")) {
@@ -6604,7 +6849,7 @@ function checkFlowVersionPins(assets) {
6604
6849
  pins = flowSkillVersionPins(loadFlow(f.filePath));
6605
6850
  } catch (err2) {
6606
6851
  logWarn(
6607
- `flow:${f.name} (${path25__default.relative(AI_RESOURCES, f.filePath)}) \u2014 could not be read: ${err2 instanceof Error ? err2.message : err2}`
6852
+ `flow:${f.name} (${path23__default.relative(root, f.filePath)}) \u2014 could not be read: ${err2 instanceof Error ? err2.message : err2}`
6608
6853
  );
6609
6854
  warnings++;
6610
6855
  continue;
@@ -6620,18 +6865,63 @@ function checkFlowVersionPins(assets) {
6620
6865
  }
6621
6866
  return { errors, warnings };
6622
6867
  }
6623
- function runVersionsCheck(opts) {
6624
- let assets = collectAssetVersions();
6868
+ function resolveCheckRoot(pathArg) {
6869
+ if (pathArg) {
6870
+ const abs = path23__default.resolve(pathArg);
6871
+ if (!fs9__default.existsSync(abs)) {
6872
+ logErr(`Path does not exist: ${abs}`);
6873
+ return null;
6874
+ }
6875
+ return abs;
6876
+ }
6877
+ for (let dir = process.cwd(); ; dir = path23__default.dirname(dir)) {
6878
+ if (fs9__default.existsSync(path23__default.join(dir, SKAILE_MANIFEST_FILENAME))) return dir;
6879
+ if (path23__default.dirname(dir) === dir) return AI_RESOURCES;
6880
+ }
6881
+ }
6882
+ function changedFiles(root, ref) {
6883
+ try {
6884
+ const out = execFileSync(
6885
+ "git",
6886
+ ["diff", "--name-only", "--relative", "--end-of-options", ref],
6887
+ {
6888
+ cwd: root,
6889
+ encoding: "utf-8",
6890
+ stdio: ["ignore", "pipe", "pipe"]
6891
+ }
6892
+ );
6893
+ return out.trim().split("\n").filter(Boolean);
6894
+ } catch (err2) {
6895
+ const stderr = err2 instanceof Error && "stderr" in err2 ? String(err2.stderr).trim() : "";
6896
+ const reason = (stderr || (err2 instanceof Error ? err2.message : String(err2))).split("\n")[0];
6897
+ logErr(`git diff failed in ${root}: ${reason}`);
6898
+ return null;
6899
+ }
6900
+ }
6901
+ function runVersionsCheck(pathArg, opts) {
6902
+ const root = resolveCheckRoot(pathArg);
6903
+ if (root === null) {
6904
+ process.exit(1);
6905
+ return;
6906
+ }
6907
+ let assets = collectAssetVersions(root);
6625
6908
  if (opts.changedOnly) {
6626
- assets = filterToChangedAssets(assets);
6909
+ const changed = changedFiles(root, "HEAD");
6910
+ if (changed === null) {
6911
+ process.exit(1);
6912
+ return;
6913
+ }
6914
+ const changedAbs = new Set(changed.map((f) => path23__default.resolve(root, f)));
6915
+ assets = assets.filter((a) => changedAbs.has(a.filePath));
6627
6916
  }
6628
- const versionCheck = checkAssetVersions(assets);
6917
+ logInfo(`Checking versions in ${root}`);
6918
+ const versionCheck = checkAssetVersions(assets, root);
6629
6919
  let errors = versionCheck.errors;
6630
6920
  let warnings = versionCheck.warnings;
6631
6921
  if (opts.changedOnly) {
6632
- warnings += checkVersionBumps(assets);
6922
+ warnings += checkVersionBumps(assets, root);
6633
6923
  }
6634
- const pinCheck = checkFlowVersionPins(assets);
6924
+ const pinCheck = checkFlowVersionPins(assets, root);
6635
6925
  errors += pinCheck.errors;
6636
6926
  warnings += pinCheck.warnings;
6637
6927
  console.log();
@@ -6654,7 +6944,7 @@ function makeValidateCommand() {
6654
6944
  "--strict-conformance",
6655
6945
  "Treat Agent Skills (agentskills.io) standard findings as errors"
6656
6946
  ).action((targetPath, opts) => {
6657
- const absPath = path25__default.resolve(targetPath);
6947
+ const absPath = path23__default.resolve(targetPath);
6658
6948
  logInfo(`Validating manifests in ${absPath}`);
6659
6949
  const { total, errors, warnings } = validateManifests(
6660
6950
  absPath,
@@ -6662,11 +6952,15 @@ function makeValidateCommand() {
6662
6952
  );
6663
6953
  const ws = validateWorkspaceManifests(absPath);
6664
6954
  const rootErrors = validatePublishManifestRoots(absPath);
6665
- const totalErrors = errors + ws.errors + rootErrors;
6955
+ const requiresErrors = validatePublishManifestRequires(absPath);
6956
+ const versionWarnings = validatePublishManifestVersions(absPath);
6957
+ const publisherWarnings = validatePublishManifestPublishers(absPath);
6958
+ const totalErrors = errors + ws.errors + rootErrors + requiresErrors;
6666
6959
  console.log();
6667
6960
  warnIgnoredDomainFiles(absPath);
6668
6961
  logInfo(`Scanned ${total} asset manifest(s) and ${ws.total} skaile.yaml file(s)`);
6669
- if (warnings > 0) logWarn(`${warnings} warning(s)`);
6962
+ const totalWarnings = warnings + versionWarnings + publisherWarnings;
6963
+ if (totalWarnings > 0) logWarn(`${totalWarnings} warning(s)`);
6670
6964
  if (totalErrors === 0) {
6671
6965
  logOk("All manifests valid");
6672
6966
  } else {
@@ -6674,23 +6968,24 @@ function makeValidateCommand() {
6674
6968
  process.exit(1);
6675
6969
  }
6676
6970
  });
6677
- cmd.command("versions").description("Check version fields and flow version pins").option("--changed-only", "Only check assets modified since last commit").option("--strict", "Exit 1 on warnings (for CI)").action((opts) => {
6678
- runVersionsCheck(opts);
6679
- });
6680
- cmd.command("changelog").description("Check that modified assets have an updated nearest CHANGELOG.md").option("--base <ref>", "Git base ref for diff", "HEAD").action((opts) => {
6681
- let diffOutput;
6682
- try {
6683
- diffOutput = execSync(`git diff --name-only --relative ${opts.base}`, {
6684
- cwd: AI_RESOURCES,
6685
- encoding: "utf-8"
6686
- });
6687
- } catch {
6688
- logErr("Failed to run git diff \u2014 are you in a git repository?");
6971
+ cmd.command("versions").description("Check version fields and flow version pins").argument("[path]", "Library or asset directory (default: the current library)").option("--changed-only", "Only check assets modified since last commit").option("--strict", "Exit 1 on warnings (for CI)").addOption(removedDomainOption()).action(
6972
+ (pathArg, opts) => {
6973
+ rejectRemovedDomainOption(opts);
6974
+ runVersionsCheck(pathArg, opts);
6975
+ }
6976
+ );
6977
+ cmd.command("changelog").description("Check that modified assets have an updated nearest CHANGELOG.md").argument("[path]", "Library or asset directory (default: the current library)").option("--base <ref>", "Git base ref for diff", "HEAD").action((pathArg, opts) => {
6978
+ const root = resolveCheckRoot(pathArg);
6979
+ if (root === null) {
6689
6980
  process.exit(1);
6690
6981
  return;
6691
6982
  }
6692
- const modifiedFiles = diffOutput.trim().split("\n").filter(Boolean);
6693
- const { updated, stale, orphans } = checkChangelogUnits(modifiedFiles, AI_RESOURCES);
6983
+ const modifiedFiles = changedFiles(root, opts.base);
6984
+ if (modifiedFiles === null) {
6985
+ process.exit(1);
6986
+ return;
6987
+ }
6988
+ const { updated, stale, orphans } = checkChangelogUnits(modifiedFiles, root);
6694
6989
  if (updated.length + stale.length + orphans.length === 0) {
6695
6990
  logOk("No modified assets found");
6696
6991
  return;
@@ -6734,7 +7029,7 @@ function itemFromRef(raw, defaultKind, ctx) {
6734
7029
  return { kind: prefixed[1], ref: value };
6735
7030
  }
6736
7031
  if (PATH_LIKE.test(value)) return { kind: defaultKind, ref: value };
6737
- if (defaultKind === "skill" && !value.includes("/") && existsSync(path25__default.join(ctx.agentDir, "skills", value, "SKILL.md"))) {
7032
+ if (defaultKind === "skill" && !value.includes("/") && existsSync(path23__default.join(ctx.agentDir, "skills", value, "SKILL.md"))) {
6738
7033
  return { kind: "skill", ref: `./skills/${value}` };
6739
7034
  }
6740
7035
  return { kind: defaultKind, ref: `${defaultKind}:${value}` };
@@ -6870,7 +7165,7 @@ function migrateAgentYaml(source, options) {
6870
7165
  manual.push("metadata.soul: not a string; left unchanged");
6871
7166
  continue;
6872
7167
  }
6873
- if (path25__default.posix.basename(soul.replace(/\\/g, "/")).toLowerCase() === "soul.md") {
7168
+ if (path23__default.posix.basename(soul.replace(/\\/g, "/")).toLowerCase() === "soul.md") {
6874
7169
  notes.push("metadata.soul \u2192 dropped (SOUL.md is a convention file)");
6875
7170
  } else {
6876
7171
  derived.push({ kind: "persona", ref: soul });
@@ -7104,7 +7399,7 @@ function migrateSubagents(skaileYamlPath, source) {
7104
7399
  if (!isMap(agentNode)) return void 0;
7105
7400
  const subNode = agentNode.get("subagents", true);
7106
7401
  if (!isMap(subNode)) return void 0;
7107
- const dir = path25__default.dirname(skaileYamlPath);
7402
+ const dir = path23__default.dirname(skaileYamlPath);
7108
7403
  const notes = [];
7109
7404
  const manual = [];
7110
7405
  const changes = [];
@@ -7122,10 +7417,10 @@ function migrateSubagents(skaileYamlPath, source) {
7122
7417
  continue;
7123
7418
  }
7124
7419
  const id = instanceId(name);
7125
- const assetDir = path25__default.join(dir, ".skaile", "agents", id);
7420
+ const assetDir = path23__default.join(dir, ".skaile", "agents", id);
7126
7421
  if (takenIds.has(id) || existsSync(assetDir)) {
7127
7422
  manual.push(
7128
- `agent.subagents.${name}: ${takenIds.has(id) ? `agents.${id} already exists` : `${path25__default.relative(dir, assetDir)} already exists`}; left in place`
7423
+ `agent.subagents.${name}: ${takenIds.has(id) ? `agents.${id} already exists` : `${path23__default.relative(dir, assetDir)} already exists`}; left in place`
7129
7424
  );
7130
7425
  continue;
7131
7426
  }
@@ -7149,13 +7444,13 @@ function migrateSubagents(skaileYamlPath, source) {
7149
7444
  manifest.tools = { ...allowed ? { allowed } : {}, ...denied ? { denied } : {} };
7150
7445
  }
7151
7446
  const text = stringify(manifest, { lineWidth: 0 });
7152
- const manifestPath = path25__default.join(assetDir, "agent.yaml");
7447
+ const manifestPath = path23__default.join(assetDir, "agent.yaml");
7153
7448
  changes.push({ type: "create", path: manifestPath, after: text });
7154
7449
  assetManifests.push({ file: manifestPath, text });
7155
7450
  if (typeof spec.prompt === "string" && spec.prompt.trim() !== "") {
7156
7451
  changes.push({
7157
7452
  type: "create",
7158
- path: path25__default.join(assetDir, "SOUL.md"),
7453
+ path: path23__default.join(assetDir, "SOUL.md"),
7159
7454
  after: `${spec.prompt.replace(/\s+$/, "")}
7160
7455
  `
7161
7456
  });
@@ -7214,7 +7509,7 @@ function validateMigratedAgent(text, registry) {
7214
7509
  function collectAgentFiles(paths) {
7215
7510
  const files = /* @__PURE__ */ new Set();
7216
7511
  for (const input of paths) {
7217
- const abs = path25__default.resolve(input);
7512
+ const abs = path23__default.resolve(input);
7218
7513
  if (!existsSync(abs)) continue;
7219
7514
  if (statSync(abs).isDirectory()) {
7220
7515
  for (const f of walkFiles(abs, (b) => b === "agent.yaml" || b === "skaile.yaml"))
@@ -7231,7 +7526,7 @@ function planAgentMigration(options) {
7231
7526
  const reports = [];
7232
7527
  for (const file of collectAgentFiles(options.paths)) {
7233
7528
  const source = readText(file);
7234
- const base = path25__default.basename(file);
7529
+ const base = path23__default.basename(file);
7235
7530
  if (base === "skaile.yaml") {
7236
7531
  const result = migrateSubagents(file, source);
7237
7532
  if (!result) continue;
@@ -7239,7 +7534,7 @@ function planAgentMigration(options) {
7239
7534
  for (const asset of result.assetManifests) {
7240
7535
  const v = validateMigratedAgent(asset.text, options.registry);
7241
7536
  validation2.errors.push(
7242
- ...v.errors.map((e) => `${path25__default.basename(path25__default.dirname(asset.file))}: ${e}`)
7537
+ ...v.errors.map((e) => `${path23__default.basename(path23__default.dirname(asset.file))}: ${e}`)
7243
7538
  );
7244
7539
  validation2.warnings.push(...v.warnings);
7245
7540
  }
@@ -7267,7 +7562,7 @@ function planAgentMigration(options) {
7267
7562
  });
7268
7563
  continue;
7269
7564
  }
7270
- migration = migrateAgentYaml(source, { agentDir: path25__default.dirname(file), knownKinds });
7565
+ migration = migrateAgentYaml(source, { agentDir: path23__default.dirname(file), knownKinds });
7271
7566
  } catch (error) {
7272
7567
  reports.push({
7273
7568
  file,
@@ -7296,7 +7591,7 @@ function planAgentMigration(options) {
7296
7591
  }
7297
7592
  var DEFAULT_PUBLISHER = "skaile-ai";
7298
7593
  var FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
7299
- var posix2 = (p6) => p6.split(path25__default.sep).join("/");
7594
+ var posix2 = (p6) => p6.split(path23__default.sep).join("/");
7300
7595
  var MOVED_KINDS = { persona: "PERSONA.md", ruleset: "RULESET.md" };
7301
7596
  var KIND_MANIFEST_FILES = /* @__PURE__ */ new Set(["PERSONA.md", "RULESET.md", "SKILL.md"]);
7302
7597
  function readFrontmatterType(text) {
@@ -7327,14 +7622,14 @@ function planMarkdownMoves(root, knownKinds, manual, unknownTypes) {
7327
7622
  if (!text.startsWith("---")) continue;
7328
7623
  const found = readFrontmatterType(text);
7329
7624
  if (!found) continue;
7330
- const base = path25__default.basename(file);
7331
- const inAgentParts = file.split(path25__default.sep).includes("_agent-parts");
7625
+ const base = path23__default.basename(file);
7626
+ const inAgentParts = file.split(path23__default.sep).includes("_agent-parts");
7332
7627
  const targetName = MOVED_KINDS[found.type];
7333
7628
  if (targetName !== void 0 && !KIND_MANIFEST_FILES.has(base)) {
7334
- const to = path25__default.join(path25__default.dirname(file), base.replace(/\.md$/i, ""), targetName);
7629
+ const to = path23__default.join(path23__default.dirname(file), base.replace(/\.md$/i, ""), targetName);
7335
7630
  if (existsSync(to) || targets.has(to)) {
7336
7631
  manual.push(
7337
- `${posix2(path25__default.relative(root, file))}: ${posix2(path25__default.relative(root, to))} already exists; not moved`
7632
+ `${posix2(path23__default.relative(root, file))}: ${posix2(path23__default.relative(root, to))} already exists; not moved`
7338
7633
  );
7339
7634
  continue;
7340
7635
  }
@@ -7355,13 +7650,13 @@ function planAgentRefRewrites(root, moves, knownKinds, notes) {
7355
7650
  const changes = [];
7356
7651
  for (const file of walkFiles(root, (b) => b === "agent.yaml")) {
7357
7652
  const source = readText(file);
7358
- const agentDir = path25__default.dirname(file);
7653
+ const agentDir = path23__default.dirname(file);
7359
7654
  let hits = 0;
7360
7655
  const refRewrite = (_kind, ref) => {
7361
- const moved = byOldPath.get(path25__default.resolve(agentDir, ref));
7656
+ const moved = byOldPath.get(path23__default.resolve(agentDir, ref));
7362
7657
  if (moved === void 0) return ref;
7363
7658
  hits++;
7364
- const rel = posix2(path25__default.relative(agentDir, moved));
7659
+ const rel = posix2(path23__default.relative(agentDir, moved));
7365
7660
  return rel.startsWith(".") ? rel : `./${rel}`;
7366
7661
  };
7367
7662
  let output;
@@ -7378,7 +7673,7 @@ function planAgentRefRewrites(root, moves, knownKinds, notes) {
7378
7673
  if (hits === 0 || output === source) continue;
7379
7674
  changes.push({ type: "write", path: file, before: source, after: output });
7380
7675
  notes.push(
7381
- `${posix2(path25__default.relative(root, file))}: persona/ruleset refs \u2192 composes items at the new paths`
7676
+ `${posix2(path23__default.relative(root, file))}: persona/ruleset refs \u2192 composes items at the new paths`
7382
7677
  );
7383
7678
  }
7384
7679
  return changes;
@@ -7403,14 +7698,14 @@ function presetText(name, description, refs, publisher) {
7403
7698
  }
7404
7699
  function skillDirs(dir) {
7405
7700
  try {
7406
- return readdirSync(path25__default.join(dir, "skills"), { withFileTypes: true }).filter((e) => e.isDirectory() && existsSync(path25__default.join(dir, "skills", e.name, "SKILL.md"))).map((e) => e.name).sort();
7701
+ return readdirSync(path23__default.join(dir, "skills"), { withFileTypes: true }).filter((e) => e.isDirectory() && existsSync(path23__default.join(dir, "skills", e.name, "SKILL.md"))).map((e) => e.name).sort();
7407
7702
  } catch {
7408
7703
  return [];
7409
7704
  }
7410
7705
  }
7411
7706
  function repoPublisher(root) {
7412
7707
  for (const name of ["skaile.manifest.yaml", "skaile.yaml"]) {
7413
- const file = path25__default.join(root, name);
7708
+ const file = path23__default.join(root, name);
7414
7709
  if (!existsSync(file)) continue;
7415
7710
  try {
7416
7711
  const parsed = parse(readText(file));
@@ -7426,9 +7721,9 @@ function planBundles(root, skaileYamls, publisher, notes, manual) {
7426
7721
  const changes = [];
7427
7722
  const presets = [];
7428
7723
  const handled = /* @__PURE__ */ new Set();
7429
- const rel = (p6) => posix2(path25__default.relative(root, p6));
7724
+ const rel = (p6) => posix2(path23__default.relative(root, p6));
7430
7725
  const convert = (name, bundleFile, dir) => {
7431
- const target = path25__default.join(dir, `${name}.preset.yaml`);
7726
+ const target = path23__default.join(dir, `${name}.preset.yaml`);
7432
7727
  if (existsSync(target)) {
7433
7728
  manual.push(`${rel(target)} already exists; bundle ${name} not converted`);
7434
7729
  return;
@@ -7454,7 +7749,7 @@ function planBundles(root, skaileYamls, publisher, notes, manual) {
7454
7749
  }
7455
7750
  if (refs.length === 0) {
7456
7751
  manual.push(
7457
- `bundle ${name}: no dependencies found${bundleFile ? ` in ${rel(bundleFile)}` : ` and no skills under ${rel(path25__default.join(dir, "skills"))}`}; no preset generated`
7752
+ `bundle ${name}: no dependencies found${bundleFile ? ` in ${rel(bundleFile)}` : ` and no skills under ${rel(path23__default.join(dir, "skills"))}`}; no preset generated`
7458
7753
  );
7459
7754
  return;
7460
7755
  }
@@ -7476,18 +7771,18 @@ function planBundles(root, skaileYamls, publisher, notes, manual) {
7476
7771
  const assets = Array.isArray(raw.assets) ? raw.assets : [];
7477
7772
  for (const entry of assets) {
7478
7773
  if (!isRecord(entry) || entry.kind !== "bundle" || typeof entry.name !== "string") continue;
7479
- const baseDir = path25__default.dirname(file);
7480
- const entryRoot = typeof entry.root === "string" ? path25__default.join(baseDir, entry.root) : baseDir;
7774
+ const baseDir = path23__default.dirname(file);
7775
+ const entryRoot = typeof entry.root === "string" ? path23__default.join(baseDir, entry.root) : baseDir;
7481
7776
  const files = Array.isArray(entry.files) ? entry.files : [];
7482
7777
  const bundleName = files.find(
7483
7778
  (f) => typeof f === "string" && f.endsWith(".bundle.yaml")
7484
7779
  );
7485
- convert(entry.name, bundleName ? path25__default.join(entryRoot, bundleName) : void 0, entryRoot);
7780
+ convert(entry.name, bundleName ? path23__default.join(entryRoot, bundleName) : void 0, entryRoot);
7486
7781
  }
7487
7782
  }
7488
7783
  for (const bundleFile of walkFiles(root, (b) => b.endsWith(".bundle.yaml"))) {
7489
7784
  if (handled.has(bundleFile)) continue;
7490
- const base = path25__default.basename(bundleFile);
7785
+ const base = path23__default.basename(bundleFile);
7491
7786
  let name = base.replace(/\.bundle\.yaml$/, "");
7492
7787
  try {
7493
7788
  const parsed = parse(readText(bundleFile));
@@ -7496,7 +7791,7 @@ function planBundles(root, skaileYamls, publisher, notes, manual) {
7496
7791
  } catch {
7497
7792
  }
7498
7793
  if (presets.some((p6) => p6.bundleFile === bundleFile)) continue;
7499
- convert(name, bundleFile, path25__default.dirname(bundleFile));
7794
+ convert(name, bundleFile, path23__default.dirname(bundleFile));
7500
7795
  }
7501
7796
  return changes;
7502
7797
  }
@@ -7506,8 +7801,8 @@ function planSkaileYaml(root, file, source, notes, manual) {
7506
7801
  if (doc.errors.length > 0 || !isMap(doc.contents)) return [];
7507
7802
  const map = doc.contents;
7508
7803
  const raw = doc.toJS();
7509
- const dir = path25__default.dirname(file);
7510
- const rel = (p6) => posix2(path25__default.relative(root, p6));
7804
+ const dir = path23__default.dirname(file);
7805
+ const rel = (p6) => posix2(path23__default.relative(root, p6));
7511
7806
  const changes = [];
7512
7807
  let changed = false;
7513
7808
  const deps = map.get("dependencies", true);
@@ -7524,7 +7819,7 @@ function planSkaileYaml(root, file, source, notes, manual) {
7524
7819
  const hasPublication = PUBLICATION_KEYS.some((k) => raw[k] !== void 0);
7525
7820
  let remove = false;
7526
7821
  if (hasPublication) {
7527
- const manifestPath = path25__default.join(dir, "skaile.manifest.yaml");
7822
+ const manifestPath = path23__default.join(dir, "skaile.manifest.yaml");
7528
7823
  if (existsSync(manifestPath)) {
7529
7824
  manual.push(
7530
7825
  `${rel(file)}: publisher/version/assets left in place \u2014 ${rel(manifestPath)} already exists; merge by hand`
@@ -7581,7 +7876,7 @@ function planSkaileYaml(root, file, source, notes, manual) {
7581
7876
  return changes;
7582
7877
  }
7583
7878
  function planAssetMigration(options) {
7584
- const root = path25__default.resolve(options.root);
7879
+ const root = path23__default.resolve(options.root);
7585
7880
  const knownKinds = new Set(options.registry.getAllKinds());
7586
7881
  const notes = [];
7587
7882
  const manual = [];
@@ -7589,7 +7884,7 @@ function planAssetMigration(options) {
7589
7884
  const { moves, changes: moveChanges } = planMarkdownMoves(root, knownKinds, manual, unknownTypes);
7590
7885
  for (const move of moves) {
7591
7886
  notes.push(
7592
- `${posix2(path25__default.relative(root, move.from))} \u2192 ${posix2(path25__default.relative(root, move.to))} (${move.kind})`
7887
+ `${posix2(path23__default.relative(root, move.from))} \u2192 ${posix2(path23__default.relative(root, move.to))} (${move.kind})`
7593
7888
  );
7594
7889
  }
7595
7890
  const agentChanges = planAgentRefRewrites(root, moves, knownKinds, notes);
@@ -7601,7 +7896,7 @@ function planAssetMigration(options) {
7601
7896
  const raw = parse(source);
7602
7897
  if (isRecord(raw)) skaileYamls.push({ file, source, raw });
7603
7898
  } catch {
7604
- manual.push(`${posix2(path25__default.relative(root, file))}: invalid YAML; skipped`);
7899
+ manual.push(`${posix2(path23__default.relative(root, file))}: invalid YAML; skipped`);
7605
7900
  }
7606
7901
  }
7607
7902
  const publisher = repoPublisher(root);
@@ -7755,7 +8050,7 @@ function workspaceConfigFiles(dir) {
7755
8050
  } catch {
7756
8051
  return [];
7757
8052
  }
7758
- return names.filter((name) => isWorkspaceConfigFilename(name)).sort().map((name) => path25__default.join(dir, name));
8053
+ return names.filter((name) => isWorkspaceConfigFilename(name)).sort().map((name) => path23__default.join(dir, name));
7759
8054
  }
7760
8055
  function readAgentConfigBlock(raw) {
7761
8056
  const key = AGENT_CONFIG_KEYS.find((candidate) => raw[candidate] !== void 0);
@@ -7767,7 +8062,7 @@ function readAgentConfigBlock(raw) {
7767
8062
  return flat ? { key, profiles: { default: profiles }, flat } : { key, profiles, flat };
7768
8063
  }
7769
8064
  function planProviderMigration(options) {
7770
- const projectDir = path25__default.resolve(options.projectDir);
8065
+ const projectDir = path23__default.resolve(options.projectDir);
7771
8066
  const registryPath = options.workspace ? workspaceProviderRegistryPath(projectDir) : userProviderRegistryPath();
7772
8067
  const plan = {
7773
8068
  registryPath,
@@ -7783,7 +8078,7 @@ function planProviderMigration(options) {
7783
8078
  raw = parseDocument(readFileSync(file, "utf-8")).toJS() ?? {};
7784
8079
  } catch (error) {
7785
8080
  plan.warnings.push(
7786
- `${path25__default.basename(file)}: not valid YAML (${error instanceof Error ? error.message : String(error)}) \u2014 skipped`
8081
+ `${path23__default.basename(file)}: not valid YAML (${error instanceof Error ? error.message : String(error)}) \u2014 skipped`
7787
8082
  );
7788
8083
  continue;
7789
8084
  }
@@ -7832,7 +8127,7 @@ function planProviderMigration(options) {
7832
8127
  });
7833
8128
  if (!model) {
7834
8129
  plan.warnings.push(
7835
- `${path25__default.basename(file)}: profile '${profile}' had no model: \u2014 it now resolves against registry order. Pin it with 'model: ${providerId}/<modelId>'.`
8130
+ `${path23__default.basename(file)}: profile '${profile}' had no model: \u2014 it now resolves against registry order. Pin it with 'model: ${providerId}/<modelId>'.`
7836
8131
  );
7837
8132
  }
7838
8133
  touched = true;
@@ -7899,7 +8194,7 @@ function printPlan(plan) {
7899
8194
  for (const entry of plan.entries) {
7900
8195
  const base = entry.entry.base_url ?? S.dim("(transport-derived)");
7901
8196
  console.log(
7902
- ` ${S.label(`${path25__default.basename(entry.file)} ${entry.profile}`)} provider: ${entry.legacy.provider}, cloud: ${entry.legacy.cloud}`
8197
+ ` ${S.label(`${path23__default.basename(entry.file)} ${entry.profile}`)} provider: ${entry.legacy.provider}, cloud: ${entry.legacy.cloud}`
7903
8198
  );
7904
8199
  console.log(` \u2192 providers.yml ${S.bold(entry.providerId)} ${base}`);
7905
8200
  console.log(
@@ -7915,7 +8210,7 @@ function printPlan(plan) {
7915
8210
  console.log();
7916
8211
  }
7917
8212
  async function runMigrateProviders(opts) {
7918
- const projectDir = opts.projectDir ? path25__default.resolve(opts.projectDir) : process.cwd();
8213
+ const projectDir = opts.projectDir ? path23__default.resolve(opts.projectDir) : process.cwd();
7919
8214
  const plan = planProviderMigration({ projectDir, workspace: opts.workspace });
7920
8215
  for (const warning of plan.warnings) logWarn(warning);
7921
8216
  if (plan.entries.length === 0 && Object.keys(plan.providers).length === 0) {
@@ -8046,7 +8341,7 @@ async function runMigrateAgents(paths, opts) {
8046
8341
  let failures = 0;
8047
8342
  let manualCount = 0;
8048
8343
  for (const report of plan.reports) {
8049
- const rel = path25__default.relative(base, report.file) || report.file;
8344
+ const rel = path23__default.relative(base, report.file) || report.file;
8050
8345
  for (const note of report.notes) console.log(` ${S.label(rel)} ${note}`);
8051
8346
  for (const note of report.manual) {
8052
8347
  manualCount++;
@@ -8073,14 +8368,14 @@ async function runMigrateAssets(root, opts) {
8073
8368
  const write = resolveMode(opts);
8074
8369
  const base = process.cwd();
8075
8370
  const plan = planAssetMigration({
8076
- root: path25__default.resolve(root ?? base),
8371
+ root: path23__default.resolve(root ?? base),
8077
8372
  registry: getKindRegistry()
8078
8373
  });
8079
8374
  for (const note of plan.notes) console.log(` ${note}`);
8080
8375
  for (const note of plan.manual) logWarn(note);
8081
8376
  for (const { file, type } of plan.unknownTypes) {
8082
8377
  logWarn(
8083
- `${path25__default.relative(base, file) || file}: frontmatter type "${type}" is not a registered asset kind (reported, not rewritten)`
8378
+ `${path23__default.relative(base, file) || file}: frontmatter type "${type}" is not a registered asset kind (reported, not rewritten)`
8084
8379
  );
8085
8380
  }
8086
8381
  printChanges(plan.changes, base);
@@ -8103,8 +8398,8 @@ function makeNpxCommand() {
8103
8398
  skills.command("add <url>").description(
8104
8399
  "Clone a repo, register it in the project's skaile.yaml sources[], and install a skill from it"
8105
8400
  ).requiredOption("--skill <name>", "Skill name to install from the repo").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", `Agent framework (${TARGET_DEFAULT_HINT})`).option("--global", "Deploy globally").action(async (url, opts) => {
8106
- const projectDir = path25__default.resolve(opts.projectDir);
8107
- const projYaml = path25__default.join(projectDir, "skaile.yaml");
8401
+ const projectDir = path23__default.resolve(opts.projectDir);
8402
+ const projYaml = path23__default.join(projectDir, "skaile.yaml");
8108
8403
  if (!existsSync(projYaml)) {
8109
8404
  logErr(`No skaile.yaml in ${projectDir} \u2014 run \`skaile init\` first.`);
8110
8405
  process.exit(1);
@@ -8117,11 +8412,11 @@ function makeNpxCommand() {
8117
8412
  }
8118
8413
  const spinner = createSpinner();
8119
8414
  const key = sourceCacheKey(url);
8120
- const clonePath = path25__default.join(getGlobalCacheDir(), key);
8415
+ const clonePath = path23__default.join(getGlobalCacheDir(), key);
8121
8416
  spinner.start(`Cloning ${url}`);
8122
8417
  try {
8123
8418
  if (!existsSync(clonePath)) {
8124
- mkdirSync(path25__default.dirname(clonePath), { recursive: true });
8419
+ mkdirSync(path23__default.dirname(clonePath), { recursive: true });
8125
8420
  execSync(`git clone ${url} ${clonePath}`, { stdio: "ignore" });
8126
8421
  }
8127
8422
  spinner.stop(`Cloned to ${key}`);
@@ -8176,7 +8471,7 @@ function makeNpxCommand() {
8176
8471
  return npx;
8177
8472
  }
8178
8473
  function resolvePublisher(clonePath, url) {
8179
- const manifestPath = path25__default.join(clonePath, SKAILE_MANIFEST_FILENAME);
8474
+ const manifestPath = path23__default.join(clonePath, SKAILE_MANIFEST_FILENAME);
8180
8475
  if (existsSync(manifestPath)) {
8181
8476
  try {
8182
8477
  const { manifest } = decodeSkaileManifest(readFileSync(manifestPath, "utf8"));
@@ -8189,12 +8484,12 @@ function resolvePublisher(clonePath, url) {
8189
8484
  return url.match(/github\.com[/:]([^/]+)\/[^/]+/)?.[1];
8190
8485
  }
8191
8486
  function resolveSkillName(clonePath, requested) {
8192
- const skillsDir = path25__default.join(clonePath, "skills");
8193
- if (existsSync(path25__default.join(skillsDir, requested, "SKILL.md"))) return requested;
8487
+ const skillsDir = path23__default.join(clonePath, "skills");
8488
+ if (existsSync(path23__default.join(skillsDir, requested, "SKILL.md"))) return requested;
8194
8489
  if (!existsSync(skillsDir)) return requested;
8195
8490
  for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
8196
8491
  if (!entry.isDirectory()) continue;
8197
- const md = path25__default.join(skillsDir, entry.name, "SKILL.md");
8492
+ const md = path23__default.join(skillsDir, entry.name, "SKILL.md");
8198
8493
  if (!existsSync(md)) continue;
8199
8494
  try {
8200
8495
  const { data } = parseFrontmatter(readFileSync(md, "utf8"));
@@ -8225,7 +8520,7 @@ function makeOutdatedCommand() {
8225
8520
  ).action(async (filter, opts) => {
8226
8521
  const am2 = new AssetManager({
8227
8522
  registry: getKindRegistry(),
8228
- projectDir: path25__default.resolve(opts.projectDir),
8523
+ projectDir: path23__default.resolve(opts.projectDir),
8229
8524
  driverTarget: opts.target
8230
8525
  });
8231
8526
  const entries = await am2.outdated();
@@ -8243,7 +8538,7 @@ function makeOutdatedCommand() {
8243
8538
  console.log(S.heading(" Outdated Assets"));
8244
8539
  console.log(` ${S.rule(refW + 34)}`);
8245
8540
  for (const e of filtered) {
8246
- const status4 = e.problem !== void 0 ? e.problem : e.library !== void 0 ? `${e.currentVersion} \u2192 ${e.latestVersion} ${S.dim(`(library ${e.library})`)}` : `${e.behind} commit(s) behind`;
8541
+ const status4 = e.problem !== void 0 ? e.problem : e.contentChanged ? `${e.currentVersion} content changed since lock ${S.dim(`(library ${e.library})`)}` : e.library !== void 0 ? `${e.currentVersion} \u2192 ${e.latestVersion} ${S.dim(`(library ${e.library})`)}` : `${e.behind} commit(s) behind`;
8247
8542
  console.log(
8248
8543
  ` ${colorRef(outdatedRef(e))}${" ".repeat(refW - outdatedRef(e).length)} ${e.problem !== void 0 ? pc5.red(status4) : pc5.yellow(status4)}`
8249
8544
  );
@@ -8262,7 +8557,7 @@ function makePatchCommand() {
8262
8557
  cmd.command("extract <ref>").alias("start").description("Extract asset for local editing").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
8263
8558
  const am2 = new AssetManager({
8264
8559
  registry: getKindRegistry(),
8265
- projectDir: path25__default.resolve(opts.projectDir)
8560
+ projectDir: path23__default.resolve(opts.projectDir)
8266
8561
  });
8267
8562
  try {
8268
8563
  const dest = await am2.patch(ref);
@@ -8276,7 +8571,7 @@ function makePatchCommand() {
8276
8571
  cmd.command("commit <ref>").description("Generate .patch file from edits").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
8277
8572
  const am2 = new AssetManager({
8278
8573
  registry: getKindRegistry(),
8279
- projectDir: path25__default.resolve(opts.projectDir)
8574
+ projectDir: path23__default.resolve(opts.projectDir)
8280
8575
  });
8281
8576
  try {
8282
8577
  const patchFile = await am2.patchCommit(ref);
@@ -8290,7 +8585,7 @@ function makePatchCommand() {
8290
8585
  cmd.command("submit <ref>").description("Apply patch to repo clone and prepare for PR").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
8291
8586
  const am2 = new AssetManager({
8292
8587
  registry: getKindRegistry(),
8293
- projectDir: path25__default.resolve(opts.projectDir)
8588
+ projectDir: path23__default.resolve(opts.projectDir)
8294
8589
  });
8295
8590
  try {
8296
8591
  await am2.patchSubmit(ref);
@@ -8306,7 +8601,7 @@ function makePatchCommand() {
8306
8601
  cmd.command("remove <ref>").description("Remove local patch after upstream merge").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
8307
8602
  const am2 = new AssetManager({
8308
8603
  registry: getKindRegistry(),
8309
- projectDir: path25__default.resolve(opts.projectDir)
8604
+ projectDir: path23__default.resolve(opts.projectDir)
8310
8605
  });
8311
8606
  am2.patchRemove(ref);
8312
8607
  logOk(`Patch removed for ${ref}`);
@@ -8325,7 +8620,7 @@ function action2(fn) {
8325
8620
  };
8326
8621
  }
8327
8622
  async function reconcileAndReport(projectDir, plugins) {
8328
- const { reconcilePlugins } = await import('../plugin-store-66QFBNEO.js');
8623
+ const { reconcilePlugins } = await import('../plugin-store-WI4MZJLP.js');
8329
8624
  if (plugins.length === 0) {
8330
8625
  logInfo("No plugins declared \u2014 nothing to reconcile.");
8331
8626
  return;
@@ -8339,10 +8634,10 @@ async function reconcileAndReport(projectDir, plugins) {
8339
8634
  }
8340
8635
  }
8341
8636
  async function runInstall2(spec, opts) {
8342
- const projectDir = path25__default.resolve(opts.projectDir);
8637
+ const projectDir = path23__default.resolve(opts.projectDir);
8343
8638
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
8344
- const { specName } = await import('../plugin-store-66QFBNEO.js');
8345
- const yamlPath = path25__default.join(projectDir, "skaile.yaml");
8639
+ const { specName } = await import('../plugin-store-WI4MZJLP.js');
8640
+ const yamlPath = path23__default.join(projectDir, "skaile.yaml");
8346
8641
  const editor = WorkspaceYamlEditor2.load(yamlPath);
8347
8642
  const replaced = editor.addPlugin(spec, specName);
8348
8643
  editor.save();
@@ -8351,10 +8646,10 @@ async function runInstall2(spec, opts) {
8351
8646
  await reconcileAndReport(projectDir, editor.getPlugins());
8352
8647
  }
8353
8648
  async function runRemove(name, opts) {
8354
- const projectDir = path25__default.resolve(opts.projectDir);
8649
+ const projectDir = path23__default.resolve(opts.projectDir);
8355
8650
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
8356
- const { specName } = await import('../plugin-store-66QFBNEO.js');
8357
- const yamlPath = path25__default.join(projectDir, "skaile.yaml");
8651
+ const { specName } = await import('../plugin-store-WI4MZJLP.js');
8652
+ const yamlPath = path23__default.join(projectDir, "skaile.yaml");
8358
8653
  const editor = WorkspaceYamlEditor2.load(yamlPath);
8359
8654
  const removed = editor.removePlugin(name, specName);
8360
8655
  if (!removed) {
@@ -8366,7 +8661,7 @@ async function runRemove(name, opts) {
8366
8661
  await reconcileAndReport(projectDir, editor.getPlugins());
8367
8662
  }
8368
8663
  async function runList(opts) {
8369
- const projectDir = path25__default.resolve(opts.projectDir);
8664
+ const projectDir = path23__default.resolve(opts.projectDir);
8370
8665
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
8371
8666
  const config = resolveSkWorkspaceConfig2(projectDir);
8372
8667
  const declared = config.plugins ?? [];
@@ -8381,7 +8676,7 @@ async function runList(opts) {
8381
8676
  const registry = createPluginRegistry();
8382
8677
  if (declared.length > 0) {
8383
8678
  try {
8384
- const { loadPlugins } = await import('../plugin-store-66QFBNEO.js');
8679
+ const { loadPlugins } = await import('../plugin-store-WI4MZJLP.js');
8385
8680
  const result = await loadPlugins(projectDir, declared, registry);
8386
8681
  for (const f of result.failed) logWarn(f.error);
8387
8682
  } catch (err2) {
@@ -8556,7 +8851,7 @@ function neededSources(config, lock) {
8556
8851
  }
8557
8852
  function sourcesWithSidecar(sources) {
8558
8853
  const dir = getStoreManifestsDir();
8559
- return sources.filter((s) => existsSync(path25.join(dir, `${storeManifestSlug(s.url)}.yaml`))).map((s) => s.url);
8854
+ return sources.filter((s) => existsSync(path23.join(dir, `${storeManifestSlug(s.url)}.yaml`))).map((s) => s.url);
8560
8855
  }
8561
8856
  function compact(obj) {
8562
8857
  const out = {};
@@ -8672,7 +8967,7 @@ function makePresetCommand() {
8672
8967
  cmd.command("init [name]").description("Scaffold a new .preset.yaml file").option("--dir <path>", "Output directory", process.cwd()).action(async (name, opts) => {
8673
8968
  const presetName = name ?? "my-preset";
8674
8969
  const filename = `${presetName}.preset.yaml`;
8675
- const outPath = path25__default.join(path25__default.resolve(opts.dir), filename);
8970
+ const outPath = path23__default.join(path23__default.resolve(opts.dir), filename);
8676
8971
  if (existsSync(outPath)) {
8677
8972
  logErr(`File already exists: ${outPath}`);
8678
8973
  logInfo("Choose a different name or remove the existing file.");
@@ -8705,7 +9000,7 @@ function makePresetCommand() {
8705
9000
  return cmd;
8706
9001
  }
8707
9002
  async function runPresetExport(name, opts) {
8708
- const projectDir = path25__default.resolve(opts.projectDir);
9003
+ const projectDir = path23__default.resolve(opts.projectDir);
8709
9004
  const file = loadSkWorkspaceConfig(projectDir);
8710
9005
  if (!file) {
8711
9006
  logErr(`No skaile.yaml found in ${projectDir}`);
@@ -8715,7 +9010,7 @@ async function runPresetExport(name, opts) {
8715
9010
  const presetName = name ?? file.config.name ?? "my-preset";
8716
9011
  let lock = null;
8717
9012
  try {
8718
- lock = readLock(path25__default.join(projectDir, "skaile.lock.yaml"));
9013
+ lock = readLock(path23__default.join(projectDir, "skaile.lock.yaml"));
8719
9014
  } catch {
8720
9015
  lock = null;
8721
9016
  }
@@ -8756,7 +9051,7 @@ async function runPresetExport(name, opts) {
8756
9051
  const contents = header ? `${header}
8757
9052
  ${body}` : body;
8758
9053
  if (opts.out && opts.dir !== process.cwd()) logWarn("--dir is ignored when --out is set.");
8759
- const outPath = opts.out ? path25__default.resolve(opts.out) : path25__default.join(path25__default.resolve(opts.dir), `${presetName}.preset.yaml`);
9054
+ const outPath = opts.out ? path23__default.resolve(opts.out) : path23__default.join(path23__default.resolve(opts.dir), `${presetName}.preset.yaml`);
8760
9055
  if (existsSync(outPath) && !opts.force) {
8761
9056
  logErr(`File already exists: ${outPath}`);
8762
9057
  logInfo("Pass --force to overwrite, or choose a different --out/--dir.");
@@ -8768,7 +9063,7 @@ ${body}` : body;
8768
9063
  logErr(`Failed to write ${outPath}: ${e.message}`);
8769
9064
  process.exit(1);
8770
9065
  }
8771
- logOk(`Exported ${S.brand(path25__default.basename(outPath))}`);
9066
+ logOk(`Exported ${S.brand(path23__default.basename(outPath))}`);
8772
9067
  logInfo(`Path: ${outPath}`);
8773
9068
  if (unresolved.length > 0) {
8774
9069
  console.error(S.err("This file is NOT safe to share."));
@@ -8809,13 +9104,13 @@ function collectInput(value, acc) {
8809
9104
  return acc;
8810
9105
  }
8811
9106
  async function runPresetApply(filePath, opts) {
8812
- const projectDir = path25__default.resolve(opts.projectDir);
9107
+ const projectDir = path23__default.resolve(opts.projectDir);
8813
9108
  const file = loadSkWorkspaceConfig(projectDir);
8814
9109
  if (!file) {
8815
9110
  logErr("No skaile.yaml \u2014 run `skaile init` first");
8816
9111
  process.exit(1);
8817
9112
  }
8818
- const resolved = path25__default.resolve(filePath);
9113
+ const resolved = path23__default.resolve(filePath);
8819
9114
  if (!existsSync(resolved)) {
8820
9115
  logErr(`File not found: ${resolved}`);
8821
9116
  process.exit(1);
@@ -8994,7 +9289,7 @@ async function runPresetInstall(projectDir) {
8994
9289
  logInfo("Installing new dependencies\u2026");
8995
9290
  const result = await am2.install({});
8996
9291
  for (const d of result.deployed) logOk(d);
8997
- for (const m of result.missing) logErr(`Missing: ${m}`);
9292
+ for (const m of result.missing) logErr(`Missing: ${m}${result.missingHints?.[m] ?? ""}`);
8998
9293
  await reportInstalledSoftDeps(am2);
8999
9294
  } catch (err2) {
9000
9295
  logErr(`Install failed: ${err2 instanceof Error ? err2.message : String(err2)}`);
@@ -9031,7 +9326,7 @@ async function reportNestedPresetRefs(preset) {
9031
9326
  }
9032
9327
  async function checkPresetCycles(preset, resolved) {
9033
9328
  const { detectCycles } = await import('../discovery/index.js');
9034
- const presetRef = path25__default.basename(resolved, ".preset.yaml");
9329
+ const presetRef = path23__default.basename(resolved, ".preset.yaml");
9035
9330
  const edges = [];
9036
9331
  for (const item of preset.items) {
9037
9332
  if (item.ref) {
@@ -9083,7 +9378,7 @@ function printPresetSummary(preset, placeholderCount, hasWarnings) {
9083
9378
  }
9084
9379
  }
9085
9380
  async function runPresetValidate(filePath) {
9086
- const resolved = path25__default.resolve(filePath);
9381
+ const resolved = path23__default.resolve(filePath);
9087
9382
  const preset = await loadPresetForValidation(resolved);
9088
9383
  await reportNestedPresetRefs(preset);
9089
9384
  await checkPresetCycles(preset, resolved);
@@ -9133,11 +9428,11 @@ items:
9133
9428
  }
9134
9429
  function makeRebuildCommand() {
9135
9430
  return new Command("rebuild").description("Re-snapshot inline-snapshot composition items and bump prompt version").argument("[agent]", "Agent name or path (defaults to current project agent)").option("--project-dir <dir>", "Project directory", process.cwd()).action(async (agentArg, opts) => {
9136
- const projectDir = path25__default.resolve(opts.projectDir);
9431
+ const projectDir = path23__default.resolve(opts.projectDir);
9137
9432
  let agentDir;
9138
9433
  if (agentArg) {
9139
9434
  if (agentArg.includes("/") || agentArg.includes("\\")) {
9140
- agentDir = path25__default.resolve(projectDir, agentArg);
9435
+ agentDir = path23__default.resolve(projectDir, agentArg);
9141
9436
  } else {
9142
9437
  let resolved;
9143
9438
  try {
@@ -9146,7 +9441,7 @@ function makeRebuildCommand() {
9146
9441
  if (!(err2 instanceof AgentRefResolutionError)) throw err2;
9147
9442
  logWarn(`${err2.message} \u2014 using "${agentArg}"`);
9148
9443
  }
9149
- agentDir = resolved ?? path25__default.resolve(projectDir, agentArg);
9444
+ agentDir = resolved ?? path23__default.resolve(projectDir, agentArg);
9150
9445
  }
9151
9446
  } else {
9152
9447
  let resolved;
@@ -9216,9 +9511,9 @@ Try a different harness with \`--driver claude-sdk\`.`;
9216
9511
  // cli/src/commands/run.ts
9217
9512
  function resolveSingleShotAgentDir(projectDir, agentDefinition) {
9218
9513
  if (!agentDefinition) return resolveAgentDir(projectDir);
9219
- const asPath = agentDefinition.endsWith("agent.yaml") ? path25__default.dirname(path25__default.resolve(projectDir, agentDefinition)) : agentDefinition;
9514
+ const asPath = agentDefinition.endsWith("agent.yaml") ? path23__default.dirname(path23__default.resolve(projectDir, agentDefinition)) : agentDefinition;
9220
9515
  const dir = resolveAgentDefinitionDir(projectDir, asPath);
9221
- if (!dir || !fs11__default.existsSync(path25__default.join(dir, "agent.yaml"))) {
9516
+ if (!dir || !fs9__default.existsSync(path23__default.join(dir, "agent.yaml"))) {
9222
9517
  throw new Error(
9223
9518
  `--agent-definition "${agentDefinition}" does not resolve to an agent directory with agent.yaml${dir ? ` (looked in ${dir})` : ""}`
9224
9519
  );
@@ -9317,7 +9612,7 @@ function makeRunCommand() {
9317
9612
  "--agent-definition <ref|path>",
9318
9613
  "Agent asset for this one invocation (agent:@pub/name, ai-assets://\u2026, or a directory with agent.yaml); single-shot prompts only"
9319
9614
  ).option("--skill <name>", "Skill name (for single-shot mode)").action(async (positional, opts) => {
9320
- const projectDir = path25__default.resolve(opts.projectDir);
9615
+ const projectDir = path23__default.resolve(opts.projectDir);
9321
9616
  const cliDriver = opts.driver;
9322
9617
  const dryRun = opts.dryRun ?? false;
9323
9618
  const agentDefinition = opts.agentDefinition?.trim() || void 0;
@@ -9436,7 +9731,7 @@ function makeRunCommand() {
9436
9731
  }
9437
9732
  function makeResumeCommand() {
9438
9733
  const cmd = new Command("resume").description("Resume current session").option("--project-dir <path>", "Project directory", process.cwd()).option("--session <run-id>", "Target session by runId").option("--dry-run", "Print plan without executing").action(async (opts) => {
9439
- const projectDir = path25__default.resolve(opts.projectDir);
9734
+ const projectDir = path23__default.resolve(opts.projectDir);
9440
9735
  const sessionId = opts.session;
9441
9736
  const dryRun = opts.dryRun ?? false;
9442
9737
  const session = sessionId ? await loadSessionById(projectDir, sessionId) : await loadSession(projectDir);
@@ -9463,7 +9758,7 @@ function makeResumeCommand() {
9463
9758
  }
9464
9759
  function makeStatusCommand() {
9465
9760
  return new Command("status").description("Show current session state").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
9466
- const projectDir = path25__default.resolve(opts.projectDir);
9761
+ const projectDir = path23__default.resolve(opts.projectDir);
9467
9762
  const session = await loadSession(projectDir);
9468
9763
  if (!session) {
9469
9764
  logInfo("No active session.");
@@ -9488,7 +9783,7 @@ function makeStatusCommand() {
9488
9783
  }
9489
9784
  function makeClearCommand() {
9490
9785
  return new Command("clear").description("Unset current session pointer").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
9491
- const projectDir = path25__default.resolve(opts.projectDir);
9786
+ const projectDir = path23__default.resolve(opts.projectDir);
9492
9787
  await clearSession(projectDir);
9493
9788
  logOk("Session cleared.");
9494
9789
  });
@@ -9498,7 +9793,7 @@ function makeReplCommand() {
9498
9793
  const { findWorkspaceRoot } = await import('../core/index.js');
9499
9794
  const { startRepl } = await import('../tui/index.js');
9500
9795
  const os2 = await import('os');
9501
- const userCwd = path25__default.resolve(opts.projectDir ?? process.cwd());
9796
+ const userCwd = path23__default.resolve(opts.projectDir ?? process.cwd());
9502
9797
  const workspaceRoot = findWorkspaceRoot(userCwd);
9503
9798
  let projectDir;
9504
9799
  let agentCwd;
@@ -9520,13 +9815,13 @@ function makeReplCommand() {
9520
9815
  p4.cancel("Cancelled.");
9521
9816
  process.exit(0);
9522
9817
  }
9523
- const tmpDir = fs11__default.mkdtempSync(path25__default.join(os2.tmpdir(), "skaile-repl-"));
9818
+ const tmpDir = fs9__default.mkdtempSync(path23__default.join(os2.tmpdir(), "skaile-repl-"));
9524
9819
  projectDir = tmpDir;
9525
9820
  agentCwd = userCwd;
9526
9821
  logOk(`Temporary workspace: ${S.cmd(tmpDir)}`);
9527
9822
  if (!driverOverride) {
9528
- const claudeDir = path25__default.join(os2.homedir(), ".claude");
9529
- if (fs11__default.existsSync(claudeDir)) {
9823
+ const claudeDir = path23__default.join(os2.homedir(), ".claude");
9824
+ if (fs9__default.existsSync(claudeDir)) {
9530
9825
  driverOverride = "claude-sdk";
9531
9826
  logInfo(`Detected ${S.cmd("~/.claude")} \u2192 using ${S.cmd("claude-sdk")} harness`);
9532
9827
  } else {
@@ -9598,12 +9893,12 @@ function makeServeCommand() {
9598
9893
  );
9599
9894
  }
9600
9895
  async function ensurePluginsLoadedForServe(projectDir) {
9601
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-R44RUTDY.js');
9896
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-KC5O7CML.js');
9602
9897
  try {
9603
9898
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
9604
9899
  const config = resolveSkWorkspaceConfig2(projectDir);
9605
9900
  if (!config.plugins || config.plugins.length === 0) return;
9606
- const { ensurePluginsLoaded } = await import('../plugin-store-66QFBNEO.js');
9901
+ const { ensurePluginsLoaded } = await import('../plugin-store-WI4MZJLP.js');
9607
9902
  const { pluginRegistry } = await import('../plugin-registry/index.js');
9608
9903
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
9609
9904
  if (result.loaded.length > 0) {
@@ -9617,14 +9912,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
9617
9912
  }
9618
9913
  }
9619
9914
  async function runCompileTest(opts) {
9620
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-R44RUTDY.js');
9915
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-KC5O7CML.js');
9621
9916
  const { tmpdir } = await import('os');
9622
9917
  const { dirname: dirname3, join: join7, resolve: resolve5 } = await import('path');
9623
9918
  const { fileURLToPath: fileURLToPath2 } = await import('url');
9624
9919
  const { unlinkSync, existsSync: existsSync18 } = await import('fs');
9625
9920
  const { spawn } = await import('child_process');
9626
9921
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
9627
- const { MONOREPO_ROOT } = await import('../paths-YUCP7K6U.js');
9922
+ const { MONOREPO_ROOT } = await import('../paths-JKEKXM52.js');
9628
9923
  if (MONOREPO_ROOT === null) {
9629
9924
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
9630
9925
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -10107,7 +10402,7 @@ function resolveMode2(opts) {
10107
10402
  if (opts.forceLocal && opts.forceRemote) {
10108
10403
  throw new Error("Cannot use both --local and --remote");
10109
10404
  }
10110
- const startDir = path25__default.resolve(opts.projectDir ?? process.cwd());
10405
+ const startDir = path23__default.resolve(opts.projectDir ?? process.cwd());
10111
10406
  const localDb = findLogsDb(startDir);
10112
10407
  if (opts.forceLocal) {
10113
10408
  if (!localDb) {
@@ -10140,14 +10435,14 @@ function resolveMode2(opts) {
10140
10435
  function findLogsDb(startDir) {
10141
10436
  let dir = startDir;
10142
10437
  for (let i = 0; i < MAX_WALK_LEVELS; i++) {
10143
- const candidate = path25__default.join(dir, ".skaile", "logs.db");
10438
+ const candidate = path23__default.join(dir, ".skaile", "logs.db");
10144
10439
  if (existsSync(candidate)) {
10145
10440
  try {
10146
10441
  if (statSync(candidate).isFile()) return candidate;
10147
10442
  } catch {
10148
10443
  }
10149
10444
  }
10150
- const parent = path25__default.dirname(dir);
10445
+ const parent = path23__default.dirname(dir);
10151
10446
  if (parent === dir) return void 0;
10152
10447
  dir = parent;
10153
10448
  }
@@ -10322,7 +10617,7 @@ function parsePositiveInt(value, flag) {
10322
10617
  function makeSessionCommand() {
10323
10618
  const cmd = new Command("session").description("Manage sessions");
10324
10619
  cmd.command("list").description("List all sessions for a project").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
10325
- const projectDir = path25__default.resolve(opts.projectDir);
10620
+ const projectDir = path23__default.resolve(opts.projectDir);
10326
10621
  const sessions = await listSessions(projectDir);
10327
10622
  const current = await loadSession(projectDir);
10328
10623
  if (sessions.length === 0) {
@@ -10350,7 +10645,7 @@ function makeSessionCommand() {
10350
10645
  console.log();
10351
10646
  });
10352
10647
  cmd.command("show <run-id>").description("Show a specific session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
10353
- const projectDir = path25__default.resolve(opts.projectDir);
10648
+ const projectDir = path23__default.resolve(opts.projectDir);
10354
10649
  const session = await loadSessionById(projectDir, runId);
10355
10650
  if (!session) {
10356
10651
  logErr(`Session not found: ${runId}`);
@@ -10359,12 +10654,12 @@ function makeSessionCommand() {
10359
10654
  console.log(JSON.stringify(session, null, 2));
10360
10655
  });
10361
10656
  cmd.command("switch <run-id>").description("Switch the current session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
10362
- const projectDir = path25__default.resolve(opts.projectDir);
10657
+ const projectDir = path23__default.resolve(opts.projectDir);
10363
10658
  await setCurrentSession(projectDir, runId);
10364
10659
  logOk(`Switched to session: ${S.dim(runId.slice(0, 8))}`);
10365
10660
  });
10366
10661
  cmd.command("delete <run-id>").description("Delete a session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
10367
- const projectDir = path25__default.resolve(opts.projectDir);
10662
+ const projectDir = path23__default.resolve(opts.projectDir);
10368
10663
  await deleteSession(projectDir, runId);
10369
10664
  logOk(`Deleted session: ${S.dim(runId.slice(0, 8))}`);
10370
10665
  });
@@ -10418,12 +10713,12 @@ function showOverview(am2) {
10418
10713
  }
10419
10714
  async function showAsset(am2, kind, name) {
10420
10715
  const entry = await am2.info(`${kind}:${name}`);
10421
- if (entry?.source && fs11__default.existsSync(entry.source)) {
10716
+ if (entry?.source && fs9__default.existsSync(entry.source)) {
10422
10717
  console.log();
10423
10718
  console.log(` ${kindColor(entry.kind)} ${S.heading(entry.name)}`);
10424
10719
  console.log(` ${S.rule(40)}`);
10425
10720
  console.log();
10426
- console.log(fs11__default.readFileSync(entry.source, "utf-8"));
10721
+ console.log(fs9__default.readFileSync(entry.source, "utf-8"));
10427
10722
  return;
10428
10723
  }
10429
10724
  logErr(`Asset not found: ${kind}:${name}`);
@@ -10433,7 +10728,7 @@ function makeShowCommand() {
10433
10728
  return new Command("show").description("Show deployed assets overview, or print asset content").argument("[kind]", "Asset kind (skill, agent, prompt, flow, preset, contract)").argument("[name]", "Asset name").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", `Agent framework (${TARGET_DEFAULT_HINT})`).action(async (kind, name, opts) => {
10434
10729
  const am2 = new AssetManager({
10435
10730
  registry: getKindRegistry(),
10436
- projectDir: path25__default.resolve(opts.projectDir),
10731
+ projectDir: path23__default.resolve(opts.projectDir),
10437
10732
  driverTarget: opts.target
10438
10733
  });
10439
10734
  if (!kind) {
@@ -10496,14 +10791,14 @@ function makeStoreCommand() {
10496
10791
  });
10497
10792
  store.command("mode <auto|local|remote>").description("Set the catalog resolution mode (not yet wired)").action((_mode) => {
10498
10793
  logErr(
10499
- `\`skaile store mode\` is scaffolded but not yet wired. Store config lives at ${path25__default.join(globalSkaileDir(), "store", "config.yaml")}.`
10794
+ `\`skaile store mode\` is scaffolded but not yet wired. Store config lives at ${path23__default.join(globalSkaileDir(), "store", "config.yaml")}.`
10500
10795
  );
10501
10796
  process.exit(2);
10502
10797
  });
10503
10798
  store.command("search <query>").description("Search the AI Asset Store catalog by name, description, or publisher").option("--kind <kind>", "Filter by asset kind (skill, agent, prompt, flow, \u2026)").option("-C, --project-dir <dir>", "Project directory (catalog config overlay)", process.cwd()).action(async (query, opts) => {
10504
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-4WUMQHES.js');
10799
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-P3D337NH.js');
10505
10800
  try {
10506
- const remote = await openCatalogSource2({ projectDir: path25__default.resolve(opts.projectDir) });
10801
+ const remote = await openCatalogSource2({ projectDir: path23__default.resolve(opts.projectDir) });
10507
10802
  const assets = await remote.listAssets(opts.kind ? { kind: opts.kind } : {});
10508
10803
  const results = filterCatalogAssets(assets, query);
10509
10804
  if (results.length === 0) {
@@ -10518,7 +10813,7 @@ function makeStoreCommand() {
10518
10813
  `
10519
10814
  );
10520
10815
  } catch (e) {
10521
- if (e instanceof LocalCatalogDisabledError) {
10816
+ if (e instanceof LocalCatalogDisabledError2) {
10522
10817
  logErr(
10523
10818
  `Remote catalog disabled (catalog.url: local). Set \`catalog.url: https://skaile.store\` in ${userConfigPath()}.`
10524
10819
  );
@@ -10529,10 +10824,10 @@ function makeStoreCommand() {
10529
10824
  }
10530
10825
  });
10531
10826
  store.command("show <ref>").description("Show a store asset's details + provenance (source, files, integrity)").option("-C, --project-dir <dir>", "Project directory (catalog config overlay)", process.cwd()).action(async (ref, opts) => {
10532
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-4WUMQHES.js');
10533
- const { supportsInstallManifest } = await import('../project-VMOHUXBD.js');
10827
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-P3D337NH.js');
10828
+ const { supportsInstallManifest } = await import('../project-WFUDVYNN.js');
10534
10829
  try {
10535
- const remote = await openCatalogSource2({ projectDir: path25__default.resolve(opts.projectDir) });
10830
+ const remote = await openCatalogSource2({ projectDir: path23__default.resolve(opts.projectDir) });
10536
10831
  const asset = await remote.resolve(ref);
10537
10832
  if (!asset) {
10538
10833
  logErr(`Not found in store: ${ref} (try a full ref, e.g. skill:@publisher/name#version)`);
@@ -10580,7 +10875,7 @@ function makeStoreCommand() {
10580
10875
  console.log(` ${S.dim(`Install: skaile add ${canonical}`)}`);
10581
10876
  console.log();
10582
10877
  } catch (e) {
10583
- if (e instanceof LocalCatalogDisabledError) {
10878
+ if (e instanceof LocalCatalogDisabledError2) {
10584
10879
  logErr(
10585
10880
  `Remote catalog disabled (catalog.url: local). Set \`catalog.url: https://skaile.store\` in ${userConfigPath()}.`
10586
10881
  );
@@ -10656,7 +10951,7 @@ function makeTreeCommand() {
10656
10951
  return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
10657
10952
  const am2 = new AssetManager({
10658
10953
  registry: getKindRegistry(),
10659
- projectDir: path25__default.resolve(opts.projectDir)
10954
+ projectDir: path23__default.resolve(opts.projectDir)
10660
10955
  });
10661
10956
  const root = am2.tree();
10662
10957
  if (root.children.length === 0) {
@@ -10683,20 +10978,24 @@ function makeUpdateCommand() {
10683
10978
  const catalogSpinner = createSpinner();
10684
10979
  catalogSpinner.start("Refreshing catalog cache");
10685
10980
  try {
10686
- const remote = await openCatalogSource({ projectDir: path25__default.resolve(opts.projectDir) });
10981
+ const remote = await openCatalogSource({ projectDir: path23__default.resolve(opts.projectDir) });
10687
10982
  const result2 = await remote.refresh();
10688
10983
  catalogSpinner.stop(
10689
10984
  `Catalog refreshed: ${S.heading(String(result2.assetsCached))} assets cached`
10690
10985
  );
10691
10986
  logInfo(`Source: ${remote.baseUrl}`);
10692
10987
  } catch (err2) {
10693
- catalogSpinner.stop("Catalog refresh failed");
10694
- logErr(`Catalog refresh failed: ${err2 instanceof Error ? err2.message : String(err2)}`);
10695
- logInfo("Continuing with asset re-deploy. Run `skaile catalog test` to debug.");
10988
+ if (err2 instanceof LocalCatalogDisabledError) {
10989
+ catalogSpinner.stop("Catalog refresh skipped (catalog.url: local)");
10990
+ } else {
10991
+ catalogSpinner.stop("Catalog refresh failed");
10992
+ logErr(`Catalog refresh failed: ${err2 instanceof Error ? err2.message : String(err2)}`);
10993
+ logInfo("Continuing with asset re-deploy. Run `skaile catalog test` to debug.");
10994
+ }
10696
10995
  }
10697
10996
  }
10698
10997
  if (opts.catalogOnly) return;
10699
- const projectDir = path25__default.resolve(opts.projectDir);
10998
+ const projectDir = path23__default.resolve(opts.projectDir);
10700
10999
  if (await shouldSyncSources(opts)) {
10701
11000
  const syncSpinner = createSpinner();
10702
11001
  syncSpinner.start("Syncing sources");
@@ -10840,7 +11139,7 @@ function makeWhyCommand() {
10840
11139
  return new Command("why").description("Show why an asset is installed (dependency chain)").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
10841
11140
  const am2 = new AssetManager({
10842
11141
  registry: getKindRegistry(),
10843
- projectDir: path25__default.resolve(opts.projectDir)
11142
+ projectDir: path23__default.resolve(opts.projectDir)
10844
11143
  });
10845
11144
  const chain = am2.why(ref);
10846
11145
  if (chain.length === 0) {
@@ -10875,10 +11174,19 @@ function makeWhyCommand() {
10875
11174
  var _defaultFormatHelp = Help.prototype.formatHelp;
10876
11175
  var pkg = JSON.parse(
10877
11176
  readFileSync(
10878
- path25__default.resolve(path25__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
11177
+ path23__default.resolve(path23__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
10879
11178
  "utf-8"
10880
11179
  )
10881
11180
  );
11181
+ for (const key of [
11182
+ "SKAILE_HOME",
11183
+ "SKAILE_INDEX_PATH",
11184
+ "SKAILE_LIBRARIES_DIR",
11185
+ "SKAILE_CACHE_DIR"
11186
+ ]) {
11187
+ const value = process.env[key];
11188
+ if (value) process.env[key] = path23__default.resolve(value);
11189
+ }
10882
11190
  var program = new Command("skaile").description("AI asset manager").version(pkg.version, "-v, --version", "Show the skaile CLI version").enablePositionalOptions().configureHelp({
10883
11191
  formatHelp(cmd, helper) {
10884
11192
  if (cmd.name() !== "skaile") return _defaultFormatHelp.call(helper, cmd, helper);
@@ -10938,7 +11246,7 @@ Execution:
10938
11246
  debug tools|connectors|mcp|config|state Inspect running container state
10939
11247
  connect <url> Interactive WebSocket REPL
10940
11248
  logs [--follow] [--filter] Tail skaile container logs
10941
- session list|show|switch|del Session management
11249
+ session list|show|switch|delete Session management
10942
11250
  status Current session state
10943
11251
  clear Unset current session
10944
11252
 
@@ -11006,31 +11314,31 @@ async function runInit(projectDir, opts) {
11006
11314
  process.exitCode = 1;
11007
11315
  return;
11008
11316
  }
11009
- const resolved = path25__default.resolve(projectDir ?? ".");
11010
- const projectName = path25__default.basename(resolved);
11317
+ const resolved = path23__default.resolve(projectDir ?? ".");
11318
+ const projectName = path23__default.basename(resolved);
11011
11319
  const created = [];
11012
11320
  const { existsSync: existsSync18 } = await import('fs');
11013
11321
  if (!existsSync18(resolved)) {
11014
11322
  mkdirSync5(resolved, { recursive: true });
11015
11323
  created.push(".");
11016
11324
  }
11017
- const skaileDir = path25__default.join(resolved, ".skaile");
11325
+ const skaileDir = path23__default.join(resolved, ".skaile");
11018
11326
  if (!existsSync18(skaileDir)) {
11019
- mkdirSync5(path25__default.join(skaileDir, "sessions"), { recursive: true });
11327
+ mkdirSync5(path23__default.join(skaileDir, "sessions"), { recursive: true });
11020
11328
  created.push(".skaile/");
11021
11329
  }
11022
- const settingsPath = path25__default.join(skaileDir, "settings.json");
11330
+ const settingsPath = path23__default.join(skaileDir, "settings.json");
11023
11331
  if (!existsSync18(settingsPath)) {
11024
11332
  writeFileSync7(settingsPath, "{}\n");
11025
11333
  created.push(".skaile/settings.json");
11026
11334
  }
11027
- const wsConfigPath = path25__default.join(resolved, "skaile.yaml");
11335
+ const wsConfigPath = path23__default.join(resolved, "skaile.yaml");
11028
11336
  if (!existsSync18(wsConfigPath)) {
11029
11337
  writeFileSync7(wsConfigPath, stringify2(buildInitWorkspaceConfig(projectName, harness)));
11030
11338
  created.push("skaile.yaml");
11031
11339
  }
11032
11340
  for (const dir of new Set(Object.values(DRIVER_TARGETS[harness].local))) {
11033
- const full = path25__default.join(resolved, dir);
11341
+ const full = path23__default.join(resolved, dir);
11034
11342
  if (!existsSync18(full)) {
11035
11343
  mkdirSync5(full, { recursive: true });
11036
11344
  created.push(`${dir}/`);
@@ -11060,9 +11368,9 @@ function buildInitWorkspaceConfig(projectName, harness) {
11060
11368
  };
11061
11369
  }
11062
11370
  async function initGitScaffold(resolved, created) {
11063
- const { execSync: execSync3 } = await import('child_process');
11371
+ const { execSync: execSync2 } = await import('child_process');
11064
11372
  const { existsSync: existsSync18, readFileSync: readFileSync10, writeFileSync: writeFileSync7 } = await import('fs');
11065
- const gitignorePath = path25__default.join(resolved, ".gitignore");
11373
+ const gitignorePath = path23__default.join(resolved, ".gitignore");
11066
11374
  const entries = [
11067
11375
  "node_modules/",
11068
11376
  ".skaile/sessions/",
@@ -11088,9 +11396,9 @@ async function initGitScaffold(resolved, created) {
11088
11396
  `);
11089
11397
  if (!existing) created.push(".gitignore");
11090
11398
  }
11091
- if (!existsSync18(path25__default.join(resolved, ".git"))) {
11399
+ if (!existsSync18(path23__default.join(resolved, ".git"))) {
11092
11400
  try {
11093
- execSync3("git init", { cwd: resolved, stdio: "pipe" });
11401
+ execSync2("git init", { cwd: resolved, stdio: "pipe" });
11094
11402
  created.push(".git/");
11095
11403
  } catch (err2) {
11096
11404
  const msg = err2 instanceof Error ? err2.message : String(err2);
@@ -11118,7 +11426,7 @@ async function bootstrapUserConfig() {
11118
11426
  }
11119
11427
  async function hydrateInitSources(resolved, created) {
11120
11428
  try {
11121
- const { ensureSourcesCloned } = await import('../ensure-sources-DSTSXJWK.js');
11429
+ const { ensureSourcesCloned } = await import('../ensure-sources-277VI7R3.js');
11122
11430
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
11123
11431
  for (const n of hydrate.cloned) created.push(`~/.skaile/cache/sources/${n}/`);
11124
11432
  if (hydrate.failed.length > 0) {
@@ -11134,7 +11442,7 @@ function printInitSummary(resolved, projectDir, created) {
11134
11442
  logOk(`Initialized project at ${S.heading(resolved)}`);
11135
11443
  console.log();
11136
11444
  console.log(S.heading(" Next steps:"));
11137
- const isCurrentDir = resolved === path25__default.resolve(".");
11445
+ const isCurrentDir = resolved === path23__default.resolve(".");
11138
11446
  let step = 1;
11139
11447
  if (!isCurrentDir) {
11140
11448
  console.log(` ${S.dim(`${step}.`)} ${S.cmd(`cd ${projectDir}`)}`);
@@ -11158,7 +11466,7 @@ function printInitSummary(resolved, projectDir, created) {
11158
11466
  console.log();
11159
11467
  }
11160
11468
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
11161
- const { cmdSetup } = await import('../setup-PYY23HGZ.js');
11469
+ const { cmdSetup } = await import('../setup-RAMLTORM.js');
11162
11470
  await cmdSetup([], { projectDir: process.cwd() });
11163
11471
  });
11164
11472
  program.addCommand(makeInstallCommand());
@@ -11232,6 +11540,10 @@ program.command("path").description("Show resolved paths (honours SKAILE_HOME an
11232
11540
  console.log();
11233
11541
  });
11234
11542
  program.addCommand(makeCompleteCommand(program));
11543
+ process.stdout.on("error", (err2) => {
11544
+ if (err2.code === "EPIPE") process.exit(0);
11545
+ throw err2;
11546
+ });
11235
11547
  try {
11236
11548
  await program.parseAsync();
11237
11549
  } catch (err2) {