@skaile/workspaces 5.10.0 → 5.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +12 -0
  3. package/dist/{asset-feeds-ELEBTNUS.js → asset-feeds-CXGQIDFR.js} +18 -18
  4. package/dist/{asset-feeds-ELEBTNUS.js.map → asset-feeds-CXGQIDFR.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +7 -7
  6. package/dist/asset-manager/index.js +13 -13
  7. package/dist/asset-manager/installer.js +9 -9
  8. package/dist/asset-manager/renderers.js +8 -8
  9. package/dist/asset-manager/src/index.d.ts +103 -2
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  12. package/dist/asset-manager/src/installer.d.ts +23 -3
  13. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  14. package/dist/bridge/drivers/claude-sdk.js +10 -10
  15. package/dist/bridge/drivers/codex.js +9 -9
  16. package/dist/bridge/drivers/continue.js +9 -9
  17. package/dist/bridge/drivers/echo.js +1 -1
  18. package/dist/bridge/drivers/gemini.js +6 -6
  19. package/dist/bridge/drivers/goose.js +9 -9
  20. package/dist/bridge/drivers/omp.js +18 -2
  21. package/dist/bridge/drivers/omp.js.map +1 -1
  22. package/dist/bridge/drivers/opencode.js +9 -9
  23. package/dist/bridge/drivers/qwen.js +6 -6
  24. package/dist/bridge/index.js +11 -11
  25. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  26. package/dist/{chunk-3BEY4WK3.js → chunk-2F5AWQX5.js} +77 -11
  27. package/dist/chunk-2F5AWQX5.js.map +1 -0
  28. package/dist/{chunk-IJHH4DSW.js → chunk-3SM2DL2T.js} +8 -8
  29. package/dist/{chunk-IJHH4DSW.js.map → chunk-3SM2DL2T.js.map} +1 -1
  30. package/dist/{chunk-HJ5MCB3L.js → chunk-47U4GZ4M.js} +2 -2
  31. package/dist/{chunk-HJ5MCB3L.js.map → chunk-47U4GZ4M.js.map} +1 -1
  32. package/dist/{chunk-7CR6HT2X.js → chunk-4A4OD24G.js} +9 -9
  33. package/dist/{chunk-7CR6HT2X.js.map → chunk-4A4OD24G.js.map} +1 -1
  34. package/dist/{chunk-5QI2JYJC.js → chunk-6O2X3GPW.js} +2 -2
  35. package/dist/{chunk-5QI2JYJC.js.map → chunk-6O2X3GPW.js.map} +1 -1
  36. package/dist/{chunk-JZCSNEHK.js → chunk-ALEYHUC5.js} +42 -20
  37. package/dist/chunk-ALEYHUC5.js.map +1 -0
  38. package/dist/{chunk-4OV5DSBB.js → chunk-BNMZVPYA.js} +5 -5
  39. package/dist/chunk-BNMZVPYA.js.map +1 -0
  40. package/dist/{chunk-SBFW3CJH.js → chunk-CAHB6MHA.js} +5 -5
  41. package/dist/{chunk-SBFW3CJH.js.map → chunk-CAHB6MHA.js.map} +1 -1
  42. package/dist/{chunk-4P3KTUZH.js → chunk-CJERAGFY.js} +24 -13
  43. package/dist/chunk-CJERAGFY.js.map +1 -0
  44. package/dist/{chunk-MVQ3Q2HM.js → chunk-COH6FQAG.js} +4 -4
  45. package/dist/{chunk-MVQ3Q2HM.js.map → chunk-COH6FQAG.js.map} +1 -1
  46. package/dist/{chunk-ZGQTS3Y4.js → chunk-CPWLNZGJ.js} +3 -3
  47. package/dist/{chunk-ZGQTS3Y4.js.map → chunk-CPWLNZGJ.js.map} +1 -1
  48. package/dist/{chunk-MGGFBZWA.js → chunk-D3B36CYC.js} +4 -3
  49. package/dist/chunk-D3B36CYC.js.map +1 -0
  50. package/dist/{chunk-2JMLDZLP.js → chunk-DZMNFCWB.js} +416 -55
  51. package/dist/chunk-DZMNFCWB.js.map +1 -0
  52. package/dist/{chunk-GFCXNFTW.js → chunk-EDYHEMJA.js} +4 -4
  53. package/dist/{chunk-GFCXNFTW.js.map → chunk-EDYHEMJA.js.map} +1 -1
  54. package/dist/{chunk-PE36IF2D.js → chunk-FH7W6TJ4.js} +65 -31
  55. package/dist/chunk-FH7W6TJ4.js.map +1 -0
  56. package/dist/{chunk-G54USEUP.js → chunk-G4FFOV3N.js} +4 -4
  57. package/dist/{chunk-G54USEUP.js.map → chunk-G4FFOV3N.js.map} +1 -1
  58. package/dist/{chunk-HOHUEKES.js → chunk-GCHPUTA3.js} +3 -3
  59. package/dist/{chunk-HOHUEKES.js.map → chunk-GCHPUTA3.js.map} +1 -1
  60. package/dist/{chunk-TRSQP3JD.js → chunk-GV4DZ6MT.js} +20 -4
  61. package/dist/chunk-GV4DZ6MT.js.map +1 -0
  62. package/dist/{chunk-QG3HOJEK.js → chunk-HCEVNYSH.js} +3 -3
  63. package/dist/{chunk-QG3HOJEK.js.map → chunk-HCEVNYSH.js.map} +1 -1
  64. package/dist/{chunk-6HHE63CO.js → chunk-HZXUXHIV.js} +4 -4
  65. package/dist/{chunk-6HHE63CO.js.map → chunk-HZXUXHIV.js.map} +1 -1
  66. package/dist/{chunk-FRPBSUFH.js → chunk-IER3KIPH.js} +5 -5
  67. package/dist/{chunk-FRPBSUFH.js.map → chunk-IER3KIPH.js.map} +1 -1
  68. package/dist/{chunk-GEWAIQZ5.js → chunk-J4RBUFGM.js} +10 -12
  69. package/dist/chunk-J4RBUFGM.js.map +1 -0
  70. package/dist/{chunk-OOWHXOK6.js → chunk-M3B6EIJD.js} +4 -4
  71. package/dist/{chunk-OOWHXOK6.js.map → chunk-M3B6EIJD.js.map} +1 -1
  72. package/dist/{chunk-VLXDXRRX.js → chunk-MZG34MBZ.js} +3 -3
  73. package/dist/{chunk-VLXDXRRX.js.map → chunk-MZG34MBZ.js.map} +1 -1
  74. package/dist/{chunk-2FMEGSBN.js → chunk-PBBPZYVG.js} +31 -9
  75. package/dist/chunk-PBBPZYVG.js.map +1 -0
  76. package/dist/{chunk-CLTHEKHR.js → chunk-PQFHMQHQ.js} +4 -4
  77. package/dist/{chunk-CLTHEKHR.js.map → chunk-PQFHMQHQ.js.map} +1 -1
  78. package/dist/{chunk-SX5U422E.js → chunk-QVFAS5IO.js} +3 -3
  79. package/dist/{chunk-SX5U422E.js.map → chunk-QVFAS5IO.js.map} +1 -1
  80. package/dist/{chunk-JFXQEVLF.js → chunk-QZNJOHN6.js} +3 -3
  81. package/dist/{chunk-JFXQEVLF.js.map → chunk-QZNJOHN6.js.map} +1 -1
  82. package/dist/{chunk-V5TZH4GF.js → chunk-R7NHYEJF.js} +4 -4
  83. package/dist/{chunk-V5TZH4GF.js.map → chunk-R7NHYEJF.js.map} +1 -1
  84. package/dist/{chunk-V7PQZOBR.js → chunk-RYYLMBA2.js} +5 -5
  85. package/dist/{chunk-V7PQZOBR.js.map → chunk-RYYLMBA2.js.map} +1 -1
  86. package/dist/{chunk-WBYDAL6X.js → chunk-S3O3GKB7.js} +4 -4
  87. package/dist/{chunk-WBYDAL6X.js.map → chunk-S3O3GKB7.js.map} +1 -1
  88. package/dist/{chunk-Y34MSWEZ.js → chunk-SBSA3IQA.js} +3 -3
  89. package/dist/{chunk-Y34MSWEZ.js.map → chunk-SBSA3IQA.js.map} +1 -1
  90. package/dist/{chunk-Y63UQZ7P.js → chunk-T42WRQ4O.js} +3 -3
  91. package/dist/{chunk-Y63UQZ7P.js.map → chunk-T42WRQ4O.js.map} +1 -1
  92. package/dist/{chunk-OBVJ7RPW.js → chunk-T7CTHHG7.js} +3 -3
  93. package/dist/{chunk-OBVJ7RPW.js.map → chunk-T7CTHHG7.js.map} +1 -1
  94. package/dist/{chunk-7I5VRVDP.js → chunk-TCHRMVTO.js} +4 -4
  95. package/dist/{chunk-7I5VRVDP.js.map → chunk-TCHRMVTO.js.map} +1 -1
  96. package/dist/{chunk-NRDSGLCQ.js → chunk-VLTQGE2E.js} +65 -22
  97. package/dist/chunk-VLTQGE2E.js.map +1 -0
  98. package/dist/{chunk-Z2K6BGUR.js → chunk-WSBKB4CJ.js} +13 -13
  99. package/dist/{chunk-Z2K6BGUR.js.map → chunk-WSBKB4CJ.js.map} +1 -1
  100. package/dist/{chunk-3MKPZZRE.js → chunk-X77SUM4P.js} +3 -3
  101. package/dist/{chunk-3MKPZZRE.js.map → chunk-X77SUM4P.js.map} +1 -1
  102. package/dist/{chunk-XCNK4UE5.js → chunk-XDKH7XSA.js} +5 -5
  103. package/dist/{chunk-XCNK4UE5.js.map → chunk-XDKH7XSA.js.map} +1 -1
  104. package/dist/{chunk-TH4CTXHX.js → chunk-XUSALIEI.js} +6 -6
  105. package/dist/{chunk-TH4CTXHX.js.map → chunk-XUSALIEI.js.map} +1 -1
  106. package/dist/{chunk-3KHYGOEY.js → chunk-Y3HTGHJC.js} +3 -3
  107. package/dist/{chunk-3KHYGOEY.js.map → chunk-Y3HTGHJC.js.map} +1 -1
  108. package/dist/{chunk-YBQONMH2.js → chunk-YOH2L76X.js} +90 -50
  109. package/dist/chunk-YOH2L76X.js.map +1 -0
  110. package/dist/{chunk-32XKCNCL.js → chunk-ZCAJZ4B2.js} +3 -3
  111. package/dist/chunk-ZCAJZ4B2.js.map +1 -0
  112. package/dist/{chunk-IXWODEED.js → chunk-ZPWTOUTK.js} +43 -7
  113. package/dist/chunk-ZPWTOUTK.js.map +1 -0
  114. package/dist/cli/index.js +210 -163
  115. package/dist/cli/index.js.map +1 -1
  116. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  117. package/dist/cli/src/commands/diff.d.ts +1 -1
  118. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  119. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  120. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  121. package/dist/cli/src/commands/manage.d.ts +6 -0
  122. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  123. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  124. package/dist/cli/src/commands/project.d.ts +3 -1
  125. package/dist/cli/src/commands/project.d.ts.map +1 -1
  126. package/dist/cli/src/commands/run.d.ts.map +1 -1
  127. package/dist/cli/src/commands/update.d.ts.map +1 -1
  128. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  129. package/dist/cli/src/commands/why.d.ts +1 -0
  130. package/dist/cli/src/commands/why.d.ts.map +1 -1
  131. package/dist/cli/src/helpers.d.ts +12 -0
  132. package/dist/cli/src/helpers.d.ts.map +1 -1
  133. package/dist/cli/src/skill-checks.d.ts +14 -6
  134. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  135. package/dist/connectors/config.js +5 -5
  136. package/dist/connectors/index.js +15 -15
  137. package/dist/{connectors-OXP2JBGI.js → connectors-4QWAKPHB.js} +18 -18
  138. package/dist/{connectors-OXP2JBGI.js.map → connectors-4QWAKPHB.js.map} +1 -1
  139. package/dist/core/index.js +6 -6
  140. package/dist/core/manifest.js +2 -2
  141. package/dist/core/models.js +1 -1
  142. package/dist/core/publish-manifest.js +2 -2
  143. package/dist/core/ref.js +1 -1
  144. package/dist/core/runtime-assets.js +5 -5
  145. package/dist/core/src/lock.d.ts +4 -3
  146. package/dist/core/src/lock.d.ts.map +1 -1
  147. package/dist/core/src/models.d.ts +1 -1
  148. package/dist/core/src/models.d.ts.map +1 -1
  149. package/dist/core/src/publish-manifest.d.ts +11 -1
  150. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  151. package/dist/core/src/workspace-config.d.ts +4 -1
  152. package/dist/core/src/workspace-config.d.ts.map +1 -1
  153. package/dist/core/workspace-config.js +4 -4
  154. package/dist/deploy/index.js +6 -6
  155. package/dist/discovery/index.js +5 -5
  156. package/dist/discovery/src/source-config.d.ts.map +1 -1
  157. package/dist/{ensure-sources-5ISVIA4T.js → ensure-sources-2RONZKCU.js} +16 -16
  158. package/dist/{ensure-sources-5ISVIA4T.js.map → ensure-sources-2RONZKCU.js.map} +1 -1
  159. package/dist/factory-assets/connectors/box.js +15 -15
  160. package/dist/factory-assets/connectors/deploy.js +15 -15
  161. package/dist/factory-assets/connectors/devserver.js +15 -15
  162. package/dist/factory-assets/connectors/flow/adapter.js +15 -15
  163. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
  164. package/dist/factory-assets/connectors/flow/contract.js +1 -1
  165. package/dist/factory-assets/connectors/flow/engine.js +8 -8
  166. package/dist/factory-assets/connectors/flow/run-flow.js +17 -17
  167. package/dist/factory-assets/connectors/flow.js +15 -15
  168. package/dist/factory-assets/connectors/git.js +15 -15
  169. package/dist/factory-assets/connectors/gmail.js +15 -15
  170. package/dist/factory-assets/connectors/googledrive.js +15 -15
  171. package/dist/factory-assets/connectors/local.js +15 -15
  172. package/dist/factory-assets/connectors/mattermost.js +15 -15
  173. package/dist/factory-assets/connectors/memory.js +15 -15
  174. package/dist/factory-assets/connectors/minio.js +15 -15
  175. package/dist/factory-assets/connectors/postgres.js +15 -15
  176. package/dist/factory-assets/connectors/s3.js +15 -15
  177. package/dist/factory-assets/connectors/sharepoint.js +15 -15
  178. package/dist/factory-assets/connectors/sqlite.js +15 -15
  179. package/dist/factory-assets/connectors/static-server.js +15 -15
  180. package/dist/factory-assets/connectors/tunnel.js +15 -15
  181. package/dist/factory-assets/connectors/webdav.js +15 -15
  182. package/dist/factory-assets/connectors/xstate-store.js +15 -15
  183. package/dist/factory-assets/connectors/xstate.js +15 -15
  184. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +4 -2
  185. package/dist/{flows-HMSE76PO.js → flows-EQF2CH4U.js} +11 -11
  186. package/dist/{flows-HMSE76PO.js.map → flows-EQF2CH4U.js.map} +1 -1
  187. package/dist/{helpers-X6URBGSF.js → helpers-CFK6YP6R.js} +16 -16
  188. package/dist/{helpers-X6URBGSF.js.map → helpers-CFK6YP6R.js.map} +1 -1
  189. package/dist/library/index.js +10 -10
  190. package/dist/library/install.js +3 -3
  191. package/dist/library/src/index.d.ts +1 -1
  192. package/dist/library/src/index.d.ts.map +1 -1
  193. package/dist/library/src/local/library-dir.d.ts +26 -0
  194. package/dist/library/src/local/library-dir.d.ts.map +1 -1
  195. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  196. package/dist/library/src/sync/git-driver.d.ts +2 -0
  197. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  198. package/dist/{library-publish-OS3JDW4S.js → library-publish-53UTB3MB.js} +51 -24
  199. package/dist/library-publish-53UTB3MB.js.map +1 -0
  200. package/dist/open-library-BOSPJVID.js +40 -0
  201. package/dist/{open-library-4QSUORI6.js.map → open-library-BOSPJVID.js.map} +1 -1
  202. package/dist/open-registry-4FI7HKET.js +32 -0
  203. package/dist/{open-registry-VCKS3MP5.js.map → open-registry-4FI7HKET.js.map} +1 -1
  204. package/dist/{paths-BVO56A25.js → paths-SUS4S4YT.js} +9 -9
  205. package/dist/{paths-BVO56A25.js.map → paths-SUS4S4YT.js.map} +1 -1
  206. package/dist/{plugin-store-X7GPWGBG.js → plugin-store-AGQDMING.js} +8 -8
  207. package/dist/{plugin-store-X7GPWGBG.js.map → plugin-store-AGQDMING.js.map} +1 -1
  208. package/dist/{project-PAXP46RD.js → project-I55A4O2T.js} +20 -20
  209. package/dist/{project-PAXP46RD.js.map → project-I55A4O2T.js.map} +1 -1
  210. package/dist/resolver/index.js +7 -7
  211. package/dist/runner/index.js +28 -28
  212. package/dist/runner/src/serve.d.ts.map +1 -1
  213. package/dist/runner/src/usage-limit-turn-hold.d.ts +51 -0
  214. package/dist/runner/src/usage-limit-turn-hold.d.ts.map +1 -0
  215. package/dist/sdk/asset-manager.js +13 -13
  216. package/dist/sdk/bridge.js +11 -11
  217. package/dist/sdk/core.js +6 -6
  218. package/dist/sdk/flow.js +8 -8
  219. package/dist/sdk/index.js +28 -28
  220. package/dist/sdk/resolver.js +7 -7
  221. package/dist/sdk/runner.js +28 -28
  222. package/dist/{setup-BV55VHWC.js → setup-7DQJKHUI.js} +21 -21
  223. package/dist/{setup-BV55VHWC.js.map → setup-7DQJKHUI.js.map} +1 -1
  224. package/dist/{skills-EDFUCJPX.js → skills-NUEN5NDX.js} +12 -12
  225. package/dist/{skills-EDFUCJPX.js.map → skills-NUEN5NDX.js.map} +1 -1
  226. package/dist/{source-E4VAT5RZ.js → source-G2LV5LVD.js} +21 -21
  227. package/dist/{source-E4VAT5RZ.js.map → source-G2LV5LVD.js.map} +1 -1
  228. package/dist/{source-manifest-publish-CLEE6TNH.js → source-manifest-publish-6RM7SWLZ.js} +23 -23
  229. package/dist/{source-manifest-publish-CLEE6TNH.js.map → source-manifest-publish-6RM7SWLZ.js.map} +1 -1
  230. package/dist/tui/index.js +59 -39
  231. package/dist/tui/index.js.map +1 -1
  232. package/dist/tui/src/repl.d.ts.map +1 -1
  233. package/dist/types/manifests.js +1 -1
  234. package/dist/types/src/manifests/preset.d.ts +1 -1
  235. package/dist/workspace-plugin/adapters/mcp.js +22 -22
  236. package/dist/workspace-plugin/adapters/omp.js +14 -14
  237. package/dist/workspace-plugin/index.js +1 -1
  238. package/package.json +1 -1
  239. package/dist/chunk-2FMEGSBN.js.map +0 -1
  240. package/dist/chunk-2JMLDZLP.js.map +0 -1
  241. package/dist/chunk-32XKCNCL.js.map +0 -1
  242. package/dist/chunk-3BEY4WK3.js.map +0 -1
  243. package/dist/chunk-4OV5DSBB.js.map +0 -1
  244. package/dist/chunk-4P3KTUZH.js.map +0 -1
  245. package/dist/chunk-GEWAIQZ5.js.map +0 -1
  246. package/dist/chunk-IXWODEED.js.map +0 -1
  247. package/dist/chunk-JZCSNEHK.js.map +0 -1
  248. package/dist/chunk-MGGFBZWA.js.map +0 -1
  249. package/dist/chunk-NRDSGLCQ.js.map +0 -1
  250. package/dist/chunk-PE36IF2D.js.map +0 -1
  251. package/dist/chunk-TRSQP3JD.js.map +0 -1
  252. package/dist/chunk-YBQONMH2.js.map +0 -1
  253. package/dist/library-publish-OS3JDW4S.js.map +0 -1
  254. package/dist/open-library-4QSUORI6.js +0 -40
  255. package/dist/open-registry-VCKS3MP5.js +0 -32
package/dist/cli/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import { makeProvidersCommand, loadRegistryView, addProviderEntry, ProviderRegistryWriteError } from '../chunk-XCNK4UE5.js';
3
- import { makeSourceCommand, syncProjectSources, divergedSourceClones } from '../chunk-Z2K6BGUR.js';
4
- import { makeInstallCommand, makeCheckCommand, makeCleanCommand, reportReplaced, reportRelocked, REF_HINT, reportInstalledSoftDeps } from '../chunk-4P3KTUZH.js';
2
+ import { makeProvidersCommand, loadRegistryView, addProviderEntry, ProviderRegistryWriteError } from '../chunk-XDKH7XSA.js';
3
+ import { makeSourceCommand, syncProjectSources, divergedSourceClones } from '../chunk-WSBKB4CJ.js';
4
+ import { makeInstallCommand, makeCheckCommand, makeCleanCommand, reportReplaced, reportRelocked, reportMoved, REF_HINT, reportInstalledSoftDeps } from '../chunk-CJERAGFY.js';
5
5
  import { createSpinner } from '../chunk-NESV47MF.js';
6
- import { AI_RESOURCES } from '../chunk-WBYDAL6X.js';
7
- import { unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, removedDomainOption, rejectRemovedDomainOption, resolveLibraryPublisherDetailed, warnLibraryNameFallback, indexLibrary, requireValidPublisherOrExit, exitOnManifestPublisherProblems, registerLibraryAsset, DOMAIN_REMOVED_HINT, manifestPublisherProblems, manifestRequiresProblems, findAssetManifestFile, declaredVersion, checkAssetFile, duplicateAssetMessage, readAssetBody, checkAsset, invalidSemverText } from '../chunk-YBQONMH2.js';
8
- import { getStoreConfig, storeFetch, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, isStoreAuthenticated, getStoreToken, getStoreIdentity, assetEntryRef, manifestVersionMismatchMessage } from '../chunk-V7PQZOBR.js';
9
- import { openCatalogSource, LocalCatalogDisabledError, openLibraryManager, openLibrary } from '../chunk-CLTHEKHR.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-TRSQP3JD.js';
11
- import { getKindRegistry, getKnownKinds } from '../chunk-SBFW3CJH.js';
6
+ import { AI_RESOURCES } from '../chunk-S3O3GKB7.js';
7
+ import { unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, removedDomainOption, rejectRemovedDomainOption, resolveLibraryPublisherDetailed, warnLibraryNameFallback, indexLibrary, requireValidPublisherOrExit, exitOnManifestPublisherProblems, registerLibraryAsset, DOMAIN_REMOVED_HINT, manifestPublisherProblems, manifestRequiresProblems, findAssetManifestFile, declaredVersion, checkAssetFile, duplicateAssetMessage, readAssetBody, checkAsset, invalidSemverText } from '../chunk-YOH2L76X.js';
8
+ import { getStoreConfig, storeFetch, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, isStoreAuthenticated, getStoreToken, getStoreIdentity, assetEntryRef, manifestVersionMismatchMessage } from '../chunk-RYYLMBA2.js';
9
+ import { openCatalogSource, LocalCatalogDisabledError, openLibraryManager, openLibrary } from '../chunk-PQFHMQHQ.js';
10
+ import { logErr, S, logOk, logInfo, logWarn, TARGET_DEFAULT_HINT, requireProjectConfig, deferredWarnings, warnLegacyClaudeCopies, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth, KIND_COL_WIDTH } from '../chunk-GV4DZ6MT.js';
11
+ import { getKindRegistry, getKnownKinds } from '../chunk-CAHB6MHA.js';
12
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-NRDSGLCQ.js';
14
- import { buildClaudePluginFiles } from '../chunk-5QI2JYJC.js';
15
- import '../chunk-FRPBSUFH.js';
16
- import '../chunk-SX5U422E.js';
13
+ import { runAgentChat, isCompositionError, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, hashAgentFiles, createCompositionContentSource, compileComposition, instanceForSession, resolveAgentInstance, describeComposition, MarkdownStreamer } from '../chunk-VLTQGE2E.js';
14
+ import { buildClaudePluginFiles } from '../chunk-6O2X3GPW.js';
15
+ import '../chunk-IER3KIPH.js';
16
+ import '../chunk-QVFAS5IO.js';
17
17
  import '../chunk-R6O6YWU7.js';
18
- import '../chunk-G54USEUP.js';
19
- import '../chunk-Y63UQZ7P.js';
18
+ import '../chunk-G4FFOV3N.js';
19
+ import '../chunk-T42WRQ4O.js';
20
20
  import '../chunk-4ZTPYIBE.js';
21
- import '../chunk-VLXDXRRX.js';
21
+ import '../chunk-MZG34MBZ.js';
22
22
  import '../chunk-X5YPJV4N.js';
23
23
  import '../chunk-O7SG5PC2.js';
24
24
  import '../chunk-7QBNJTTQ.js';
@@ -27,56 +27,56 @@ import '../chunk-5LKOAX7I.js';
27
27
  import '../chunk-32NA4TVC.js';
28
28
  import '../chunk-W3UDISS2.js';
29
29
  import '../chunk-NWDSLXOX.js';
30
- import { runFlow, resumeFlow } from '../chunk-IJHH4DSW.js';
30
+ import { runFlow, resumeFlow } from '../chunk-3SM2DL2T.js';
31
31
  import '../chunk-4R6DROGN.js';
32
- import { validateFlowVersions } from '../chunk-3MKPZZRE.js';
33
- import '../chunk-HOHUEKES.js';
32
+ import { validateFlowVersions } from '../chunk-X77SUM4P.js';
33
+ import '../chunk-GCHPUTA3.js';
34
34
  import '../chunk-ISHJITXJ.js';
35
- import '../chunk-7CR6HT2X.js';
35
+ import '../chunk-4A4OD24G.js';
36
36
  import '../chunk-X4BAYGMT.js';
37
- import '../chunk-V5TZH4GF.js';
38
- import '../chunk-OBVJ7RPW.js';
39
- import '../chunk-QG3HOJEK.js';
37
+ import '../chunk-R7NHYEJF.js';
38
+ import '../chunk-T7CTHHG7.js';
39
+ import '../chunk-HCEVNYSH.js';
40
40
  import '../chunk-LOO5CB5M.js';
41
41
  import '../chunk-2H73V6XR.js';
42
- import '../chunk-OOWHXOK6.js';
42
+ import '../chunk-M3B6EIJD.js';
43
43
  import '../chunk-B4X2N7JQ.js';
44
44
  import '../chunk-YROR332M.js';
45
- import { getProviderPreset, AI_PROVIDER_PRESETS } from '../chunk-HJ5MCB3L.js';
45
+ import { getProviderPreset, AI_PROVIDER_PRESETS } from '../chunk-47U4GZ4M.js';
46
46
  import '../chunk-6E6PKKAD.js';
47
47
  import '../chunk-IFGTRL2I.js';
48
- import { projectAiAssetsRoots, loadFlow, loadAllFlowEntries, findFlowFileInRoots } from '../chunk-7I5VRVDP.js';
48
+ import { projectAiAssetsRoots, loadFlow, loadAllFlowEntries, findFlowFileInRoots } from '../chunk-TCHRMVTO.js';
49
49
  import '../chunk-LNFKL23K.js';
50
- import '../chunk-MGGFBZWA.js';
50
+ import '../chunk-D3B36CYC.js';
51
51
  import '../chunk-M3WPBTGJ.js';
52
52
  import { nodeLabel, nodeSkillAsset, nodeIsInert, nodeIsOptional, nodeRunKind, flowSkillVersionPins } from '../chunk-7RGTAEG6.js';
53
53
  import '../chunk-NUELZWCF.js';
54
54
  import '../chunk-F4NJDSR7.js';
55
- import { AssetManager, MissingManifestError, parseRefTolerant, normalizeRepoUrl, FACTORY_SOURCE_URL } from '../chunk-2JMLDZLP.js';
56
- import { libraryDirMissing, missingLibraryDirMessage, cloneOrInitGitRepo, trackOriginBranch, stampManifestPublisher, ensureGitRepo, conflictingAssetRoot, setManifestPublisher, LIBRARY_OWNERSHIPS, isGitRepo, assertManifestEditable, installLibraryAsset, missingRootAssets, assertValidLibraryName, syncManifestWithDisk, getStoreManifestsDir, getDefaultValue, isSecretPlaceholder } from '../chunk-3BEY4WK3.js';
57
- import { parseManifestFile, SEMVER_RE } from '../chunk-GEWAIQZ5.js';
58
- import '../chunk-MVQ3Q2HM.js';
55
+ import { AssetManager, MissingManifestError, parseRefTolerant, normalizeRepoUrl, FACTORY_SOURCE_URL } from '../chunk-DZMNFCWB.js';
56
+ import { libraryDirMissing, missingLibraryDirMessage, cloneOrInitGitRepo, trackOriginBranch, stampManifestPublisher, ensureGitRepo, conflictingAssetRoot, setManifestPublisher, LIBRARY_OWNERSHIPS, isGitRepo, assertManifestEditable, installLibraryAsset, missingRootAssets, assertValidLibraryName, syncManifestWithDisk, getStoreManifestsDir, getDefaultValue, isSecretPlaceholder } from '../chunk-2F5AWQX5.js';
57
+ import { parseManifestFile, SEMVER_RE } from '../chunk-J4RBUFGM.js';
58
+ import '../chunk-COH6FQAG.js';
59
59
  import '../chunk-R7FOF242.js';
60
60
  import '../chunk-3TXEJN4W.js';
61
- import { installTargetOf, SCAFFOLD_KINDS } from '../chunk-PE36IF2D.js';
61
+ import { installTargetOf, SCAFFOLD_KINDS } from '../chunk-FH7W6TJ4.js';
62
62
  import '../chunk-CGYEHQOX.js';
63
63
  import '../chunk-KTBKW2FI.js';
64
64
  import '../chunk-UQ6LFBPZ.js';
65
- import '../chunk-6HHE63CO.js';
66
- import { effectiveComposes, validatePreset, composeSlotDiagnostics, agentDeprecationDiagnostics, validateAgent, SLOT_ID_PATTERN } from '../chunk-32XKCNCL.js';
67
- import { resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, WorkspaceYamlEditor, resolveLibraryDir, checkAgentSkillConformance, globalInstallDir, GLOBAL_INSTALL_DIR_NAME, readLock, aiResourceRoots, workspaceProviderRegistryPath, userProviderRegistryPath, loadProviderRegistryFile } from '../chunk-2FMEGSBN.js';
65
+ import '../chunk-HZXUXHIV.js';
66
+ import { effectiveComposes, validatePreset, composeSlotDiagnostics, agentDeprecationDiagnostics, validateAgent, SLOT_ID_PATTERN } from '../chunk-ZCAJZ4B2.js';
67
+ import { resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, WorkspaceYamlEditor, resolveLibraryDir, checkAgentSkillConformance, globalInstallDir, GLOBAL_INSTALL_DIR_NAME, readLock, aiResourceRoots, workspaceProviderRegistryPath, userProviderRegistryPath, loadProviderRegistryFile } from '../chunk-PBBPZYVG.js';
68
68
  import '../chunk-4GY63JU6.js';
69
- import { factoryAssetRoots } from '../chunk-GFCXNFTW.js';
69
+ import { factoryAssetRoots } from '../chunk-EDYHEMJA.js';
70
70
  import '../chunk-PMECEZK3.js';
71
71
  import { DEFAULT_DRIVER_ID, DRIVER_DEFAULTS } from '../chunk-5BEFNLOR.js';
72
72
  import { findKindDirs } from '../chunk-A2ULN3KX.js';
73
- import { SourceEntryError, SKAILE_YAML_DEFAULT, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, AgentRefResolutionError, resolveAgentDefinitionDir, resolveSkWorkspaceConfig, matchPin, coerceVersion, loadSkWorkspaceConfig, normalizeAgentInstances, agentInstanceDiagnostics, storeManifestSlug, isWorkspaceConfigFilename } from '../chunk-JZCSNEHK.js';
73
+ import { SourceEntryError, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, AgentRefResolutionError, resolveAgentDefinitionDir, resolveSkWorkspaceConfig, matchPin, coerceVersion, loadSkWorkspaceConfig, normalizeAgentInstances, agentInstanceDiagnostics, storeManifestSlug, isWorkspaceConfigFilename } from '../chunk-ALEYHUC5.js';
74
74
  import { globalCacheRoot, globalSkaileDir, userConfigPath } from '../chunk-L5VSIPQD.js';
75
75
  import { SUPPORTED_DRIVER_TARGETS, driverTargetForDriver } from '../chunk-CPSIPIX7.js';
76
- import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest, loadSkPublishManifest, encodeSkaileManifest } from '../chunk-IXWODEED.js';
76
+ import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest, loadSkPublishManifest, encodeSkaileManifest } from '../chunk-ZPWTOUTK.js';
77
77
  import { pluginTitle } from '../chunk-RVRB27AN.js';
