@skaile/workspaces 0.22.0-beta.0 → 0.22.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/CHANGELOG.md +221 -0
  2. package/dist/{asset-feeds-PJDJ3QYI.js → asset-feeds-2M6UKEJ7.js} +13 -14
  3. package/dist/asset-feeds-2M6UKEJ7.js.map +1 -0
  4. package/dist/asset-manager/catalog-deployer.d.ts +2 -0
  5. package/dist/asset-manager/contrib.d.ts +2 -0
  6. package/dist/asset-manager/fragments.d.ts +2 -0
  7. package/dist/asset-manager/history.d.ts +2 -0
  8. package/dist/asset-manager/index.d.ts +2 -0
  9. package/dist/asset-manager/index.js +7 -7
  10. package/dist/asset-manager/installer.d.ts +2 -0
  11. package/dist/asset-manager/installer.js +6 -6
  12. package/dist/asset-manager/renderers.d.ts +2 -0
  13. package/dist/asset-manager/src/index.d.ts +18 -7
  14. package/dist/asset-manager/src/index.d.ts.map +1 -1
  15. package/dist/asset-manager/src/installer.d.ts +3 -3
  16. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  17. package/dist/base-assets/connectors/deploy.d.ts +2 -0
  18. package/dist/base-assets/connectors/deploy.js +8 -8
  19. package/dist/base-assets/connectors/devserver.d.ts +2 -0
  20. package/dist/base-assets/connectors/devserver.js +8 -8
  21. package/dist/base-assets/connectors/flow/adapter.js +8 -8
  22. package/dist/base-assets/connectors/flow/engine.d.ts +2 -0
  23. package/dist/base-assets/connectors/flow/run-flow.js +9 -9
  24. package/dist/base-assets/connectors/flow.d.ts +2 -0
  25. package/dist/base-assets/connectors/flow.js +8 -8
  26. package/dist/base-assets/connectors/git/driver.d.ts.map +1 -1
  27. package/dist/base-assets/connectors/git.d.ts +2 -0
  28. package/dist/base-assets/connectors/git.js +8 -8
  29. package/dist/base-assets/connectors/gmail.d.ts +2 -0
  30. package/dist/base-assets/connectors/gmail.js +8 -8
  31. package/dist/base-assets/connectors/googledrive.d.ts +2 -0
  32. package/dist/base-assets/connectors/googledrive.js +8 -8
  33. package/dist/base-assets/connectors/local.d.ts +2 -0
  34. package/dist/base-assets/connectors/local.js +8 -8
  35. package/dist/base-assets/connectors/mattermost.d.ts +2 -0
  36. package/dist/base-assets/connectors/mattermost.js +8 -8
  37. package/dist/base-assets/connectors/memory.d.ts +2 -0
  38. package/dist/base-assets/connectors/memory.js +8 -8
  39. package/dist/base-assets/connectors/minio.d.ts +2 -0
  40. package/dist/base-assets/connectors/minio.js +8 -8
  41. package/dist/base-assets/connectors/postgres.d.ts +2 -0
  42. package/dist/base-assets/connectors/postgres.js +8 -8
  43. package/dist/base-assets/connectors/s3.d.ts +2 -0
  44. package/dist/base-assets/connectors/s3.js +8 -8
  45. package/dist/base-assets/connectors/sharepoint.d.ts +2 -0
  46. package/dist/base-assets/connectors/sharepoint.js +8 -8
  47. package/dist/base-assets/connectors/sqlite.d.ts +2 -0
  48. package/dist/base-assets/connectors/sqlite.js +8 -8
  49. package/dist/base-assets/connectors/static-server.d.ts +2 -0
  50. package/dist/base-assets/connectors/static-server.js +8 -8
  51. package/dist/base-assets/connectors/tunnel.d.ts +2 -0
  52. package/dist/base-assets/connectors/tunnel.js +8 -8
  53. package/dist/base-assets/connectors/webdav.d.ts +2 -0
  54. package/dist/base-assets/connectors/webdav.js +8 -8
  55. package/dist/base-assets/connectors/xstate-store.d.ts +2 -0
  56. package/dist/base-assets/connectors/xstate-store.js +8 -8
  57. package/dist/base-assets/connectors/xstate.d.ts +2 -0
  58. package/dist/base-assets/connectors/xstate.js +8 -8
  59. package/dist/bridge/drivers/claude-sdk.d.ts +2 -0
  60. package/dist/bridge/drivers/claude-sdk.js +2 -2
  61. package/dist/bridge/drivers/codex.d.ts +2 -0
  62. package/dist/bridge/drivers/codex.js +2 -2
  63. package/dist/bridge/drivers/echo.d.ts +2 -0
  64. package/dist/bridge/drivers/echo.js +2 -2
  65. package/dist/bridge/drivers/omp.d.ts +2 -0
  66. package/dist/bridge/drivers/omp.js +2 -2
  67. package/dist/bridge/index.d.ts +2 -0
  68. package/dist/bridge/index.js +3 -3
  69. package/dist/bridge/src/registry.d.ts +4 -2
  70. package/dist/bridge/src/registry.d.ts.map +1 -1
  71. package/dist/chunk-32NA4TVC.js +30 -0
  72. package/dist/chunk-32NA4TVC.js.map +1 -0
  73. package/dist/{chunk-CSDQBWE6.js → chunk-3KLWGHDE.js} +5 -5
  74. package/dist/{chunk-CSDQBWE6.js.map → chunk-3KLWGHDE.js.map} +1 -1
  75. package/dist/{chunk-UZRY5UI2.js → chunk-6E6PKKAD.js} +68 -3
  76. package/dist/chunk-6E6PKKAD.js.map +1 -0
  77. package/dist/{chunk-G6GKWGOW.js → chunk-6SA2SIOU.js} +26 -10
  78. package/dist/chunk-6SA2SIOU.js.map +1 -0
  79. package/dist/{chunk-IGQEXBBG.js → chunk-6VTG73UY.js} +13 -9
  80. package/dist/chunk-6VTG73UY.js.map +1 -0
  81. package/dist/{chunk-TTY56FQQ.js → chunk-74GTZ4TJ.js} +17 -5
  82. package/dist/chunk-74GTZ4TJ.js.map +1 -0
  83. package/dist/chunk-7QBNJTTQ.js +3 -0
  84. package/dist/{chunk-W2O5LWYU.js.map → chunk-7QBNJTTQ.js.map} +1 -1
  85. package/dist/{chunk-SL6JVGRD.js → chunk-CEUHU3C4.js} +3 -3
  86. package/dist/{chunk-SL6JVGRD.js.map → chunk-CEUHU3C4.js.map} +1 -1
  87. package/dist/{chunk-J2FCO6TM.js → chunk-FIHVQFXB.js} +2 -2
  88. package/dist/{chunk-J2FCO6TM.js.map → chunk-FIHVQFXB.js.map} +1 -1
  89. package/dist/{chunk-F3MGZ5E6.js → chunk-FVZLCBSX.js} +3 -3
  90. package/dist/{chunk-F3MGZ5E6.js.map → chunk-FVZLCBSX.js.map} +1 -1
  91. package/dist/{chunk-7PTP3SQJ.js → chunk-GTS2FODO.js} +32 -7
  92. package/dist/chunk-GTS2FODO.js.map +1 -0
  93. package/dist/{chunk-KA46DUM4.js → chunk-I5SGBFMM.js} +51 -3
  94. package/dist/chunk-I5SGBFMM.js.map +1 -0
  95. package/dist/{chunk-MO4JPTRD.js → chunk-LDLZFYLR.js} +5 -5
  96. package/dist/{chunk-MO4JPTRD.js.map → chunk-LDLZFYLR.js.map} +1 -1
  97. package/dist/{chunk-TKOLD2O7.js → chunk-LDYPQVRU.js} +516 -145
  98. package/dist/chunk-LDYPQVRU.js.map +1 -0
  99. package/dist/{chunk-GKM6MDUC.js → chunk-M5JDVO6D.js} +3 -3
  100. package/dist/{chunk-GKM6MDUC.js.map → chunk-M5JDVO6D.js.map} +1 -1
  101. package/dist/{chunk-XHFMUGDD.js → chunk-M5TE6YI5.js} +3 -3
  102. package/dist/{chunk-XHFMUGDD.js.map → chunk-M5TE6YI5.js.map} +1 -1
  103. package/dist/{chunk-NGC7ZQI4.js → chunk-NICAMYPV.js} +39 -45
  104. package/dist/chunk-NICAMYPV.js.map +1 -0
  105. package/dist/{chunk-WIR34WMU.js → chunk-NQL3T75I.js} +24 -59
  106. package/dist/chunk-NQL3T75I.js.map +1 -0
  107. package/dist/{chunk-RENHNO4J.js → chunk-P4FYHEHW.js} +206 -137
  108. package/dist/chunk-P4FYHEHW.js.map +1 -0
  109. package/dist/{chunk-2DNSSQ22.js → chunk-TWQPDBHB.js} +270 -173
  110. package/dist/chunk-TWQPDBHB.js.map +1 -0
  111. package/dist/{chunk-UZVHJ7LX.js → chunk-UBLTUFFI.js} +4 -4
  112. package/dist/{chunk-UZVHJ7LX.js.map → chunk-UBLTUFFI.js.map} +1 -1
  113. package/dist/{chunk-X5Y4EGZB.js → chunk-VUCPJBAG.js} +43 -10
  114. package/dist/chunk-VUCPJBAG.js.map +1 -0
  115. package/dist/{chunk-PBWMV5GM.js → chunk-WQ7DE5UC.js} +18 -4
  116. package/dist/chunk-WQ7DE5UC.js.map +1 -0
  117. package/dist/cli/index.d.ts +2 -0
  118. package/dist/cli/index.js +258 -262
  119. package/dist/cli/index.js.map +1 -1
  120. package/dist/cli/src/commands/deploy.d.ts.map +1 -1
  121. package/dist/cli/src/commands/manage.d.ts +22 -31
  122. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  123. package/dist/cli/src/commands/npx.d.ts +5 -3
  124. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  125. package/dist/cli/src/commands/project.d.ts.map +1 -1
  126. package/dist/cli/src/commands/source.d.ts +7 -0
  127. package/dist/cli/src/commands/source.d.ts.map +1 -1
  128. package/dist/cli/src/commands/update.d.ts.map +1 -1
  129. package/dist/cli/src/ensure-sources.d.ts.map +1 -1
  130. package/dist/client/index.d.ts +2 -0
  131. package/dist/connectors/config.d.ts +2 -0
  132. package/dist/connectors/config.js +6 -6
  133. package/dist/connectors/index.d.ts +2 -0
  134. package/dist/connectors/index.js +8 -8
  135. package/dist/connectors/rclone-config.d.ts +2 -0
  136. package/dist/connectors/rclone.d.ts +2 -0
  137. package/dist/connectors-shared/index.d.ts +2 -0
  138. package/dist/core/discovery.d.ts +2 -0
  139. package/dist/core/driver-targets.d.ts +2 -0
  140. package/dist/core/framework.d.ts +2 -0
  141. package/dist/core/index.d.ts +2 -0
  142. package/dist/core/index.js +5 -5
  143. package/dist/core/logging.d.ts +2 -0
  144. package/dist/core/manifest.d.ts +2 -0
  145. package/dist/core/manifest.js +2 -2
  146. package/dist/core/models.d.ts +2 -0
  147. package/dist/core/models.js +1 -1
  148. package/dist/core/runtime-assets.d.ts +2 -0
  149. package/dist/core/runtime-assets.js +4 -4
  150. package/dist/core/src/index.d.ts +7 -5
  151. package/dist/core/src/index.d.ts.map +1 -1
  152. package/dist/core/src/lock.d.ts +47 -26
  153. package/dist/core/src/lock.d.ts.map +1 -1
  154. package/dist/core/src/manifest.d.ts.map +1 -1
  155. package/dist/core/src/models.d.ts +61 -49
  156. package/dist/core/src/models.d.ts.map +1 -1
  157. package/dist/core/src/repo-manager.d.ts +79 -36
  158. package/dist/core/src/repo-manager.d.ts.map +1 -1
  159. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  160. package/dist/core/src/walker.d.ts +52 -0
  161. package/dist/core/src/walker.d.ts.map +1 -0
  162. package/dist/core/src/workspace-config.d.ts +160 -45
  163. package/dist/core/src/workspace-config.d.ts.map +1 -1
  164. package/dist/core/src/workspace-yaml-editor.d.ts +33 -16
  165. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  166. package/dist/core/store.d.ts +2 -0
  167. package/dist/core/workspace-config.d.ts +2 -0
  168. package/dist/core/workspace-config.js +3 -3
  169. package/dist/deploy/index.d.ts +2 -0
  170. package/dist/deploy/index.js +167 -52
  171. package/dist/deploy/index.js.map +1 -1
  172. package/dist/deploy/src/index.d.ts +4 -3
  173. package/dist/deploy/src/index.d.ts.map +1 -1
  174. package/dist/deploy/src/targets/container-runtime.d.ts +1 -0
  175. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  176. package/dist/deploy/src/targets/docker.d.ts +1 -0
  177. package/dist/deploy/src/targets/docker.d.ts.map +1 -1
  178. package/dist/deploy/src/targets/local.d.ts.map +1 -1
  179. package/dist/deploy/src/targets/nix.d.ts +36 -0
  180. package/dist/deploy/src/targets/nix.d.ts.map +1 -0
  181. package/dist/deploy/src/targets/podman.d.ts +1 -0
  182. package/dist/deploy/src/targets/podman.d.ts.map +1 -1
  183. package/dist/deploy/src/targets/process-handle.d.ts +34 -0
  184. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -0
  185. package/dist/discovery/index.d.ts +2 -0
  186. package/dist/discovery/index.js +3 -3
  187. package/dist/discovery/src/source-config.d.ts +2 -2
  188. package/dist/{ensure-sources-COGVKY44.js → ensure-sources-ALTI5PXR.js} +20 -16
  189. package/dist/ensure-sources-ALTI5PXR.js.map +1 -0
  190. package/dist/library/index.d.ts +2 -0
  191. package/dist/library/index.js +4 -4
  192. package/dist/library/src/remote/remote-catalog-source.d.ts +17 -0
  193. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  194. package/dist/open-library-EEGG6RDN.js +13 -0
  195. package/dist/{open-library-DWAQFUSQ.js.map → open-library-EEGG6RDN.js.map} +1 -1
  196. package/dist/plugin-registry/index.d.ts +2 -0
  197. package/dist/plugin-registry/index.js +1 -1
  198. package/dist/plugin-registry/src/context.d.ts +30 -1
  199. package/dist/plugin-registry/src/context.d.ts.map +1 -1
  200. package/dist/plugin-registry/src/deploy-handle.d.ts +17 -1
  201. package/dist/plugin-registry/src/deploy-handle.d.ts.map +1 -1
  202. package/dist/plugin-registry/src/deploy-helpers.d.ts +69 -0
  203. package/dist/plugin-registry/src/deploy-helpers.d.ts.map +1 -0
  204. package/dist/plugin-registry/src/index.d.ts +6 -4
  205. package/dist/plugin-registry/src/index.d.ts.map +1 -1
  206. package/dist/plugin-registry/src/internal.d.ts.map +1 -1
  207. package/dist/plugin-registry/src/registry.d.ts +1 -0
  208. package/dist/plugin-registry/src/registry.d.ts.map +1 -1
  209. package/dist/plugin-registry/src/targets.d.ts +4 -0
  210. package/dist/plugin-registry/src/targets.d.ts.map +1 -1
  211. package/dist/{plugin-store-6OENKNFW.js → plugin-store-G277ZX3B.js} +8 -8
  212. package/dist/{plugin-store-6OENKNFW.js.map → plugin-store-G277ZX3B.js.map} +1 -1
  213. package/dist/plugins/index.d.ts +2 -0
  214. package/dist/plugins/src/catalog-source.d.ts +5 -0
  215. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  216. package/dist/resolver/index.d.ts +2 -0
  217. package/dist/runner/index.d.ts +2 -0
  218. package/dist/runner/index.js +17 -16
  219. package/dist/runner/prompt-assembly.d.ts +2 -0
  220. package/dist/runner/src/resources.d.ts.map +1 -1
  221. package/dist/runner/src/serve.d.ts +7 -0
  222. package/dist/runner/src/serve.d.ts.map +1 -1
  223. package/dist/sdk/asset-manager.d.ts +2 -0
  224. package/dist/sdk/asset-manager.js +7 -7
  225. package/dist/sdk/bridge.d.ts +2 -0
  226. package/dist/sdk/bridge.js +3 -3
  227. package/dist/sdk/client.d.ts +2 -0
  228. package/dist/sdk/core.d.ts +2 -0
  229. package/dist/sdk/core.js +5 -5
  230. package/dist/sdk/flow.d.ts +2 -0
  231. package/dist/sdk/index.d.ts +2 -0
  232. package/dist/sdk/index.js +53 -19
  233. package/dist/sdk/index.js.map +1 -1
  234. package/dist/sdk/resolver.d.ts +2 -0
  235. package/dist/sdk/runner.d.ts +2 -0
  236. package/dist/sdk/runner.js +17 -16
  237. package/dist/sdk/session.d.ts +2 -0
  238. package/dist/sdk/src/local-runtime.d.ts +8 -0
  239. package/dist/sdk/src/local-runtime.d.ts.map +1 -1
  240. package/dist/sdk/src/transport.d.ts +7 -1
  241. package/dist/sdk/src/transport.d.ts.map +1 -1
  242. package/dist/sdk/store.d.ts +2 -0
  243. package/dist/sdk/telemetry.d.ts +2 -0
  244. package/dist/sdk/transport/ws/client.d.ts +2 -0
  245. package/dist/sdk/transport/ws/client.js +2 -1
  246. package/dist/sdk/transport/ws/server.d.ts +2 -0
  247. package/dist/sdk/transport/ws/server.js +2 -1
  248. package/dist/sdk/transport/ws.d.ts +2 -0
  249. package/dist/sdk/transport/ws.js +4 -3
  250. package/dist/sdk/transport.d.ts +2 -0
  251. package/dist/sdk/transport.js +4 -3
  252. package/dist/sdk/types.d.ts +2 -0
  253. package/dist/secrets/index.d.ts +2 -0
  254. package/dist/session/index.d.ts +2 -0
  255. package/dist/{setup-ACMP3QZC.js → setup-REX4I5NE.js} +10 -10
  256. package/dist/{setup-ACMP3QZC.js.map → setup-REX4I5NE.js.map} +1 -1
  257. package/dist/store/index.d.ts +2 -0
  258. package/dist/store/react.d.ts +2 -0
  259. package/dist/store/vue.d.ts +2 -0
  260. package/dist/store-client-IX3Y67NK.js +14 -0
  261. package/dist/{store-client-ZSLNOOQG.js.map → store-client-IX3Y67NK.js.map} +1 -1
  262. package/dist/telemetry/index.d.ts +2 -0
  263. package/dist/transport/index.d.ts +2 -0
  264. package/dist/transport/index.js +4 -3
  265. package/dist/transport/src/ws/auth.d.ts +34 -0
  266. package/dist/transport/src/ws/auth.d.ts.map +1 -0
  267. package/dist/transport/src/ws/client.d.ts +4 -0
  268. package/dist/transport/src/ws/client.d.ts.map +1 -1
  269. package/dist/transport/src/ws/index.d.ts +3 -2
  270. package/dist/transport/src/ws/index.d.ts.map +1 -1
  271. package/dist/transport/src/ws/server.d.ts +5 -0
  272. package/dist/transport/src/ws/server.d.ts.map +1 -1
  273. package/dist/transport/ws/client.d.ts +2 -0
  274. package/dist/transport/ws/client.js +2 -1
  275. package/dist/transport/ws/server.d.ts +2 -0
  276. package/dist/transport/ws/server.js +2 -1
  277. package/dist/transport/ws.d.ts +2 -0
  278. package/dist/transport/ws.js +4 -3
  279. package/dist/tui/index.d.ts +2 -0
  280. package/dist/tui/index.js +17 -16
  281. package/dist/tui/index.js.map +1 -1
  282. package/dist/types/index.d.ts +2 -0
  283. package/dist/types/manifests.d.ts +2 -0
  284. package/dist/workspace-plugin/adapters/mcp.d.ts +2 -0
  285. package/dist/workspace-plugin/adapters/omp.d.ts +2 -0
  286. package/dist/workspace-plugin/index.d.ts +2 -0
  287. package/dist/workspace-plugin/index.js +1 -1
  288. package/package.json +4 -2
  289. package/dist/asset-feeds-PJDJ3QYI.js.map +0 -1
  290. package/dist/chunk-2DNSSQ22.js.map +0 -1
  291. package/dist/chunk-7PTP3SQJ.js.map +0 -1
  292. package/dist/chunk-G6GKWGOW.js.map +0 -1
  293. package/dist/chunk-IGQEXBBG.js.map +0 -1
  294. package/dist/chunk-KA46DUM4.js.map +0 -1
  295. package/dist/chunk-NGC7ZQI4.js.map +0 -1
  296. package/dist/chunk-PBWMV5GM.js.map +0 -1
  297. package/dist/chunk-RENHNO4J.js.map +0 -1
  298. package/dist/chunk-TKOLD2O7.js.map +0 -1
  299. package/dist/chunk-TTY56FQQ.js.map +0 -1
  300. package/dist/chunk-UZRY5UI2.js.map +0 -1
  301. package/dist/chunk-W2O5LWYU.js +0 -3
  302. package/dist/chunk-WIR34WMU.js.map +0 -1
  303. package/dist/chunk-X5Y4EGZB.js.map +0 -1
  304. package/dist/ensure-sources-COGVKY44.js.map +0 -1
  305. package/dist/open-library-DWAQFUSQ.js +0 -13
  306. package/dist/store-client-ZSLNOOQG.js +0 -14
