@skaile/workspaces 5.9.0 → 5.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/README.md +12 -0
  3. package/dist/{asset-feeds-XMKKUUK6.js → asset-feeds-CXGQIDFR.js} +19 -19
  4. package/dist/{asset-feeds-XMKKUUK6.js.map → asset-feeds-CXGQIDFR.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +8 -8
  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 +400 -35
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/asset-manager/src/install-agent.d.ts +3 -1
  12. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  13. package/dist/asset-manager/src/install-instances.d.ts +31 -1
  14. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  15. package/dist/asset-manager/src/installer.d.ts +43 -3
  16. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  17. package/dist/asset-manager/src/renderers.d.ts +4 -5
  18. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  19. package/dist/bridge/drivers/claude-sdk.js +11 -11
  20. package/dist/bridge/drivers/codex.js +11 -11
  21. package/dist/bridge/drivers/continue.js +10 -10
  22. package/dist/bridge/drivers/echo.js +2 -2
  23. package/dist/bridge/drivers/gemini.js +7 -7
  24. package/dist/bridge/drivers/goose.js +10 -10
  25. package/dist/bridge/drivers/omp.js +19 -3
  26. package/dist/bridge/drivers/omp.js.map +1 -1
  27. package/dist/bridge/drivers/opencode.js +10 -10
  28. package/dist/bridge/drivers/qwen.js +7 -7
  29. package/dist/bridge/index.js +12 -12
  30. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  31. package/dist/{chunk-4MQS7CAF.js → chunk-2F5AWQX5.js} +437 -175
  32. package/dist/chunk-2F5AWQX5.js.map +1 -0
  33. package/dist/{chunk-UM7RIAHO.js → chunk-3SM2DL2T.js} +8 -8
  34. package/dist/{chunk-UM7RIAHO.js.map → chunk-3SM2DL2T.js.map} +1 -1
  35. package/dist/{chunk-5NNNV76P.js → chunk-47U4GZ4M.js} +2 -2
  36. package/dist/{chunk-5NNNV76P.js.map → chunk-47U4GZ4M.js.map} +1 -1
  37. package/dist/{chunk-TTRYE6AC.js → chunk-4A4OD24G.js} +9 -9
  38. package/dist/{chunk-TTRYE6AC.js.map → chunk-4A4OD24G.js.map} +1 -1
  39. package/dist/{chunk-ZTBAYUDY.js → chunk-6O2X3GPW.js} +2 -2
  40. package/dist/{chunk-ZTBAYUDY.js.map → chunk-6O2X3GPW.js.map} +1 -1
  41. package/dist/{chunk-JAKOMFC6.js → chunk-ALEYHUC5.js} +114 -46
  42. package/dist/chunk-ALEYHUC5.js.map +1 -0
  43. package/dist/{chunk-QVNRCDTV.js → chunk-BNMZVPYA.js} +7 -7
  44. package/dist/chunk-BNMZVPYA.js.map +1 -0
  45. package/dist/{chunk-2FRUUDZY.js → chunk-CAHB6MHA.js} +5 -5
  46. package/dist/{chunk-2FRUUDZY.js.map → chunk-CAHB6MHA.js.map} +1 -1
  47. package/dist/{chunk-GKMZ6THE.js → chunk-CJERAGFY.js} +44 -33
  48. package/dist/chunk-CJERAGFY.js.map +1 -0
  49. package/dist/{chunk-CKQEIY43.js → chunk-COH6FQAG.js} +4 -4
  50. package/dist/{chunk-CKQEIY43.js.map → chunk-COH6FQAG.js.map} +1 -1
  51. package/dist/{chunk-UO7WPLDY.js → chunk-CPWLNZGJ.js} +3 -3
  52. package/dist/{chunk-UO7WPLDY.js.map → chunk-CPWLNZGJ.js.map} +1 -1
  53. package/dist/{chunk-MGGFBZWA.js → chunk-D3B36CYC.js} +4 -3
  54. package/dist/chunk-D3B36CYC.js.map +1 -0
  55. package/dist/{chunk-UMVKJM4Q.js → chunk-DALV4HHP.js} +18 -3
  56. package/dist/chunk-DALV4HHP.js.map +1 -0
  57. package/dist/{chunk-IMKSM5NL.js → chunk-DZMNFCWB.js} +1447 -199
  58. package/dist/chunk-DZMNFCWB.js.map +1 -0
  59. package/dist/{chunk-GB7WDMH2.js → chunk-EDYHEMJA.js} +4 -4
  60. package/dist/{chunk-GB7WDMH2.js.map → chunk-EDYHEMJA.js.map} +1 -1
  61. package/dist/{chunk-YSHVQGUS.js → chunk-FH7W6TJ4.js} +164 -41
  62. package/dist/chunk-FH7W6TJ4.js.map +1 -0
  63. package/dist/{chunk-W5DWWE4Y.js → chunk-G4FFOV3N.js} +4 -4
  64. package/dist/{chunk-W5DWWE4Y.js.map → chunk-G4FFOV3N.js.map} +1 -1
  65. package/dist/{chunk-2LWYNQK7.js → chunk-GCHPUTA3.js} +3 -3
  66. package/dist/{chunk-2LWYNQK7.js.map → chunk-GCHPUTA3.js.map} +1 -1
  67. package/dist/{chunk-JZ5EHBPI.js → chunk-GV4DZ6MT.js} +20 -4
  68. package/dist/chunk-GV4DZ6MT.js.map +1 -0
  69. package/dist/{chunk-S53LOR7B.js → chunk-HCEVNYSH.js} +3 -3
  70. package/dist/{chunk-S53LOR7B.js.map → chunk-HCEVNYSH.js.map} +1 -1
  71. package/dist/{chunk-EF7NPDDU.js → chunk-HZXUXHIV.js} +31 -17
  72. package/dist/chunk-HZXUXHIV.js.map +1 -0
  73. package/dist/{chunk-IR33D6EP.js → chunk-IER3KIPH.js} +5 -5
  74. package/dist/{chunk-IR33D6EP.js.map → chunk-IER3KIPH.js.map} +1 -1
  75. package/dist/{chunk-Y7QA2OLD.js → chunk-J4RBUFGM.js} +22 -20
  76. package/dist/chunk-J4RBUFGM.js.map +1 -0
  77. package/dist/{chunk-J7U3PIOE.js → chunk-M3B6EIJD.js} +4 -4
  78. package/dist/{chunk-J7U3PIOE.js.map → chunk-M3B6EIJD.js.map} +1 -1
  79. package/dist/{chunk-DNZYOKOJ.js → chunk-MZG34MBZ.js} +3 -3
  80. package/dist/{chunk-DNZYOKOJ.js.map → chunk-MZG34MBZ.js.map} +1 -1
  81. package/dist/{chunk-V2DXZYBB.js → chunk-NWDSLXOX.js} +3 -3
  82. package/dist/{chunk-V2DXZYBB.js.map → chunk-NWDSLXOX.js.map} +1 -1
  83. package/dist/{chunk-36AFURKZ.js → chunk-PBBPZYVG.js} +61 -12
  84. package/dist/chunk-PBBPZYVG.js.map +1 -0
  85. package/dist/{chunk-P67WJVP4.js → chunk-PQFHMQHQ.js} +10 -9
  86. package/dist/chunk-PQFHMQHQ.js.map +1 -0
  87. package/dist/{chunk-UAROCOXF.js → chunk-QVFAS5IO.js} +3 -3
  88. package/dist/{chunk-UAROCOXF.js.map → chunk-QVFAS5IO.js.map} +1 -1
  89. package/dist/{chunk-K3CVFRVS.js → chunk-QZNJOHN6.js} +3 -3
  90. package/dist/{chunk-K3CVFRVS.js.map → chunk-QZNJOHN6.js.map} +1 -1
  91. package/dist/{chunk-FVJK4QWM.js → chunk-R7NHYEJF.js} +4 -4
  92. package/dist/{chunk-FVJK4QWM.js.map → chunk-R7NHYEJF.js.map} +1 -1
  93. package/dist/{chunk-GXLQLPE5.js → chunk-RYYLMBA2.js} +5 -5
  94. package/dist/{chunk-GXLQLPE5.js.map → chunk-RYYLMBA2.js.map} +1 -1
  95. package/dist/{chunk-Y4N2NUZD.js → chunk-S3O3GKB7.js} +4 -4
  96. package/dist/{chunk-Y4N2NUZD.js.map → chunk-S3O3GKB7.js.map} +1 -1
  97. package/dist/{chunk-GTILM2CI.js → chunk-SBSA3IQA.js} +43 -12
  98. package/dist/chunk-SBSA3IQA.js.map +1 -0
  99. package/dist/{chunk-4PTSR4UU.js → chunk-T42WRQ4O.js} +3 -3
  100. package/dist/{chunk-4PTSR4UU.js.map → chunk-T42WRQ4O.js.map} +1 -1
  101. package/dist/{chunk-MR5HBOUF.js → chunk-T7CTHHG7.js} +3 -3
  102. package/dist/{chunk-MR5HBOUF.js.map → chunk-T7CTHHG7.js.map} +1 -1
  103. package/dist/{chunk-FZNG4V4J.js → chunk-TCHRMVTO.js} +4 -4
  104. package/dist/{chunk-FZNG4V4J.js.map → chunk-TCHRMVTO.js.map} +1 -1
  105. package/dist/{chunk-LAMCXQGA.js → chunk-VLTQGE2E.js} +75 -25
  106. package/dist/chunk-VLTQGE2E.js.map +1 -0
  107. package/dist/{chunk-7AI3Q5AQ.js → chunk-WSBKB4CJ.js} +71 -24
  108. package/dist/chunk-WSBKB4CJ.js.map +1 -0
  109. package/dist/{chunk-CGT45WN7.js → chunk-X77SUM4P.js} +3 -3
  110. package/dist/{chunk-CGT45WN7.js.map → chunk-X77SUM4P.js.map} +1 -1
  111. package/dist/{chunk-SCOT677Q.js → chunk-XDKH7XSA.js} +5 -5
  112. package/dist/{chunk-SCOT677Q.js.map → chunk-XDKH7XSA.js.map} +1 -1
  113. package/dist/{chunk-QVEKLSEH.js → chunk-XUSALIEI.js} +6 -6
  114. package/dist/{chunk-QVEKLSEH.js.map → chunk-XUSALIEI.js.map} +1 -1
  115. package/dist/{chunk-FYXZRVID.js → chunk-Y3HTGHJC.js} +3 -3
  116. package/dist/{chunk-FYXZRVID.js.map → chunk-Y3HTGHJC.js.map} +1 -1
  117. package/dist/chunk-YOH2L76X.js +505 -0
  118. package/dist/chunk-YOH2L76X.js.map +1 -0
  119. package/dist/{chunk-B6GIW55K.js → chunk-ZCAJZ4B2.js} +7 -4
  120. package/dist/chunk-ZCAJZ4B2.js.map +1 -0
  121. package/dist/{chunk-BTE2V4IW.js → chunk-ZPWTOUTK.js} +76 -7
  122. package/dist/{chunk-BTE2V4IW.js.map → chunk-ZPWTOUTK.js.map} +1 -1
  123. package/dist/cli/index.js +1034 -794
  124. package/dist/cli/index.js.map +1 -1
  125. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  126. package/dist/cli/src/commands/catalog.d.ts +8 -5
  127. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  128. package/dist/cli/src/commands/diff.d.ts +4 -2
  129. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  130. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  131. package/dist/cli/src/commands/library-index.d.ts +34 -2
  132. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  133. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  134. package/dist/cli/src/commands/manage.d.ts +12 -5
  135. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  136. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  137. package/dist/cli/src/commands/outdated.d.ts +7 -5
  138. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  139. package/dist/cli/src/commands/project.d.ts +13 -8
  140. package/dist/cli/src/commands/project.d.ts.map +1 -1
  141. package/dist/cli/src/commands/run.d.ts.map +1 -1
  142. package/dist/cli/src/commands/source.d.ts +30 -1
  143. package/dist/cli/src/commands/source.d.ts.map +1 -1
  144. package/dist/cli/src/commands/update.d.ts.map +1 -1
  145. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  146. package/dist/cli/src/commands/why.d.ts +1 -0
  147. package/dist/cli/src/commands/why.d.ts.map +1 -1
  148. package/dist/cli/src/helpers.d.ts +12 -0
  149. package/dist/cli/src/helpers.d.ts.map +1 -1
  150. package/dist/cli/src/skill-checks.d.ts +57 -4
  151. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  152. package/dist/connectors/config.js +5 -5
  153. package/dist/connectors/index.js +16 -16
  154. package/dist/{connectors-C7UQ73BK.js → connectors-4QWAKPHB.js} +19 -19
  155. package/dist/{connectors-C7UQ73BK.js.map → connectors-4QWAKPHB.js.map} +1 -1
  156. package/dist/core/index.js +7 -7
  157. package/dist/core/logging.js +1 -1
  158. package/dist/core/manifest.js +2 -2
  159. package/dist/core/models.js +1 -1
  160. package/dist/core/publish-manifest.js +2 -2
  161. package/dist/core/ref.js +1 -1
  162. package/dist/core/runtime-assets.js +5 -5
  163. package/dist/core/src/index.d.ts +2 -1
  164. package/dist/core/src/index.d.ts.map +1 -1
  165. package/dist/core/src/lock.d.ts +6 -2
  166. package/dist/core/src/lock.d.ts.map +1 -1
  167. package/dist/core/src/logging/sinks/sqlite-runtime.d.ts.map +1 -1
  168. package/dist/core/src/manifest.d.ts.map +1 -1
  169. package/dist/core/src/models.d.ts +22 -6
  170. package/dist/core/src/models.d.ts.map +1 -1
  171. package/dist/core/src/publish-manifest.d.ts +29 -3
  172. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  173. package/dist/core/src/repo-manager.d.ts.map +1 -1
  174. package/dist/core/src/requirements.d.ts +26 -0
  175. package/dist/core/src/requirements.d.ts.map +1 -0
  176. package/dist/core/src/walker.d.ts.map +1 -1
  177. package/dist/core/src/workspace-config.d.ts +22 -1
  178. package/dist/core/src/workspace-config.d.ts.map +1 -1
  179. package/dist/core/src/workspace-yaml-editor.d.ts +4 -1
  180. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  181. package/dist/core/workspace-config.js +4 -4
  182. package/dist/deploy/index.js +7 -7
  183. package/dist/discovery/index.js +5 -5
  184. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  185. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  186. package/dist/discovery/src/discover.d.ts.map +1 -1
  187. package/dist/discovery/src/source-config.d.ts.map +1 -1
  188. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  189. package/dist/{ensure-sources-SRC2DVR5.js → ensure-sources-2RONZKCU.js} +17 -17
  190. package/dist/{ensure-sources-SRC2DVR5.js.map → ensure-sources-2RONZKCU.js.map} +1 -1
  191. package/dist/factory-assets/connectors/box.js +16 -16
  192. package/dist/factory-assets/connectors/deploy.js +16 -16
  193. package/dist/factory-assets/connectors/devserver.js +16 -16
  194. package/dist/factory-assets/connectors/flow/adapter.js +16 -16
  195. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
  196. package/dist/factory-assets/connectors/flow/contract.js +1 -1
  197. package/dist/factory-assets/connectors/flow/engine.js +9 -9
  198. package/dist/factory-assets/connectors/flow/run-flow.js +18 -18
  199. package/dist/factory-assets/connectors/flow.js +16 -16
  200. package/dist/factory-assets/connectors/git.js +16 -16
  201. package/dist/factory-assets/connectors/gmail.js +16 -16
  202. package/dist/factory-assets/connectors/googledrive.js +16 -16
  203. package/dist/factory-assets/connectors/local.js +16 -16
  204. package/dist/factory-assets/connectors/mattermost.js +16 -16
  205. package/dist/factory-assets/connectors/memory.js +16 -16
  206. package/dist/factory-assets/connectors/minio.js +16 -16
  207. package/dist/factory-assets/connectors/postgres.js +16 -16
  208. package/dist/factory-assets/connectors/s3.js +16 -16
  209. package/dist/factory-assets/connectors/sharepoint.js +16 -16
  210. package/dist/factory-assets/connectors/sqlite.js +16 -16
  211. package/dist/factory-assets/connectors/static-server.js +16 -16
  212. package/dist/factory-assets/connectors/tunnel.js +16 -16
  213. package/dist/factory-assets/connectors/webdav.js +16 -16
  214. package/dist/factory-assets/connectors/xstate-store.js +16 -16
  215. package/dist/factory-assets/connectors/xstate.js +16 -16
  216. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +9 -3
  217. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +4 -2
  218. package/dist/{flows-CBYRSAGS.js → flows-EQF2CH4U.js} +12 -12
  219. package/dist/{flows-CBYRSAGS.js.map → flows-EQF2CH4U.js.map} +1 -1
  220. package/dist/{helpers-XAEKCZKT.js → helpers-CFK6YP6R.js} +17 -17
  221. package/dist/{helpers-XAEKCZKT.js.map → helpers-CFK6YP6R.js.map} +1 -1
  222. package/dist/library/index.js +11 -11
  223. package/dist/library/install.js +3 -3
  224. package/dist/library/src/index.d.ts +2 -1
  225. package/dist/library/src/index.d.ts.map +1 -1
  226. package/dist/library/src/local/library-dir.d.ts +68 -0
  227. package/dist/library/src/local/library-dir.d.ts.map +1 -0
  228. package/dist/library/src/local/library-manager.d.ts +10 -1
  229. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  230. package/dist/library/src/local/library.d.ts +2 -2
  231. package/dist/library/src/local/library.d.ts.map +1 -1
  232. package/dist/library/src/local/local-catalog-source.d.ts +9 -0
  233. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  234. package/dist/library/src/manifest-writer.d.ts +55 -4
  235. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  236. package/dist/library/src/remote/cache.d.ts +18 -1
  237. package/dist/library/src/remote/cache.d.ts.map +1 -1
  238. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  239. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  240. package/dist/library/src/sync/git-driver.d.ts +7 -6
  241. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  242. package/dist/{library-publish-VJSWMOLH.js → library-publish-53UTB3MB.js} +151 -42
  243. package/dist/library-publish-53UTB3MB.js.map +1 -0
  244. package/dist/open-library-BOSPJVID.js +40 -0
  245. package/dist/{open-library-DB2PNL2X.js.map → open-library-BOSPJVID.js.map} +1 -1
  246. package/dist/open-registry-4FI7HKET.js +32 -0
  247. package/dist/{open-registry-ZUZJ7MS7.js.map → open-registry-4FI7HKET.js.map} +1 -1
  248. package/dist/paths-SUS4S4YT.js +22 -0
  249. package/dist/{paths-FQ64OLJG.js.map → paths-SUS4S4YT.js.map} +1 -1
  250. package/dist/{plugin-store-MPAMD5OT.js → plugin-store-AGQDMING.js} +9 -9
  251. package/dist/{plugin-store-MPAMD5OT.js.map → plugin-store-AGQDMING.js.map} +1 -1
  252. package/dist/project-I55A4O2T.js +41 -0
  253. package/dist/{project-I6NX3NFB.js.map → project-I55A4O2T.js.map} +1 -1
  254. package/dist/resolver/index.js +8 -8
  255. package/dist/runner/index.js +30 -30
  256. package/dist/runner/src/agent.d.ts.map +1 -1
  257. package/dist/runner/src/serve.d.ts.map +1 -1
  258. package/dist/runner/src/usage-limit-turn-hold.d.ts +51 -0
  259. package/dist/runner/src/usage-limit-turn-hold.d.ts.map +1 -0
  260. package/dist/sdk/asset-manager.js +14 -14
  261. package/dist/sdk/bridge.js +12 -12
  262. package/dist/sdk/core.js +7 -7
  263. package/dist/sdk/flow.js +9 -9
  264. package/dist/sdk/index.js +30 -30
  265. package/dist/sdk/resolver.js +8 -8
  266. package/dist/sdk/runner.js +30 -30
  267. package/dist/{setup-B7JUHYJW.js → setup-7DQJKHUI.js} +22 -22
  268. package/dist/{setup-B7JUHYJW.js.map → setup-7DQJKHUI.js.map} +1 -1
  269. package/dist/{skills-TVO26Y4V.js → skills-NUEN5NDX.js} +13 -13
  270. package/dist/{skills-TVO26Y4V.js.map → skills-NUEN5NDX.js.map} +1 -1
  271. package/dist/source-G2LV5LVD.js +41 -0
  272. package/dist/{source-PJBMDCKX.js.map → source-G2LV5LVD.js.map} +1 -1
  273. package/dist/{source-manifest-publish-LLJWXGID.js → source-manifest-publish-6RM7SWLZ.js} +24 -24
  274. package/dist/{source-manifest-publish-LLJWXGID.js.map → source-manifest-publish-6RM7SWLZ.js.map} +1 -1
  275. package/dist/tui/index.js +61 -41
  276. package/dist/tui/index.js.map +1 -1
  277. package/dist/tui/src/repl.d.ts.map +1 -1
  278. package/dist/types/manifests.js +1 -1
  279. package/dist/types/src/manifests/agent.d.ts +2 -0
  280. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  281. package/dist/types/src/manifests/contract.d.ts +2 -0
  282. package/dist/types/src/manifests/contract.d.ts.map +1 -1
  283. package/dist/types/src/manifests/index.d.ts +3 -3
  284. package/dist/types/src/manifests/index.d.ts.map +1 -1
  285. package/dist/types/src/manifests/preset.d.ts +1 -1
  286. package/dist/types/src/manifests/prompt.d.ts +2 -0
  287. package/dist/types/src/manifests/prompt.d.ts.map +1 -1
  288. package/dist/workspace-plugin/adapters/mcp.js +23 -23
  289. package/dist/workspace-plugin/adapters/omp.js +14 -14
  290. package/dist/workspace-plugin/index.js +2 -2
  291. package/package.json +1 -1
  292. package/dist/chunk-36AFURKZ.js.map +0 -1
  293. package/dist/chunk-4MQS7CAF.js.map +0 -1
  294. package/dist/chunk-7AI3Q5AQ.js.map +0 -1
  295. package/dist/chunk-B6GIW55K.js.map +0 -1
  296. package/dist/chunk-EF7NPDDU.js.map +0 -1
  297. package/dist/chunk-GKMZ6THE.js.map +0 -1
  298. package/dist/chunk-GTILM2CI.js.map +0 -1
  299. package/dist/chunk-IMKSM5NL.js.map +0 -1
  300. package/dist/chunk-JAKOMFC6.js.map +0 -1
  301. package/dist/chunk-JZ5EHBPI.js.map +0 -1
  302. package/dist/chunk-LAMCXQGA.js.map +0 -1
  303. package/dist/chunk-MGGFBZWA.js.map +0 -1
  304. package/dist/chunk-P67WJVP4.js.map +0 -1
  305. package/dist/chunk-QVNRCDTV.js.map +0 -1
  306. package/dist/chunk-UMVKJM4Q.js.map +0 -1
  307. package/dist/chunk-Y7QA2OLD.js.map +0 -1
  308. package/dist/chunk-YSHVQGUS.js.map +0 -1
  309. package/dist/chunk-ZAOGFXDO.js +0 -112
  310. package/dist/chunk-ZAOGFXDO.js.map +0 -1
  311. package/dist/library-publish-VJSWMOLH.js.map +0 -1
  312. package/dist/open-library-DB2PNL2X.js +0 -40
  313. package/dist/open-registry-ZUZJ7MS7.js +0 -32
  314. package/dist/paths-FQ64OLJG.js +0 -22
  315. package/dist/project-I6NX3NFB.js +0 -41
  316. package/dist/source-PJBMDCKX.js +0 -41
package/CHANGELOG.md CHANGED
@@ -1,5 +1,150 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `validate`, `library index` and `library publish --dry-run` now give one verdict for every asset kind.
8
+
9
+ - `library create flow` and `library create preset` write the `TODO: describe this <kind>.` description when `--description` is missing, as the other kinds do. An unedited flow or preset (the `TODO:` description, `nodes: []`, the example preset item) fails all three commands with exit 1. It was a warning before.
10
+ - A manifest `dependencies:` entry with an invalid publisher fails `publish --dry-run` with the same message as `validate` and `index`.
11
+ - A missing `version` reads as `0.1.0` for all six kinds, and an empty `metadata:` as no metadata. A version that is present but not a string says `set version: 0.1.0` (`set metadata.version: 0.1.0` for skill, prompt and contract) instead of raw schema text.
12
+ - An asset name over 64 characters fails `library create`, `validate`, `index` and `publish --dry-run` with the asset-name rule. `library create skill <300-char name>` no longer ends in `ENAMETOOLONG` with a stack trace. `isValidAssetName` applies the 64-character limit.
13
+ - `library publish --ref` and `library register --ref` exit 1 before the plan when the ref is not a valid git ref name, or is not a branch, tag or commit of the library repo.
14
+ - `references/dependency-standard.md` of the `authoring-skaile-manifests` skill says the asset file's own version wins.
15
+
16
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - A locked asset is now identified by kind, publisher, name and the library its lock entry names.
17
+
18
+ - `skaile remove skill:@acme/x` no longer deletes the deployed copy of `skill:@mortegro/x` when only the mortegro one was added. It prints `Not deployed or declared` and exits 1. The deployed copy, the lock and `skaile.yaml` stay as they are.
19
+ - `skaile install` keeps a locked library asset on the library its lock entry names, also after `library default <other>` or when another library holds the same ref. `skaile update` and `skaile add` still pick the library by the default rules, and a pin moves an asset to the library that holds it. A move prints `! <ref> moved from <a> to <b>`. `AssetManager.install` takes `moveLibraries` (set by `update`), `InstallResult` has `moved`, and `AssetManager.add` takes `onLibraryMoved`.
20
+ - A `#0.1.0` pin resolves for an `AGENT.md` agent that has no version in its frontmatter, in `skaile add agent:@acme/x#0.1.0` and in a `skaile.yaml` dependency. The pin matches the version in the library manifest, as the lock key does.
21
+
22
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - The lock changes only when an entry changes, and a hand-edited deployed copy is no longer invisible.
23
+
24
+ - `skaile.lock.yaml` is written in one canonical order (`schema_version` and `locked_at` first, then every key sorted). `add`, `install` and `update` write nothing when only the order or `locked_at` differs, so the first `install` after `add`, and a `library rename` matched by URL, leave a committed lock byte-identical and print no `Lock file written`.
25
+ - `skaile check`, `doctor` and `outdated` exit 1 when a deployed file was edited by hand or an asset folder holds a file the asset does not ship, including a file a harness or agent wrote there after deploy. `skaile install --locked`, `install` and `update` overwrite or remove it and print `Restored <file>` (or `Removed <file> (not part of <ref>)`). `diff` shows the edit and keeps exit 0.
26
+ - `.venv/`, `venv/`, `.pytest_cache/`, `.mypy_cache/`, `.ruff_cache/`, `.idea/`, `.vscode/`, `*.pyo`, `Thumbs.db`, `.env` and `.env.*` in an asset folder are neither deployed nor hashed, so running `pytest` in a library no longer makes the lock drift. The templates `.env.example`, `.env.sample`, `.env.template` and `.env.dist` stay part of the asset. `skaile add` warns once per other `.env` file it finds in an asset folder.
27
+
28
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - A `skaile.yaml` that does not parse (a duplicate key, bad YAML, a root that is not a mapping) now stops `install`, `update`, `check`, `doctor`, `outdated`, `diff`, `add` and `remove` with `skaile.yaml — parse error: <reason>` and exit 1, before anything is deployed, undeployed or locked. Before, `install` read the broken file as "nothing declared", deleted every deployed asset and emptied the lock. `resolveSkWorkspaceConfig` and `resolveGlobalSkWorkspaceConfig` throw that error instead of returning `{}`. Outside a project, `check`, `doctor`, `outdated`, `install`, `update` and `diff` exit 1 with `No skaile.yaml found. Run skaile init to create one.` and write nothing, as `add` does.
29
+
30
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `skaile run` and `skaile repl` end with the driver's error and exit 1 when the omp bridge does not start. Before, they ended on an unsettled top-level await with exit code 13 and no message (p137). `OmpDriver.start()` now rejects when omp exits before it is ready, and the CLI ends any command that has nothing left to wait for with one line and exit 1.
31
+
32
+ `skaile repl` no longer prints log records as raw JSON on stdout. They go to the project's log database; only warnings and errors print, on stderr (p47).
33
+
34
+ The README quick start and tutorial 01 name the optional SDK to install per driver: `@anthropic-ai/claude-agent-sdk` for `claude-sdk`, `@openai/codex-sdk` for `codex` (p138).
35
+
36
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - A command now ends with the verdict it printed.
37
+
38
+ - `skaile diff <ref>` of a locked asset whose library is not registered, or that has an unresolvable requirement, prints the state problem only and exits 1. It no longer prints `No differences.` first. A plain difference (edited copy, changed library files) still shows the diff and exits 0.
39
+ - `skaile update` ends with `Failed` and exit 1 (never `Done`) when a declared asset is missing, a source pull failed, an agent instance cannot be rendered or a library is not registered. `Nothing to update.` is no longer printed after a failure.
40
+ - `skaile add <ref>` of an asset whose requirement no registered library or source holds exits 1 with `<ref> requires <dep> (not found — register the library that holds it with skaile library init <name> --path <dir>, or remove the requirement from the asset's manifest) — nothing was added`. It was exit 0 with `was added without unresolved dependencies`, which left a project that `check`, `install` and `diff` all fail. `skaile.yaml`, the lock and the deployed files stay as they were. `AssetManager.add` throws instead of warning, so `skaile update <name>`, `skaile manage` and `skaile npx` fail the same way.
41
+
42
+ ### Patch Changes
43
+
44
+ - [#1054](https://github.com/skaile-ai/workspaces/pull/1054) [`87945dd`](https://github.com/skaile-ai/workspaces/commit/87945ddc111f3cdd5c2e354d387170ce2f6ca6a5) Thanks [@Frozen666](https://github.com/Frozen666)! - A flow turn refused by a Claude usage limit that no seat switch could clear no longer triggers an immediate re-prompt into the same limit. The runner holds the flow's automatic turns until something outside it asks for one (a chat message, the platform's continuation prompt, a wake, an approval or input) or the session moves to another seat.
45
+
46
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `skaile manage` ticks a library group only when the group's own rows are installed: with the same ref in two libraries, only the group that holds the installed copy gets the tick. `skaile diff preset:<ref>` of an installed preset says `preset has no files of its own` and exits 0, and `skaile why preset:<ref>` finds the preset in the lock instead of printing `not found in lock file`. `AssetManager.diff()` can return the new status `no-files`.
47
+
48
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `library rename` of a local library no longer breaks projects that lock it: the rename is recorded, and `install --locked`, `check` and `install` find the library under its new name. `library rename` and `library show` of a library whose folder is gone print the missing-directory line and exit 1, with no raw `ENOENT`. `library pull`, `sync` and `push` print `merge in progress; resolve the conflicts, then git commit` and exit 1 while a merge is unfinished, like they do for a rebase.
49
+
50
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - Every command now gives the fix text of the shared project state. For a declared ref that no library or source holds, `install`, `install --locked`, `update` and `why` print the `check` fix (`register the library ... or drop it with skaile remove`). They no longer say `run skaile install first` for a ref that `install` cannot resolve. `outdated` no longer advises `skaile install` for a requirement whose locked library is not registered; it names `library init` or `remove`. `run skaile add agent:... first` is printed only when a registered library holds the agent; otherwise the advice names `library init` or the binding to drop. `check`, `doctor` and `outdated` print the requiring asset as `kind:@publisher/name`. `LockGap.asset` of a `requires` gap now carries the publisher.
51
+
52
+ ## 5.10.0
53
+
54
+ ### Minor Changes
55
+
56
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - The shared per-asset checks now cover every kind, the manifest and the publish selection.
57
+
58
+ - A `SKILL.md` with only `name:` fails `validate`, `library index` and `library publish --dry-run` with the same message. `index` no longer adds a new, versionless asset that fails the checks to the manifest (p07).
59
+ - A `TODO:` description is an error for every kind, not only for skills. Before, an agent, prompt, contract, flow or preset with it only warned (p103).
60
+ - `validate versions` reads preset and contract versions (p109).
61
+ - `library publish --asset <ref>` exits 1 with `No asset matches "<ref>"` when the ref selects nothing. A `#version` pin that the asset file does not hold exits 1 (p106).
62
+ - The publish plan names a directory that repeats a kind and name the manifest already holds, and exits 1, as `index` does (p107).
63
+ - `library index` and `validate` warn about a manifest `dependencies:` entry that no registered library holds. The check is offline. The exit code stays 0 (p119).
64
+ - `skaile add` of a library asset that the manifest does not list exits 1 and names `skaile library index <lib>`, where it deployed `SKILL.md` without its helper files. After `library index`, `add` deploys every file (p127).
65
+ - Library API: `syncManifestWithDisk` reports `FailedAsset.inManifest`. New `scanUnlistedAssets` and `UnlistedAsset`.
66
+
67
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - `skaile check` and `skaile doctor` fail wherever `install --locked` fails (5.8.0 critique, second recheck). `AssetManager.projectState()` carries the new cases, so no command has its own copy.
68
+
69
+ - A library asset whose files changed since the lock fails `check` and `doctor` with `content changed since lock`, like `outdated` and `install --locked` (p125). A lock written by 4.x holds a hash from before the shared asset hash; it reads the same way and the line names `skaile install` to re-lock it (p118). A newer version in the library stays `outdated` news.
70
+ - A locked asset whose library and deployed copy are both gone names only the library fix. `install` and `update` say `its lock entry is kept; no deployed copy exists` instead of claiming a kept deployed copy (p64).
71
+ - `skaile doctor` exits 1 for every problem that makes `check` exit 1, including files missing from a deployed asset (p117).
72
+ - An `agents.<id>.ref` that binds to no agent is a project-state problem: `check` and `doctor` exit 1 (p124). `skaile remove agent:<ref>` also removes the `agents.<id>` bindings that point at it and the rendered agent file, so `validate` passes afterwards. `LockGap.type` gains `content` and `agent`.
73
+
74
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - Small fixes for the CLI library flow:
75
+
76
+ - `skaile run "<prompt>"` no longer prints internal log records (`building workspace MCP server`, `spawning omp`, capability-registry events) as raw JSON on stdout. They go to the project's log database (`.skaile/logs.db`); warnings and errors still print on stderr (p47).
77
+ - `library init` no longer tells you to pass `--publisher`, an option it does not have. It names `skaile library set <name> publisher=<name>`. `library create` and `asset import`, which have the flag, still advise it (p104).
78
+ - The `library create prompt` and `library create contract` scaffolds say `Prompt goes here.` and `Contract goes here.` instead of the skill wording. `validate` flags the new text and the old skill text as an untouched scaffold. New exports: `PROMPT_BODY_PLACEHOLDER`, `CONTRACT_BODY_PLACEHOLDER` (`@skaile/workspaces/types/manifests`) (p105).
79
+ - A library name longer than 64 characters is refused with one line before any directory is created (`✗ Invalid library name (300 characters): at most 64 characters.`). Before, it ended in a raw `ENAMETOOLONG` error (p113).
80
+ - `skaile add` in a directory with no `skaile.yaml` exits 1 and names `skaile init`. It writes nothing. Before, it deployed the asset and wrote a lock file that `list` ignored (p123).
81
+ - `skaile add` prints one `! skipped symlink <path>` line for each symlink inside an asset directory that it does not deploy (p132). Symlinks are still not deployed. `AssetManager.add()` gains an `onSkippedSymlink` option and `DeployOptions` gains `onSkippedSymlink`.
82
+
83
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - A registered library without its directory has one state everywhere (5.8.0 critique, second recheck).
84
+
85
+ - `library list`, `library show`, `library status`, `check`, `outdated`, `install`, `add` and the git verbs describe it with one line: `library "<name>" is registered but its directory <path> is missing - run skaile library init <name> --path <dir> or skaile library remove <name>`. New exports from `@skaile/workspaces/library`: `libraryDirMissing`, `missingLibraryDirMessage`, `LibraryManager.requireLibraryDir` (p115).
86
+ - `library push`, `pull`, `sync`, `commit`, `git`, `link` and `publish` exit 1 with that line instead of a JS `TypeError` or `spawnSync git ENOENT` (p114).
87
+ - `library index <name>` and `library create --library <name>` refuse the missing directory and create nothing. `search --local` no longer lists the assets of that library (p116).
88
+ - A library removed with `library remove` (without `--purge`) keeps its directory but no longer resolves for `add`, `install --locked` or flow discovery. `library remove` records its name in `.unregistered-libraries` in the libraries dir. A directory nobody registered still resolves as a hand-made library (p121).
89
+ - Plain `skaile install` fails like `install --locked` when the lock pins a library that is not registered here, or whose directory is gone: the same `Missing: ... library "<name>" is not registered` lines, exit 1, no clone, no lock write, deployed files kept. It no longer re-resolves the asset from a `sources:` repository or from another library that holds the same asset. The lookup lives in one place, `AssetManager.unavailableLockedLibraries`, so a later lock-recorded URL fallback extends it there (p128).
90
+
91
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - A `library:` lock entry of a git-backed library now records the library's remote as an optional `url:` field (credentials of an `https://user:token@…` URL are left out; a local library without a remote writes none). The library name in the lock is local to a machine, so a teammate who cloned the same remote under another name could not `install --locked`. When the locked name is not registered (or its directory is gone), `install --locked`, `install` and `check` now use the registered library whose remote is the same repository (`.git` suffix, trailing `/` and `git@host:o/r` against `https://host/o/r` do not matter), exit 0, deploy the locked files and leave the lock unchanged. With neither the name nor the remote registered, the `Missing:` line names the library and the remote and says `skaile library init <name> --git <url>`. The lock schema version is not bumped, a lock without `url:` resolves by name as before, and an older CLI ignores the key. `LockLibraryOrigin` gains `url?: string` (p122).
92
+
93
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - Store and factory assets deploy their `requires`, and `add`, `info` and `search` agree on one version (second 5.8.0 recheck).
94
+
95
+ - `skaile add skill:@skaile-ai/skailify` deploys `skailify` and every asset it requires. `check` and `install --locked` exit 0 afterwards, and `install` deploys a requirement that is missing instead of printing `Nothing to install` (p131).
96
+ - `add`, `info` and `search` show the same version for one ref. When the factory, a project source or a library hold it at different versions, all three name the origin they chose (p126).
97
+ - The "did you mean" hint of `add` with a ref that has no publisher lists only refs that resolve (p129).
98
+ - `search --local` lists one row per publisher for the same name, so `skill:@mortegro/speak-like-a-pirate` no longer hides behind `skill:@acme/speak-like-a-pirate` (p130).
99
+ - Library API: `LocalIndex.pruneAssetDefs` returns the ids of the removed rows (`string[]`), not the count. Use `.length` for the count. `LocalCatalogSource.sync()` also returns `pruned` and takes an optional `only` set. When a library re-publishes a ref under another publisher, `library index` restores the index row that another library still holds.
100
+
101
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - `update` and sources respect local state and report git and cache errors cleanly (p108, p110, p111, p112, p120).
102
+
103
+ - `skaile update <name>` updates only the declared asset the name matches (`kind:@publisher/name`, `kind:name` or `name`). A name that matches none exits 1 with `No declared asset matches "<name>".`, before any network work. Before, the name was ignored and an unknown one exited 0 (p110).
104
+ - `skaile update` never resets a source clone that holds commits the remote lacks. `pullRepoResult` refuses with `Not possible to fast-forward, aborting.`, the message `skaile source sync` gives, and the clone stays as it is. Before, the force-sync dropped the local commits (p111).
105
+ - A `sources:` item in `skaile.yaml` without a `url:` fails with one line that names it (`sources[0] has no url: "skill:@x/y" (write it as "- url: <git url>")`) in every command that reads sources. `source list` no longer ends in a `TypeError`. The new `parseSourceEntries()` and `SourceEntryError` are exported from `@skaile/workspaces/core`; `normalizeConfig()` and `WorkspaceYamlEditor.getSources()` throw it instead of skipping the item (p112).
106
+ - `skaile library pull` and `sync` print `uncommitted changes in <lib>; commit or stash them first` and exit 1 when local edits block the pull, not git's multi-line error (p108).
107
+ - The catalog cache is keyed by `catalog.url`: listings and cached misses ("not found") are stored under a hash of the URL. After the URL changes, results come only from the new URL, a ref the old catalog lacked is asked of the new one at once, and an unreachable URL prints `store unavailable` instead of the old catalog's results. Found assets and tarballs stay shared, so an air-gapped run still resolves what an online run cached. `CatalogCacheOptions` has a new optional `scope` (p120).
108
+
109
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Library authoring refuses the inputs it let through before (p13, p14, p74, p76, p85).
110
+
111
+ - One publisher slug decides everywhere: 1–39 lowercase letters, digits and single hyphens inside (the lowercase form of the ref parser's publisher grammar). `library create --publisher`, `library set <lib> publisher=`, `asset import --publisher`, `validate`, `library index` and the `library publish` plan now all refuse `a.b`, `Bad!`, `-x`, `x-`, `a--b`, `a_b` and a 40-character name with the same `Invalid publisher "…"` line, so a ref that `create` or `import` prints can always be added (p13). A store login is lowercased before it is used as the publisher.
112
+ - `library create --dir <d>` checks the real path of `<d>`: a symlink that leaves the library is refused and the message names the path it resolves to (p14). A file at `<d>` exits 1 with `… is not a directory`, no stack trace (p74).
113
+ - `library init <name> --path <dir>` refuses a directory inside a registered library, a directory that contains one, and the libraries folder (p85).
114
+ - Adopting a directory whose `skaile.manifest.yaml` lists only some of its assets prints `! <n> asset(s) on disk are not in the manifest; run library index` (p76).
115
+
116
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - One requirement identity from the 5.8.0 critique. A requirement is `publisher/kind:name` wherever it is declared: a bare `report-table` in a SKILL.md `requires` and `skill:@acme/report-table` in the manifest `dependencies` are one requirement, so `info`, `check`, `doctor` and `install --locked` list it once, publisher-qualified (p90, p99). A `dependencies:` entry whose publisher is not a valid slug (`skill:@Bad/x`) now fails `skaile validate` and `skaile library index` (p95). `skaile remove` with the library gone reads the deployed asset's `requires` and prunes the dependencies only it required (p95). An asset added from a project `sources:` clone deploys its `requires` like a library asset, so `check` and `install --locked` exit 0 afterwards and `install` no longer says "Nothing to install" while `check` calls a requirement fixable (p83).
117
+
118
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - `remove` guards dependencies, the lock stays quiet, `update` says "replaced", build leftovers leave the deploy and the hash (p88, p93, p92, p98).
119
+
120
+ - `skaile remove <ref>` of an asset another installed asset requires prints `! <ref> is required by <ref2>`, keeps files, declaration and lock entry, and exits 1. `--force` removes it anyway (p88).
121
+ - `skaile install` and `skaile update` rewrite `skaile.lock.yaml` only when its content changes, so a no-op run keeps the file byte-identical (`locked_at` included) and prints no `Lock file written` line (p93).
122
+ - When an asset moves to another locked version, `install` and `update` print `<ref> replaced 0.1.1 → 0.1.2` instead of the `! Removed: …#0.1.1` warning (p92).
123
+ - `__pycache__/`, `*.pyc`, `.DS_Store`, `node_modules/` and symlinks in an asset folder are neither deployed nor hashed. A `.pyc` that a helper script writes into a library no longer makes the lock report `content changed since lock` (p98).
124
+
125
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Hints and `diff` of a project whose assets live in more than one library (5.8.0 critique). A "did you mean" hint after a publisher change names the asset of the library the lock recorded for the old ref, never a same-named asset of another library, and the `skaile library set <lib> publisher=<old>` advice names that library (p78). With the same ref in two libraries, `skaile diff` compares the deployed copy with the library the lock records, at the locked version, instead of the highest version of another library (p87). The "`<ref>` exists in N libraries" warning is printed by `skaile add` (and `npx skills add`) only; `diff`, `check`, `outdated`, `install` and `update` no longer repeat a choice the lock or a pin already made (p87).
126
+
127
+ One project state for `check`, `doctor`, `outdated`, `diff` and `install --locked` (5.8.0 critique). `AssetManager.projectState()` (replaces `lockGaps()`) computes every way the project differs from what it declares and locks, and all five commands take their verdict and exit code from it. A hand-declared preset that nothing holds, or one with an item that does not resolve, now fails `doctor`, `outdated` and `install --locked` as it fails `check`, also in a project that already has a lock (p46); the lock gains an optional `presets:` list that records every preset `install` and `add` expanded, so this holds offline. After `library rename` or removal, `check` and `doctor` fail like `install --locked` and `outdated` (p89); `outdated` and `diff <ref>` exit 1 on a project-state problem. `install --locked` ends with `Failed`, never `Done`, when a locked asset is missing (p100). A declared ref that no library or source holds is no longer advised `skaile install`; the line names `skaile library init` / `skaile remove <ref>` (p91).
128
+
129
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - `skaile validate`, `skaile library index` and `skaile library publish --dry-run` now run one shared per-asset check list: a flow file the flow engine cannot parse (p72) and a skill whose description is still the scaffold `TODO:` placeholder (p73) fail all three with the same message, and `index` now reports it (exit 1, closing line `✗ <n> asset(s) fail the checks of skaile validate`) while keeping the asset in the manifest and the search index. The factory skill `authoring-skaile-manifests` now says the asset file's version wins over `assets[].version` (p45). `skaile migrate assets --write` keeps a bundle's `version` in the preset it writes, and prints `version <old> → 1.0.0` when it has to reset an unusable one (p94).
130
+
131
+ ### Patch Changes
132
+
133
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - `skaile library init <name> --path <dir>` on a directory with no manifest (or one that lists no assets) now writes one manifest entry per asset it indexes. It runs the same sync and index as `library index`, so `Indexed N asset(s)` matches the manifest, a second `library index` changes nothing, and an asset that fails the checks is reported with the same lines and exit code as `index`. A manifest that already lists assets keeps its entries, and the `! <n> asset(s) on disk are not in the manifest` line still fires for the rest (p133).
134
+
135
+ - [#1053](https://github.com/skaile-ai/workspaces/pull/1053) [`1d24047`](https://github.com/skaile-ai/workspaces/commit/1d240475becac3df0eec5c93cb7a51dd7840f55e) Thanks [@mortegro](https://github.com/mortegro)! - `skaile manage` now ticks the right library row when the lock's library is registered here under another name. It finds the library the way `check` and `install --locked` do: by the locked name, else by the git remote the lock records. Before, only a row with the locked name was ticked, so an installed asset showed as not installed (p134). A lock entry whose library is not registered here ticks no library row. A copy placed by `skaile asset install` still ticks only the row of its library, by the name the lock records, even when that library is no longer registered. `AssetManager` has a new method, `lockedLibraryNames()`, that returns this lookup for every library entry of the project lock.
136
+
137
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Library agents behave like skills through the consume chain. A deployed agent is left alone on a repeat `skaile install`, `install --locked` and `update` (no `Updated` line, file untouched) (p84). `skaile diff agent:…` finds the deployed `<name>.md` / `<name>.toml` and compares it with the rendered source (p96). `skaile install` exits 1 for an `agents:` instance whose agent was never added and says `run skaile add agent:… first` (p97). The `add`/`install` line of an `AGENT.md` agent prints `#<version>` from the lock (p101). The `library create agent` `SOUL.md` scaffold says `Agent prompt goes here.`; `validate` still flags it, and the older skill wording (p102).
138
+
139
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - CLI polish from the 5.8.0 critique: `skaile why <ref>` now exits 1 when the ref is not a dependency of the project (p77); `skaile run` no longer prints Node's `ExperimentalWarning: SQLite is an experimental feature` on stderr, other warnings are kept (p75); `skaile manage` ticks an asset as installed only when kind, name and publisher all match, so an unrelated same-named asset of another publisher or library is no longer shown as installed (p86).
140
+
141
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Library git verbs and sources report what git did (p79–p82).
142
+
143
+ - `skaile library push` counts the commits the remote it pushes to lacks. After `skaile library set <name> backendConfig.url=<url>` the first push no longer reports every commit as pushed (p79).
144
+ - `library pull`, `sync` and `push` print one line, `rebase in progress; finish it with git rebase --continue`, and exit 1 while a rebase is unfinished. Before, `pull` and `sync` printed git's raw text and `push` advised the rebase that was already running (p80).
145
+ - `skaile source list`, `show` and `remove` tell two sources with the same repo name apart. `list` shows the second under its clone-cache key; `show` and `remove` of a shared name exit 1 and list both URLs, and a URL or the listed key picks one. `remove` no longer drops the first match silently (p81).
146
+ - A failed source pull prints git's whole error on one line, for example `fatal: '<path>' does not appear to be a git repository Could not read from remote repository. …`, not only its last line (p82).
147
+
3
148
  ## 5.9.0
4
149
 
5
150
  ### Minor Changes
package/README.md CHANGED
@@ -76,6 +76,18 @@ cli (top-level CLI — orchestrates everything below)
76
76
 
77
77
  ## Quick Start
78
78
 
79
+ `skaile run` and `skaile repl` start a driver (a harness), and two of the drivers need an
80
+ optional SDK that `skaile-cli` does not install. Install the one for your driver before the
81
+ first `run` or `repl`:
82
+
83
+ | Driver | Install |
84
+ |---|---|
85
+ | `claude-sdk` (default) | `npm i -D @anthropic-ai/claude-agent-sdk` (with Bun: `bun add @anthropic-ai/claude-agent-sdk`) |
86
+ | `codex` | `npm i -D @openai/codex-sdk` (with Bun: `bun add @openai/codex-sdk`) |
87
+ | `omp` | none; needs the `omp` binary on your `PATH` and a configured model |
88
+
89
+ Without the SDK, `skaile run` exits 1 with `Claude Agent SDK not installed` (or `Codex SDK not installed`).
90
+
79
91
  ```bash
80
92
  # Installed from npm (npm i -D skaile-cli)
81
93
  npx skaile --help # run the skaile CLI
@@ -1,29 +1,29 @@
1
- import { getKnownKinds } from './chunk-2FRUUDZY.js';
2
- import './chunk-FZNG4V4J.js';
3
- import './chunk-MGGFBZWA.js';
1
+ import { getKnownKinds } from './chunk-CAHB6MHA.js';
2
+ import './chunk-TCHRMVTO.js';
3
+ import './chunk-D3B36CYC.js';
4
4
  import './chunk-7RGTAEG6.js';
5
5
  import './chunk-NUELZWCF.js';
6
- import './chunk-4MQS7CAF.js';
7
- import './chunk-Y7QA2OLD.js';
8
- import './chunk-CKQEIY43.js';
6
+ import './chunk-2F5AWQX5.js';
7
+ import './chunk-J4RBUFGM.js';
8
+ import './chunk-COH6FQAG.js';
9
9
  import './chunk-R7FOF242.js';
10
10
  import './chunk-3TXEJN4W.js';
11
- import './chunk-B6GIW55K.js';
12
- import './chunk-36AFURKZ.js';
11
+ import './chunk-ZCAJZ4B2.js';
12
+ import './chunk-PBBPZYVG.js';
13
13
  import './chunk-4GY63JU6.js';
14
- import { factoryAssetRoots } from './chunk-GB7WDMH2.js';
14
+ import { factoryAssetRoots } from './chunk-EDYHEMJA.js';
15
15
  import './chunk-PMECEZK3.js';
16
16
  import './chunk-5BEFNLOR.js';
17
17
  import './chunk-A2ULN3KX.js';
18
- import { scanRepo } from './chunk-JAKOMFC6.js';
18
+ import { scanRepo } from './chunk-ALEYHUC5.js';
19
19
  import './chunk-L5VSIPQD.js';
20
20
  import './chunk-CPSIPIX7.js';
21
- import './chunk-BTE2V4IW.js';
21
+ import './chunk-ZPWTOUTK.js';
22
22
  import './chunk-RVRB27AN.js';
23
- import { parseRequires } from './chunk-GTILM2CI.js';
24
- import './chunk-QVNRCDTV.js';
23
+ import { parseRequires } from './chunk-SBSA3IQA.js';
24
+ import './chunk-BNMZVPYA.js';
25
25
  import './chunk-ICSCSM5D.js';
26
- import './chunk-UMVKJM4Q.js';
26
+ import './chunk-DALV4HHP.js';
27
27
  import './chunk-MJHSLODD.js';
28
28
  import './chunk-C3CAXQMA.js';
29
29
  import './chunk-BOFL7GIF.js';
@@ -51,8 +51,8 @@ function libraryEntryOf(asset) {
51
51
  async function libraryAssets() {
52
52
  const notes = [];
53
53
  try {
54
- const { openLibraryManager } = await import('./open-library-DB2PNL2X.js');
55
- const { getKindRegistry } = await import('./open-registry-ZUZJ7MS7.js');
54
+ const { openLibraryManager } = await import('./open-library-BOSPJVID.js');
55
+ const { getKindRegistry } = await import('./open-registry-4FI7HKET.js');
56
56
  const { scanAuthoringLibraries } = await import('./library/index.js');
57
57
  const { library: index, close } = await openLibraryManager();
58
58
  try {
@@ -85,7 +85,7 @@ async function libraryAssets() {
85
85
  async function storeAssets(projectDir) {
86
86
  const notes = [];
87
87
  try {
88
- const { resolveCatalogSource } = await import('./open-library-DB2PNL2X.js');
88
+ const { resolveCatalogSource } = await import('./open-library-BOSPJVID.js');
89
89
  const { source, close } = await resolveCatalogSource({ projectDir });
90
90
  try {
91
91
  const assets = await source.listAssets();
@@ -164,5 +164,5 @@ async function gatherAssetFeeds(am, projectDir) {
164
164
  }
165
165
 
166
166
  export { gatherAssetFeeds };
167
- //# sourceMappingURL=asset-feeds-XMKKUUK6.js.map
168
- //# sourceMappingURL=asset-feeds-XMKKUUK6.js.map
167
+ //# sourceMappingURL=asset-feeds-CXGQIDFR.js.map
168
+ //# sourceMappingURL=asset-feeds-CXGQIDFR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":"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","file":"asset-feeds-XMKKUUK6.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`, read through\n * `scanAuthoringLibraries` (`@skaile/workspaces/library`): the same scan\n * `library index` / `search --local` use, so publishers and refs match them\n * (per-asset `publisher_overrides` honoured), `dev_paths` assets are left out,\n * and a library that fails to scan becomes one note while the rest stay listed.\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 * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n parseRequires,\n scanRepo,\n} from \"@skaile/workspaces/core\";\nimport { getKnownKinds } from \"./open-registry.ts\";\nimport type { DiscoveredAsset } from \"@skaile/workspaces/discovery\";\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 * Map one discovered library asset to the `CatalogEntry` the manage rows read.\n * `publisher` is the bare per-asset publisher (what `search --local` prints),\n * `source` the manifest path. `repo` is left unset: it only feeds the Sources-tree\n * org grouping. `requires` / `dependencies` come from the manifest the way the\n * scanner fills them — string `requires:` refs parsed to `{kind, name}`, a bundle's\n * string `dependencies:` list verbatim.\n */\nfunction libraryEntryOf(asset: DiscoveredAsset): CatalogEntry {\n const { manifest } = asset;\n const nested = (manifest.metadata as Record<string, unknown> | undefined)?.requires;\n const rawRequires = manifest.requires ?? nested;\n const requireRefs =\n typeof rawRequires === \"string\"\n ? rawRequires\n : Array.isArray(rawRequires)\n ? rawRequires.filter((r): r is string => typeof r === \"string\")\n : undefined;\n const deps = manifest.dependencies;\n return {\n name: asset.name,\n kind: asset.kind as AssetKind,\n description: typeof manifest.description === \"string\" ? manifest.description : \"\",\n source: asset.manifestPath,\n publisher: asset.publisher,\n ...(asset.plugin ? { plugin: asset.plugin } : {}),\n version: asset.version,\n requires: requireRefs === undefined ? [] : parseRequires({ requires: requireRefs }),\n dependencies:\n asset.kind === \"bundle\" && Array.isArray(deps)\n ? deps.filter((d): d is string => typeof d === \"string\" && d.length > 0)\n : [],\n };\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache) through\n * `scanAuthoringLibraries`, grouped under the bare library name\n * (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * comes from `DiscoveredAsset.plugin`. A library whose scan fails becomes one\n * `FeedNote`; the outer `catch` covers only opening the index.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n // Lazy: the library subpath pulls in SQLite, which the other feeds never need.\n const { openLibraryManager } = await import(\"./open-library.ts\");\n const { getKindRegistry } = await import(\"./open-registry.ts\");\n const { scanAuthoringLibraries } = await import(\"@skaile/workspaces/library\");\n const { library: index, close } = await openLibraryManager();\n try {\n const entries: OriginEntry[] = [];\n for (const scan of await scanAuthoringLibraries(index, getKindRegistry())) {\n if (scan.error !== undefined) {\n notes.push({ feed: \"libraries\", message: `${scan.library.name}: ${scan.error}` });\n continue;\n }\n for (const asset of scan.assets) {\n entries.push({\n origin: \"library\",\n entry: libraryEntryOf(asset),\n group: scan.library.name,\n });\n }\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-CXGQIDFR.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`, read through\n * `scanAuthoringLibraries` (`@skaile/workspaces/library`): the same scan\n * `library index` / `search --local` use, so publishers and refs match them\n * (per-asset `publisher_overrides` honoured), `dev_paths` assets are left out,\n * and a library that fails to scan becomes one note while the rest stay listed.\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 * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n parseRequires,\n scanRepo,\n} from \"@skaile/workspaces/core\";\nimport { getKnownKinds } from \"./open-registry.ts\";\nimport type { DiscoveredAsset } from \"@skaile/workspaces/discovery\";\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 * Map one discovered library asset to the `CatalogEntry` the manage rows read.\n * `publisher` is the bare per-asset publisher (what `search --local` prints),\n * `source` the manifest path. `repo` is left unset: it only feeds the Sources-tree\n * org grouping. `requires` / `dependencies` come from the manifest the way the\n * scanner fills them — string `requires:` refs parsed to `{kind, name}`, a bundle's\n * string `dependencies:` list verbatim.\n */\nfunction libraryEntryOf(asset: DiscoveredAsset): CatalogEntry {\n const { manifest } = asset;\n const nested = (manifest.metadata as Record<string, unknown> | undefined)?.requires;\n const rawRequires = manifest.requires ?? nested;\n const requireRefs =\n typeof rawRequires === \"string\"\n ? rawRequires\n : Array.isArray(rawRequires)\n ? rawRequires.filter((r): r is string => typeof r === \"string\")\n : undefined;\n const deps = manifest.dependencies;\n return {\n name: asset.name,\n kind: asset.kind as AssetKind,\n description: typeof manifest.description === \"string\" ? manifest.description : \"\",\n source: asset.manifestPath,\n publisher: asset.publisher,\n ...(asset.plugin ? { plugin: asset.plugin } : {}),\n version: asset.version,\n requires: requireRefs === undefined ? [] : parseRequires({ requires: requireRefs }),\n dependencies:\n asset.kind === \"bundle\" && Array.isArray(deps)\n ? deps.filter((d): d is string => typeof d === \"string\" && d.length > 0)\n : [],\n };\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache) through\n * `scanAuthoringLibraries`, grouped under the bare library name\n * (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * comes from `DiscoveredAsset.plugin`. A library whose scan fails becomes one\n * `FeedNote`; the outer `catch` covers only opening the index.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n // Lazy: the library subpath pulls in SQLite, which the other feeds never need.\n const { openLibraryManager } = await import(\"./open-library.ts\");\n const { getKindRegistry } = await import(\"./open-registry.ts\");\n const { scanAuthoringLibraries } = await import(\"@skaile/workspaces/library\");\n const { library: index, close } = await openLibraryManager();\n try {\n const entries: OriginEntry[] = [];\n for (const scan of await scanAuthoringLibraries(index, getKindRegistry())) {\n if (scan.error !== undefined) {\n notes.push({ feed: \"libraries\", message: `${scan.library.name}: ${scan.error}` });\n continue;\n }\n for (const asset of scan.assets) {\n entries.push({\n origin: \"library\",\n entry: libraryEntryOf(asset),\n group: scan.library.name,\n });\n }\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,19 +1,19 @@
1
- export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs } from '../chunk-2LWYNQK7.js';
2
- import '../chunk-36AFURKZ.js';
1
+ export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs } from '../chunk-GCHPUTA3.js';
2
+ import '../chunk-PBBPZYVG.js';
3
3
  import '../chunk-4GY63JU6.js';
4
- import '../chunk-GB7WDMH2.js';
4
+ import '../chunk-EDYHEMJA.js';
5
5
  import '../chunk-PMECEZK3.js';
6
6
  import '../chunk-5BEFNLOR.js';
7
7
  import '../chunk-A2ULN3KX.js';
8
- import '../chunk-JAKOMFC6.js';
8
+ import '../chunk-ALEYHUC5.js';
9
9
  import '../chunk-L5VSIPQD.js';
10
10
  import '../chunk-CPSIPIX7.js';
11
- import '../chunk-BTE2V4IW.js';
11
+ import '../chunk-ZPWTOUTK.js';
12
12
  import '../chunk-RVRB27AN.js';
13
- import '../chunk-GTILM2CI.js';
14
- import '../chunk-QVNRCDTV.js';
13
+ import '../chunk-SBSA3IQA.js';
14
+ import '../chunk-BNMZVPYA.js';
15
15
  import '../chunk-ICSCSM5D.js';
16
- import '../chunk-UMVKJM4Q.js';
16
+ import '../chunk-DALV4HHP.js';
17
17
  import '../chunk-MJHSLODD.js';
18
18
  import '../chunk-C3CAXQMA.js';
19
19
  import '../chunk-BOFL7GIF.js';
@@ -1,30 +1,30 @@
1
- export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, installAgentInstances, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, softDepName } from '../chunk-IMKSM5NL.js';
2
- import '../chunk-4MQS7CAF.js';
3
- import '../chunk-Y7QA2OLD.js';
4
- import '../chunk-CKQEIY43.js';
1
+ export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, installAgentInstances, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, softDepName } from '../chunk-DZMNFCWB.js';
2
+ import '../chunk-2F5AWQX5.js';
3
+ import '../chunk-J4RBUFGM.js';
4
+ import '../chunk-COH6FQAG.js';
5
5
  import '../chunk-R7FOF242.js';