78
- import { dedupeRequirements, parseFrontmatter, scanDirectory } from '../chunk-Y34MSWEZ.js';
79
- import { parseAssetRef, isValidPublisher, PUBLISHER_HINT, isValidAssetName, ASSET_NAME_HINT, slugifyAssetName, parseAssetRefLoose, assetRefToStr } from '../chunk-4OV5DSBB.js';
78
+ import { dedupeRequirements, parseFrontmatter, scanDirectory } from '../chunk-SBSA3IQA.js';
79
+ import { parseAssetRef, isValidPublisher, PUBLISHER_HINT, isValidAssetName, ASSET_NAME_HINT, slugifyAssetName, parseAssetRefLoose, assetRefToStr } from '../chunk-BNMZVPYA.js';
80
80
  import { portableSpawn, portableSpawnSync } from '../chunk-ICSCSM5D.js';
81
81
  import { openSqlite } from '../chunk-DALV4HHP.js';
82
82
  import { parseModelRef, resolveEntryBaseUrl } from '../chunk-MJHSLODD.js';
@@ -184,7 +184,7 @@ async function runSearch(kind, query, opts) {
184
184
  }
185
185
  }
186
186
  async function searchIndex(query, kind) {
187
- const { openLibrary: openLibrary2 } = await import('../open-library-4QSUORI6.js');
187
+ const { openLibrary: openLibrary2 } = await import('../open-library-BOSPJVID.js');
188
188
  const library = await openLibrary2();
189
189
  try {
190
190
  const { libraryDirMissing: libraryDirMissing2 } = await import('../library/index.js');
@@ -335,7 +335,7 @@ async function searchLocal(query, kind, opts, showStore, airGapped) {
335
335
  const factory = await searchFactory(projectDir, query, kind);
336
336
  let entries = unionEntries(await searchIndex(query, kind), factory);
337
337
  if (entries.length === 0 && !query && !kind && !airGapped) {
338
- const { autoSyncForSearch } = await import('../source-E4VAT5RZ.js');
338
+ const { autoSyncForSearch } = await import('../source-G2LV5LVD.js');
339
339
  if (await autoSyncForSearch(projectDir)) {
340
340
  entries = unionEntries(await searchIndex(query, kind), factory);
341
341
  }
@@ -455,7 +455,7 @@ async function searchStore(query, kind, opts, airGapped) {
455
455
  logInfo("air-gapped (cache_ttl: 0) \u2014 local sources only");
456
456
  return;
457
457
  }
458
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-4QSUORI6.js');
458
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BOSPJVID.js');
459
459
  try {
460
460
  const remote = await openCatalogSource2({ projectDir: path18__default.resolve(opts.projectDir) });
461
461
  const assets = await remote.listAssets(kind ? { kind } : {});
@@ -578,13 +578,7 @@ function makeAddCommand() {
578
578
  process.exit(1);
579
579
  }
580
580
  const harnesses = parseHarnessFilter(opts.harness);
581
- if (!opts.global && harnesses === void 0) {
582
- const projectDir = path18__default.resolve(opts.projectDir);
583
- if (!existsSync(path18__default.join(projectDir, SKAILE_YAML_DEFAULT))) {
584
- logErr(`No ${S.cmd("skaile.yaml")} found. Run ${S.cmd("skaile init")} to create one.`);
585
- process.exit(1);
586
- }
587
- }
581
+ if (!opts.global && harnesses === void 0) requireProjectConfig(opts.projectDir);
588
582
  const warnings = deferredWarnings();
589
583
  const am2 = new AssetManager({
590
584
  registry: getKindRegistry(),
@@ -600,9 +594,11 @@ function makeAddCommand() {
600
594
  const libraryOf = /* @__PURE__ */ new Map();
601
595
  let presets = [];
602
596
  const skippedLinks = /* @__PURE__ */ new Set();
597
+ const skippedEnv = /* @__PURE__ */ new Set();
603
598
  const added = await am2.add(ref, {
604
599
  link: opts.link,
605
600
  onLibraryOrigin: (deployedRef, library) => libraryOf.set(deployedRef, library),
601
+ onLibraryMoved: (m) => warnings.push(`${m.ref} moved from ${m.from} to ${m.to}`),
606
602
  onPresets: (expanded) => {
607
603
  presets = expanded;
608
604
  },
@@ -611,6 +607,14 @@ function makeAddCommand() {
611
607
  if (skippedLinks.has(linkPath)) return;
612
608
  skippedLinks.add(linkPath);
613
609
  warnings.push(`skipped symlink ${linkPath}`);
610
+ },
611
+ // A `.env` in an asset root is never deployed or hashed: say so once per file.
612
+ onEnvFile: (_assetRef, envPath) => {
613
+ if (skippedEnv.has(envPath)) return;
614
+ skippedEnv.add(envPath);
615
+ warnings.push(
616
+ `${envPath} is a .env file: it is not deployed or hashed with the asset. Keep secrets out of an asset root`
617
+ );
614
618
  }
615
619
  });
616
620
  spinner.stop("Done");
@@ -665,6 +669,8 @@ function makeRemoveCommand() {
665
669
  "Comma-separated global harnesses to undeploy from (default: all resolved); implies --global"
666
670
  ).option("--target <agent>", `Driver target (${TARGET_DEFAULT_HINT})`).option("--force", "Remove even when another installed asset requires it").option("--no-soft-deps", "skip the orphaned-soft-dep prompt (don't remove, don't report)").action(async (ref, opts) => {
667
671
  const harnesses = parseHarnessFilter(opts.harness);
672
+ if (!opts.global && harnesses === void 0)
673
+ requireProjectConfig(opts.projectDir, { allowMissing: true });
668
674
  const am2 = new AssetManager({
669
675
  registry: getKindRegistry(),
670
676
  projectDir: path18__default.resolve(opts.projectDir),
@@ -850,7 +856,7 @@ async function resolveInfoEntry(am2, ref, opts) {
850
856
  return { entry: match ?? deployed };
851
857
  }
852
858
  const lookup = opts.storeLookup ?? (async (filter) => {
853
- const { resolveCatalogSource } = await import('../open-library-4QSUORI6.js');
859
+ const { resolveCatalogSource } = await import('../open-library-BOSPJVID.js');
854
860
  const { source, close } = await resolveCatalogSource({ projectDir: opts.projectDir });
855
861
  try {
856
862
  return await source.listAssets(filter);
@@ -866,7 +872,7 @@ async function resolveInfoEntry(am2, ref, opts) {
866
872
  );
867
873
  return { entry: hit ? catalogAssetToEntry(hit) : null };
868
874
  } catch (err2) {
869
- const { LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-4QSUORI6.js');
875
+ const { LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BOSPJVID.js');
870
876
  const storeNote = err2 instanceof Error ? err2.message : String(err2);
871
877
  const disabled = err2 instanceof LocalCatalogDisabledError2 || /catalog\.url/i.test(storeNote);
872
878
  return { entry: null, storeNote, ...disabled ? { storeDisabled: true } : {} };
@@ -942,31 +948,31 @@ function makeCreateCommand() {
942
948
  }
943
949
  function makeDoctorCommand() {
944
950
  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) => {
951
+ requireProjectConfig(opts.projectDir);
945
952
  const am2 = new AssetManager({
946
953
  registry: getKindRegistry(),
947
954
  projectDir: path18__default.resolve(opts.projectDir)
948
955
  });
949
- const { gaps, requirements } = await am2.projectState();
956
+ const { gaps } = await am2.projectState();
950
957
  if (gaps.length === 0) {
951
958
  logOk("No missing dependencies.");
952
959
  return;
953
960
  }
954
961
  process.exitCode = 1;
955
962
  for (const g of gaps) if (g.type !== "requires") logErr(g.message);
956
- const missing = requirements.filter((i) => !i.unresolved);
963
+ const missing = gaps.filter((g) => g.type === "requires" && g.asset !== void 0);
957
964
  if (missing.length === 0) return;
958
- const assetW = Math.max(5, ...missing.map((i) => `${i.assetKind}:${i.assetName}`.length));
959
- const depW = Math.max(11, ...missing.map((i) => `${i.depKind}:${i.depName}`.length));
965
+ const assetW = Math.max(5, ...missing.map((g) => (g.asset ?? "").length));
966
+ const depW = Math.max(11, ...missing.map((g) => g.ref.length));
960
967
  console.log();
961
968
  console.log(
962
969
  ` ${S.dim("ASSET".padEnd(assetW))} ${S.dim("MISSING DEP".padEnd(depW))} ${S.dim("IN REPOS")}`
963
970
  );
964
971
  console.log(` ${S.rule(assetW + depW + 15)}`);
965
- for (const i of missing) {
966
- const asset = `${i.assetKind}:${i.assetName}`;
967
- const dep = `${i.depKind}:${i.depName}`;
968
- const status4 = i.inRepos ? S.warn("fixable") : S.err("not found");
969
- console.log(` ${asset.padEnd(assetW)} ${dep.padEnd(depW)} ${status4}`);
972
+ for (const g of missing) {
973
+ const asset = g.asset ?? "";
974
+ const status4 = g.manualFix ? S.err("not found") : S.warn("fixable");
975
+ console.log(` ${asset.padEnd(assetW)} ${g.ref.padEnd(depW)} ${status4}`);
970
976
  }
971
977
  console.log();
972
978
  });
@@ -1479,7 +1485,7 @@ function makeCatalogCommand() {
1479
1485
  return catalog;
1480
1486
  }
1481
1487
  async function runLocalCatalogTest(projectDir) {
1482
- const { resolveCatalogSource } = await import('../open-library-4QSUORI6.js');
1488
+ const { resolveCatalogSource } = await import('../open-library-BOSPJVID.js');
1483
1489
  let resolved;
1484
1490
  try {
1485
1491
  resolved = await resolveCatalogSource({ projectDir });
@@ -1622,7 +1628,7 @@ async function scanLibraryFlowEntries() {
1622
1628
  const { LocalIndex, resolveIndexPath, scanAuthoringLibraries } = await import('../library/index.js');
1623
1629
  const indexPath = resolveIndexPath();
1624
1630
  if (!existsSync(indexPath)) return entries;
1625
- const { getKindRegistry: getKindRegistry2 } = await import('../open-registry-VCKS3MP5.js');
1631
+ const { getKindRegistry: getKindRegistry2 } = await import('../open-registry-4FI7HKET.js');
1626
1632
  const index = new LocalIndex({ indexPath });
1627
1633
  try {
1628
1634
  for (const { assets } of await scanAuthoringLibraries(index, getKindRegistry2())) {
@@ -2575,7 +2581,7 @@ async function ensureTargetsRegistered(projectDir) {
2575
2581
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
2576
2582
  const config = resolveSkWorkspaceConfig2(projectDir);
2577
2583
  if (config.plugins && config.plugins.length > 0) {
2578
- const { ensurePluginsLoaded } = await import('../plugin-store-X7GPWGBG.js');
2584
+ const { ensurePluginsLoaded } = await import('../plugin-store-AGQDMING.js');
2579
2585
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
2580
2586
  for (const f of result.failed) logWarn(f.error);
2581
2587
  }
@@ -2694,15 +2700,24 @@ function makeDeployCommand() {
2694
2700
  cmd.action(() => cmd.help());
2695
2701
  return cmd;
2696
2702
  }
2703
+ var DIFF_SHOWS = { content: true, modified: true, incomplete: true };
2697
2704
  function makeDiffCommand() {
2698
2705
  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) => {
2706
+ requireProjectConfig(opts.projectDir);
2699
2707
  const am2 = new AssetManager({
2700
2708
  registry: getKindRegistry(),
2701
2709
  projectDir: path18__default.resolve(opts.projectDir)
2702
2710
  });
2711
+ const gaps = await am2.gapsOf(ref);
2712
+ const blocking = gaps.filter((g) => !DIFF_SHOWS[g.type]);
2713
+ if (blocking.length > 0) {
2714
+ for (const g of blocking) logErr(g.message);
2715
+ process.exitCode = 1;
2716
+ return;
2717
+ }
2703
2718
  const result = await am2.diff(ref);
2704
- const problems = (await am2.gapsOf(ref)).filter(
2705
- (g) => !(g.type === "content" && result.status === "differs")
2719
+ const problems = gaps.filter(
2720
+ (g) => !(result.status === "differs" && (g.type === "content" || g.type === "modified"))
2706
2721
  );
2707
2722
  switch (result.status) {
2708
2723
  case "not-found":
@@ -2711,8 +2726,12 @@ function makeDiffCommand() {
2711
2726
  case "not-deployed":
2712
2727
  if (problems.length === 0) logWarn(`${ref} is not deployed \u2014 run skaile install`);
2713
2728
  break;
2729
+ case "no-files":
2730
+ if (problems.length === 0)
2731
+ logInfo(`${ref}: preset has no files of its own; run skaile diff on its items`);
2732
+ break;
2714
2733
  case "identical":
2715
- logInfo("No differences.");
2734
+ if (problems.length === 0) logInfo("No differences.");
2716
2735
  break;
2717
2736
  case "differs":
2718
2737
  console.log(result.diff);
@@ -3682,7 +3701,7 @@ function pruneEmptyLibraryParents(libPath) {
3682
3701
  }
3683
3702
  }
3684
3703
  async function warnIfNotGithubRemote(name, url) {
3685
- const { isGithubRemote, notGithubRemoteMessage } = await import('../library-publish-OS3JDW4S.js');
3704
+ const { isGithubRemote, notGithubRemoteMessage } = await import('../library-publish-53UTB3MB.js');
3686
3705
  if (!isGithubRemote(url)) logWarn(notGithubRemoteMessage(name, url));
3687
3706
  }
3688
3707
  function scaffoldLibraryFiles(dir, name) {
@@ -3782,7 +3801,10 @@ function makeLibraryCommand() {
3782
3801
  console.log(` ${S.label("manifestGen")} ${l.manifestGenerated}`);
3783
3802
  console.log(` ${S.label("backendConfig")} ${JSON.stringify(l.backendConfig)}`);
3784
3803
  console.log();
3785
- if (libraryDirMissing(l)) logWarn(missingLibraryDirMessage(l));
3804
+ if (libraryDirMissing(l)) {
3805
+ logErr(missingLibraryDirMessage(l));
3806
+ process.exitCode = 1;
3807
+ }
3786
3808
  } finally {
3787
3809
  close();
3788
3810
  }
@@ -3984,7 +4006,7 @@ function makeLibraryCommand() {
3984
4006
  process.exit(1);
3985
4007
  }
3986
4008
  logOk(`Created ${effectiveKind}: ${pc5.dim(res.path)}`);
3987
- if (opts.description === void 0 && ["skill", "agent", "prompt", "contract"].includes(effectiveKind)) {
4009
+ if (opts.description === void 0) {
3988
4010
  logWarn(
3989
4011
  `Description is a TODO placeholder \u2014 edit it (what the ${effectiveKind} does and when to use it) or \`skaile validate\` will fail.`
3990
4012
  );
@@ -4023,6 +4045,10 @@ function makeLibraryCommand() {
4023
4045
  }
4024
4046
  });
4025
4047
  async function renameLibrary(manager, lib, newName) {
4048
+ if (libraryDirMissing(lib)) {
4049
+ logErr(missingLibraryDirMessage(lib));
4050
+ process.exit(1);
4051
+ }
4026
4052
  requireValidLibraryName(newName);
4027
4053
  if (await manager.getLibrary(newName)) {
4028
4054
  logErr(`A library named "${newName}" is already registered.`);
@@ -4326,16 +4352,16 @@ function makeLibraryCommand() {
4326
4352
  "With --create-repo: create the repo private (the store only accepts public repos)"
4327
4353
  ).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(
4328
4354
  async (lib, opts) => {
4329
- const { runLibraryPublish } = await import('../library-publish-OS3JDW4S.js');
4355
+ const { runLibraryPublish } = await import('../library-publish-53UTB3MB.js');
4330
4356
  await withStoreErrorHandling(() => runLibraryPublish(lib, opts));
4331
4357
  }
4332
4358
  );
4333
4359
  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) => {
4334
- const { runLibraryRegister } = await import('../library-publish-OS3JDW4S.js');
4360
+ const { runLibraryRegister } = await import('../library-publish-53UTB3MB.js');
4335
4361
  await withStoreErrorHandling(() => runLibraryRegister(lib, opts));
4336
4362
  });
4337
4363
  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) => {
4338
- const { runLibraryYank } = await import('../library-publish-OS3JDW4S.js');
4364
+ const { runLibraryYank } = await import('../library-publish-53UTB3MB.js');
4339
4365
  await withStoreErrorHandling(() => runLibraryYank(lib, opts));
4340
4366
  });
4341
4367
  return cmd;
@@ -4995,7 +5021,7 @@ function scheduleSoftDepPreview() {
4995
5021
  }
4996
5022
  async function loadAssets() {
4997
5023
  softDepPreviewCache.clear();
4998
- const { gatherAssetFeeds } = await import('../asset-feeds-ELEBTNUS.js');
5024
+ const { gatherAssetFeeds } = await import('../asset-feeds-CXGQIDFR.js');
4999
5025
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
5000
5026
  if (notes.length > 0) {
5001
5027
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
@@ -5199,7 +5225,7 @@ function reconcileCollapsedSets(rows) {
5199
5225
  async function loadSourcesAndLibraries() {
5200
5226
  try {
5201
5227
  const [{ openLibraryManager: openLibraryManager2 }, { getGlobalCacheDir: getGlobalCacheDir2, globalSkaileDir: globalSkaileDir2 }] = await Promise.all([
5202
- import('../open-library-4QSUORI6.js'),
5228
+ import('../open-library-BOSPJVID.js'),
5203
5229
  import('../core/index.js')
5204
5230
  ]);
5205
5231
  const { manager, library, close } = await openLibraryManager2();
@@ -5331,12 +5357,25 @@ function pendingCountsFor(match) {
5331
5357
  }
5332
5358
  return [add, remove];
5333
5359
  }
5334
- function groupStatus(refs) {
5335
- if (refs.length === 0) return pc5.dim("\xB7 ");
5336
- if (refs.some((r) => state.pendingAdds.has(r))) return pc5.blue("+ ");
5337
- if (refs.some((r) => state.pendingRemoves.has(r))) return pc5.red("- ");
5338
- const allInstalled = refs.every((r) => findAssetRow(r)?.installed);
5339
- return allInstalled ? pc5.green("\u2713 ") : pc5.dim("\xB7 ");
5360
+ function groupSelectionState(rows, pendingAdds, pendingRemoves) {
5361
+ const own = rows.filter((r) => assetRefOf(r) !== null);
5362
+ if (own.length === 0) return "empty";
5363
+ const refs = refsOf(own);
5364
+ if (refs.some((r) => pendingAdds.has(r))) return "add";
5365
+ if (refs.some((r) => pendingRemoves.has(r))) return "remove";
5366
+ return own.every((r) => r.installed) ? "installed" : "none";
5367
+ }
5368
+ function groupStatus(rows) {
5369
+ switch (groupSelectionState(rows, state.pendingAdds, state.pendingRemoves)) {
5370
+ case "add":
5371
+ return pc5.blue("+ ");
5372
+ case "remove":
5373
+ return pc5.red("- ");
5374
+ case "installed":
5375
+ return pc5.green("\u2713 ");
5376
+ default:
5377
+ return pc5.dim("\xB7 ");
5378
+ }
5340
5379
  }
5341
5380
  function renderHeaderLine(opts) {
5342
5381
  const indicator = opts.collapsed ? "\u25B6" : "\u25BC";
@@ -5348,7 +5387,7 @@ function renderHeaderLine(opts) {
5348
5387
  if (add > 0) count += pc5.green(`+${add}`);
5349
5388
  if (remove > 0) count += pc5.red(`-${remove}`);
5350
5389
  count += `/${total}`;
5351
- const status4 = groupStatus(opts.refs);
5390
+ const status4 = groupStatus(countRows.filter(opts.match));
5352
5391
  const line = `${opts.indent}${status4}${indicator} ${opts.label} (${count} assets)`;
5353
5392
  return opts.selected ? pc5.bgWhite(pc5.black(`${line} `.padEnd(state.cols))) : line;
5354
5393
  }
@@ -5360,7 +5399,6 @@ function renderAssetRow(row, selected) {
5360
5399
  indent: " ",
5361
5400
  collapsed: state.collapsedOrigins.has(origin),
5362
5401
  match: (r) => isAsset(r) && rowOrigin(r) === origin,
5363
- refs: originAssetRefs(state.assetRows, origin),
5364
5402
  label: `${meta.icon} ${pc5.bold(pc5.cyan(meta.label))}`,
5365
5403
  selected
5366
5404
  });
@@ -5371,7 +5409,6 @@ function renderAssetRow(row, selected) {
5371
5409
  indent: " ".repeat(3),
5372
5410
  collapsed: state.collapsedSources.has(srcKey(origin, row.source)),
5373
5411
  match: (r) => isAsset(r) && inSource(r, origin, row.source),
5374
- refs: sourceAssetRefs(state.assetRows, origin, row.source),
5375
5412
  label: pc5.bold(pc5.cyan(row.source)),
5376
5413
  selected
5377
5414
  });
@@ -5383,7 +5420,6 @@ function renderAssetRow(row, selected) {
5383
5420
  indent: " ".repeat(5),
5384
5421
  collapsed: state.collapsedPlugins.has(pluginKey(origin, row.source, plugin)),
5385
5422
  match: (r) => isAsset(r) && inPlugin(r, origin, row.source, plugin),
5386
- refs: pluginAssetRefs(state.assetRows, origin, row.source, plugin),
5387
5423
  label: pluginHeaderLabel(plugin),
5388
5424
  selected
5389
5425
  });
@@ -5426,7 +5462,6 @@ function renderSourceTreeRow(row, selected) {
5426
5462
  indent: " ".repeat(3),
5427
5463
  collapsed: state.collapsedSourceOrgs.has(org),
5428
5464
  match: (r) => isAsset(r) && rowOrigin(r) === "source" && rowOrg(r) === org,
5429
- refs: sourceOrgRefs(state.sourceTreeRows, org),
5430
5465
  label: pc5.bold(pc5.cyan(org)),
5431
5466
  selected,
5432
5467
  rows: state.sourceTreeRows
@@ -5439,7 +5474,6 @@ function renderSourceTreeRow(row, selected) {
5439
5474
  indent: " ".repeat(5),
5440
5475
  collapsed: state.collapsedSourceRepos.has(repoKey(org, repo)),
5441
5476
  match: (r) => isAsset(r) && rowOrigin(r) === "source" && rowOrg(r) === org && rowGroup(r) === repo,
5442
- refs: sourceRepoRefs(state.sourceTreeRows, org, repo),
5443
5477
  label: pc5.bold(repo),
5444
5478
  selected,
5445
5479
  rows: state.sourceTreeRows
@@ -5453,7 +5487,6 @@ function renderSourceTreeRow(row, selected) {
5453
5487
  indent: " ".repeat(7),
5454
5488
  collapsed: state.collapsedSourcePlugins.has(srcPluginKey(org, repo, plugin)),
5455
5489
  match: (r) => isAsset(r) && rowOrigin(r) === "source" && rowOrg(r) === org && rowGroup(r) === repo && r.plugin === plugin,
5456
- refs: sourcePluginRefs(state.sourceTreeRows, org, repo, plugin),
5457
5490
  label: pluginHeaderLabel(plugin),
5458
5491
  selected,
5459
5492
  rows: state.sourceTreeRows
@@ -5474,7 +5507,6 @@ function renderLibraryTreeRow(row, selected) {
5474
5507
  indent: " ".repeat(3),
5475
5508
  collapsed: state.collapsedLibraryGroups.has(group),
5476
5509
  match: (r) => isAsset(r) && rowOrigin(r) === "library" && rowGroup(r) === group,
5477
- refs: libraryGroupRefs(state.libraryTreeRows, group),
5478
5510
  label: pc5.bold(pc5.cyan(group)),
5479
5511
  selected,
5480
5512
  rows: state.libraryTreeRows
@@ -5487,7 +5519,6 @@ function renderLibraryTreeRow(row, selected) {
5487
5519
  indent: " ".repeat(5),
5488
5520
  collapsed: state.collapsedLibraryPlugins.has(libPluginKey(group, plugin)),
5489
5521
  match: (r) => isAsset(r) && inPlugin(r, "library", group, plugin),
5490
- refs: pluginAssetRefs(state.libraryTreeRows, "library", group, plugin),
5491
5522
  label: pluginHeaderLabel(plugin),
5492
5523
  selected,
5493
5524
  rows: state.libraryTreeRows
@@ -6635,25 +6666,6 @@ function findManifestCandidates(rootPath) {
6635
6666
  walk(rootPath);
6636
6667
  return candidates;
6637
6668
  }
6638
- function checkManifestIdentity(kind, parsed) {
6639
- if (parsed === null || typeof parsed !== "object") return null;
6640
- const obj = parsed;
6641
- const identity = kind === "flow" ? obj.id : obj.name;
6642
- if (typeof identity !== "string" || identity.length === 0) return null;
6643
- const publisher = typeof obj.publisher === "string" ? obj.publisher : void 0;
6644
- if (publisher !== void 0) {
6645
- try {
6646
- parseAssetRef(`${kind}:@${publisher}/${identity}`);
6647
- return null;
6648
- } catch (e) {
6649
- return e instanceof Error ? e.message : String(e);
6650
- }
6651
- }
6652
- if (!isValidAssetName(identity)) {
6653
- return `invalid asset ${kind === "flow" ? "id" : "name"} "${identity}" \u2014 ${ASSET_NAME_HINT}`;
6654
- }
6655
- return null;
6656
- }
6657
6669
  function parseManifestCandidate(c, absRoot) {
6658
6670
  const content = fs8__default.readFileSync(c.filePath, "utf-8");
6659
6671
  const res = parseManifestFile(c.filePath, content);
@@ -6691,11 +6703,6 @@ function validateManifestCandidate(c, parsed, body, absRoot, registry, strictCon
6691
6703
  const relPath = path18__default.relative(absRoot, c.filePath);
6692
6704
  let errors = 0;
6693
6705
  let warnings = 0;
6694
- const identityError = checkManifestIdentity(c.kind, parsed);
6695
- if (identityError) {
6696
- logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
6697
- errors++;
6698
- }
6699
6706
  const dirName = path18__default.basename(path18__default.dirname(c.filePath));
6700
6707
  const checked = checkAsset(
6701
6708
  c.kind,
@@ -8793,6 +8800,7 @@ function makeOutdatedCommand() {
8793
8800
  SUPPORTED_DRIVER_TARGETS
8794
8801
  )
8795
8802
  ).action(async (filter, opts) => {
8803
+ requireProjectConfig(opts.projectDir);
8796
8804
  const am2 = new AssetManager({
8797
8805
  registry: getKindRegistry(),
8798
8806
  projectDir: path18__default.resolve(opts.projectDir),
@@ -8901,7 +8909,7 @@ function action2(fn) {
8901
8909
  };
8902
8910
  }
8903
8911
  async function reconcileAndReport(projectDir, plugins) {
8904
- const { reconcilePlugins } = await import('../plugin-store-X7GPWGBG.js');
8912
+ const { reconcilePlugins } = await import('../plugin-store-AGQDMING.js');
8905
8913
  if (plugins.length === 0) {
8906
8914
  logInfo("No plugins declared \u2014 nothing to reconcile.");
8907
8915
  return;
@@ -8917,7 +8925,7 @@ async function reconcileAndReport(projectDir, plugins) {
8917
8925
  async function runInstall2(spec, opts) {
8918
8926
  const projectDir = path18__default.resolve(opts.projectDir);
8919
8927
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
8920
- const { specName } = await import('../plugin-store-X7GPWGBG.js');
8928
+ const { specName } = await import('../plugin-store-AGQDMING.js');
8921
8929
  const yamlPath = path18__default.join(projectDir, "skaile.yaml");
8922
8930
  const editor = WorkspaceYamlEditor2.load(yamlPath);
8923
8931
  const replaced = editor.addPlugin(spec, specName);
@@ -8929,7 +8937,7 @@ async function runInstall2(spec, opts) {
8929
8937
  async function runRemove(name, opts) {
8930
8938
  const projectDir = path18__default.resolve(opts.projectDir);
8931
8939
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
8932
- const { specName } = await import('../plugin-store-X7GPWGBG.js');
8940
+ const { specName } = await import('../plugin-store-AGQDMING.js');
8933
8941
  const yamlPath = path18__default.join(projectDir, "skaile.yaml");
8934
8942
  const editor = WorkspaceYamlEditor2.load(yamlPath);
8935
8943
  const removed = editor.removePlugin(name, specName);
@@ -8957,7 +8965,7 @@ async function runList(opts) {
8957
8965
  const registry = createPluginRegistry();
8958
8966
  if (declared.length > 0) {
8959
8967
  try {
8960
- const { loadPlugins } = await import('../plugin-store-X7GPWGBG.js');
8968
+ const { loadPlugins } = await import('../plugin-store-AGQDMING.js');
8961
8969
  const result = await loadPlugins(projectDir, declared, registry);
8962
8970
  for (const f of result.failed) logWarn(f.error);
8963
8971
  } catch (err2) {
@@ -10112,14 +10120,19 @@ function makeReplCommand() {
10112
10120
  }
10113
10121
  console.log();
10114
10122
  }
10115
- await startRepl({
10116
- projectDir,
10117
- cwd: agentCwd !== projectDir ? agentCwd : void 0,
10118
- driver: driverOverride,
10119
- model: opts.model,
10120
- resume: opts.resume,
10121
- resumeSessionId: opts.resumeSession
10122
- });
10123
+ try {
10124
+ await startRepl({
10125
+ projectDir,
10126
+ cwd: agentCwd !== projectDir ? agentCwd : void 0,
10127
+ driver: driverOverride,
10128
+ model: opts.model,
10129
+ resume: opts.resume,
10130
+ resumeSessionId: opts.resumeSession
10131
+ });
10132
+ } catch (err2) {
10133
+ logErr(friendlyDriverError(err2) ?? (err2 instanceof Error ? err2.message : String(err2)));
10134
+ process.exit(1);
10135
+ }
10123
10136
  });
10124
10137
  }
10125
10138
  function parseProviderIds(raw) {
@@ -10174,12 +10187,12 @@ function makeServeCommand() {
10174
10187
  );
10175
10188
  }
10176
10189
  async function ensurePluginsLoadedForServe(projectDir) {
10177
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-X6URBGSF.js');
10190
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-CFK6YP6R.js');
10178
10191
  try {
10179
10192
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
10180
10193
  const config = resolveSkWorkspaceConfig2(projectDir);
10181
10194
  if (!config.plugins || config.plugins.length === 0) return;
10182
- const { ensurePluginsLoaded } = await import('../plugin-store-X7GPWGBG.js');
10195
+ const { ensurePluginsLoaded } = await import('../plugin-store-AGQDMING.js');
10183
10196
  const { pluginRegistry } = await import('../plugin-registry/index.js');
10184
10197
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
10185
10198
  if (result.loaded.length > 0) {
@@ -10193,14 +10206,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
10193
10206
  }
10194
10207
  }
10195
10208
  async function runCompileTest(opts) {
10196
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-X6URBGSF.js');
10209
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-CFK6YP6R.js');
10197
10210
  const { tmpdir } = await import('os');
10198
10211
  const { dirname: dirname3, join: join6, resolve: resolve5 } = await import('path');
10199
10212
  const { fileURLToPath: fileURLToPath2 } = await import('url');
10200
- const { unlinkSync, existsSync: existsSync18 } = await import('fs');
10213
+ const { unlinkSync, existsSync: existsSync17 } = await import('fs');
10201
10214
  const { spawn } = await import('child_process');
10202
10215
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
10203
- const { MONOREPO_ROOT } = await import('../paths-BVO56A25.js');
10216
+ const { MONOREPO_ROOT } = await import('../paths-SUS4S4YT.js');
10204
10217
  if (MONOREPO_ROOT === null) {
10205
10218
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
10206
10219
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -10262,7 +10275,7 @@ async function runCompileTest(opts) {
10262
10275
  } catch {
10263
10276
  }
10264
10277
  try {
10265
- if (existsSync18(outfile)) unlinkSync(outfile);
10278
+ if (existsSync17(outfile)) unlinkSync(outfile);
10266
10279
  } catch {
10267
10280
  }
10268
10281
  }
@@ -11085,7 +11098,7 @@ function makeStoreCommand() {
11085
11098
  process.exit(2);
11086
11099
  });
11087
11100
  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) => {
11088
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-4QSUORI6.js');
11101
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BOSPJVID.js');
11089
11102
  try {
11090
11103
  const remote = await openCatalogSource2({ projectDir: path18__default.resolve(opts.projectDir) });
11091
11104
  const assets = await remote.listAssets(opts.kind ? { kind: opts.kind } : {});
@@ -11113,8 +11126,8 @@ function makeStoreCommand() {
11113
11126
  }
11114
11127
  });
11115
11128
  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) => {
11116
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-4QSUORI6.js');
11117
- const { supportsInstallManifest } = await import('../project-PAXP46RD.js');
11129
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BOSPJVID.js');
11130
+ const { supportsInstallManifest } = await import('../project-I55A4O2T.js');
11118
11131
  try {
11119
11132
  const remote = await openCatalogSource2({ projectDir: path18__default.resolve(opts.projectDir) });
11120
11133
  const asset = await remote.resolve(ref);
@@ -11269,6 +11282,7 @@ function makeUpdateCommand() {
11269
11282
  ).option("--project-dir <path>", "Project directory", process.cwd()).option("--no-catalog", "Skip refreshing the catalog cache").option("--catalog-only", "Refresh the catalog cache only; do not re-deploy assets").option("--no-sync", "Skip syncing sources from upstream before re-deploying").option("-y, --yes", "Sync sources without the confirmation prompt").action(
11270
11283
  async (name, opts) => {
11271
11284
  const projectDir = path18__default.resolve(opts.projectDir);
11285
+ if (!opts.catalogOnly) requireProjectConfig(projectDir);
11272
11286
  const am2 = new AssetManager({ registry: getKindRegistry(), projectDir });
11273
11287
  const target = name !== void 0 && !opts.catalogOnly ? await resolveUpdateTarget(am2, name) : void 0;
11274
11288
  if (opts.catalog !== false) {
@@ -11295,11 +11309,11 @@ function makeUpdateCommand() {
11295
11309
  if (await shouldSyncSources(opts)) {
11296
11310
  const syncSpinner = createSpinner();
11297
11311
  syncSpinner.start("Syncing sources");
11298
- const { total, synced, failed } = await syncProjectSources(projectDir);
11312
+ const { total, synced, failed: failed2 } = await syncProjectSources(projectDir);
11299
11313
  syncSpinner.stop(
11300
- total === 0 ? "No sources to sync." : `Synced ${S.heading(`${synced}/${total}`)} source(s)` + (failed ? ` (${failed} failed)` : "")
11314
+ total === 0 ? "No sources to sync." : `Synced ${S.heading(`${synced}/${total}`)} source(s)` + (failed2 ? ` (${failed2} failed)` : "")
11301
11315
  );
11302
- if (failed > 0) process.exitCode = 1;
11316
+ if (failed2 > 0) process.exitCode = 1;
11303
11317
  } else {
11304
11318
  for (const slug of divergedSourceClones(projectDir)) {
11305
11319
  logErr(`${slug}: git pull failed: Not possible to fast-forward, aborting.`);
@@ -11314,27 +11328,39 @@ function makeUpdateCommand() {
11314
11328
  spinner.start("Re-deploying assets");
11315
11329
  let result;
11316
11330
  try {
11317
- result = await am2.install();
11331
+ result = await am2.install({ moveLibraries: true });
11318
11332
  } catch (err2) {
11319
11333
  spinner.stop("Failed");
11320
11334
  logErr(String(err2));
11321
11335
  process.exit(1);
11322
11336
  }
11323
- spinner.stop("Done");
11337
+ const failed = result.missing.length > 0 || !!result.agentInstanceErrors?.length || process.exitCode === 1;
11338
+ spinner.stop(failed ? "Failed" : "Done");
11324
11339
  if (result.deployed.length > 0) {
11325
11340
  for (const d of result.deployed) logOk(`Updated ${d}`);
11326
11341
  }
11342
+ for (const r of result.restored ?? []) {
11343
+ for (const f of r.restored) logInfo(`Restored ${f}`);
11344
+ for (const f of r.removed) logInfo(`Removed ${f} (not part of ${r.ref})`);
11345
+ }
11327
11346
  for (const r of result.removed) logWarn(`Removed: ${r}`);
11328
11347
  reportReplaced(result.replaced);
11329
11348
  reportRelocked(result.relocked);
11330
- const changed = result.deployed.length > 0 || result.removed.length > 0 || !!result.replaced?.length || !!result.relocked?.length;
11349
+ reportMoved(result.moved);
11350
+ const changed = result.deployed.length > 0 || result.removed.length > 0 || !!result.replaced?.length || !!result.moved?.length || !!result.relocked?.length;
11331
11351
  if (result.lockWritten && changed) {
11332
11352
  logInfo(`Lock file written: ${S.dim("skaile.lock.yaml")}`);
11333
11353
  }
11354
+ if (result.agentInstanceErrors?.length) {
11355
+ logErr(
11356
+ `${result.agentInstanceErrors.length} agent instance(s) could not be rendered (see above)`
11357
+ );
11358
+ process.exitCode = 1;
11359
+ }
11334
11360
  if (result.missing.length > 0) {
11335
11361
  for (const m of result.missing) logErr(`Missing: ${m}${result.missingHints?.[m] ?? ""}`);
11336
11362
  process.exitCode = 1;
11337
- } else if (!changed) {
11363
+ } else if (!changed && !failed) {
11338
11364
  logInfo("Nothing to update.");
11339
11365
  }
11340
11366
  }
@@ -11394,14 +11420,14 @@ async function updateOne(am2, projectDir, target) {
11394
11420
  spinner.start(`Updating ${target.ref}`);
11395
11421
  let deployed;
11396
11422
  try {
11397
- deployed = await am2.add(target.ref);
11423
+ deployed = await am2.add(target.ref, { onLibraryMoved: (m) => reportMoved([m]) });
11398
11424
  } catch (err2) {
11399
11425
  spinner.stop("Failed");
11400
11426
  logErr(err2 instanceof Error ? err2.message : String(err2));
11401
11427
  process.exitCode = 1;
11402
11428
  return;
11403
11429
  }
11404
- spinner.stop("Done");
11430
+ spinner.stop(process.exitCode === 1 ? "Failed" : "Done");
11405
11431
  for (const d of deployed) logOk(`Updated ${d}`);
11406
11432
  if (deployed.length > 0) return;
11407
11433
  if (readText2(lockPath) !== before) logInfo(`Re-locked ${target.ref}`);
@@ -11495,17 +11521,23 @@ function refKindName(ref) {
11495
11521
  let rest = colon === -1 ? trimmed : trimmed.slice(colon + 1);
11496
11522
  const hash = rest.indexOf("#");
11497
11523
  if (hash !== -1) rest = rest.slice(0, hash);
11524
+ let publisher;
11498
11525
  if (rest.startsWith("@")) {
11499
11526
  const slash = rest.indexOf("/");
11500
- if (slash !== -1) rest = rest.slice(slash + 1);
11527
+ if (slash !== -1) {
11528
+ publisher = rest.slice(1, slash);
11529
+ rest = rest.slice(slash + 1);
11530
+ }
11501
11531
  }
11502
- return { kind, name: rest };
11532
+ return { kind, name: rest, publisher };
11503
11533
  }
11504
11534
  function whyEmptyMessage(ref, declared) {
11505
- const { kind, name } = refKindName(ref);
11506
- const isDeclared = declared.some(
11507
- (d) => d.name === name && (kind === void 0 || d.kind === kind)
11508
- );
11535
+ const { kind, name, publisher } = refKindName(ref);
11536
+ const isDeclared = declared.some((d) => {
11537
+ if (d.name !== name || kind !== void 0 && d.kind !== kind) return false;
11538
+ const declaredPublisher = d.ref ? refKindName(d.ref).publisher : void 0;
11539
+ return !publisher || !declaredPublisher || publisher === declaredPublisher;
11540
+ });
11509
11541
  if (isDeclared) {
11510
11542
  return `${ref} not found in lock file. Run \`skaile install\` first.`;
11511
11543
  }
@@ -11519,11 +11551,19 @@ function makeWhyCommand() {
11519
11551
  });
11520
11552
  const chain = await am2.why(ref);
11521
11553
  if (chain.length === 0) {
11554
+ const declaredGap = (await am2.gapsOf(ref)).find((g) => g.type === "declared");
11555
+ if (declaredGap) {
11556
+ logErr(declaredGap.message);
11557
+ process.exitCode = 1;
11558
+ return;
11559
+ }
11522
11560
  let declared;
11523
11561
  try {
11524
11562
  declared = await am2.listDeclared();
11525
- } catch {
11526
- logErr(`${ref} not found in lock file. Run \`skaile install\` first.`);
11563
+ } catch (err2) {
11564
+ logErr(
11565
+ `${ref} is not in the lock file, and skaile.yaml cannot be read: ${err2 instanceof Error ? err2.message : String(err2)}`
11566
+ );
11527
11567
  process.exitCode = 1;
11528
11568
  return;
11529
11569
  }
@@ -11695,29 +11735,29 @@ async function runInit(projectDir, opts) {
11695
11735
  const resolved = path18__default.resolve(projectDir ?? ".");
11696
11736
  const projectName = path18__default.basename(resolved);
11697
11737
  const created = [];
11698
- const { existsSync: existsSync18 } = await import('fs');
11699
- if (!existsSync18(resolved)) {
11738
+ const { existsSync: existsSync17 } = await import('fs');
11739
+ if (!existsSync17(resolved)) {
11700
11740
  mkdirSync5(resolved, { recursive: true });
11701
11741
  created.push(".");
11702
11742
  }
11703
11743
  const skaileDir = path18__default.join(resolved, ".skaile");
11704
- if (!existsSync18(skaileDir)) {
11744
+ if (!existsSync17(skaileDir)) {
11705
11745
  mkdirSync5(path18__default.join(skaileDir, "sessions"), { recursive: true });
11706
11746
  created.push(".skaile/");
11707
11747
  }
11708
11748
  const settingsPath = path18__default.join(skaileDir, "settings.json");
11709
- if (!existsSync18(settingsPath)) {
11749
+ if (!existsSync17(settingsPath)) {
11710
11750
  writeFileSync6(settingsPath, "{}\n");
11711
11751
  created.push(".skaile/settings.json");
11712
11752
  }
11713
11753
  const wsConfigPath = path18__default.join(resolved, "skaile.yaml");
11714
- if (!existsSync18(wsConfigPath)) {
11754
+ if (!existsSync17(wsConfigPath)) {
11715
11755
  writeFileSync6(wsConfigPath, stringify2(buildInitWorkspaceConfig(projectName, harness)));
11716
11756
  created.push("skaile.yaml");
11717
11757
  }
11718
11758
  for (const dir of new Set(Object.values(DRIVER_TARGETS[harness].local))) {
11719
11759
  const full = path18__default.join(resolved, dir);
11720
- if (!existsSync18(full)) {
11760
+ if (!existsSync17(full)) {
11721
11761
  mkdirSync5(full, { recursive: true });
11722
11762
  created.push(`${dir}/`);
11723
11763
  }
@@ -11747,7 +11787,7 @@ function buildInitWorkspaceConfig(projectName, harness) {
11747
11787
  }
11748
11788
  async function initGitScaffold(resolved, created) {
11749
11789
  const { execSync: execSync2 } = await import('child_process');
11750
- const { existsSync: existsSync18, readFileSync: readFileSync10, writeFileSync: writeFileSync6 } = await import('fs');
11790
+ const { existsSync: existsSync17, readFileSync: readFileSync10, writeFileSync: writeFileSync6 } = await import('fs');
11751
11791
  const gitignorePath = path18__default.join(resolved, ".gitignore");
11752
11792
  const entries = [
11753
11793
  "node_modules/",
@@ -11765,7 +11805,7 @@ async function initGitScaffold(resolved, created) {
11765
11805
  ".env",
11766
11806
  ".env.local"
11767
11807
  ];
11768
- const existing = existsSync18(gitignorePath) ? readFileSync10(gitignorePath, "utf-8") : "";
11808
+ const existing = existsSync17(gitignorePath) ? readFileSync10(gitignorePath, "utf-8") : "";
11769
11809
  const have = new Set(existing.split("\n").map((l) => l.trim()));
11770
11810
  const append = entries.filter((e) => !have.has(e));
11771
11811
  if (append.length > 0) {
@@ -11774,7 +11814,7 @@ async function initGitScaffold(resolved, created) {
11774
11814
  `);
11775
11815
  if (!existing) created.push(".gitignore");
11776
11816
  }
11777
- if (!existsSync18(path18__default.join(resolved, ".git"))) {
11817
+ if (!existsSync17(path18__default.join(resolved, ".git"))) {
11778
11818
  try {
11779
11819
  execSync2("git init", { cwd: resolved, stdio: "pipe" });
11780
11820
  created.push(".git/");
@@ -11804,7 +11844,7 @@ async function bootstrapUserConfig() {
11804
11844
  }
11805
11845
  async function hydrateInitSources(resolved, created) {
11806
11846
  try {
11807
- const { ensureSourcesCloned } = await import('../ensure-sources-5ISVIA4T.js');
11847
+ const { ensureSourcesCloned } = await import('../ensure-sources-2RONZKCU.js');
11808
11848
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
11809
11849
  for (const n of hydrate.cloned) created.push(`~/.skaile/cache/sources/${n}/`);
11810
11850
  if (hydrate.failed.length > 0) {
@@ -11844,7 +11884,7 @@ function printInitSummary(resolved, projectDir, created) {
11844
11884
  console.log();
11845
11885
  }
11846
11886
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
11847
- const { cmdSetup } = await import('../setup-BV55VHWC.js');
11887
+ const { cmdSetup } = await import('../setup-7DQJKHUI.js');
11848
11888
  await cmdSetup([], { projectDir: process.cwd() });
11849
11889
  });
11850
11890
  program.addCommand(makeInstallCommand());
@@ -11922,8 +11962,15 @@ process.stdout.on("error", (err2) => {
11922
11962
  if (err2.code === "EPIPE") process.exit(0);
11923
11963
  throw err2;
11924
11964
  });
11965
+ var commandSettled = false;
11966
+ process.once("beforeExit", () => {
11967
+ if (commandSettled) return;
11968
+ logErr("The command ended before it finished (nothing left to wait for).");
11969
+ process.exit(1);
11970
+ });
11925
11971
  try {
11926
11972
  await program.parseAsync();
11973
+ commandSettled = true;
11927
11974
  } catch (err2) {
11928
11975
  const { LibrarySyncError } = await import('../library/index.js');
11929
11976
  if (!(err2 instanceof LibrarySyncError || err2 instanceof SourceEntryError)) throw err2;