@@ -1,17 +1,32 @@
1
- import { removeAsset, deployAll, createScaffold } from './chunk-MO4JPTRD.js';
2
- import { readLock, buildLockFile, writeLock, verifyLock, extractForPatch, generatePatch, savePatch, applyPatch } from './chunk-RENHNO4J.js';
3
- import { resolveRuntimeAssets } from './chunk-TTY56FQQ.js';
4
- import { resolveSkWorkspaceConfig, ensureRepo, resolveAll, resolveAsset, scanRepo, checkRepoStatus, readLinks, getGlobalCacheDir } from './chunk-TKOLD2O7.js';
5
- import { parseAssetRef } from './chunk-X5Y4EGZB.js';
1
+ import { removeAsset, deployAll, createScaffold } from './chunk-LDLZFYLR.js';
2
+ import { writeLock, buildLockFile, readLock, verifyLock, extractForPatch, generatePatch, savePatch, applyPatch } from './chunk-P4FYHEHW.js';
3
+ import { resolveRuntimeAssets } from './chunk-74GTZ4TJ.js';
4
+ import { resolveSkWorkspaceConfig, getRepoCommit, ensureRepo, buildProvenanceIndex, resolveAll, scanRepo, checkRepoStatus, resolveAsset, readLinks, getGlobalCacheDir } from './chunk-LDYPQVRU.js';
5
+ import { parseAssetRef } from './chunk-VUCPJBAG.js';
6
6
  import { deployedBase, isDeployed, deployedDir } from './chunk-JKNWJ64A.js';
