@skaile/workspaces 5.6.0 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +4 -2
  3. package/dist/{asset-feeds-4O2JK5S4.js → asset-feeds-K36CR52Q.js} +17 -17
  4. package/dist/{asset-feeds-4O2JK5S4.js.map → asset-feeds-K36CR52Q.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +9 -9
  6. package/dist/asset-manager/index.js +14 -14
  7. package/dist/asset-manager/installer.js +10 -10
  8. package/dist/asset-manager/renderers.js +9 -9
  9. package/dist/asset-manager/src/index.d.ts +106 -16
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/asset-manager/src/installer.d.ts +4 -1
  12. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  13. package/dist/bridge/drivers/claude-sdk.js +11 -11
  14. package/dist/bridge/drivers/codex.js +10 -10
  15. package/dist/bridge/drivers/continue.js +12 -12
  16. package/dist/bridge/drivers/echo.js +1 -1
  17. package/dist/bridge/drivers/gemini.js +5 -5
  18. package/dist/bridge/drivers/goose.js +12 -12
  19. package/dist/bridge/drivers/omp.js +2 -2
  20. package/dist/bridge/drivers/opencode.js +12 -12
  21. package/dist/bridge/drivers/qwen.js +5 -5
  22. package/dist/bridge/index.js +12 -12
  23. package/dist/{chunk-VX3INFBA.js → chunk-34C42MJX.js} +3 -3
  24. package/dist/{chunk-VX3INFBA.js.map → chunk-34C42MJX.js.map} +1 -1
  25. package/dist/{chunk-NLXIALVO.js → chunk-53MSCGR2.js} +5 -5
  26. package/dist/{chunk-NLXIALVO.js.map → chunk-53MSCGR2.js.map} +1 -1
  27. package/dist/chunk-6C654TFI.js +84 -0
  28. package/dist/chunk-6C654TFI.js.map +1 -0
  29. package/dist/{chunk-6NPINANG.js → chunk-6UFFKMVC.js} +5 -5
  30. package/dist/{chunk-6NPINANG.js.map → chunk-6UFFKMVC.js.map} +1 -1
  31. package/dist/{chunk-XOGG7VDZ.js → chunk-6VRJH4MR.js} +16 -24
  32. package/dist/chunk-6VRJH4MR.js.map +1 -0
  33. package/dist/{chunk-IPWR33AW.js → chunk-74EEFB52.js} +31 -15
  34. package/dist/chunk-74EEFB52.js.map +1 -0
  35. package/dist/{chunk-OGLDAJFL.js → chunk-7FJQT3GT.js} +4 -4
  36. package/dist/{chunk-OGLDAJFL.js.map → chunk-7FJQT3GT.js.map} +1 -1
  37. package/dist/{chunk-VKSXST23.js → chunk-AVCUPPG6.js} +3 -3
  38. package/dist/{chunk-VKSXST23.js.map → chunk-AVCUPPG6.js.map} +1 -1
  39. package/dist/{chunk-5B5IZVEP.js → chunk-BTK7ECLH.js} +2 -2
  40. package/dist/{chunk-5B5IZVEP.js.map → chunk-BTK7ECLH.js.map} +1 -1
  41. package/dist/{chunk-O5GDKC5I.js → chunk-BWZF2ZIF.js} +3 -3
  42. package/dist/{chunk-O5GDKC5I.js.map → chunk-BWZF2ZIF.js.map} +1 -1
  43. package/dist/{chunk-PJS2YWGG.js → chunk-CWM3MYGX.js} +6 -6
  44. package/dist/{chunk-PJS2YWGG.js.map → chunk-CWM3MYGX.js.map} +1 -1
  45. package/dist/{chunk-4CTGEEN6.js → chunk-D5HOETOB.js} +424 -98
  46. package/dist/chunk-D5HOETOB.js.map +1 -0
  47. package/dist/{chunk-MX3UQXLU.js → chunk-DFFD4BFG.js} +96 -20
  48. package/dist/chunk-DFFD4BFG.js.map +1 -0
  49. package/dist/{chunk-KXTO7HON.js → chunk-EAZECHPM.js} +3 -3
  50. package/dist/{chunk-KXTO7HON.js.map → chunk-EAZECHPM.js.map} +1 -1
  51. package/dist/{chunk-ZBBM6O6P.js → chunk-EB4XN3KE.js} +3 -3
  52. package/dist/{chunk-ZBBM6O6P.js.map → chunk-EB4XN3KE.js.map} +1 -1
  53. package/dist/{chunk-MX6LZE2C.js → chunk-EU3Q5AQ4.js} +26 -18
  54. package/dist/chunk-EU3Q5AQ4.js.map +1 -0
  55. package/dist/{chunk-BTISGSK4.js → chunk-FAP63KV7.js} +4 -4
  56. package/dist/{chunk-BTISGSK4.js.map → chunk-FAP63KV7.js.map} +1 -1
  57. package/dist/{chunk-46OVMT76.js → chunk-G67BOI2J.js} +3 -3
  58. package/dist/{chunk-46OVMT76.js.map → chunk-G67BOI2J.js.map} +1 -1
  59. package/dist/{chunk-V7NN3HXR.js → chunk-GIC3G5YG.js} +6 -6
  60. package/dist/{chunk-V7NN3HXR.js.map → chunk-GIC3G5YG.js.map} +1 -1
  61. package/dist/{chunk-27HS2DHB.js → chunk-GWXFSLBK.js} +3 -3
  62. package/dist/{chunk-27HS2DHB.js.map → chunk-GWXFSLBK.js.map} +1 -1
  63. package/dist/{chunk-VSQFGU5D.js → chunk-ILFGVSTJ.js} +3 -3
  64. package/dist/{chunk-VSQFGU5D.js.map → chunk-ILFGVSTJ.js.map} +1 -1
  65. package/dist/{chunk-KYXOGHY6.js → chunk-IUUYRXT6.js} +4 -4
  66. package/dist/{chunk-KYXOGHY6.js.map → chunk-IUUYRXT6.js.map} +1 -1
  67. package/dist/{chunk-436GRQC2.js → chunk-IZLQ4GDO.js} +63 -44
  68. package/dist/chunk-IZLQ4GDO.js.map +1 -0
  69. package/dist/{chunk-LLKKLKZJ.js → chunk-JLSCA5T5.js} +3 -3
  70. package/dist/{chunk-LLKKLKZJ.js.map → chunk-JLSCA5T5.js.map} +1 -1
  71. package/dist/{chunk-SX4UIDKT.js → chunk-KM7XWC4Y.js} +3 -3
  72. package/dist/{chunk-SX4UIDKT.js.map → chunk-KM7XWC4Y.js.map} +1 -1
  73. package/dist/{chunk-KUFNKVBM.js → chunk-KNWCFEWU.js} +3 -3
  74. package/dist/{chunk-KUFNKVBM.js.map → chunk-KNWCFEWU.js.map} +1 -1
  75. package/dist/{chunk-MFHKHXDE.js → chunk-L5VSIPQD.js} +5 -5
  76. package/dist/chunk-L5VSIPQD.js.map +1 -0
  77. package/dist/{chunk-AOAZCSDI.js → chunk-LBQ4BBX4.js} +3 -3
  78. package/dist/{chunk-AOAZCSDI.js.map → chunk-LBQ4BBX4.js.map} +1 -1
  79. package/dist/{chunk-2W4LBLIN.js → chunk-LCU5U5IW.js} +6 -6
  80. package/dist/{chunk-2W4LBLIN.js.map → chunk-LCU5U5IW.js.map} +1 -1
  81. package/dist/{chunk-DZM73WDN.js → chunk-LXY4BUA3.js} +5 -5
  82. package/dist/{chunk-DZM73WDN.js.map → chunk-LXY4BUA3.js.map} +1 -1
  83. package/dist/{chunk-7KLC4LZO.js → chunk-MKLBK7HI.js} +8 -8
  84. package/dist/{chunk-7KLC4LZO.js.map → chunk-MKLBK7HI.js.map} +1 -1
  85. package/dist/{chunk-4GNJELPH.js → chunk-N6FBTXQ5.js} +2 -2
  86. package/dist/{chunk-4GNJELPH.js.map → chunk-N6FBTXQ5.js.map} +1 -1
  87. package/dist/{chunk-2XFUXGV6.js → chunk-NWQB7UTY.js} +3 -3
  88. package/dist/{chunk-2XFUXGV6.js.map → chunk-NWQB7UTY.js.map} +1 -1
  89. package/dist/{chunk-SDFROXSA.js → chunk-O4Z7MAW7.js} +3 -3
  90. package/dist/{chunk-SDFROXSA.js.map → chunk-O4Z7MAW7.js.map} +1 -1
  91. package/dist/{chunk-AO7VJ6G6.js → chunk-O7VPNKYN.js} +8 -3
  92. package/dist/chunk-O7VPNKYN.js.map +1 -0
  93. package/dist/{chunk-TZCQ7ZWQ.js → chunk-OOLT6HGP.js} +10 -11
  94. package/dist/chunk-OOLT6HGP.js.map +1 -0
  95. package/dist/{chunk-2GRB5ITE.js → chunk-PSA6ONFB.js} +4 -4
  96. package/dist/{chunk-2GRB5ITE.js.map → chunk-PSA6ONFB.js.map} +1 -1
  97. package/dist/{chunk-45VFGT7A.js → chunk-RNPHRRLG.js} +3 -3
  98. package/dist/{chunk-45VFGT7A.js.map → chunk-RNPHRRLG.js.map} +1 -1
  99. package/dist/{chunk-7ZHLYXTI.js → chunk-RVIZQ5XD.js} +3 -3
  100. package/dist/{chunk-7ZHLYXTI.js.map → chunk-RVIZQ5XD.js.map} +1 -1
  101. package/dist/{chunk-BF33SCLY.js → chunk-SWO25LTO.js} +4 -4
  102. package/dist/{chunk-BF33SCLY.js.map → chunk-SWO25LTO.js.map} +1 -1
  103. package/dist/{chunk-UAP2XHRF.js → chunk-SZWRPEF7.js} +8 -8
  104. package/dist/{chunk-UAP2XHRF.js.map → chunk-SZWRPEF7.js.map} +1 -1
  105. package/dist/{chunk-S7QXEXKY.js → chunk-THEJJBOU.js} +3 -3
  106. package/dist/{chunk-S7QXEXKY.js.map → chunk-THEJJBOU.js.map} +1 -1
  107. package/dist/{chunk-PA7WLID3.js → chunk-TTPSDC2G.js} +33 -3
  108. package/dist/chunk-TTPSDC2G.js.map +1 -0
  109. package/dist/{chunk-VBBBZDI7.js → chunk-UX3K4RKE.js} +3 -3
  110. package/dist/{chunk-VBBBZDI7.js.map → chunk-UX3K4RKE.js.map} +1 -1
  111. package/dist/{chunk-RGXVQZOV.js → chunk-VOOI7B2L.js} +23 -21
  112. package/dist/chunk-VOOI7B2L.js.map +1 -0
  113. package/dist/{chunk-OLLAQLFJ.js → chunk-WIEC3ZE4.js} +5 -5
  114. package/dist/{chunk-OLLAQLFJ.js.map → chunk-WIEC3ZE4.js.map} +1 -1
  115. package/dist/cli/index.js +944 -600
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  118. package/dist/cli/src/commands/catalog.d.ts +12 -3
  119. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  120. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  121. package/dist/cli/src/commands/library-index.d.ts +41 -4
  122. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  123. package/dist/cli/src/commands/library-publish.d.ts +9 -0
  124. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  125. package/dist/cli/src/commands/manage.d.ts +8 -2
  126. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  127. package/dist/cli/src/commands/migrate-agents.d.ts.map +1 -1
  128. package/dist/cli/src/commands/outdated.d.ts +3 -2
  129. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  130. package/dist/cli/src/commands/project.d.ts +13 -4
  131. package/dist/cli/src/commands/project.d.ts.map +1 -1
  132. package/dist/cli/src/commands/source.d.ts +4 -3
  133. package/dist/cli/src/commands/source.d.ts.map +1 -1
  134. package/dist/cli/src/commands/update.d.ts +1 -1
  135. package/dist/cli/src/commands/update.d.ts.map +1 -1
  136. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  137. package/dist/cli/src/skill-checks.d.ts +21 -10
  138. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  139. package/dist/connectors/config.js +6 -6
  140. package/dist/connectors/index.js +15 -15
  141. package/dist/{connectors-HWENZFKW.js → connectors-SSOTIDHT.js} +18 -18
  142. package/dist/{connectors-HWENZFKW.js.map → connectors-SSOTIDHT.js.map} +1 -1
  143. package/dist/core/index.js +8 -8
  144. package/dist/core/manifest.js +2 -2
  145. package/dist/core/models.js +1 -1
  146. package/dist/core/publish-manifest.js +2 -2
  147. package/dist/core/ref.js +1 -1
  148. package/dist/core/runtime-assets.js +6 -6
  149. package/dist/core/src/cache-paths.d.ts.map +1 -1
  150. package/dist/core/src/index.d.ts +1 -1
  151. package/dist/core/src/index.d.ts.map +1 -1
  152. package/dist/core/src/lock.d.ts +3 -3
  153. package/dist/core/src/lock.d.ts.map +1 -1
  154. package/dist/core/src/manifest.d.ts +6 -1
  155. package/dist/core/src/manifest.d.ts.map +1 -1
  156. package/dist/core/src/models.d.ts +8 -0
  157. package/dist/core/src/models.d.ts.map +1 -1
  158. package/dist/core/store.js +2 -2
  159. package/dist/core/workspace-config.js +5 -5
  160. package/dist/deploy/index.js +8 -8
  161. package/dist/discovery/index.js +4 -4
  162. package/dist/discovery/src/index.d.ts +1 -1
  163. package/dist/discovery/src/index.d.ts.map +1 -1
  164. package/dist/discovery/src/source-config.d.ts +12 -0
  165. package/dist/discovery/src/source-config.d.ts.map +1 -1
  166. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  167. package/dist/{ensure-sources-VCPKNPK2.js → ensure-sources-277VI7R3.js} +17 -17
  168. package/dist/{ensure-sources-VCPKNPK2.js.map → ensure-sources-277VI7R3.js.map} +1 -1
  169. package/dist/factory-assets/connectors/box.js +15 -15
  170. package/dist/factory-assets/connectors/deploy.js +15 -15
  171. package/dist/factory-assets/connectors/devserver.js +15 -15
  172. package/dist/factory-assets/connectors/flow/adapter.js +15 -15
  173. package/dist/factory-assets/connectors/flow/engine.js +9 -9
  174. package/dist/factory-assets/connectors/flow/run-flow.js +17 -17
  175. package/dist/factory-assets/connectors/flow.js +15 -15
  176. package/dist/factory-assets/connectors/git.js +15 -15
  177. package/dist/factory-assets/connectors/gmail.js +15 -15
  178. package/dist/factory-assets/connectors/googledrive.js +15 -15
  179. package/dist/factory-assets/connectors/local.js +15 -15
  180. package/dist/factory-assets/connectors/mattermost.js +15 -15
  181. package/dist/factory-assets/connectors/memory.js +15 -15
  182. package/dist/factory-assets/connectors/minio.js +15 -15
  183. package/dist/factory-assets/connectors/postgres.js +15 -15
  184. package/dist/factory-assets/connectors/s3.js +15 -15
  185. package/dist/factory-assets/connectors/sharepoint.js +15 -15
  186. package/dist/factory-assets/connectors/sqlite.js +15 -15
  187. package/dist/factory-assets/connectors/static-server.js +15 -15
  188. package/dist/factory-assets/connectors/tunnel.js +15 -15
  189. package/dist/factory-assets/connectors/webdav.js +15 -15
  190. package/dist/factory-assets/connectors/xstate-store.js +15 -15
  191. package/dist/factory-assets/connectors/xstate.js +15 -15
  192. package/dist/{flows-ENQY2DV7.js → flows-J2UEU2QM.js} +13 -13
  193. package/dist/{flows-ENQY2DV7.js.map → flows-J2UEU2QM.js.map} +1 -1
  194. package/dist/{helpers-IW36CEJX.js → helpers-KC5O7CML.js} +17 -17
  195. package/dist/{helpers-IW36CEJX.js.map → helpers-KC5O7CML.js.map} +1 -1
  196. package/dist/library/index.js +11 -11
  197. package/dist/library/install.js +3 -3
  198. package/dist/library/src/index.d.ts +3 -3
  199. package/dist/library/src/index.d.ts.map +1 -1
  200. package/dist/library/src/local/library-manager.d.ts +6 -0
  201. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  202. package/dist/library/src/local/local-catalog-source.d.ts +5 -2
  203. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  204. package/dist/library/src/manifest-writer.d.ts +23 -1
  205. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  206. package/dist/library/src/sync/git-driver.d.ts +12 -0
  207. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  208. package/dist/{library-publish-R3DQLMTD.js → library-publish-FGXF5TJO.js} +85 -41
  209. package/dist/library-publish-FGXF5TJO.js.map +1 -0
  210. package/dist/{open-library-FAJZRDKE.js → open-library-P3D337NH.js} +20 -20
  211. package/dist/{open-library-FAJZRDKE.js.map → open-library-P3D337NH.js.map} +1 -1
  212. package/dist/open-registry-Z3P2X2AB.js +32 -0
  213. package/dist/{open-registry-NVPCQPND.js.map → open-registry-Z3P2X2AB.js.map} +1 -1
  214. package/dist/paths-JKEKXM52.js +22 -0
  215. package/dist/{paths-YUCP7K6U.js.map → paths-JKEKXM52.js.map} +1 -1
  216. package/dist/{plugin-store-66QFBNEO.js → plugin-store-WI4MZJLP.js} +10 -10
  217. package/dist/{plugin-store-66QFBNEO.js.map → plugin-store-WI4MZJLP.js.map} +1 -1
  218. package/dist/project-WFUDVYNN.js +41 -0
  219. package/dist/{project-ALJIVFHI.js.map → project-WFUDVYNN.js.map} +1 -1
  220. package/dist/resolver/index.js +9 -9
  221. package/dist/runner/index.js +28 -28
  222. package/dist/runner/src/serve.d.ts.map +1 -1
  223. package/dist/sdk/asset-manager.js +14 -14
  224. package/dist/sdk/bridge.js +12 -12
  225. package/dist/sdk/core.js +8 -8
  226. package/dist/sdk/flow.js +9 -9
  227. package/dist/sdk/index.js +28 -28
  228. package/dist/sdk/resolver.js +9 -9
  229. package/dist/sdk/runner.js +28 -28
  230. package/dist/secrets/index.js +2 -2
  231. package/dist/{setup-35JXIA3N.js → setup-RAMLTORM.js} +22 -22
  232. package/dist/{setup-35JXIA3N.js.map → setup-RAMLTORM.js.map} +1 -1
  233. package/dist/skills-EOHZ2DZ4.js +26 -0
  234. package/dist/{skills-CS7NE5TT.js.map → skills-EOHZ2DZ4.js.map} +1 -1
  235. package/dist/{source-ISR4KRZV.js → source-FYVSFYEI.js} +21 -21
  236. package/dist/{source-ISR4KRZV.js.map → source-FYVSFYEI.js.map} +1 -1
  237. package/dist/{source-manifest-publish-P22IPK5F.js → source-manifest-publish-4FPIPPLV.js} +23 -23
  238. package/dist/{source-manifest-publish-P22IPK5F.js.map → source-manifest-publish-4FPIPPLV.js.map} +1 -1
  239. package/dist/tui/index.js +28 -28
  240. package/dist/workspace-plugin/adapters/mcp.js +22 -22
  241. package/dist/workspace-plugin/adapters/omp.js +14 -14
  242. package/dist/workspace-plugin/index.js +1 -1
  243. package/package.json +3 -1
  244. package/dist/chunk-2NYXQYHN.js +0 -22
  245. package/dist/chunk-2NYXQYHN.js.map +0 -1
  246. package/dist/chunk-436GRQC2.js.map +0 -1
  247. package/dist/chunk-4CTGEEN6.js.map +0 -1
  248. package/dist/chunk-AO7VJ6G6.js.map +0 -1
  249. package/dist/chunk-IPWR33AW.js.map +0 -1
  250. package/dist/chunk-MFHKHXDE.js.map +0 -1
  251. package/dist/chunk-MX3UQXLU.js.map +0 -1
  252. package/dist/chunk-MX6LZE2C.js.map +0 -1
  253. package/dist/chunk-PA7WLID3.js.map +0 -1
  254. package/dist/chunk-RGXVQZOV.js.map +0 -1
  255. package/dist/chunk-TZCQ7ZWQ.js.map +0 -1
  256. package/dist/chunk-XOGG7VDZ.js.map +0 -1
  257. package/dist/library-publish-R3DQLMTD.js.map +0 -1
  258. package/dist/open-registry-NVPCQPND.js +0 -32
  259. package/dist/paths-YUCP7K6U.js +0 -22
  260. package/dist/project-ALJIVFHI.js +0 -41
  261. package/dist/skills-CS7NE5TT.js +0 -26
package/CHANGELOG.md CHANGED
@@ -1,5 +1,78 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1027](https://github.com/skaile-ai/workspaces/pull/1027) [`13a54f1`](https://github.com/skaile-ai/workspaces/commit/13a54f15275a9410af554a3eadf05c58e0d1b932) Thanks [@mortegro](https://github.com/mortegro)! - Library authoring fixes from the 5.4.0 review:
8
+
9
+ - `skaile library index` and `skaile validate` now accept dependency refs in the documented `kind:@publisher/name#version` form. A malformed `dependencies` entry fails both commands with the same message; before, `index` dropped it and exited 0 while `validate` passed.
10
+ - `skaile library index` no longer writes a broken asset into the manifest. An asset whose file does not parse (e.g. an empty `SKILL.md`) is reported and skipped with exit 1, an asset with a version that is not semver is skipped with a warning, and `library publish` refuses both. Re-indexing removes the index row of an asset it now skips, so `add` and `search --local` stop finding the old version.
11
+ - `skaile validate` fails on a `metadata.version` that is not semver, warns when the manifest version differs from the asset file (the file is the source of truth; run `skaile library index`), and flags unedited scaffolds of every kind (prompt, agent, contract and flow, not only skill).
12
+ - `skaile validate versions [path]` and `skaile validate changelog [path]` take a path like plain `skaile validate` and default to the library you are in. `--changed-only` outside a git repo prints one line, `git diff failed in <root>: …`. `skaile validate versions` now fails on a non-semver version, like plain `validate`.
13
+ - `skaile library create` now scaffolds only skill, agent, prompt, flow, preset and contract. Other kinds (persona, ruleset, knowledge, mcp-server, connector) are refused with exit 1 instead of silently creating a skill. Hand-written files of those kinds still validate.
14
+ - `skaile library create --dir` is refused when it points outside the library.
15
+ - `skaile library create` rejects asset names that are not lowercase kebab-case and invalid `--publisher` values (also checked by `library set publisher=`), with a hint and exit 1, creating nothing.
16
+ - `skaile library create` and `skaile library index` no longer write `metadata.publisher` into asset files; the manifest (`assets[].publisher`, else the library's `publisher:`) is the only publisher source. `skaile validate` warns about a file whose `metadata.publisher` differs from it. Existing files keep the key until you remove it.
17
+ - `skaile library index` and adopting an existing directory with `skaile library init` now warn when the publisher falls back to the library name.
18
+ - `skaile library link` and `skaile library init --git` warn when the remote is not a GitHub URL, since `library publish` only supports GitHub. The exit code is unchanged.
19
+ - API: `createScaffold` / `AssetManager.create` return `{ ok: false }` for a kind without a scaffold instead of creating a skill, and `syncManifestWithDisk` returns `{ removed, skipped }` (see MIGRATION.md).
20
+
21
+ - [#1028](https://github.com/skaile-ai/workspaces/pull/1028) [`baa938a`](https://github.com/skaile-ai/workspaces/commit/baa938a4ea1e888afbb5af6441082cb8e765406a) Thanks [@mortegro](https://github.com/mortegro)! - Library git flow, `library set` guards and path fixes from the 5.4.0 review:
22
+
23
+ - `skaile library pull` and `skaile library sync` stay fast-forward-only. When local and remote both changed, they now fail with one line that names `skaile library git <lib> pull --rebase origin <branch>`, instead of a long git dump (`pull` used to exit 0 here). `library init --git` and `library link` now set the branch upstream.
24
+ - `skaile library commit` now refuses (exit 1, no commit) while a rebase, merge, cherry-pick or revert is unfinished or unmerged files exist.
25
+ - `skaile library set <lib> isDefault=true` now makes that library the only default instead of failing with a SQL error. `isDefault=false` on the current default is refused.
26
+ - `skaile library set` now rejects an unknown `ownership`, `contributor`/`reader` on a local library, and `backendConfig.url` on a local library, with the same wording `init` uses.
27
+ - Library names must be letters, digits, `_` or `-`, starting with a letter or digit (`init`, `rename`, `set name=`). Names like `a/b` or `../y` no longer create nested folders or crash. `set name=` now renames like `library rename`. `library remove --purge` also removes the empty parent folders it leaves behind under the libraries root.
28
+ - `skaile library remove` without a TTY and without `-y` now exits 1 with `library remove needs confirmation: pass -y` and keeps the library.
29
+ - Git-only commands on a local library (`push`, `pull`, `sync`, …) now tell you to run `skaile library link <name> <url>` first.
30
+ - A relative `SKAILE_HOME`, `SKAILE_INDEX_PATH`, `SKAILE_LIBRARIES_DIR` or `SKAILE_CACHE_DIR` is now made absolute at startup, so commands run from a subdirectory, and programs `skaile` starts, use the same libraries, index and cache.
31
+ - `skaile source remove` and its `--purge` help now name the real cache directory instead of a hard-coded `~/.skaile/cache/sources/`.
32
+ - `skaile update` with `catalog.url: local` now prints `Catalog refresh skipped (catalog.url: local)` instead of reporting a failed refresh.
33
+ - Piping output into a reader that closes early (`skaile search … | head -1`) now exits 0 without an EPIPE stack trace.
34
+ - `skaile --help` lists the real session subcommands (`session list|show|switch|delete`), and the README quick start no longer uses the non-existent `skaile run mvp`.
35
+ - Registering or renaming a library through `@skaile/workspaces/library` now rejects names that are not letters, digits, `_` or `-`, and `source add` turns repo names such as `my.repo` into valid library names.
36
+
37
+ - [#1026](https://github.com/skaile-ai/workspaces/pull/1026) [`014b422`](https://github.com/skaile-ai/workspaces/commit/014b422606c879517419ad467fbc8426671a729f) Thanks [@mortegro](https://github.com/mortegro)! - Resolver and lock fixes from the 5.4.0 review:
38
+
39
+ - `skaile add` and `skaile install` now resolve a ref from your registered library before asking any store, so a library asset adds even when the store is unreachable, and the success line names the library. A `#version` pin the library does not hold still falls through to the store. See MIGRATION.md.
40
+ - `skaile install` no longer asks the store about refs your library already provides, and an unreachable store is reported once per store URL instead of once per ref.
41
+ - The dependencies of a library asset (`requires` and `dependencies`) are now deployed and locked together with it. Dependency cycles are handled.
42
+ - `skaile add skill:@acme/x` now finds an asset created with `library create --publisher acme`, even when the library's own publisher is different.
43
+ - Short refs like `skill:name` now find library assets in `info`, `why` and `diff`. `diff` on an unknown ref says "not found" instead of crashing.
44
+ - `skaile doctor` and `skaile check` now report unmet requirements of library assets and locked assets whose library is gone, instead of saying everything is fine. `skaile check` fails for every declared dependency that does not resolve and names `skaile install`.
45
+ - Re-adding an asset with a new version pin (`skaile add x#0.2.0` after `skaile add x`) now replaces its line in `skaile.yaml` instead of adding a second one.
46
+ - Upgrading a source or store pinned asset now leaves one entry for it in `skaile.lock.yaml`, not one per version.
47
+ - The lock now records the library asset version that was actually deployed, so bumping a skill and running `skaile update` writes the new version and `skaile install --locked` passes.
48
+ - `skaile remove` now removes a declared asset from `skaile.yaml` and the lock even when its files are already gone, including every duplicate line an older `add` left behind. It exits 1 only when there was nothing to remove.
49
+ - `skaile outdated` now reads library assets from disk, so a version bump shows up once without `skaile library index` first. It lists a library asset whose content changed without a version bump as `content changed since lock`, and a source asset after `skaile source sync` moved the clone past the locked commit, with the number of commits behind. A lock that is ahead of your local clone is not reported as behind.
50
+ - Adding two sources with the same repo name from different orgs now gives each its own library row, and `source remove` only removes the row of the source you name.
51
+ - `skaile manage` now ticks an asset only in the library its lock entry names, and `skaile search` shows which library each result comes from.
52
+ - `asset show` and `asset install` now reject `@publisher/name@version` like `install` does, and `asset show` prints only the canonical `ref`.
53
+
54
+ - [#1029](https://github.com/skaile-ai/workspaces/pull/1029) [`8b5e19f`](https://github.com/skaile-ai/workspaces/commit/8b5e19fb14f89a475937ceddeb9613dedf871eae) Thanks [@mortegro](https://github.com/mortegro)! - Upgrade hints and docs from the 5.4.0 review:
55
+
56
+ - `--domain` on `asset import`, `asset migrate`, `library create` and `validate versions`, and `skaile library set <lib> structure=…`, now print the "domains were removed in 5.0" hint and exit 1 instead of a generic unknown-option error. `--domain` no longer appears in `--help`.
57
+ - When `skaile add` or `skaile install` cannot find a ref after a publisher change, the error now names the asset under its new publisher (`did you mean skill:@acme/…?`) and the lock entry still pinned to the old one, only when that lock entry came from the library that now holds the asset under the new publisher (an unrelated asset that just shares the name is no longer offered). The hint is printed by the CLI; programmatically, `InstallResult.missing` still holds bare refs and the text is in the new `InstallResult.missingHints` (ref → hint).
58
+ - The "Upgrading a 4.x library" steps and the 5.3.0 migration entry now say to run `skaile install` once and commit `skaile.lock.yaml` (`install --locked` fails until then), and to run `skaile library link <name> <url>` before `library commit`, `push` or `publish` on a library still registered as local.
59
+ - The 5.4.0 migration entry carries its real heading, and the release script refuses to publish a new version while `MIGRATION.md` still has an `## Unreleased` heading (`node scripts/release.mjs --check-migration` runs the check alone).
60
+
61
+ ### Patch Changes
62
+
63
+ - [#1036](https://github.com/skaile-ai/workspaces/pull/1036) [`5ebf7dd`](https://github.com/skaile-ai/workspaces/commit/5ebf7dd75c15f253ee573a0f049cb523e90d853f) Thanks [@peteralbert](https://github.com/peteralbert)! - The runner now re-announces `protocol_info` on every reconnect once a session is initialized, not only on managed hosts. A platform that re-adopted a running container after its own restart had lost the announcement, so it refused every version-gated command for the rest of the container's life: answering a flow's open question failed with "connector_mutate requires Protocol 3.7 acknowledgement support".
64
+
65
+ ## 5.6.1
66
+
67
+ ### Patch Changes
68
+
69
+ - [#1031](https://github.com/skaile-ai/workspaces/pull/1031) [`377e0d6`](https://github.com/skaile-ai/workspaces/commit/377e0d6736eb01d828aaf74764e09fd82db96b53) Thanks [@mortegro](https://github.com/mortegro)! - - `skaile migrate agents` no longer copies a legacy `requires[].name` such as `Code Reviewer` or `foo.bar` verbatim into `composes[].as`, which failed validation and got the whole `agent.yaml` skipped. The name is slugified (`code-reviewer`, `foo-bar`) with a note naming the original; a name with no valid slug, or one that collides with another alias in the same agent, omits `as` and is listed under the plan's manual section.
70
+
71
+ - Tests now pin the run controller's cancel races: a cancel while a run is moving from `queued` to `running`, and a cancel while the nested session is being created or started, each end `cancelled`, settle `agent.result { wait: true }` and dispose the half-started session.
72
+
73
+ - [#1034](https://github.com/skaile-ai/workspaces/pull/1034) [`85bf2cc`](https://github.com/skaile-ai/workspaces/commit/85bf2cc7dc8517f90568ac4bdb26299db617b8d3) Thanks [@mortegro](https://github.com/mortegro)! - - `skaile install` deploys every file the lock records for an asset from a `sources:` clone again. Since 5.6.0 such assets were copied through the kind's convention filter, so a skill's `.gitignore` or `resources/` dir was dropped while `skaile.lock.yaml` still listed it. Store-staged assets already copied their full file list; both paths now share it.
74
+ - A re-install compares every deployed file of an asset, not only its manifest, so a deleted or stale companion file (`scripts/`, `resources/`, dotfiles) is restored even when `SKILL.md` is unchanged.
75
+
3
76
  ## 5.6.0
4
77
 
5
78
  ### Minor Changes
package/README.md CHANGED
@@ -80,7 +80,8 @@ cli (top-level CLI — orchestrates everything below)
80
80
  # Installed from npm (npm i -D skaile-cli)
81
81
  npx skaile --help # run the skaile CLI
82
82
  npx skaile search skill # list available skills
83
- npx skaile run mvp # run a flow
83
+ npx skaile flow list # list available flows
84
+ npx skaile run "Summarise this repository" # send a single prompt (run also takes a flow name)
84
85
  ```
85
86
 
86
87
  ```bash
@@ -88,7 +89,8 @@ npx skaile run mvp # run a flow
88
89
  bun run build
89
90
  bun packages/workspaces/cli/src/index.ts --help # run the skaile CLI
90
91
  bun packages/workspaces/cli/src/index.ts search skill # list available skills
91
- bun packages/workspaces/cli/src/index.ts run mvp # run a flow
92
+ bun packages/workspaces/cli/src/index.ts flow list # list available flows
93
+ bun packages/workspaces/cli/src/index.ts run "Summarise this repository" # send a single prompt
92
94
  ```
93
95
 
94
96
  Flow authors and editor integrations can import the v2 contract independently:
@@ -1,27 +1,27 @@
1
- import { getKnownKinds } from './chunk-OLLAQLFJ.js';
2
- import './chunk-AOAZCSDI.js';
1
+ import { getKnownKinds } from './chunk-WIEC3ZE4.js';
2
+ import './chunk-LBQ4BBX4.js';
3
3
  import './chunk-QZLWJETK.js';
4
4
  import './chunk-NFGRW3L7.js';
5
5
  import './chunk-QCI6D7E4.js';
6
- import './chunk-MX3UQXLU.js';
7
- import './chunk-XOGG7VDZ.js';
8
- import './chunk-BTISGSK4.js';
6
+ import './chunk-DFFD4BFG.js';
7
+ import './chunk-6VRJH4MR.js';
8
+ import './chunk-FAP63KV7.js';
9
9
  import './chunk-R7FOF242.js';
10
10
  import './chunk-3TXEJN4W.js';
11
11
  import './chunk-FRHE7FFB.js';
12
- import './chunk-TZCQ7ZWQ.js';
12
+ import './chunk-OOLT6HGP.js';
13
13
  import './chunk-4GY63JU6.js';
14
- import { factoryAssetRoots } from './chunk-BF33SCLY.js';
15
- import './chunk-46OVMT76.js';
14
+ import { factoryAssetRoots } from './chunk-SWO25LTO.js';
15
+ import './chunk-G67BOI2J.js';
16
16
  import './chunk-5BEFNLOR.js';
17
17
  import './chunk-A2ULN3KX.js';
18
- import { scanRepo } from './chunk-2W4LBLIN.js';
19
- import './chunk-MFHKHXDE.js';
18
+ import { scanRepo } from './chunk-LCU5U5IW.js';
19
+ import './chunk-L5VSIPQD.js';
20
20
  import './chunk-CPSIPIX7.js';
21
- import './chunk-7ZHLYXTI.js';
21
+ import './chunk-RVIZQ5XD.js';
22
22
  import './chunk-RVRB27AN.js';
23
- import './chunk-PA7WLID3.js';
24
- import './chunk-AO7VJ6G6.js';
23
+ import './chunk-TTPSDC2G.js';
24
+ import './chunk-O7VPNKYN.js';
25
25
  import './chunk-ICSCSM5D.js';
26
26
  import './chunk-JMKB7IB4.js';
27
27
  import './chunk-MJHSLODD.js';
@@ -34,7 +34,7 @@ import * as path from 'path';
34
34
  async function libraryAssets() {
35
35
  const notes = [];
36
36
  try {
37
- const { openLibraryManager, authoringLibraries } = await import('./open-library-FAJZRDKE.js');
37
+ const { openLibraryManager, authoringLibraries } = await import('./open-library-P3D337NH.js');
38
38
  const { manager, close } = await openLibraryManager();
39
39
  try {
40
40
  const libs = authoringLibraries(await manager.listLibraries());
@@ -61,7 +61,7 @@ async function libraryAssets() {
61
61
  async function storeAssets(projectDir) {
62
62
  const notes = [];
63
63
  try {
64
- const { resolveCatalogSource } = await import('./open-library-FAJZRDKE.js');
64
+ const { resolveCatalogSource } = await import('./open-library-P3D337NH.js');
65
65
  const { source, close } = await resolveCatalogSource({ projectDir });
66
66
  try {
67
67
  const assets = await source.listAssets();
@@ -140,5 +140,5 @@ async function gatherAssetFeeds(am, projectDir) {
140
140
  }
141
141
 
142
142
  export { gatherAssetFeeds };
143
- //# sourceMappingURL=asset-feeds-4O2JK5S4.js.map
144
- //# sourceMappingURL=asset-feeds-4O2JK5S4.js.map
143
+ //# sourceMappingURL=asset-feeds-K36CR52Q.js.map
144
+ //# sourceMappingURL=asset-feeds-K36CR52Q.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":"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","file":"asset-feeds-4O2JK5S4.js","sourcesContent":["/**\n * asset-feeds.ts — gather installable assets from every feed the manage TUI\n * surfaces.\n *\n * Four feeds, normalized into `CatalogEntry`:\n * - **Project sources** — `skaile.yaml` `sources:` entries (scanned via\n * `AssetManager.search()`; the new `sources:` field is merged into the\n * legacy repositories map in `AssetManager.loadConfig`).\n * - **Local libraries** — user authoring places from `LocalIndex` (filesystem\n * scan of each library's `path`).\n * - **Factory assets** — the bundled first-party `factory-assets` tree\n * (`factoryAssetRoots()`), scanned from disk. Always present; no network.\n * - **Remote store** — the configured catalog source when `catalog.url` is\n * not `local`. Failures are non-fatal — they surface as notes.\n */\n\nimport { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n scanRepo,\n} from \"@skaile/workspaces/core\";\nimport { getKnownKinds } from \"./open-registry.ts\";\n\n/** One non-fatal note returned to the caller for surfacing in the UI. */\nexport interface FeedNote {\n feed: \"sources\" | \"libraries\" | \"store\" | \"factory\";\n message: string;\n}\n\n/**\n * Which feed an asset came from. This is the top-level grouping axis in the\n * manage TUI (\"where is this skill coming from?\") and is intentionally distinct\n * from `publisher` (asset-intrinsic identity): the same publisher can legitimately\n * appear under more than one origin (e.g. a github repo you added as a `source`\n * that is also listed in the remote `store`).\n */\nexport type AssetOrigin = \"source\" | \"library\" | \"factory\" | \"store\";\n\n/** A catalog entry tagged with the feed it was gathered from. */\nexport interface OriginEntry {\n origin: AssetOrigin;\n entry: CatalogEntry;\n /**\n * Second-level grouping label for the manage tree. Defaults (when unset) to the\n * entry's `publisher`; the source feed sets it to the source's short repo name\n * so the Sources band groups by source — \"which repo did this come from\" — not\n * by the asset-intrinsic publisher.\n */\n group?: string;\n}\n\nexport interface AssetFeedResult {\n entries: OriginEntry[];\n notes: FeedNote[];\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache). Each\n * library's `path` is scanned with `scanRepo` and grouped under the bare library\n * name (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * is stamped by `scanRepo`.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { openLibraryManager, authoringLibraries } = await import(\"./open-library.ts\");\n const { manager, close } = await openLibraryManager();\n try {\n // Authoring libraries are the rows that are NOT source clones.\n const libs = authoringLibraries(await manager.listLibraries());\n const entries: OriginEntry[] = [];\n for (const lib of libs) {\n if (!existsSync(lib.path)) continue;\n const libEntries = [\n ...(await scanRepo(lib.path, lib.name, { knownKinds: getKnownKinds() })),\n ];\n for (const entry of libEntries) entries.push({ origin: \"library\", entry, group: lib.name });\n }\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n notes.push({\n feed: \"libraries\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/**\n * Pull a (best-effort) snapshot of the connected remote store catalog.\n *\n * - Returns no entries when the resolved catalog is local-only or the host\n * is unreachable (the failure becomes a note, not an exception).\n * - Maps `CatalogAsset` → `CatalogEntry`, carrying `publisher`, `repo`, and\n * `category` straight through and using `source = \"store://<id>\"`; per-file\n * `source` paths are not available for remote assets so the canonical ref is\n * a stable placeholder.\n */\nasync function storeAssets(projectDir: string): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { resolveCatalogSource } = await import(\"./open-library.ts\");\n const { source, close } = await resolveCatalogSource({ projectDir });\n try {\n const assets = await source.listAssets();\n const entries: CatalogEntry[] = assets.map((a) => ({\n name: a.name,\n kind: (a.kind as AssetKind) ?? \"skill\",\n description: a.description ?? \"\",\n source: `store://${a.id}`,\n publisher: a.publisher,\n repo: a.repo,\n plugin: a.plugin,\n category: a.category,\n version: a.version,\n requires: [],\n dependencies: [],\n }));\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Local-only catalog throws a recognizable message — silence it; absence\n // is the user's choice, not an error.\n if (!/local/i.test(msg)) {\n notes.push({ feed: \"store\", message: msg });\n }\n return { entries: [], notes };\n }\n}\n\n/** The slice of `AssetManager` the source feed needs (kept narrow for tests). */\ninterface AssetManagerLike {\n search: () => Promise<CatalogEntry[]>;\n searchRepoRoots: () => { repoName: string; root: string }[];\n}\n\n/**\n * Project-source feed: leans on `AssetManager.search()`, which merges\n * `skaile.yaml`'s `sources:` field into the repositories map. Plugin grouping\n * (`entry.plugin`) is stamped by the scanner, so entries pass through as-is.\n */\nasync function sourceAssets(am: AssetManagerLike): Promise<OriginEntry[]> {\n // The bundled factory tree is injected into the repositories map as an implicit\n // source, so `am.search()` returns it too. It has its own `factory` origin band,\n // so drop it here — otherwise the same first-party skills list twice under Sources.\n const factoryPrefixes = factoryAssetRoots().map((r) => (r.endsWith(path.sep) ? r : r + path.sep));\n const isFactoryPath = (p: string) =>\n factoryPrefixes.some((fp) => p === fp.slice(0, -1) || p.startsWith(fp));\n\n const all = (await am.search()).filter((e) => !isFactoryPath(e.source));\n const entries: OriginEntry[] = [];\n // Group each source's entries under the source node (its short repo name), not\n // the publisher: under Sources the navigational question is \"which repo did\n // this come from\". Each entry's `source` (absolute manifest path) lives under\n // exactly one declared root, so group by prefix. The cache slug is\n // URL-keyed `github.com/<org>/<repo>` — take the trailing segment.\n for (const { repoName, root } of am.searchRepoRoots()) {\n if (isFactoryPath(root)) continue;\n const prefix = root.endsWith(path.sep) ? root : root + path.sep;\n const owned = all.filter((e) => e.source === root || e.source.startsWith(prefix));\n if (owned.length === 0) continue;\n const sourceName = repoName.split(\"/\").pop() || repoName;\n for (const entry of owned) entries.push({ origin: \"source\", entry, group: sourceName });\n }\n return entries;\n}\n\n/**\n * Factory-asset feed: scan the bundled first-party `factory-assets` tree(s)\n * resolved by `factoryAssetRoots()` (the `SKAILE_FACTORY_ASSETS_DIR` override\n * layer ahead of the bundled tree). Local disk only, no network — the entries are\n * the built-in skills / connectors / bundles that ship with `@skaile/workspaces`.\n * `factoryAssetRoots()` already dedupes, so the env override pointing at the\n * bundled dir collapses to one root.\n */\nasync function factoryAssets(): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const entries: CatalogEntry[] = [];\n for (const root of factoryAssetRoots()) {\n entries.push(...(await scanRepo(root, \"skaile-factory\", { knownKinds: getKnownKinds() })));\n }\n return { entries, notes };\n } catch (err) {\n notes.push({\n feed: \"factory\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/** Tag a flat entry list with a single origin. */\nfunction tag(origin: AssetOrigin, entries: CatalogEntry[]): OriginEntry[] {\n return entries.map((entry) => ({ origin, entry }));\n}\n\n/**\n * Run all feeds and return a single normalized result.\n *\n * Feeds run in parallel where possible — the store fetch is the slow one\n * (one HTTP call) and is fired alongside the local library walk. The factory\n * scan is local disk only, so it runs inline.\n */\nexport async function gatherAssetFeeds(\n am: AssetManagerLike,\n projectDir: string,\n): Promise<AssetFeedResult> {\n const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);\n const factory = await factoryAssets();\n const src = await sourceAssets(am);\n return {\n entries: [\n ...src,\n ...libs.entries,\n ...tag(\"factory\", factory.entries),\n ...tag(\"store\", store.entries),\n ],\n notes: [...libs.notes, ...store.notes, ...factory.notes],\n };\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":"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","file":"asset-feeds-K36CR52Q.js","sourcesContent":["/**\n * asset-feeds.ts — gather installable assets from every feed the manage TUI\n * surfaces.\n *\n * Four feeds, normalized into `CatalogEntry`:\n * - **Project sources** — `skaile.yaml` `sources:` entries (scanned via\n * `AssetManager.search()`; the new `sources:` field is merged into the\n * legacy repositories map in `AssetManager.loadConfig`).\n * - **Local libraries** — user authoring places from `LocalIndex` (filesystem\n * scan of each library's `path`).\n * - **Factory assets** — the bundled first-party `factory-assets` tree\n * (`factoryAssetRoots()`), scanned from disk. Always present; no network.\n * - **Remote store** — the configured catalog source when `catalog.url` is\n * not `local`. Failures are non-fatal — they surface as notes.\n */\n\nimport { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n scanRepo,\n} from \"@skaile/workspaces/core\";\nimport { getKnownKinds } from \"./open-registry.ts\";\n\n/** One non-fatal note returned to the caller for surfacing in the UI. */\nexport interface FeedNote {\n feed: \"sources\" | \"libraries\" | \"store\" | \"factory\";\n message: string;\n}\n\n/**\n * Which feed an asset came from. This is the top-level grouping axis in the\n * manage TUI (\"where is this skill coming from?\") and is intentionally distinct\n * from `publisher` (asset-intrinsic identity): the same publisher can legitimately\n * appear under more than one origin (e.g. a github repo you added as a `source`\n * that is also listed in the remote `store`).\n */\nexport type AssetOrigin = \"source\" | \"library\" | \"factory\" | \"store\";\n\n/** A catalog entry tagged with the feed it was gathered from. */\nexport interface OriginEntry {\n origin: AssetOrigin;\n entry: CatalogEntry;\n /**\n * Second-level grouping label for the manage tree. Defaults (when unset) to the\n * entry's `publisher`; the source feed sets it to the source's short repo name\n * so the Sources band groups by source — \"which repo did this come from\" — not\n * by the asset-intrinsic publisher.\n */\n group?: string;\n}\n\nexport interface AssetFeedResult {\n entries: OriginEntry[];\n notes: FeedNote[];\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache). Each\n * library's `path` is scanned with `scanRepo` and grouped under the bare library\n * name (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * is stamped by `scanRepo`.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { openLibraryManager, authoringLibraries } = await import(\"./open-library.ts\");\n const { manager, close } = await openLibraryManager();\n try {\n // Authoring libraries are the rows that are NOT source clones.\n const libs = authoringLibraries(await manager.listLibraries());\n const entries: OriginEntry[] = [];\n for (const lib of libs) {\n if (!existsSync(lib.path)) continue;\n const libEntries = [\n ...(await scanRepo(lib.path, lib.name, { knownKinds: getKnownKinds() })),\n ];\n for (const entry of libEntries) entries.push({ origin: \"library\", entry, group: lib.name });\n }\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n notes.push({\n feed: \"libraries\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/**\n * Pull a (best-effort) snapshot of the connected remote store catalog.\n *\n * - Returns no entries when the resolved catalog is local-only or the host\n * is unreachable (the failure becomes a note, not an exception).\n * - Maps `CatalogAsset` → `CatalogEntry`, carrying `publisher`, `repo`, and\n * `category` straight through and using `source = \"store://<id>\"`; per-file\n * `source` paths are not available for remote assets so the canonical ref is\n * a stable placeholder.\n */\nasync function storeAssets(projectDir: string): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { resolveCatalogSource } = await import(\"./open-library.ts\");\n const { source, close } = await resolveCatalogSource({ projectDir });\n try {\n const assets = await source.listAssets();\n const entries: CatalogEntry[] = assets.map((a) => ({\n name: a.name,\n kind: (a.kind as AssetKind) ?? \"skill\",\n description: a.description ?? \"\",\n source: `store://${a.id}`,\n publisher: a.publisher,\n repo: a.repo,\n plugin: a.plugin,\n category: a.category,\n version: a.version,\n requires: [],\n dependencies: [],\n }));\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Local-only catalog throws a recognizable message — silence it; absence\n // is the user's choice, not an error.\n if (!/local/i.test(msg)) {\n notes.push({ feed: \"store\", message: msg });\n }\n return { entries: [], notes };\n }\n}\n\n/** The slice of `AssetManager` the source feed needs (kept narrow for tests). */\ninterface AssetManagerLike {\n search: () => Promise<CatalogEntry[]>;\n searchRepoRoots: () => { repoName: string; root: string }[];\n}\n\n/**\n * Project-source feed: leans on `AssetManager.search()`, which merges\n * `skaile.yaml`'s `sources:` field into the repositories map. Plugin grouping\n * (`entry.plugin`) is stamped by the scanner, so entries pass through as-is.\n */\nasync function sourceAssets(am: AssetManagerLike): Promise<OriginEntry[]> {\n // The bundled factory tree is injected into the repositories map as an implicit\n // source, so `am.search()` returns it too. It has its own `factory` origin band,\n // so drop it here — otherwise the same first-party skills list twice under Sources.\n const factoryPrefixes = factoryAssetRoots().map((r) => (r.endsWith(path.sep) ? r : r + path.sep));\n const isFactoryPath = (p: string) =>\n factoryPrefixes.some((fp) => p === fp.slice(0, -1) || p.startsWith(fp));\n\n const all = (await am.search()).filter((e) => !isFactoryPath(e.source));\n const entries: OriginEntry[] = [];\n // Group each source's entries under the source node (its short repo name), not\n // the publisher: under Sources the navigational question is \"which repo did\n // this come from\". Each entry's `source` (absolute manifest path) lives under\n // exactly one declared root, so group by prefix. The cache slug is\n // URL-keyed `github.com/<org>/<repo>` — take the trailing segment.\n for (const { repoName, root } of am.searchRepoRoots()) {\n if (isFactoryPath(root)) continue;\n const prefix = root.endsWith(path.sep) ? root : root + path.sep;\n const owned = all.filter((e) => e.source === root || e.source.startsWith(prefix));\n if (owned.length === 0) continue;\n const sourceName = repoName.split(\"/\").pop() || repoName;\n for (const entry of owned) entries.push({ origin: \"source\", entry, group: sourceName });\n }\n return entries;\n}\n\n/**\n * Factory-asset feed: scan the bundled first-party `factory-assets` tree(s)\n * resolved by `factoryAssetRoots()` (the `SKAILE_FACTORY_ASSETS_DIR` override\n * layer ahead of the bundled tree). Local disk only, no network — the entries are\n * the built-in skills / connectors / bundles that ship with `@skaile/workspaces`.\n * `factoryAssetRoots()` already dedupes, so the env override pointing at the\n * bundled dir collapses to one root.\n */\nasync function factoryAssets(): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const entries: CatalogEntry[] = [];\n for (const root of factoryAssetRoots()) {\n entries.push(...(await scanRepo(root, \"skaile-factory\", { knownKinds: getKnownKinds() })));\n }\n return { entries, notes };\n } catch (err) {\n notes.push({\n feed: \"factory\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/** Tag a flat entry list with a single origin. */\nfunction tag(origin: AssetOrigin, entries: CatalogEntry[]): OriginEntry[] {\n return entries.map((entry) => ({ origin, entry }));\n}\n\n/**\n * Run all feeds and return a single normalized result.\n *\n * Feeds run in parallel where possible — the store fetch is the slow one\n * (one HTTP call) and is fired alongside the local library walk. The factory\n * scan is local disk only, so it runs inline.\n */\nexport async function gatherAssetFeeds(\n am: AssetManagerLike,\n projectDir: string,\n): Promise<AssetFeedResult> {\n const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);\n const factory = await factoryAssets();\n const src = await sourceAssets(am);\n return {\n entries: [\n ...src,\n ...libs.entries,\n ...tag(\"factory\", factory.entries),\n ...tag(\"store\", store.entries),\n ],\n notes: [...libs.notes, ...store.notes, ...factory.notes],\n };\n}\n"]}
@@ -1,17 +1,17 @@
1
- export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs } from '../chunk-SDFROXSA.js';
2
- import '../chunk-TZCQ7ZWQ.js';
1
+ export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs } from '../chunk-O4Z7MAW7.js';
2
+ import '../chunk-OOLT6HGP.js';
3
3
  import '../chunk-4GY63JU6.js';
4
- import '../chunk-BF33SCLY.js';
5
- import '../chunk-46OVMT76.js';
4
+ import '../chunk-SWO25LTO.js';
5
+ import '../chunk-G67BOI2J.js';
6
6
  import '../chunk-5BEFNLOR.js';
7
7
  import '../chunk-A2ULN3KX.js';
8
- import '../chunk-2W4LBLIN.js';
9
- import '../chunk-MFHKHXDE.js';
8
+ import '../chunk-LCU5U5IW.js';
9
+ import '../chunk-L5VSIPQD.js';
10
10
  import '../chunk-CPSIPIX7.js';
11
- import '../chunk-7ZHLYXTI.js';
11
+ import '../chunk-RVIZQ5XD.js';
12
12
  import '../chunk-RVRB27AN.js';
13
- import '../chunk-PA7WLID3.js';
14
- import '../chunk-AO7VJ6G6.js';
13
+ import '../chunk-TTPSDC2G.js';
14
+ import '../chunk-O7VPNKYN.js';
15
15
  import '../chunk-ICSCSM5D.js';
16
16
  import '../chunk-JMKB7IB4.js';
17
17
  import '../chunk-MJHSLODD.js';
@@ -1,28 +1,28 @@
1
- export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, installAgentInstances, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, softDepName } from '../chunk-4CTGEEN6.js';
2
- import '../chunk-MX3UQXLU.js';
3
- import '../chunk-XOGG7VDZ.js';
4
- import '../chunk-BTISGSK4.js';
1
+ export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, installAgentInstances, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, softDepName } from '../chunk-D5HOETOB.js';
2
+ import '../chunk-DFFD4BFG.js';
3
+ import '../chunk-6VRJH4MR.js';
4
+ import '../chunk-FAP63KV7.js';
5
5
  import '../chunk-R7FOF242.js';
6
6
  import '../chunk-3TXEJN4W.js';
7
- export { createScaffold, deployAll, installAgent, installTargetOf, removeAsset } from '../chunk-IPWR33AW.js';
7
+ export { SCAFFOLD_KINDS, createScaffold, deployAll, installAgent, installTargetOf, removeAsset } from '../chunk-74EEFB52.js';
8
8
  export { BUILT_IN_FRAGMENTS, loadPromptExtensions, resolveFragments } from '../chunk-CGYEHQOX.js';
9
9
  export { appendHistory, clearHistory, getRecentHistory, loadHistory } from '../chunk-KTBKW2FI.js';
10
10
  import '../chunk-UQ6LFBPZ.js';
11
- export { AGENT_RENDERERS, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-VKSXST23.js';
11
+ export { AGENT_RENDERERS, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-AVCUPPG6.js';
12
12
  import '../chunk-FRHE7FFB.js';
13
- import '../chunk-TZCQ7ZWQ.js';
13
+ import '../chunk-OOLT6HGP.js';
14
14
  import '../chunk-4GY63JU6.js';
15
- import '../chunk-BF33SCLY.js';
16
- import '../chunk-46OVMT76.js';
15
+ import '../chunk-SWO25LTO.js';
16
+ import '../chunk-G67BOI2J.js';
17
17
  import '../chunk-5BEFNLOR.js';
18
18
  import '../chunk-A2ULN3KX.js';
19
- import '../chunk-2W4LBLIN.js';
20
- import '../chunk-MFHKHXDE.js';
19
+ import '../chunk-LCU5U5IW.js';
20
+ import '../chunk-L5VSIPQD.js';
21
21
  import '../chunk-CPSIPIX7.js';
22
- import '../chunk-7ZHLYXTI.js';
22
+ import '../chunk-RVIZQ5XD.js';
23
23
  import '../chunk-RVRB27AN.js';
24
- import '../chunk-PA7WLID3.js';
25
- import '../chunk-AO7VJ6G6.js';
24
+ import '../chunk-TTPSDC2G.js';
25
+ import '../chunk-O7VPNKYN.js';
26
26
  import '../chunk-ICSCSM5D.js';
27
27
  import '../chunk-JMKB7IB4.js';
28
28
  import '../chunk-MJHSLODD.js';
@@ -1,20 +1,20 @@
1
- export { canonicalEntryRef, createScaffold, deployAll, deployAsset, installTargetOf, removeAsset } from '../chunk-IPWR33AW.js';
1
+ export { SCAFFOLD_KINDS, canonicalEntryRef, createScaffold, deployAll, deployAsset, installTargetOf, removeAsset } from '../chunk-74EEFB52.js';
2
2
  import '../chunk-CGYEHQOX.js';
3
- import '../chunk-VKSXST23.js';
3
+ import '../chunk-AVCUPPG6.js';
4
4
  import '../chunk-FRHE7FFB.js';
5
- import '../chunk-TZCQ7ZWQ.js';
5
+ import '../chunk-OOLT6HGP.js';
6
6
  import '../chunk-4GY63JU6.js';
7
- import '../chunk-BF33SCLY.js';
8
- import '../chunk-46OVMT76.js';
7
+ import '../chunk-SWO25LTO.js';
8
+ import '../chunk-G67BOI2J.js';
9
9
  import '../chunk-5BEFNLOR.js';
10
10
  import '../chunk-A2ULN3KX.js';
11
- import '../chunk-2W4LBLIN.js';
12
- import '../chunk-MFHKHXDE.js';
11
+ import '../chunk-LCU5U5IW.js';
12
+ import '../chunk-L5VSIPQD.js';
13
13
  import '../chunk-CPSIPIX7.js';
14
- import '../chunk-7ZHLYXTI.js';
14
+ import '../chunk-RVIZQ5XD.js';
15
15
  import '../chunk-RVRB27AN.js';
16
- import '../chunk-PA7WLID3.js';
17
- import '../chunk-AO7VJ6G6.js';
16
+ import '../chunk-TTPSDC2G.js';
17
+ import '../chunk-O7VPNKYN.js';
18
18
  import '../chunk-ICSCSM5D.js';
19
19
  import '../chunk-JMKB7IB4.js';
20
20
  import '../chunk-MJHSLODD.js';
@@ -1,18 +1,18 @@
1
- export { AGENT_RENDERERS, CODEX_IDENTITY_DIR, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-VKSXST23.js';
1
+ export { AGENT_RENDERERS, CODEX_IDENTITY_DIR, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-AVCUPPG6.js';
2
2
  import '../chunk-FRHE7FFB.js';
3
- import '../chunk-TZCQ7ZWQ.js';
3
+ import '../chunk-OOLT6HGP.js';
4
4
  import '../chunk-4GY63JU6.js';
5
- import '../chunk-BF33SCLY.js';
6
- import '../chunk-46OVMT76.js';
5
+ import '../chunk-SWO25LTO.js';
6
+ import '../chunk-G67BOI2J.js';
7
7
  import '../chunk-5BEFNLOR.js';
8
8
  import '../chunk-A2ULN3KX.js';
9
- import '../chunk-2W4LBLIN.js';
10
- import '../chunk-MFHKHXDE.js';
9
+ import '../chunk-LCU5U5IW.js';
10
+ import '../chunk-L5VSIPQD.js';
11
11
  import '../chunk-CPSIPIX7.js';
12
- import '../chunk-7ZHLYXTI.js';
12
+ import '../chunk-RVIZQ5XD.js';
13
13
  import '../chunk-RVRB27AN.js';
14
- import '../chunk-PA7WLID3.js';
15
- import '../chunk-AO7VJ6G6.js';
14
+ import '../chunk-TTPSDC2G.js';
15
+ import '../chunk-O7VPNKYN.js';
16
16
  import '../chunk-ICSCSM5D.js';
17
17
  import '../chunk-JMKB7IB4.js';
18
18
  import '../chunk-MJHSLODD.js';
@@ -136,7 +136,7 @@ export type { HistoryEntry } from "./history.js";
136
136
  export { appendHistory, clearHistory, getRecentHistory, loadHistory, } from "./history.js";
137
137
  export type { DeployOptions, ScaffoldOptions } from "./installer.js";
138
138
  export type { DeployableEntry } from "./installer.js";
139
- export { createScaffold, deployAll, installTargetOf, removeAsset } from "./installer.js";
139
+ export { createScaffold, deployAll, installTargetOf, removeAsset, SCAFFOLD_KINDS, } from "./installer.js";
140
140
  export type { RenderMcpConfigOptions, RenderMcpConfigResult, SkippedMcpServer, } from "./mcp-config.js";
141
141
  export { renderMcpServerConfig } from "./mcp-config.js";
142
142
  export type { Log } from "./renderers.js";
@@ -187,8 +187,22 @@ export interface InstallResult {
187
187
  deployed: string[];
188
188
  /** Asset refs (`kind:name`) removed because they are no longer in the resolved set. */
189
189
  removed: string[];
190
- /** Asset refs that could not be resolved in any configured repository. */
190
+ /**
191
+ * Asset refs that could not be resolved in any configured repository. On the
192
+ * non-locked path every entry is a bare ref; the reason a miss happened lives in
193
+ * {@link InstallResult.missingHints}. The `--locked` path still appends its prose
194
+ * (`ref (not found in library "x")`) to the entry.
195
+ */
191
196
  missing: string[];
197
+ /**
198
+ * Why a ref in {@link InstallResult.missing} may have missed, keyed by that ref:
199
+ * the asset's publisher changed (`library set publisher=`), so the lock still holds
200
+ * it under the old one and/or a library now holds it under another. Parenthesised
201
+ * parts such as `did you mean skill:@acme/x?` and
202
+ * `locked as skill:@plain/x; run skaile install to re-resolve`. Only refs with a
203
+ * hint appear; absent when none has.
204
+ */
205
+ missingHints?: Record<string, string>;
192
206
  /** Whether `skaile.lock.yaml` was written or updated. */
193
207
  lockWritten: boolean;
194
208
  /**
@@ -247,6 +261,12 @@ export interface OutdatedEntry {
247
261
  * has no `latestVersion`.
248
262
  */
249
263
  problem?: string;
264
+ /**
265
+ * Library-origin asset only: the library's files on disk differ from the content
266
+ * hash recorded in the lock at the same version (edited in place, no version bump).
267
+ * `skaile update` re-deploys them.
268
+ */
269
+ contentChanged?: boolean;
250
270
  }
251
271
  /**
252
272
  * Outcome of `AssetManager.diff()` — distinguishes an unknown ref from a real
@@ -296,6 +316,11 @@ export interface DepIssue {
296
316
  depName: string;
297
317
  /** `true` when the missing dependency exists in a configured repository but has not been installed. */
298
318
  inRepos: boolean;
319
+ /**
320
+ * `true` when the asset itself is lock-managed but no source or library holds it
321
+ * any more, so its `requires` cannot be checked. `depKind`/`depName` repeat the asset.
322
+ */
323
+ unresolved?: boolean;
299
324
  }
300
325
  /**
301
326
  * A single deployed asset shown in the workspace overview.
@@ -456,6 +481,8 @@ export declare class AssetManager {
456
481
  private readonly indexPathOverride?;
457
482
  /** Sink for cross-library collision warnings; else `console.warn`. */
458
483
  private readonly onLibraryCollision?;
484
+ /** Store URLs whose failed version lookup was already reported (one warning per URL). */
485
+ private readonly warnedStoreVersionLookups;
459
486
  constructor(opts: AssetManagerOptions);
460
487
  /** Registered kind names — the `knownKinds` argument of the manifest scanners. */
461
488
  private get knownKinds();
@@ -536,10 +563,26 @@ export declare class AssetManager {
536
563
  * content. The returned `libraryOf` map names the library each entry came from
537
564
  * so callers can lock it as library-origin (see {@link libraryLockEntries}).
538
565
  *
566
+ * @param opts.quiet - Skip the cross-library collision warning (a lookup that only
567
+ * builds an error hint must not warn).
539
568
  * @returns the matched deploy entries, the set of `missing` refs covered, and
540
569
  * each entry's originating library name.
541
570
  */
542
571
  private resolveLibraryEntries;
572
+ /**
573
+ * Explain misses caused by a publisher change, for every missed publisher-qualified
574
+ * ref at once (one library scan, one lock read). Per ref:
575
+ * - `did you mean <ref>?` when a registered library holds the same kind + name
576
+ * under another publisher;
577
+ * - `locked as <lockRef>; run skaile install to re-resolve` when the lock holds the
578
+ * same kind + name under another publisher, records the library it came from, and
579
+ * that library now holds the asset under yet another publisher than the locked
580
+ * one. An unrelated asset that merely shares kind + name does not qualify.
581
+ *
582
+ * @param refs - Missed refs; a trailing `(reason)` after the first space is ignored.
583
+ * @returns hint text per ref, only for refs that have one. Never warns.
584
+ */
585
+ private publisherChangeHints;
543
586
  /** Collision messages already printed by this instance (one warning per ref + library set). */
544
587
  private readonly warnedLibraryCollisions;
545
588
  /**
@@ -555,10 +598,12 @@ export declare class AssetManager {
555
598
  private loadLibraryIndex;
556
599
  /**
557
600
  * Library-origin lock entries for the assets {@link resolveLibraryEntries}
558
- * matched. The locked version comes from the library index when it knows the
559
- * asset (its manifest-declared version is authoritative), else from the
560
- * on-disk asset. The hash is computed from the files on disk, so it matches
561
- * what `install --locked` re-hashes.
601
+ * matched. The locked version is the one actually deployed: the on-disk
602
+ * entry's version, falling back to the library index only when the disk entry
603
+ * carries none — the index lags until the next `skaile library index`, so
604
+ * preferring it would lock a stale version after an in-place bump. The hash is
605
+ * computed from the files on disk, so it matches what `install --locked`
606
+ * re-hashes.
562
607
  */
563
608
  private libraryLockEntries;
564
609
  /**
@@ -584,6 +629,26 @@ export declare class AssetManager {
584
629
  * (offline, store down) keeps the first pass's result rather than regressing.
585
630
  */
586
631
  private resolveWithStores;
632
+ /**
633
+ * Resolve `deps` library-first, then walk the dependencies of every library
634
+ * asset it picks.
635
+ *
636
+ * A publisher-qualified ref that no project source declares is looked up in the
637
+ * registered **libraries** before any store is asked, so a locally authored
638
+ * asset resolves (and deploys) with the store unreachable and without a
639
+ * version-discovery round trip. Only refs the libraries did not satisfy go to
640
+ * {@link resolveWithStores}; its misses get one more library try (a ref a source
641
+ * knows only under another version). A `#version` pin still selects through
642
+ * `matchPin` inside {@link resolveLibraryEntries}.
643
+ *
644
+ * Library assets declare `dependencies` / `requires`. Those are fed back through
645
+ * the same resolution with a `seen` identity set (mirrors `resolveAll`), so deps
646
+ * deploy, get lock entries, and a dependency cycle terminates.
647
+ *
648
+ * @returns source/store candidates, still-unresolved refs, applied overrides,
649
+ * expanded presets, and the library leg (entries + originating library per entry).
650
+ */
651
+ private resolveLibraryFirst;
587
652
  /** The catalog fetcher to use: an injected one, else built from `stores`. */
588
653
  private storeFetcherFor;
589
654
  /**
@@ -816,7 +881,11 @@ export declare class AssetManager {
816
881
  */
817
882
  private presentRefs;
818
883
  /**
819
- * Remove a deployed asset and unregister it from `skaile.yaml`.
884
+ * Remove a deployed asset and unregister it from `skaile.yaml` and the lock.
885
+ *
886
+ * A declared asset is always unregistered, even when nothing is deployed any
887
+ * more (e.g. its library file was deleted): the declaration and lock entry
888
+ * would otherwise be stuck behind a "not deployed" refusal.
820
889
  *
821
890
  * Deliberately does NOT re-render the driver target's MCP config: the render
822
891
  * step is async (the declaration resolver is), and making this synchronous
@@ -825,15 +894,18 @@ export declare class AssetManager {
825
894
  * {@link renderMcpServerConfig}.
826
895
  *
827
896
  * @param ref - Asset ref in `kind:name` form (e.g. `skill:my-skill`).
828
- * @returns `true` if the asset was found and removed, `false` if it was not deployed.
829
- * A `preset:` ref has no deployed files: it is found when declared in `skaile.yaml`, and
830
- * only its declaration goes — its expanded items leave with the next `skaile install`.
897
+ * @returns `true` if anything changed (files undeployed, declaration or lock
898
+ * entry removed), `false` if the asset was neither deployed nor declared.
899
+ * A `preset:` ref has no deployed files: only its declaration goes — its
900
+ * expanded items leave with the next `skaile install`.
831
901
  */
832
902
  remove(ref: string): boolean;
833
903
  /**
834
904
  * Drop every lock entry matching a removed asset's identity, version-agnostic so
835
905
  * a content-sha pseudo-version key is pruned too. Symmetric with {@link add}'s
836
906
  * lock-merge — stops a stale entry reporting a phantom "removed" on next install.
907
+ *
908
+ * @returns `true` when at least one lock entry was dropped.
837
909
  */
838
910
  private pruneLockEntry;
839
911
  /**
@@ -971,10 +1043,13 @@ export declare class AssetManager {
971
1043
  *
972
1044
  * Two kinds of staleness are reported:
973
1045
  * - **Source assets** — only remote repositories (not local paths) are checked;
974
- * `behind` is the number of commits the local clone is missing.
975
- * - **Library assets** — a library-origin lock entry whose library index now
976
- * offers a newer version than the locked one; `behind` is 0, `latestVersion`
977
- * and `library` are set. A library not indexed (or removed) is not reported.
1046
+ * `behind` counts the commits the clone is missing from the remote plus the
1047
+ * commits the clone moved past the locked commit (`source sync` after `add`).
1048
+ * - **Library assets** — a library-origin lock entry whose library files on disk
1049
+ * (not the index, which lags until `skaile library index`) hold a newer version
1050
+ * than the locked one (`latestVersion`, `library` set), or the same version with
1051
+ * different bytes (`contentChanged`). `behind` is 0. An unregistered library is a
1052
+ * `problem` row.
978
1053
  *
979
1054
  * @returns Array of {@link OutdatedEntry} objects.
980
1055
  */
@@ -1046,7 +1121,13 @@ export declare class AssetManager {
1046
1121
  *
1047
1122
  * For each deployed asset, checks that all entries in its `requires` list are
1048
1123
  * also deployed. Returns a list of issues with a flag indicating whether the
1049
- * missing dependency can be resolved from a configured repository.
1124
+ * missing dependency can be resolved from a configured repository or library.
1125
+ *
1126
+ * A deployed asset is looked up by its publisher-qualified identity taken from
1127
+ * the lock key (`kind:@pub/name`), so library and source assets resolve alike.
1128
+ * A lock-managed asset that no source or library can be found for is reported
1129
+ * as an issue with `unresolved: true` (its `requires` cannot be verified);
1130
+ * unmanaged deployed files carry no declared origin and are skipped.
1050
1131
  *
1051
1132
  * @returns Array of {@link DepIssue} objects. An empty array means the workspace is healthy.
1052
1133
  */
@@ -1059,7 +1140,7 @@ export declare class AssetManager {
1059
1140
  * @param destDir - Parent directory to create the asset in.
1060
1141
  * @param opts - Optional scaffold content (`description`).
1061
1142
  * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the
1062
- * directory already exists.
1143
+ * directory already exists or `kind` has no scaffold template.
1063
1144
  */
1064
1145
  create(name: string, kind: string, destDir: string, opts?: ScaffoldOptions): {
1065
1146
  ok: boolean;
@@ -1117,9 +1198,18 @@ export declare class AssetManager {
1117
1198
  * parent dir) when absent so `skaile add --global` works on a fresh machine.
1118
1199
  */
1119
1200
  private addDependencyToConfig;
1201
+ /**
1202
+ * Whether the declared `dep` names the same asset (kind, publisher, name) as
1203
+ * `ref`, ignoring the version pin. A publisher must agree on both sides —
1204
+ * unlike {@link removeDependencyFromConfig}, a bare `kind:name` never replaces a
1205
+ * publisher-qualified line. Unparseable entries only match on string equality.
1206
+ */
1207
+ private sameDeclaredAsset;
1120
1208
  /**
1121
1209
  * Remove a dependency ref from the manifest `dependencies:`. Targets the same
1122
1210
  * file as {@link addDependencyToConfig} (`~/.skaile/skaile.yaml` in global mode).
1211
+ *
1212
+ * @returns `true` when a declaration was removed.
1123
1213
  */
1124
1214
  private removeDependencyFromConfig;
1125
1215
  private resolveRepoDir;