6
6
  import '../chunk-3TXEJN4W.js';
7
- export { SCAFFOLD_KINDS, createScaffold, deployAll, installAgent, installTargetOf, removeAsset } from '../chunk-YSHVQGUS.js';
7
+ export { SCAFFOLD_KINDS, createScaffold, deployAll, installAgent, installTargetOf, removeAsset } from '../chunk-FH7W6TJ4.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-EF7NPDDU.js';
12
- import '../chunk-B6GIW55K.js';
13
- import '../chunk-36AFURKZ.js';
11
+ export { AGENT_RENDERERS, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-HZXUXHIV.js';
12
+ import '../chunk-ZCAJZ4B2.js';
13
+ import '../chunk-PBBPZYVG.js';
14
14
  import '../chunk-4GY63JU6.js';
15
- import '../chunk-GB7WDMH2.js';
15
+ import '../chunk-EDYHEMJA.js';
16
16
  import '../chunk-PMECEZK3.js';
17
17
  import '../chunk-5BEFNLOR.js';
18
18
  import '../chunk-A2ULN3KX.js';
19
- import '../chunk-JAKOMFC6.js';
19
+ import '../chunk-ALEYHUC5.js';
20
20
  import '../chunk-L5VSIPQD.js';
21
21
  import '../chunk-CPSIPIX7.js';
22
- import '../chunk-BTE2V4IW.js';
22
+ import '../chunk-ZPWTOUTK.js';
23
23
  import '../chunk-RVRB27AN.js';
24
- import '../chunk-GTILM2CI.js';
25
- import '../chunk-QVNRCDTV.js';
24
+ import '../chunk-SBSA3IQA.js';
25
+ import '../chunk-BNMZVPYA.js';
26
26
  import '../chunk-ICSCSM5D.js';
27
- import '../chunk-UMVKJM4Q.js';
27
+ import '../chunk-DALV4HHP.js';
28
28
  import '../chunk-MJHSLODD.js';
29
29
  import '../chunk-C3CAXQMA.js';
30
30
  import '../chunk-BOFL7GIF.js';
@@ -1,22 +1,22 @@
1
- export { SCAFFOLD_KINDS, canonicalEntryRef, createScaffold, deployAll, deployAsset, installTargetOf, removeAsset } from '../chunk-YSHVQGUS.js';
1
+ export { SCAFFOLD_KINDS, canonicalEntryRef, createScaffold, deployAll, deployAsset, deployedAssetDrift, diffDeployedAgent, installTargetOf, removeAsset } from '../chunk-FH7W6TJ4.js';
2
2
  import '../chunk-CGYEHQOX.js';
3
- import '../chunk-EF7NPDDU.js';
4
- import '../chunk-B6GIW55K.js';
5
- import '../chunk-36AFURKZ.js';
3
+ import '../chunk-HZXUXHIV.js';
4
+ import '../chunk-ZCAJZ4B2.js';
5
+ import '../chunk-PBBPZYVG.js';
6
6
  import '../chunk-4GY63JU6.js';
7
- import '../chunk-GB7WDMH2.js';
7
+ import '../chunk-EDYHEMJA.js';
8
8
  import '../chunk-PMECEZK3.js';
9
9
  import '../chunk-5BEFNLOR.js';
10
10
  import '../chunk-A2ULN3KX.js';
11
- import '../chunk-JAKOMFC6.js';
11
+ import '../chunk-ALEYHUC5.js';
12
12
  import '../chunk-L5VSIPQD.js';
13
13
  import '../chunk-CPSIPIX7.js';
14
- import '../chunk-BTE2V4IW.js';
14
+ import '../chunk-ZPWTOUTK.js';
15
15
  import '../chunk-RVRB27AN.js';
16
- import '../chunk-GTILM2CI.js';
17
- import '../chunk-QVNRCDTV.js';
16
+ import '../chunk-SBSA3IQA.js';
17
+ import '../chunk-BNMZVPYA.js';
18
18
  import '../chunk-ICSCSM5D.js';
19
- import '../chunk-UMVKJM4Q.js';
19
+ import '../chunk-DALV4HHP.js';
20
20
  import '../chunk-MJHSLODD.js';
21
21
  import '../chunk-C3CAXQMA.js';
22
22
  import '../chunk-BOFL7GIF.js';
@@ -1,20 +1,20 @@
1
- export { AGENT_RENDERERS, CODEX_IDENTITY_DIR, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-EF7NPDDU.js';
2
- import '../chunk-B6GIW55K.js';
3
- import '../chunk-36AFURKZ.js';
1
+ export { AGENT_RENDERERS, CODEX_IDENTITY_DIR, claudeCodeRenderer, codexRenderer, driverTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-HZXUXHIV.js';
2
+ import '../chunk-ZCAJZ4B2.js';
3
+ import '../chunk-PBBPZYVG.js';
4
4
  import '../chunk-4GY63JU6.js';
5
- import '../chunk-GB7WDMH2.js';
5
+ import '../chunk-EDYHEMJA.js';
6
6
  import '../chunk-PMECEZK3.js';
7
7
  import '../chunk-5BEFNLOR.js';
8
8
  import '../chunk-A2ULN3KX.js';
9
- import '../chunk-JAKOMFC6.js';
9
+ import '../chunk-ALEYHUC5.js';
10
10
  import '../chunk-L5VSIPQD.js';
11
11
  import '../chunk-CPSIPIX7.js';
12
- import '../chunk-BTE2V4IW.js';
12
+ import '../chunk-ZPWTOUTK.js';
13
13
  import '../chunk-RVRB27AN.js';
14
- import '../chunk-GTILM2CI.js';
15
- import '../chunk-QVNRCDTV.js';
14
+ import '../chunk-SBSA3IQA.js';
15
+ import '../chunk-BNMZVPYA.js';
16
16
  import '../chunk-ICSCSM5D.js';
17
- import '../chunk-UMVKJM4Q.js';
17
+ import '../chunk-DALV4HHP.js';
18
18
  import '../chunk-MJHSLODD.js';
19
19
  import '../chunk-C3CAXQMA.js';
20
20
  import '../chunk-BOFL7GIF.js';