7
7
  import { appendHistory, getRecentHistory, clearHistory } from './chunk-KTBKW2FI.js';
8
8
  import { commitChanges } from './chunk-UQ6LFBPZ.js';
9
9
  import { spawnSync } from 'child_process';
10
- import { existsSync, readFileSync, readdirSync, rmSync, lstatSync, unlinkSync, writeFileSync } from 'fs';
10
+ import { existsSync, readdirSync, rmSync, lstatSync, unlinkSync, readFileSync, writeFileSync } from 'fs';
11
11
  import { homedir } from 'os';
12
12
  import { resolve, join, dirname } from 'path';
13
13
  import { parse, stringify } from 'yaml';
14
14
 
15
+ function sourceSlug(url) {
16
+ return url.replace(/\.git$/, "").split(/[/:]/).pop() ?? "source";
17
+ }
18
+ function parseCanonicalLockKey(key) {
19
+ const slash = key.indexOf("/");
20
+ const colon = key.indexOf(":", slash + 1);
21
+ const at = key.lastIndexOf("@");
22
+ if (slash === -1 || colon === -1 || at === -1 || at < colon) return {};
23
+ return {
24
+ publisher: key.slice(0, slash),
25
+ kind: key.slice(slash + 1, colon),
26
+ name: key.slice(colon + 1, at),
27
+ version: key.slice(at + 1)
28
+ };
29
+ }
15
30
  var AssetManager = class {
16
31
  /** Resolved absolute path to the workspace root. */
17
32
  projectDir;
@@ -37,44 +52,85 @@ var AssetManager = class {
37
52
  return { driverTarget: this.driverTarget, global: this.global, cwd: this.projectDir };
38
53
  }
39
54
  loadConfig() {
40
- const configPath = join(this.projectDir, "skaile.yaml");
41
- let raw = {};
42
- if (existsSync(configPath)) {
43
- try {
44
- raw = parse(readFileSync(configPath, "utf8")) ?? {};
45
- } catch {
46
- }
47
- }
48
55
  const config = resolveSkWorkspaceConfig(this.projectDir);
56
+ const sources = config.sources ?? [];
57
+ const stores = config.stores ?? [];
58
+ const dependencies = config.dependencies ?? [];
59
+ const overrides = config.overrides ?? [];
60
+ const patches = config.patches ?? {};
61
+ const skaileHome = process.env.SKAILE_HOME ?? join(homedir(), ".skaile");
62
+ const sourcesDir = join(skaileHome, "sources");
49
63
  const repositories = {};
50
- let dependencies = raw.dependencies ?? [];
51
- const patches = raw.patches ?? {};
52
- const aiResources = raw.ai_resources ?? config.ai_resources;
53
- if (aiResources?.length) {
54
- for (const entry of aiResources) {
55
- if (repositories[entry.name]) continue;
56
- const isUrl = /^(https?:|git@|git:)/.test(entry.path);
57
- repositories[entry.name] = isUrl ? { url: entry.path, branch: entry.branch } : { path: entry.path, branch: entry.branch };
58
- if (entry.dependencies) {
59
- dependencies = [...dependencies, ...entry.dependencies];
60
- }
64
+ for (const s of sources) {
65
+ const slug = sourceSlug(s.url);
66
+ if (repositories[slug]) continue;
67
+ repositories[slug] = { path: join(sourcesDir, slug), url: s.url };
68
+ }
69
+ return { repositories, sources, stores, dependencies, overrides, patches, config };
70
+ }
71
+ /** Build provenance-index clones from the resolved source declarations. */
72
+ buildClones(repositories) {
73
+ const clones = [];
74
+ for (const [slug, decl] of Object.entries(repositories)) {
75
+ const localPath = this.resolveRepoDir(decl, slug);
76
+ if (!localPath || !existsSync(localPath)) continue;
77
+ const commit = getRepoCommit(localPath) ?? "0".repeat(40);
78
+ clones.push({
79
+ localPath,
80
+ sourceUrl: decl.url ?? localPath,
81
+ commit,
82
+ tag: decl.branch
83
+ });
84
+ }
85
+ return clones;
86
+ }
87
+ /**
88
+ * Bridge a resolved {@link ProvenanceCandidate} to a {@link CatalogEntry} for
89
+ * the deploy pipeline. `source` is the absolute path to the asset's primary
90
+ * manifest (or its directory) inside the clone; `publisher` is set to the
91
+ * clone slug so `deployAll`'s repositories lookup resolves local-vs-remote.
92
+ */
93
+ candidateToCatalogEntry(c, repositories) {
94
+ let slug;
95
+ let cloneDir;
96
+ for (const [s, decl] of Object.entries(repositories)) {
97
+ if (decl.url === c.sourceUrl) {
98
+ slug = s;
99
+ cloneDir = this.resolveRepoDir(decl, s) ?? void 0;
100
+ break;
61
101
  }
62
102
  }
63
- const sourcesRaw = raw.sources ?? config.sources ?? [];
64
- if (sourcesRaw.length > 0) {
65
- const skaileHome = process.env.SKAILE_HOME ?? join(homedir(), ".skaile");
66
- const sourcesDir = join(skaileHome, "sources");
67
- for (const entry of sourcesRaw) {
68
- if (!entry?.name || !entry.url) continue;
69
- if (repositories[entry.name]) continue;
70
- repositories[entry.name] = {
71
- path: join(sourcesDir, entry.name),
72
- url: entry.url,
73
- branch: entry.branch
74
- };
103
+ if (!cloneDir) {
104
+ const first = Object.entries(repositories)[0];
105
+ if (first) {
106
+ slug = first[0];
107
+ cloneDir = this.resolveRepoDir(first[1], first[0]) ?? void 0;
75
108
  }
76
109
  }
77
- return { repositories, dependencies, patches, config };
110
+ if (!cloneDir || !slug) return null;
111
+ const MD_BY_KIND = {
112
+ skill: "SKILL.md",
113
+ agent: "AGENT.md",
114
+ bundle: "BUNDLE.md",
115
+ "mcp-server": "MCP.md",
116
+ connector: "CONNECTOR.md",
117
+ prompt: "PROMPT.md",
118
+ contract: "CONTRACT.md"
119
+ };
120
+ const mdName = MD_BY_KIND[c.kind];
121
+ const mdRel = c.files.find((f) => mdName ? f.path.endsWith(mdName) : false)?.path;
122
+ const source = mdRel ? join(cloneDir, mdRel) : cloneDir;
123
+ return {
124
+ name: c.name,
125
+ kind: c.kind,
126
+ description: "",
127
+ source,
128
+ publisher: slug,
129
+ version: c.version,
130
+ requires: [],
131
+ dependencies: [],
132
+ metadata: c.metadata
133
+ };
78
134
  }
79
135
  // ── Install / resolve ──────────────────────────────────────────────────
80
136
  /**
@@ -89,50 +145,55 @@ var AssetManager = class {
89
145
  * @returns {@link InstallResult} summarising what was deployed, what was missing, and any collisions.
90
146
  */
91
147
  async install(opts) {
92
- const { repositories, dependencies, patches } = this.loadConfig();
148
+ const { repositories, sources, stores, dependencies, overrides, patches } = this.loadConfig();
93
149
  if (opts?.locked) {
94
150
  return this.installLocked(repositories, patches);
95
151
  }
152
+ const pinBySlug = new Map(sources.map((s) => [sourceSlug(s.url), s.pin]));
96
153
  for (const [name, decl] of Object.entries(repositories)) {
97
154
  try {
98
- ensureRepo(decl, name, this.reposDir, { projectDir: this.projectDir });
155
+ ensureRepo(decl, name, this.reposDir, {
156
+ projectDir: this.projectDir,
157
+ pin: pinBySlug.get(name)
158
+ });
99
159
  } catch (err) {
100
160
  return {
101
161
  deployed: [],
102
162
  removed: [],
103
- missing: [`repo:${name}`],
104
- lockWritten: false,
105
- collisions: []
163
+ missing: [`source:${name} (${err instanceof Error ? err.message : String(err)})`],
164
+ lockWritten: false
106
165
  };
107
166
  }
108
167
  }
109
- const { resolved, missing, resolvedBy, collisions } = resolveAll(
110
- dependencies,
111
- repositories,
112
- this.reposDir,
113
- { projectDir: this.projectDir }
168
+ const provenanceIndex = buildProvenanceIndex(this.buildClones(repositories), {
169
+ projectDir: this.projectDir
170
+ });
171
+ const { resolved, missing, overridesApplied } = await resolveAll(dependencies, {
172
+ provenanceIndex,
173
+ overrides,
174
+ stores,
175
+ storeFetcher: this.buildStoreFetcher(stores),
176
+ projectDir: this.projectDir
177
+ });
178
+ const oldLock = this.tryReadLock();
179
+ const resolvedRefs = new Set(
180
+ resolved.map((c) => `${c.publisher}/${c.kind}:${c.name}@${c.version}`)
114
181
  );
115
- const oldLock = readLock(this.lockPath);
116
- const resolvedRefs = new Set(resolved.map((e) => `${e.kind}:${e.name}`));
117
182
  const removed = [];
118
183
  if (oldLock) {
119
184
  for (const ref of Object.keys(oldLock.assets)) {
120
185
  if (!resolvedRefs.has(ref)) {
121
- const [kind, name] = ref.split(":");
122
- removeAsset(kind, name, this.deployOpts);
123
- removed.push(ref);
186
+ const { kind, name } = parseCanonicalLockKey(ref);
187
+ if (kind && name) {
188
+ removeAsset(kind, name, this.deployOpts);
189
+ removed.push(ref);
190
+ }
124
191
  }
125
192
  }
126
193
  }
127
- const deployed = deployAll(resolved, repositories, patches, this.deployOpts);
128
- const lockData = buildLockFile(
129
- repositories,
130
- resolved,
131
- resolvedBy,
132
- this.reposDir,
133
- this.projectDir
134
- );
135
- writeLock(this.lockPath, lockData);
194
+ const entries = resolved.map((c) => this.candidateToCatalogEntry(c, repositories)).filter((e) => e !== null);
195
+ const deployed = deployAll(entries, repositories, patches, this.deployOpts);
196
+ writeLock(this.lockPath, buildLockFile(resolved, overridesApplied));
136
197
  for (const ref of deployed) {
137
198
  appendHistory(this.projectDir, {
138
199
  ref,
@@ -150,14 +211,41 @@ var AssetManager = class {
150
211
  });
151
212
  }
152
213
  const { npmInstalled, npmFailed } = await this.installRuntimeAssetDeps();
214
+ return { deployed, removed, missing, lockWritten: true, npmInstalled, npmFailed };
215
+ }
216
+ /** Read the lock, returning null on a legacy v1 lock instead of throwing. */
217
+ tryReadLock() {
218
+ try {
219
+ return readLock(this.lockPath);
220
+ } catch {
221
+ return null;
222
+ }
223
+ }
224
+ /** Build a store fetcher from the configured stores, or undefined when none. */
225
+ buildStoreFetcher(stores) {
226
+ if (stores.length === 0) return void 0;
153
227
  return {
154
- deployed,
155
- removed,
156
- missing,
157
- lockWritten: true,
158
- collisions,
159
- npmInstalled,
160
- npmFailed
228
+ getInstallManifest: async (storeUrl, ref) => {
229
+ const { RemoteCatalogSource, CatalogHttpError } = await import('./library/index.js');
230
+ const src = new RemoteCatalogSource({ baseUrl: storeUrl });
231
+ try {
232
+ const m = await src.getInstallManifest(ref);
233
+ return {
234
+ sourceUrl: m.source.url,
235
+ commit: m.source.commitSha,
236
+ sha256: m.sha256,
237
+ files: m.files
238
+ };
239
+ } catch (err) {
240
+ if (err instanceof CatalogHttpError && err.status === 404) return null;
241
+ throw err;
242
+ }
243
+ },
244
+ getCanonicalDigest: async (storeUrl, ref) => {
245
+ const { RemoteCatalogSource } = await import('./library/index.js');
246
+ const src = new RemoteCatalogSource({ baseUrl: storeUrl });
247
+ return src.getCanonicalDigest(ref);
248
+ }
161
249
  };
162
250
  }
163
251
  /**
@@ -192,19 +280,22 @@ var AssetManager = class {
192
280
  return { npmInstalled, npmFailed };
193
281
  }
194
282
  installLocked(repositories, patches) {
195
- const lock = readLock(this.lockPath);
283
+ const lock = this.tryReadLock();
196
284
  if (!lock) {
197
285
  throw new Error("No lock file found. Run `skaile install` first.");
198
286
  }
199
- for (const [name, lockRepo] of Object.entries(lock.repositories)) {
200
- const decl = repositories[name] ?? {
201
- url: lockRepo.url,
202
- path: lockRepo.path,
203
- branch: lockRepo.branch
204
- };
205
- ensureRepo(decl, name, this.reposDir, { projectDir: this.projectDir });
287
+ const declBySlug = new Map(Object.entries(repositories));
288
+ for (const src of lock.sources) {
289
+ const slug = sourceSlug(src.url);
290
+ const decl = declBySlug.get(slug) ?? { url: src.url };
291
+ ensureRepo(decl, slug, this.reposDir, { projectDir: this.projectDir, pin: src.commit });
206
292
  }
207
- const verification = verifyLock(lock, this.reposDir);
293
+ const resolveCloneDir = (sourceUrl) => {
294
+ const slug = sourceSlug(sourceUrl);
295
+ const decl = declBySlug.get(slug) ?? { url: sourceUrl };
296
+ return this.resolveRepoDir(decl, slug);
297
+ };
298
+ const verification = verifyLock(lock, resolveCloneDir);
208
299
  if (!verification.ok) {
209
300
  const issues = [
210
301
  ...verification.drifted.map((r) => `drifted: ${r}`),
@@ -215,27 +306,25 @@ var AssetManager = class {
215
306
  }
216
307
  const resolved = [];
217
308
  for (const [ref, entry] of Object.entries(lock.assets)) {
218
- const [kind, name] = ref.split(":");
219
- const repoDecl = repositories[entry.repository];
220
- let repoDir;
221
- if (repoDecl?.path) {
222
- repoDir = resolve(this.projectDir, repoDecl.path);
223
- } else {
224
- repoDir = join(this.reposDir, entry.repository);
225
- }
309
+ const { publisher, kind, name } = parseCanonicalLockKey(ref);
310
+ if (!publisher || !kind || !name) continue;
311
+ const slug = sourceSlug(entry.source.url);
312
+ const cloneDir = resolveCloneDir(entry.source.url) ?? join(this.reposDir, slug);
313
+ const mdRel = entry.files.find((f) => /\.(md|yaml)$/i.test(f.path))?.path ?? entry.files[0]?.path ?? "";
226
314
  resolved.push({
227
315
  name,
228
316
  kind,
229
317
  description: "",
230
- source: join(repoDir, entry.source),
231
- repository: entry.repository,
232
- version: entry.version,
318
+ source: mdRel ? join(cloneDir, mdRel) : cloneDir,
319
+ publisher: slug,
320
+ version: entry.source.commit,
233
321
  requires: [],
234
322
  dependencies: []
235
323
  });
324
+ if (!repositories[slug]) repositories[slug] = { url: entry.source.url, path: cloneDir };
236
325
  }
237
326
  const deployed = deployAll(resolved, repositories, patches, this.deployOpts);
238
- return { deployed, removed: [], missing: [], lockWritten: false, collisions: [] };
327
+ return { deployed, removed: [], missing: [], lockWritten: false };
239
328
  }
240
329
  /**
241
330
  * Add a single asset (and its transitive dependencies) to the workspace.
@@ -247,21 +336,33 @@ var AssetManager = class {
247
336
  * @returns Array of asset refs that were deployed in this call.
248
337
  * @throws When the asset cannot be found in any configured repository.
249
338
  */
250
- add(ref) {
251
- const { repositories, patches } = this.loadConfig();
252
- const parsed = parseAssetRef(ref);
339
+ async add(ref) {
340
+ const { repositories, stores, overrides, patches } = this.loadConfig();
341
+ parseAssetRef(ref);
253
342
  for (const [name, decl] of Object.entries(repositories)) {
254
343
  try {
255
344
  ensureRepo(decl, name, this.reposDir, { projectDir: this.projectDir });
256
345
  } catch {
257
346
  }
258
347
  }
259
- const entry = resolveAsset(parsed, repositories, this.reposDir);
260
- if (!entry) throw new Error(`Asset not found: ${ref}`);
261
- const { resolved, missing } = resolveAll([ref], repositories, this.reposDir);
262
- const deployed = deployAll(resolved, repositories, patches, this.deployOpts);
263
- const depRef = `${parsed.kind}:${parsed.name}`;
264
- this.addDependencyToConfig(depRef);
348
+ const provenanceIndex = buildProvenanceIndex(this.buildClones(repositories), {
349
+ projectDir: this.projectDir
350
+ });
351
+ const { resolved, missing } = await resolveAll([ref], {
352
+ provenanceIndex,
353
+ overrides,
354
+ stores,
355
+ storeFetcher: this.buildStoreFetcher(stores),
356
+ projectDir: this.projectDir
357
+ });
358
+ if (resolved.length === 0) {
359
+ throw new Error(
360
+ `Asset not found: ${ref}${missing.length ? ` (missing: ${missing.join(", ")})` : ""}`
361
+ );
362
+ }
363
+ const entries = resolved.map((c) => this.candidateToCatalogEntry(c, repositories)).filter((e) => e !== null);
364
+ const deployed = deployAll(entries, repositories, patches, this.deployOpts);
365
+ this.addDependencyToConfig(ref);
265
366
  for (const d of deployed) {
266
367
  appendHistory(this.projectDir, {
267
368
  ref: d,
@@ -332,7 +433,7 @@ var AssetManager = class {
332
433
  for (const [name, decl] of Object.entries(repositories)) {
333
434
  const repoDir = this.resolveRepoDir(decl, name);
334
435
  if (!repoDir) continue;
335
- if (parsed.repository && parsed.repository !== name) continue;
436
+ if (parsed.publisher && parsed.publisher !== name) continue;
336
437
  const entries = scanRepo(repoDir, name);
337
438
  const match = entries.find((e) => e.kind === parsed.kind && e.name === parsed.name);
338
439
  if (match) return match;
@@ -393,7 +494,7 @@ var AssetManager = class {
393
494
  */
394
495
  overview() {
395
496
  const { repositories } = this.loadConfig();
396
- const lock = readLock(this.lockPath);
497
+ const lock = this.tryReadLock();
397
498
  const deployed = this.listDeployed();
398
499
  const repoStatuses = /* @__PURE__ */ new Map();
399
500
  for (const [name, decl] of Object.entries(repositories)) {
@@ -406,23 +507,34 @@ var AssetManager = class {
406
507
  error: status.error
407
508
  });
408
509
  }
510
+ const lockByKindName = /* @__PURE__ */ new Map();
511
+ for (const [key] of Object.entries(lock?.assets ?? {})) {
512
+ const parsed = parseCanonicalLockKey(key);
513
+ if (parsed.kind && parsed.name && parsed.publisher && parsed.version) {
514
+ lockByKindName.set(`${parsed.kind}:${parsed.name}`, {
515
+ publisher: parsed.publisher,
516
+ version: parsed.version,
517
+ url: lock.assets[key].source.url
518
+ });
519
+ }
520
+ }
409
521
  const entries = [];
410
522
  for (const d of deployed) {
411
- const lockKey = `${d.kind}:${d.name}`;
412
- const lockEntry = lock?.assets[lockKey];
413
- const domain = lockEntry?.domain ?? "unknown";
414
- const repository = lockEntry?.repository ?? "";
523
+ const lockEntry = lockByKindName.get(`${d.kind}:${d.name}`);
524
+ const publisher = lockEntry?.publisher ?? "";
415
525
  const version = lockEntry?.version ?? "";
526
+ const slug = lockEntry ? sourceSlug(lockEntry.url) : "";
416
527
  let syncStatus = "unknown";
417
- if (repository) {
418
- const repoStatus = repoStatuses.get(repository);
528
+ if (slug) {
529
+ const repoStatus = repoStatuses.get(slug);
419
530
  if (!repoStatus) syncStatus = "unknown";
420
531
  else if (repoStatus.kind === "local") syncStatus = "local";
421
532
  else if (repoStatus.error) syncStatus = "error";
422
533
  else if (repoStatus.upToDate) syncStatus = "synced";
423
534
  else syncStatus = "outdated";
424
535
  }
425
- entries.push({ kind: d.kind, name: d.name, domain, repository, version, syncStatus });
536
+ const domain = publisher || "unknown";
537
+ entries.push({ kind: d.kind, name: d.name, domain, publisher, version, syncStatus });
426
538
  }
427
539
  const byDomain = /* @__PURE__ */ new Map();
428
540
  for (const e of entries) {
@@ -452,22 +564,11 @@ var AssetManager = class {
452
564
  * Returns a single node with `ref === "(no lock file)"` when no lock exists.
453
565
  */
454
566
  tree() {
455
- const lock = readLock(this.lockPath);
567
+ const lock = this.tryReadLock();
456
568
  if (!lock) return { ref: "(no lock file)", children: [] };
457
- const byParent = /* @__PURE__ */ new Map();
458
- for (const [ref, entry] of Object.entries(lock.assets)) {
459
- const parent = entry.resolved_by;
460
- if (!byParent.has(parent)) byParent.set(parent, []);
461
- byParent.get(parent).push(ref);
462
- }
463
- function buildNode(ref) {
464
- const children = (byParent.get(ref) ?? []).map(buildNode);
465
- return { ref, children };
466
- }
467
- const directChildren = byParent.get("direct") ?? [];
468
569
  return {
469
570
  ref: "project",
470
- children: directChildren.map(buildNode)
571
+ children: Object.keys(lock.assets).map((ref) => ({ ref, children: [] }))
471
572
  };
472
573
  }
473
574
  /**
@@ -478,22 +579,10 @@ var AssetManager = class {
478
579
  * the asset is not in the lock file.
479
580
  */
480
581
  why(ref) {
481
- const lock = readLock(this.lockPath);
582
+ const lock = this.tryReadLock();
482
583
  if (!lock) return [];
483
584
  if (!lock.assets[ref]) return [];
484
- const chain = [];
485
- let current = ref;
486
- const seen = /* @__PURE__ */ new Set();
487
- while (current && current !== "direct") {
488
- if (seen.has(current)) break;
489
- seen.add(current);
490
- chain.push(current);
491
- const entry = lock.assets[current];
492
- if (!entry) break;
493
- current = entry.resolved_by;
494
- }
495
- if (current === "direct") chain.push("direct (skaile.yaml)");
496
- return chain;
585
+ return [ref, "direct (skaile.yaml)"];
497
586
  }
498
587
  /**
499
588
  * List installed assets whose source repository is behind the remote.
@@ -505,27 +594,26 @@ var AssetManager = class {
505
594
  */
506
595
  outdated() {
507
596
  const { repositories } = this.loadConfig();
508
- const lock = readLock(this.lockPath);
597
+ const lock = this.tryReadLock();
509
598
  if (!lock) return [];
510
599
  const result = [];
511
- for (const [name, lockRepo] of Object.entries(lock.repositories)) {
512
- if (!lockRepo.commit || lockRepo.path) continue;
513
- const decl = repositories[name];
514
- if (!decl) continue;
515
- const status = checkRepoStatus(decl, name, this.reposDir);
516
- if (status.behind > 0) {
517
- for (const [ref, entry] of Object.entries(lock.assets)) {
518
- if (entry.repository === name) {
519
- const [kind, assetName] = ref.split(":");
520
- result.push({
521
- kind,
522
- name: assetName,
523
- repository: name,
524
- currentVersion: entry.version,
525
- behind: status.behind
526
- });
527
- }
528
- }
600
+ for (const src of lock.sources) {
601
+ const slug = sourceSlug(src.url);
602
+ const decl = repositories[slug];
603
+ if (!decl || decl.path) continue;
604
+ const status = checkRepoStatus(decl, slug, this.reposDir);
605
+ if (status.behind <= 0) continue;
606
+ for (const [ref, entry] of Object.entries(lock.assets)) {
607
+ if (entry.source.url !== src.url) continue;
608
+ const { publisher, kind, name, version } = parseCanonicalLockKey(ref);
609
+ if (!kind || !name) continue;
610
+ result.push({
611
+ kind,
612
+ name,
613
+ publisher: publisher ?? slug,
614
+ currentVersion: version ?? "",
615
+ behind: status.behind
616
+ });
529
617
  }
530
618
  }
531
619
  return result;
@@ -561,22 +649,25 @@ var AssetManager = class {
561
649
  *
562
650
  * @returns The written {@link LockFile} data.
563
651
  */
564
- lock() {
565
- const { repositories, dependencies } = this.loadConfig();
652
+ async lock() {
653
+ const { repositories, stores, dependencies, overrides } = this.loadConfig();
566
654
  for (const [name, decl] of Object.entries(repositories)) {
567
655
  try {
568
656
  ensureRepo(decl, name, this.reposDir, { projectDir: this.projectDir });
569
657
  } catch {
570
658
  }
571
659
  }
572
- const { resolved, resolvedBy } = resolveAll(dependencies, repositories, this.reposDir);
573
- const lockData = buildLockFile(
574
- repositories,
575
- resolved,
576
- resolvedBy,
577
- this.reposDir,
578
- this.projectDir
579
- );
660
+ const provenanceIndex = buildProvenanceIndex(this.buildClones(repositories), {
661
+ projectDir: this.projectDir
662
+ });
663
+ const { resolved, overridesApplied } = await resolveAll(dependencies, {
664
+ provenanceIndex,
665
+ overrides,
666
+ stores,
667
+ storeFetcher: this.buildStoreFetcher(stores),
668
+ projectDir: this.projectDir
669
+ });
670
+ const lockData = buildLockFile(resolved, overridesApplied);
580
671
  writeLock(this.lockPath, lockData);
581
672
  return lockData;
582
673
  }
@@ -633,11 +724,11 @@ var AssetManager = class {
633
724
  patchSubmit(ref) {
634
725
  const parsed = parseAssetRef(ref);
635
726
  const entry = this.info(ref);
636
- if (!entry?.repository) throw new Error(`Asset not found or no repository: ${ref}`);
727
+ if (!entry?.publisher) throw new Error(`Asset not found or no publisher: ${ref}`);
637
728
  const { repositories } = this.loadConfig();
638
- const decl = repositories[entry.repository];
639
- if (!decl?.url) throw new Error("Can only submit patches for remote repositories.");
640
- const repoDir = join(this.reposDir, entry.repository);
729
+ const decl = repositories[entry.publisher];
730
+ if (!decl?.url) throw new Error("Can only submit patches for remote sources.");
731
+ const repoDir = join(this.reposDir, entry.publisher);
641
732
  const branchName = `patch/${parsed.kind}-${parsed.name}`;
642
733
  const patchFile = join(this.patchDir, `${parsed.kind}-${parsed.name}.patch`);
643
734
  if (!existsSync(patchFile)) throw new Error("No patch file. Run `skaile patch-commit` first.");
@@ -749,12 +840,13 @@ var AssetManager = class {
749
840
  * and `unmanaged` (deployed assets not in the lock file).
750
841
  */
751
842
  clean(opts) {
752
- const lock = readLock(this.lockPath);
843
+ const lock = this.tryReadLock();
753
844
  const removed = [];
754
845
  const skipped = [];
755
846
  if (lock) {
756
847
  for (const ref of Object.keys(lock.assets)) {
757
- const [kind, name] = ref.split(":");
848
+ const { kind, name } = parseCanonicalLockKey(ref);
849
+ if (!kind || !name) continue;
758
850
  const dest = deployedDir(
759
851
  kind,
760
852
  name,
@@ -772,7 +864,12 @@ var AssetManager = class {
772
864
  }
773
865
  }
774
866
  }
775
- const lockRefs = lock ? new Set(Object.keys(lock.assets)) : /* @__PURE__ */ new Set();
867
+ const lockRefs = lock ? new Set(
868
+ Object.keys(lock.assets).map((r) => {
869
+ const p = parseCanonicalLockKey(r);
870
+ return p.kind && p.name ? `${p.kind}:${p.name}` : r;
871
+ })
872
+ ) : /* @__PURE__ */ new Set();
776
873
  const unmanaged = [];
777
874
  const allDeployed = this.listDeployed();
778
875
  for (const d of allDeployed) {
@@ -846,5 +943,5 @@ var AssetManager = class {
846
943
  };
847
944
 
848
945
  export { AssetManager };
849
- //# sourceMappingURL=chunk-2DNSSQ22.js.map
850
- //# sourceMappingURL=chunk-2DNSSQ22.js.map
946
+ //# sourceMappingURL=chunk-TWQPDBHB.js.map
947
+ //# sourceMappingURL=chunk-TWQPDBHB.js.map