@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../asset-manager/src/install-instances.ts","../asset-manager/src/mcp-config.ts","../asset-manager/src/index.ts"],"names":["entry","join","parseYaml","readFileSync","resolve","sep","files","semverGt","existsSync","dir","deps","gaps","sameAsset","path","dirname","rmSync","reason","mkdirSync","writeFileSync","stringifyYaml"],"mappings":"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","file":"chunk-DZMNFCWB.js","sourcesContent":["/**\n * Agent instance rendering — the `skaile install` step that renders every agent\n * instance of `skaile.yaml` (`agent:` as `default`, plus the `agents:` map) into\n * the target harness's native agent format.\n *\n * One rendering per instance, named by the instance id: claude\n * `.claude/agents/<id>.md`, omp `.omp/agents/<id>/`, codex\n * `.codex/agents/<id>.toml` (+ `.codex/skaile-agents/<id>.md`). The `delegate`\n * sub-agents an instance composes are rendered flat next to it.\n *\n * Stale outputs follow the ownership rule `mcp-config.ts` uses for `.mcp.json`:\n * what this step wrote is recorded per harness and instance in\n * `.skaile/agent-instances-managed.json`; a rendering whose instance left\n * `skaile.yaml` (or that an instance no longer composes) is removed on the next\n * install, and nothing the ledger does not list is ever touched. An instance\n * whose agent cannot be resolved this run keeps its previous rendering.\n */\n\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport type { DriverTarget, SkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport {\n DRIVER_TARGETS,\n deployedBase,\n effectiveAgentInstances,\n resolveAgentDefinitionDir,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport { installAgent } from \"./install-agent.js\";\nimport { CODEX_IDENTITY_DIR, driverTargetSupportsAgents } from \"./renderers.js\";\n\n/** One rendered instance: its id and every path written for it (workspace-relative). */\nexport interface InstalledAgentInstance {\n id: string;\n files: string[];\n}\n\n/** Outcome of {@link installAgentInstances}. */\nexport interface InstallAgentInstancesResult {\n /** Instances rendered in this pass. */\n instances: InstalledAgentInstance[];\n /** Workspace-relative paths removed because their instance (or sub-agent) is gone. */\n removed: string[];\n /** Non-fatal renderer notes. */\n warnings: string[];\n /** Instances that could not be rendered because their `ref` does not resolve to an agent. */\n errors: string[];\n}\n\n/** Options for {@link installAgentInstances}. */\nexport interface InstallAgentInstancesOptions {\n /** Workspace root (where `skaile.yaml` lives). */\n projectDir: string;\n /** Harness to render for. */\n driverTarget: DriverTarget;\n /** Parsed workspace config; read from `projectDir` when omitted. */\n wsConfig?: SkWorkspaceConfig;\n log?: (msg: string) => void;\n}\n\ninterface InstanceLedger {\n version: 1;\n /** harness → instance id → workspace-relative paths this step wrote. */\n targets: Record<string, Record<string, string[]>>;\n}\n\nconst ledgerPath = (projectDir: string): string =>\n join(projectDir, \".skaile\", \"agent-instances-managed.json\");\n\nfunction readLedger(projectDir: string): InstanceLedger {\n const p = ledgerPath(projectDir);\n if (!existsSync(p)) return { version: 1, targets: {} };\n try {\n const parsed = JSON.parse(readFileSync(p, \"utf-8\")) as Partial<InstanceLedger>;\n return { version: 1, targets: parsed.targets ?? {} };\n } catch {\n // An unreadable ledger owns nothing: render fresh, never delete on a guess.\n return { version: 1, targets: {} };\n }\n}\n\nfunction writeLedger(projectDir: string, ledger: InstanceLedger): void {\n const p = ledgerPath(projectDir);\n mkdirSync(dirname(p), { recursive: true });\n writeFileSync(p, `${JSON.stringify(ledger, null, 2)}\\n`, \"utf-8\");\n}\n\n/**\n * Resolve the agent definition directory one instance binds to. `errors` lists why it does\n * not: the `ref` finds no agent, or the directory it finds has no `agent.yaml`. What to do about\n * an `agent:` ref that finds no agent depends on the libraries registered, so the caller adds\n * it (see `AssetManager.projectState`). `srcDir` is `undefined` for an `ai-assets://` ref\n * with no `ai-assets/` directory above the project, which is no error.\n */\nfunction bindInstance(\n projectDir: string,\n id: string,\n instance: { ref: string },\n): { srcDir: string | undefined; errors: string[] } {\n const errors: string[] = [];\n let srcDir: string | undefined;\n try {\n srcDir = resolveAgentDefinitionDir(projectDir, instance.ref);\n } catch (err) {\n errors.push(`agent instance \"${id}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n if (srcDir !== undefined && !existsSync(join(srcDir, \"agent.yaml\"))) {\n errors.push(\n `agent instance \"${id}\": ${instance.ref} resolves to ${srcDir}, which has no agent.yaml`,\n );\n }\n return { srcDir, errors };\n}\n\n/** One agent instance of `skaile.yaml` whose `ref` does not bind to an agent. */\nexport interface UnboundAgentInstance {\n /** Instance id (`default` for the `agent:` block). */\n id: string;\n /** The instance's `ref`. */\n ref: string;\n /** Why it does not bind, as `install` prints it. */\n error: string;\n}\n\n/**\n * The instances of `skaile.yaml` that {@link installAgentInstances} cannot render because their\n * `ref` binds to no agent: `skaile check` fails on them, and `skaile install` too. A harness\n * without a native agent format renders nothing, so it has none. An unreadable `skaile.yaml`\n * has none either.\n */\nexport function unboundAgentInstances(\n projectDir: string,\n driverTarget: DriverTarget,\n): UnboundAgentInstance[] {\n if (!driverTargetSupportsAgents(driverTarget)) return [];\n let instances: Record<string, { ref: string }>;\n try {\n instances = effectiveAgentInstances(resolveSkWorkspaceConfig(projectDir));\n } catch {\n return [];\n }\n const out: UnboundAgentInstance[] = [];\n for (const [id, instance] of Object.entries(instances)) {\n const { errors } = bindInstance(projectDir, id, instance);\n if (errors.length > 0) out.push({ id, ref: instance.ref, error: errors.join(\"; \") });\n }\n return out;\n}\n\n/**\n * Remove the native agent files an earlier install rendered for the instances `ids`, as far as\n * no other instance claims them, and drop those instances from the ledger. Only paths the ledger\n * lists and that sit inside the harness agent dir are removed.\n *\n * @returns Workspace-relative paths removed.\n */\nexport function removeAgentInstanceRenderings(opts: {\n projectDir: string;\n driverTarget: DriverTarget;\n ids: readonly string[];\n}): string[] {\n const { projectDir, driverTarget, ids } = opts;\n if (!driverTargetSupportsAgents(driverTarget) || ids.length === 0) return [];\n const ledger = readLedger(projectDir);\n const previous = ledger.targets[driverTarget];\n if (!previous) return [];\n const gone = new Set(ids);\n const claimed = new Set(\n Object.entries(previous)\n .filter(([id]) => !gone.has(id))\n .flatMap(([, files]) => files),\n );\n const agentDeployDir = deployedBase(\"agent\", driverTarget, false, projectDir);\n const removable = [resolve(agentDeployDir), resolve(dirname(agentDeployDir), CODEX_IDENTITY_DIR)];\n const root = resolve(projectDir);\n const removed: string[] = [];\n for (const id of gone) {\n for (const rel of previous[id] ?? []) {\n if (claimed.has(rel)) continue;\n const abs = resolve(root, rel);\n if (!removable.some((dir) => abs.startsWith(dir + sep)) || !existsSync(abs)) continue;\n rmSync(abs, { recursive: true, force: true });\n removed.push(rel);\n }\n }\n const owned = Object.fromEntries(Object.entries(previous).filter(([id]) => !gone.has(id)));\n const nextTargets = { ...ledger.targets };\n if (Object.keys(owned).length > 0) nextTargets[driverTarget] = owned;\n else delete nextTargets[driverTarget];\n if (JSON.stringify(nextTargets) !== JSON.stringify(ledger.targets)) {\n writeLedger(projectDir, { version: 1, targets: nextTargets });\n }\n return removed;\n}\n\n/**\n * Render every agent instance of the workspace for `driverTarget`, then remove\n * the renderings this step wrote earlier that no instance claims any more.\n * Harnesses without a native agent format are a no-op (nothing rendered, the\n * ledger is not touched).\n *\n * Never throws for a bad instance: an unresolvable `ref` becomes a warning and\n * leaves that instance's previous rendering in place.\n *\n * @docLink packages/asset-manager/concepts#install-agent-instances\n */\nexport function installAgentInstances(\n opts: InstallAgentInstancesOptions,\n): InstallAgentInstancesResult {\n const { projectDir, driverTarget, log } = opts;\n const result: InstallAgentInstancesResult = {\n instances: [],\n removed: [],\n warnings: [],\n errors: [],\n };\n if (!driverTargetSupportsAgents(driverTarget)) return result;\n\n const wsConfig = opts.wsConfig ?? resolveSkWorkspaceConfig(projectDir);\n const instances = effectiveAgentInstances(wsConfig);\n const agentDeployDir = deployedBase(\"agent\", driverTarget, false, projectDir);\n const skillsRelDir = DRIVER_TARGETS[driverTarget]?.local.skill ?? \"\";\n\n const ledger = readLedger(projectDir);\n const previous = ledger.targets[driverTarget] ?? {};\n const owned: Record<string, string[]> = {};\n\n for (const [id, instance] of Object.entries(instances)) {\n const { srcDir, errors } = bindInstance(projectDir, id, instance);\n result.errors.push(...errors);\n if (srcDir === undefined || errors.length > 0) {\n // Nothing new to record: keep whatever an earlier pass rendered for it.\n if (previous[id]) owned[id] = previous[id];\n continue;\n }\n\n const rendered = installAgent(\n srcDir,\n agentDeployDir,\n projectDir,\n driverTarget,\n skillsRelDir,\n id,\n /* includeSubAgents */ true,\n new Set<string>(),\n wsConfig,\n log,\n instance,\n );\n result.warnings.push(...rendered.warnings);\n const files = [...new Set(rendered.created)];\n owned[id] = files;\n result.instances.push({ id, files });\n }\n\n // Remove what an earlier pass wrote and no instance claims now.\n const claimed = new Set(Object.values(owned).flat());\n const root = resolve(projectDir);\n // The ledger is a file in the workspace, so it is input: only paths strictly inside what this\n // step renders into (the harness agent dir, and codex's identity dir beside it) may be removed.\n const removable = [resolve(agentDeployDir), resolve(dirname(agentDeployDir), CODEX_IDENTITY_DIR)];\n for (const rel of Object.values(previous).flat()) {\n if (claimed.has(rel)) continue;\n const abs = resolve(root, rel);\n if (!removable.some((dir) => abs.startsWith(dir + sep)) || !existsSync(abs)) continue;\n rmSync(abs, { recursive: true, force: true });\n result.removed.push(rel);\n }\n\n const nextTargets = { ...ledger.targets };\n if (Object.keys(owned).length > 0) nextTargets[driverTarget] = owned;\n else delete nextTargets[driverTarget];\n if (JSON.stringify(nextTargets) !== JSON.stringify(ledger.targets)) {\n writeLedger(projectDir, { version: 1, targets: nextTargets });\n }\n\n return result;\n}\n","/**\n * Render the workspace's declared MCP servers into the **coding agent's own**\n * native MCP config, so a developer who runs `skaile install` in a project and\n * then opens their coding agent in that folder gets the same MCP servers\n * skaile's own agent loop wires up.\n *\n * This is the sibling of skill deployment (`.claude/skills/`): skills already\n * render into the driver target's native tree, MCP servers now do too.\n *\n * Declarations come from the single resolver `loadMcpServerDeclarations()` in\n * `@skaile/workspaces/core` — the same one the runner uses. There is no second\n * resolver here.\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { DriverTarget, McpServerDeclaration } from \"@skaile/workspaces/core\";\nimport { loadMcpServerDeclarations } from \"@skaile/workspaces/core\";\n\n// ── Driver-target coverage ───────────────────────────────────────────────────\n\n/**\n * Per-driver-target native MCP config location, relative to the project root.\n *\n * Only `claude-code` is populated: its project-scope `.mcp.json` schema is\n * documented and stable. `codex` (TOML `config.toml`) and `omp` (no documented\n * project-scope MCP file) are deliberately absent — an unlisted target is a\n * silent no-op, and adding one later is a one-line change here.\n */\nconst TARGET_MCP_CONFIG: Partial<Record<DriverTarget, string>> = {\n \"claude-code\": \".mcp.json\",\n};\n\n/** IDs reserved for skaile's built-in MCP servers. Never rendered. */\nconst RESERVED_MCP_SERVER_IDS = new Set([\n \"skaile-connectors\",\n \"skaile-workspace\",\n \"skaile-capabilities\",\n]);\n\n/**\n * Secret-ref prefixes that cannot be represented in a coding agent's MCP\n * config. `env:` is the one exception — it maps onto the agent's own `${VAR}`\n * environment expansion (see {@link renderSecretRef}).\n *\n * Must stay in sync with `KNOWN_PREFIXES` in\n * `@skaile/workspaces/connectors` (`src/secrets.ts`) minus `env:`. Writing an\n * unresolved ref verbatim is exactly what `resolveRecordSecretsStrict` in\n * `runner/src/external-mcp.ts` refuses to do — it would put e.g.\n * `Authorization: mcp:github` on the wire and surface a misleading upstream\n * rejection instead of \"the credential is unavailable\".\n */\nconst UNSUPPORTED_SECRET_PREFIXES = [\n \"vault:\",\n \"forge:\",\n \"op:\",\n \"kp:\",\n \"oauth:\",\n \"mount:\",\n \"connector:\",\n \"mcp:\",\n] as const;\n\n/**\n * `${workspace}` marker, substituted with the absolute workspace root in\n * `command` / `args` / `env` — the same token the runner resolves.\n */\nconst WORKSPACE_MARKER = /\\$\\{workspace\\}/g;\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\n/** A skipped declaration and the human-readable reason it was not rendered. */\nexport interface SkippedMcpServer {\n id: string;\n reason: string;\n}\n\n/** Outcome of one {@link renderMcpServerConfig} pass. */\nexport interface RenderMcpConfigResult {\n /** Absolute path to the config file, when the target is supported. */\n path?: string;\n /** Whether the config file was actually written. */\n written: boolean;\n /** IDs skaile wrote (and now owns) in this pass. */\n servers: string[];\n /** Previously-owned IDs removed in this pass. */\n removed: string[];\n /** Declarations deliberately not rendered, with reasons. */\n skipped: SkippedMcpServer[];\n}\n\n/** Options for {@link renderMcpServerConfig}. */\nexport interface RenderMcpConfigOptions {\n /** Warning sink. Defaults to `console.warn` prefixed with `skaile:`. */\n warn?: (message: string) => void;\n}\n\n/** A rendered `.mcp.json` server entry (stdio or remote). */\ninterface McpConfigEntry {\n type?: \"sse\" | \"http\";\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n}\n\ninterface McpJsonFile {\n mcpServers?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\ninterface ManagedState {\n version: number;\n targets: Record<string, string[]>;\n}\n\n// ── Value rendering ──────────────────────────────────────────────────────────\n\n/**\n * Substitute `${workspace}` with the absolute project dir. A literal\n * `${workspace}` left in the file would be read by the coding agent as an\n * environment-variable expansion and silently resolve to nothing.\n */\nfunction substituteWorkspace(value: string, projectDir: string): string {\n return value.replace(WORKSPACE_MARKER, projectDir);\n}\n\n/**\n * Map an `env:NAME` secret ref onto `${NAME}`, which the coding agent expands\n * from its own environment. Any other value passes through unchanged.\n */\nfunction renderSecretRef(value: string): string {\n return value.startsWith(\"env:\") ? `\\${${value.slice(4)}}` : value;\n}\n\n/**\n * Render one `env` / `headers` map, or `undefined` when it is empty.\n *\n * `projectDir` is passed only for `env` (a local subprocess's environment);\n * `headers` are remote-transport config, where `${workspace}` is meaningless —\n * the same split the runner applies.\n */\nfunction renderValueMap(\n map: Record<string, string> | undefined,\n projectDir?: string,\n): Record<string, string> | undefined {\n if (!map) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(map)) {\n out[k] = renderSecretRef(projectDir ? substituteWorkspace(v, projectDir) : v);\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** First unsupported secret ref found across the declaration's value maps. */\nfunction findUnsupportedSecretRef(decl: McpServerDeclaration): string | undefined {\n const values = [...Object.values(decl.env ?? {}), ...Object.values(decl.headers ?? {})];\n return values.find((v) => UNSUPPORTED_SECRET_PREFIXES.some((p) => v.startsWith(p)));\n}\n\n// ── Skip rules ───────────────────────────────────────────────────────────────\n\n/**\n * Why this declaration cannot be rendered into a coding agent's MCP config, or\n * `undefined` when it can. Never attempts a Nix build or any other resolution.\n */\nfunction skipReason(decl: McpServerDeclaration): string | undefined {\n if (RESERVED_MCP_SERVER_IDS.has(decl.id)) return \"reserved id\";\n\n // Mirrors the runner's back-compat default: an unset launcher with a recipe\n // binding means \"recipe\". Recipe resolution needs the platform's Nix runtime,\n // which a consumer machine does not have.\n if (decl.launcher === \"recipe\" || (decl.launcher == null && decl.recipe != null)) {\n return \"requires the skaile platform's Nix recipe runtime\";\n }\n\n if (decl.auth === \"backend\") return \"requires a platform-minted credential\";\n if (decl.ca) return \"pins a CA, which the coding agent's MCP config cannot carry\";\n\n // A materialized/store-staged asset can have live plaintext credentials\n // folded into `env` from a sibling `.instance.json`. Those must never be\n // persisted to a file the project is told to commit — the same rule that\n // keeps `.instance.json` out of `.claude/skills/`.\n if (decl.instanceSecretsFolded) return \"resolved credentials are folded in from .instance.json\";\n\n const transport = decl.transport ?? \"stdio\";\n if (transport === \"stdio\" && !decl.command) return \"no command\";\n if (transport !== \"stdio\" && !decl.url) return \"no url\";\n\n const badRef = findUnsupportedSecretRef(decl);\n if (badRef) return `unsupported secret reference '${badRef}'`;\n\n return undefined;\n}\n\n// ── Entry building ───────────────────────────────────────────────────────────\n\n/** Build the `.mcp.json` entry for a declaration that passed the skip rules. */\nfunction buildEntry(decl: McpServerDeclaration, projectDir: string): McpConfigEntry {\n const transport = decl.transport ?? \"stdio\";\n if (transport !== \"stdio\") {\n const entry: McpConfigEntry = { type: transport, url: decl.url };\n const headers = renderValueMap(decl.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n // stdio is the documented default type and is omitted from the canonical\n // project-scope examples — omit it here too.\n const entry: McpConfigEntry = {\n command: substituteWorkspace(decl.command as string, projectDir),\n };\n const args = decl.args?.map((a) => substituteWorkspace(a, projectDir));\n if (args && args.length > 0) entry.args = args;\n const env = renderValueMap(decl.env, projectDir);\n if (env) entry.env = env;\n return entry;\n}\n\n// ── Managed-state I/O ────────────────────────────────────────────────────────\n\nfunction managedStatePath(projectDir: string): string {\n return path.join(projectDir, \".skaile\", \"mcp-managed.json\");\n}\n\n/**\n * Parse JSON at `p`, or `null` when the file is absent.\n *\n * @throws When the file exists but is unparseable — silently overwriting a\n * hand-edited, version-controlled file would be worse than failing loudly.\n */\nasync function readJsonStrict<T>(p: string): Promise<T | null> {\n let raw: string;\n try {\n raw = await fs.readFile(p, \"utf-8\");\n } catch {\n return null;\n }\n try {\n return JSON.parse(raw) as T;\n } catch (e: unknown) {\n throw new Error(\n `cannot parse ${p}: ${e instanceof Error ? e.message : String(e)}; please fix or remove`,\n );\n }\n}\n\nasync function writeJson(p: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(p), { recursive: true });\n await fs.writeFile(p, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nasync function readManagedIds(projectDir: string, target: DriverTarget): Promise<string[]> {\n const state = await readJsonStrict<ManagedState>(managedStatePath(projectDir));\n const ids = state?.targets?.[target];\n return Array.isArray(ids) ? ids : [];\n}\n\nasync function writeManagedIds(\n projectDir: string,\n target: DriverTarget,\n ids: string[],\n): Promise<void> {\n const p = managedStatePath(projectDir);\n const state = (await readJsonStrict<ManagedState>(p)) ?? { version: 1, targets: {} };\n const targets = { ...(state.targets ?? {}) };\n if (ids.length > 0) targets[target] = ids;\n else delete targets[target];\n await writeJson(p, { version: 1, targets });\n}\n\n// ── Merge ────────────────────────────────────────────────────────────────────\n\n/** Result of merging renderable entries into an existing `mcpServers` map. */\ninterface MergeResult {\n next: Record<string, unknown>;\n owned: string[];\n removed: string[];\n}\n\n/**\n * Merge skaile-owned entries into the existing map without ever clobbering a\n * user-authored one. Ownership is explicit (the managed-id list), never\n * inferred from the entry's shape.\n */\nfunction mergeServers(\n existing: Record<string, unknown>,\n renderable: Map<string, McpConfigEntry>,\n managedIds: string[],\n warn: (message: string) => void,\n configLabel: string,\n): MergeResult {\n const next = { ...existing };\n const managed = new Set(managedIds);\n const owned: string[] = [];\n const removed: string[] = [];\n\n // Only previously-managed ids may be deleted. Never touch anything else.\n // `Object.hasOwn`, not `in` — `in` walks the prototype chain, so ids like\n // `constructor` / `toString` would read as pre-existing hand-written entries.\n for (const id of managed) {\n if (!renderable.has(id) && Object.hasOwn(next, id)) {\n delete next[id];\n removed.push(id);\n }\n }\n\n for (const [id, entry] of renderable) {\n if (Object.hasOwn(next, id) && !managed.has(id)) {\n warn(`\"${id}\" already declared in ${configLabel} by hand — leaving the existing entry`);\n continue;\n }\n next[id] = entry;\n owned.push(id);\n }\n\n return { next, owned, removed };\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Render every MCP server declared for `projectDir` into `driverTarget`'s\n * native project-scope MCP config.\n *\n * Merge rules, in short:\n * - Entries skaile previously wrote (tracked in `.skaile/mcp-managed.json`) are\n * refreshed, or deleted once their declaration disappears.\n * - A hand-written entry with the same id is left untouched and warned about.\n * - Every other key of the config file survives verbatim.\n * - A project with no renderable servers and no prior state writes nothing.\n *\n * Unsupported driver targets (`codex`, `omp`) are a silent no-op.\n *\n * @param projectDir - Workspace root where `skaile.yaml` lives.\n * @param driverTarget - Coding agent whose native MCP config to write.\n * @param opts - Optional warning sink.\n * @returns What was written, removed and skipped.\n * @docLink packages/asset-manager/concepts#coding-agent-mcp-config\n */\nexport async function renderMcpServerConfig(\n projectDir: string,\n driverTarget: DriverTarget,\n opts?: RenderMcpConfigOptions,\n): Promise<RenderMcpConfigResult> {\n const warn = opts?.warn ?? ((m: string) => console.warn(`skaile: ${m}`));\n\n const relConfig = TARGET_MCP_CONFIG[driverTarget];\n if (!relConfig) return { written: false, servers: [], removed: [], skipped: [] };\n\n const configPath = path.join(projectDir, relConfig);\n\n const declarations = await loadMcpServerDeclarations(projectDir);\n const skipped: SkippedMcpServer[] = [];\n const renderable = new Map<string, McpConfigEntry>();\n for (const decl of declarations) {\n const reason = skipReason(decl);\n if (reason) {\n skipped.push({ id: decl.id, reason });\n warn(`MCP server \"${decl.id}\" not written to ${relConfig}: ${reason}`);\n continue;\n }\n renderable.set(decl.id, buildEntry(decl, projectDir));\n }\n\n const managedIds = await readManagedIds(projectDir, driverTarget);\n const existingFile = await readJsonStrict<McpJsonFile>(configPath);\n\n // Nothing to write and nothing ever written: leave the project untouched\n // rather than creating an empty `.mcp.json` / `.skaile/` dir.\n if (renderable.size === 0 && managedIds.length === 0 && !existingFile) {\n return { path: configPath, written: false, servers: [], removed: [], skipped };\n }\n\n const file = existingFile ?? {};\n const existingServers = (file.mcpServers ?? {}) as Record<string, unknown>;\n const { next, owned, removed } = mergeServers(\n existingServers,\n renderable,\n managedIds,\n warn,\n relConfig,\n );\n\n // Claim ownership BEFORE writing the config. A crash between the two writes\n // must leave a ledger entry with no config entry (self-healing — the next\n // pass simply re-adds it), never a config entry with no ledger entry (which\n // would be misread as hand-written and disowned forever).\n const ledgerStale = JSON.stringify(owned) !== JSON.stringify(managedIds);\n if (ledgerStale) await writeManagedIds(projectDir, driverTarget, owned);\n\n // Never conjure an empty `.mcp.json` into a project that has none: with\n // nothing to write and no file to update, the ledger reconciliation above is\n // the whole job.\n if (Object.keys(next).length === 0 && !existingFile) {\n return { path: configPath, written: false, servers: owned, removed, skipped };\n }\n\n if (!ledgerStale && JSON.stringify(next) === JSON.stringify(existingServers) && existingFile) {\n return { path: configPath, written: false, servers: owned, removed, skipped };\n }\n\n await writeJson(configPath, { ...file, mcpServers: next });\n\n return { path: configPath, written: true, servers: owned, removed, skipped };\n}\n","/**\n * @skaile/asset-manager — programmatic AI asset management API.\n *\n * Manages project-local repositories, dependency resolution, deployment,\n * lock files, patches, and contribution workflows.\n *\n * Usage:\n * import { AssetManager } from \"@skaile/workspaces/asset-manager\"\n * const am = new AssetManager({ projectDir: \"/path/to/project\" })\n * await am.install()\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport {\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n rmSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, posix, relative, resolve, sep } from \"node:path\";\nimport type {\n AiComponent,\n AssetRef,\n CatalogEntry,\n DriverTarget,\n LockEntry,\n LockFile,\n OverrideEntry,\n ProvenanceCandidate,\n ProvenanceIndex,\n SkWorkspaceConfig,\n SourceClone,\n SourceDeclaration,\n SourceEntry,\n StoreEntry,\n StoreFetcher,\n} from \"@skaile/workspaces/core\";\nimport {\n discoverAssetsInTree,\n isManifestMode,\n readManifestSourceConfig,\n} from \"@skaile/workspaces/discovery\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport {\n assetRefToStr,\n buildLibraryLockEntries,\n buildLockFile,\n buildProvenanceIndex,\n checkRepoStatus,\n coerceVersion,\n computeHash,\n applyPatch as coreApplyPatch,\n dedupeRequirements,\n DEFAULT_AGENT_INSTANCE_ID,\n deployedBase,\n deployedDir,\n deployedPaths,\n depToStr,\n ensureRepo,\n extractForPatch,\n factoryAssetRoots,\n generatePatch,\n getGlobalCacheDir,\n getRepoCommit,\n GLOBAL_INSTALL_DIR_NAME,\n globalCacheRoot,\n globalSkaileDir,\n isDeployed,\n loadMcpServerDeclarations,\n loadSkPublishManifest,\n matchPin,\n MAX_PRESET_DEPTH,\n mergeLockFile,\n migrateLegacyDir,\n parseAssetRef,\n parseAssetRefLoose,\n parseRequires,\n PresetDepthError,\n readLinks,\n readLock,\n resolveAll,\n resolveAsset,\n resolveConfiguredDriverTarget,\n resolveGlobalHarnesses,\n resolveGlobalSkWorkspaceConfig,\n resolveRuntimeAssets,\n resolveSkWorkspaceConfig,\n savePatch,\n scanDirectory,\n scanRepo,\n SKAILE_YAML_DEFAULT,\n slugifyAssetName,\n sourceCacheKey,\n sourceShortName,\n storeManifestSlug,\n verifyLock,\n writeLock,\n} from \"@skaile/workspaces/core\";\nimport type { PresetExpansion, ResolveResult } from \"@skaile/workspaces/core\";\nimport type { AssetDefinition, AssetFetcher, Library } from \"@skaile/workspaces/library\";\nimport {\n getStoreManifestsDir,\n missingLibraryDirMessage,\n renamedLibraryName,\n resolveLibraryDir,\n scanUnlistedAssets,\n unregisteredLibraryNames,\n} from \"@skaile/workspaces/library\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\nimport { gt as semverGt } from \"semver\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { commitChanges } from \"./contrib.js\";\nimport type { HistoryEntry } from \"./history.js\";\nimport { appendHistory, clearHistory, getRecentHistory } from \"./history.js\";\nimport {\n type InstalledAgentInstance,\n installAgentInstances,\n removeAgentInstanceRenderings,\n unboundAgentInstances,\n} from \"./install-instances.js\";\nimport type { DeployOptions, ScaffoldOptions } from \"./installer.js\";\nimport {\n canonicalEntryRef,\n createScaffold,\n type DeployableEntry,\n type DeployedDrift,\n deployAll,\n deployedAssetDrift,\n diffDeployedAgent,\n installTargetOf,\n removeAsset,\n} from \"./installer.js\";\nimport { renderMcpServerConfig } from \"./mcp-config.js\";\n\n/**\n * Normalize a git remote URL to a comparable identity so the same repo declared\n * in different syntaxes (`https://…`, `git@host:…`, trailing `/`, `.git` suffix,\n * case) compares equal. Used to dedupe the implicit factory source against an\n * explicit user declaration.\n */\nexport function normalizeRepoUrl(url: string): string {\n return url\n .trim()\n .replace(/^git@([^:]+):/, \"https://$1/\") // git@host:org/repo → https://host/org/repo\n .replace(/^[a-z]+:\\/\\//i, \"\") // drop scheme\n .replace(/\\/+$/, \"\")\n .replace(/\\.git$/i, \"\")\n .replace(/\\/+$/, \"\")\n .toLowerCase();\n}\n\n/**\n * `url` without anything secret, for a lock that is committed. A `scheme://` URL loses its\n * password, its query and its fragment (tokens travel there); an http(s) URL loses its user\n * name too, an ssh-style one keeps a bare user name (`ssh://git@host/…` holds no secret). A\n * `scheme://` URL the parser rejects (an unescaped `/` in the userinfo) loses everything up to\n * its last `@`. A path or an scp-style `git@host:path` has no secret and stays as written.\n */\nfunction withoutUrlSecrets(url: string): string {\n if (!/^[a-z][a-z0-9+.-]*:\\/\\//i.test(url)) return url;\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\" || parsed.password) {\n parsed.username = \"\";\n }\n parsed.password = \"\";\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n } catch {\n return url.replace(/[?#].*$/, \"\").replace(/^([a-z][a-z0-9+.-]*:\\/\\/).*@/i, \"$1\");\n }\n}\n\n/**\n * The remote URL a lock records for `library`: its git remote without secrets (see\n * {@link withoutUrlSecrets}), or `undefined` for a library without a remote (a local library).\n */\nfunction libraryRemoteUrl(library: Library): string | undefined {\n const config = library.backendConfig;\n if (library.backend !== \"git\" || !(\"url\" in config) || typeof config.url !== \"string\") {\n return undefined;\n }\n const url = config.url.trim();\n return url ? withoutUrlSecrets(url) : undefined;\n}\n\n/**\n * Absolute path to a source URL's curated store manifest\n * (`~/.skaile/store/manifests/<slug>.yaml`, authored by `source manifest init`).\n * Keyed by the collision-free {@link storeManifestSlug}, matching the CLI writer\n * + the `source add` overlay reader, so the provenance walker honors the same\n * curated inventory `search --local` shows.\n */\nfunction storeOverlayPathForUrl(url: string): string {\n return join(getStoreManifestsDir(), `${storeManifestSlug(url)}.yaml`);\n}\n\n/**\n * Declared pin per source cache key. Every entry point that hands `sources:`\n * declarations to `ensureRepo` MUST pass these through — an unpinned managed\n * clone is pulled to the branch tip, so a dropped pin silently moves a pinned\n * source (and, from `lock()`, launders the branch-tip SHA into the lockfile).\n */\nfunction pinsBySlug(sources: SourceEntry[]): Map<string, string | undefined> {\n return new Map(sources.map((s) => [sourceCacheKey(s.url), s.pin]));\n}\n\n/** Primary manifest filename for each asset kind (the deploy entry point). */\nconst MD_BY_KIND: Record<string, string> = {\n skill: \"SKILL.md\",\n agent: \"AGENT.md\",\n \"mcp-server\": \"MCP.md\",\n connector: \"CONNECTOR.md\",\n prompt: \"PROMPT.md\",\n contract: \"CONTRACT.md\",\n};\n\n/**\n * Pick a candidate's primary manifest file from its `files[]`. Fixed-name kinds\n * (skill/agent/contract/…) match their `MD_BY_KIND` basename; `prompt` and\n * `flow` use their `<name>.prompt.md` / `<name>.flow.{yaml,json}` suffixes\n * (these have no fixed basename, so an exact-name match alone would miss them).\n */\nfunction matchManifestPath(kind: string, paths: readonly string[]): string | undefined {\n const exact = MD_BY_KIND[kind];\n if (exact) {\n const hit = paths.find((p) => p.endsWith(exact));\n if (hit) return hit;\n }\n if (kind === \"preset\") return paths.find((p) => p.endsWith(\".preset.yaml\"));\n if (kind === \"prompt\") return paths.find((p) => p.endsWith(\".prompt.md\"));\n if (kind === \"flow\") {\n return paths.find((p) => p.endsWith(\".flow.yaml\") || p.endsWith(\".flow.json\"));\n }\n return undefined;\n}\n\n/**\n * Drop a publisher scope so a declared `@pub/name` compares equal to an on-disk\n * / declared `name` (both directions are checked at the call sites).\n */\nfunction unscopedName(x: string): string {\n return x.includes(\"/\") ? x.split(\"/\").pop()! : x;\n}\n\n/**\n * Longest common leading directory prefix across `paths` (slash-joined, no\n * trailing slash). Mirrors the prefix-strip `installFromManifest` flat mode\n * applies, so a staged asset's manifest can be located deterministically.\n */\nfunction commonDirPrefix(paths: readonly string[]): string {\n if (paths.length === 0) return \"\";\n const dirs = paths.map((p) => p.split(\"/\").slice(0, -1));\n let common = dirs[0]!;\n for (let i = 1; i < dirs.length && common.length > 0; i++) {\n const segs = dirs[i]!;\n let n = 0;\n while (n < common.length && n < segs.length && common[n] === segs[n]) n++;\n common = common.slice(0, n);\n }\n return common.join(\"/\");\n}\n\n/**\n * An asset's `paths` relative to its primary manifest's directory, `manifestRel`\n * (both in one coordinate space), dropping anything outside it. This is the file\n * set a deploy copies: exactly what the lock records for the asset, so a deployed\n * tree never differs from its lock (a `.gitignore` or a `resources/` dir the kind's\n * convention filter would not pick is still the asset's).\n */\nfunction filesUnderManifestDir(paths: readonly string[], manifestRel: string): string[] {\n const manifestDir = posix.dirname(manifestRel);\n return paths\n .map((p) => posix.relative(manifestDir, p))\n .filter((rel) => rel !== \"\" && !rel.startsWith(\"..\"));\n}\n\n/**\n * Index lock entries by their `<kind>:<name>` suffix for deployed-asset lookup.\n * Only entries whose canonical key fully parses (kind, name, publisher, version)\n * are included.\n */\nfunction indexLockByKindName(\n lock: LockFile | null,\n): Map<string, { publisher: string; version: string; url: string; library: boolean }> {\n const lockByKindName = new Map<\n string,\n { publisher: string; version: string; url: string; library: boolean }\n >();\n for (const [key, entry] of Object.entries(lock?.assets ?? {})) {\n const parsed = parseCanonicalLockKey(key);\n if (parsed.kind && parsed.name && parsed.publisher && parsed.version) {\n lockByKindName.set(`${parsed.kind}:${parsed.name}`, {\n publisher: parsed.publisher,\n version: parsed.version,\n url: entry.source?.url ?? \"\",\n library: entry.library !== undefined,\n });\n }\n }\n return lockByKindName;\n}\n\n/**\n * Snapshot of the local index's library side: the registered libraries and every\n * indexed asset definition. Library assets are bytes on disk; the index is the\n * authority on their *version* (a `skaile.manifest.yaml` `assets[].version` can\n * differ from the asset's own frontmatter) and content hash.\n */\ninterface LibraryIndexSnapshot {\n libraries: Library[];\n defs: AssetDefinition[];\n}\n\n/**\n * Commits in `from..to` of the clone at `repoDir`. The caller already knows the\n * two commits differ: a lock that is ahead of the clone (git exits 0 with `0`) is\n * not behind, but an unreadable range (shallow clone, rewritten history, a commit\n * that is not a plain hex id) still counts as one commit. Results are memoised in\n * `cache` per `(from, to)` pair; one `outdated()` call owns that map.\n */\nfunction commitsBetween(\n repoDir: string,\n from: string,\n to: string,\n cache: Map<string, number>,\n): number {\n const key = `${from}..${to}`;\n const hit = cache.get(key);\n if (hit !== undefined) return hit;\n let count = 1;\n // `from` comes from the committed lock file: never let it reach git's argv as an option.\n if (COMMIT_ID.test(from) && COMMIT_ID.test(to)) {\n const r = spawnSync(\"git\", [\"-C\", repoDir, \"rev-list\", \"--count\", key], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (r.status === 0) {\n const n = Number.parseInt(r.stdout.trim(), 10);\n if (Number.isFinite(n) && n >= 0) count = n;\n }\n }\n cache.set(key, count);\n return count;\n}\n\nconst COMMIT_ID = /^[0-9a-f]{7,64}$/;\n\n/**\n * `kind:name` → sha256 of every asset in the library at `libPath`, hashed from\n * the files on disk by the same discovery pass `skaile library index` runs. The\n * publisher only affects refs, never the hash, so a manifest-less library gets a\n * placeholder. Memoised per root in `cache` for one lock/restore pass.\n */\nfunction libraryDiskHashes(\n libPath: string,\n cache: Map<string, Map<string, string>>,\n registry: IAssetKindRegistry,\n): Map<string, string> {\n let hashes = cache.get(libPath);\n if (!hashes) {\n const sourceConfig = readManifestSourceConfig(libPath, \"library\") ?? {\n version: 1,\n publisher_default: \"@library\",\n default_ref: \"main\",\n publisher_overrides: [],\n dev_paths: [],\n };\n hashes = new Map(\n discoverAssetsInTree(libPath, { sourceConfig, registry }).assets.map((a) => [\n `${a.kind}:${a.name}`,\n a.sha256,\n ]),\n );\n cache.set(libPath, hashes);\n }\n return hashes;\n}\n\n/** `true` when the library's own `skaile.manifest.yaml` has an `assets:` list, even an empty one. */\nfunction manifestFileHasAssetsArray(libPath: string): boolean {\n try {\n const doc = parseYaml(readFileSync(join(libPath, \"skaile.manifest.yaml\"), \"utf8\")) as {\n assets?: unknown;\n } | null;\n return Array.isArray(doc?.assets);\n } catch {\n return false;\n }\n}\n\n/**\n * `true` when the library at `libPath` has a first-party `skaile.manifest.yaml` that\n * carries an `assets:` inventory (`library index` writes one, even an empty one) and none\n * of its entries' `root:` holds `entry`'s manifest file. Such an asset is on disk yet not\n * indexed: a deploy would copy only the kind's default file set and drop its helper\n * files (or deploy an asset `library index` refused), so `add` refuses and names\n * `skaile library index`. A library with no manifest file, a manifest without `assets:`\n * (glob mode), or a curated `source:` manifest, has no inventory to be missing from.\n */\nfunction isUnlistedLibraryAsset(entry: { source: string }, libPath: string): boolean {\n const manifest = loadSkPublishManifest(libPath);\n const listed = manifest?.assets ?? [];\n if (!manifest || manifest.source) return false;\n if (listed.length === 0 && !manifestFileHasAssetsArray(libPath)) return false;\n const file = resolve(entry.source);\n return !listed.some((a) => {\n if (!a.root || a.source) return false;\n const root = resolve(libPath, a.root);\n return file === root || file.startsWith(root + sep);\n });\n}\n\n/**\n * Give a scanned library entry the file set its content hash covers, so a deploy\n * copies exactly those bytes (every file under the manifest entry's `root:`, or\n * its explicit `files:`) instead of the kind's convention filter, which drops a\n * skill's `build.py` / `template.html` / `example.data/`. Same discovery pass as\n * {@link libraryDiskHashes} and `skaile library publish`, so the deployed tree\n * never differs from what the lock hashed. A library without `assets:` in its\n * `skaile.manifest.yaml` (glob mode), or an entry discovery rejected, keeps the\n * kind's default filter — the entry is returned untouched.\n *\n * @param cache - Per library root: manifest path → asset files relative to the\n * manifest's directory. Memoised for one resolution pass.\n */\nfunction withLibraryFiles<E extends DeployableEntry>(\n entry: E,\n libPath: string,\n cache: Map<string, Map<string, string[]>>,\n registry: IAssetKindRegistry,\n): E {\n let byManifest = cache.get(libPath);\n if (!byManifest) {\n byManifest = new Map();\n const sourceConfig = readManifestSourceConfig(libPath, \"library\");\n if (sourceConfig && isManifestMode(sourceConfig)) {\n for (const a of discoverAssetsInTree(libPath, { sourceConfig, registry }).assets) {\n const { assetRoot, files } = a.fileFilter;\n byManifest.set(\n resolve(a.manifestPath),\n filesUnderManifestDir(files, relative(assetRoot, a.manifestPath).split(sep).join(\"/\")),\n );\n }\n }\n cache.set(libPath, byManifest);\n }\n const files = byManifest.get(resolve(entry.source));\n if (files) entry.files = files;\n return entry;\n}\n\n/**\n * The highest-versioned indexed definition of `kind:@publisher/name` held by the\n * library named `libraryName`, or `undefined` when the library is unknown to the\n * index or has not indexed the asset. Stored publishers may carry the `@` scope\n * sigil, so both sides are compared bare.\n */\nfunction newestLibraryDef(\n snap: LibraryIndexSnapshot | null,\n libraryName: string,\n id: { kind: string; publisher: string; name: string },\n): AssetDefinition | undefined {\n const lib = snap?.libraries.find((l) => l.name === libraryName);\n if (!snap || !lib) return undefined;\n let best: AssetDefinition | undefined;\n for (const d of snap.defs) {\n if (d.libraryId !== lib.id || d.kind !== id.kind || d.name !== id.name) continue;\n if (d.publisher.replace(/^@/, \"\") !== id.publisher) continue;\n if (!best || semverGt(coerceVersion(d.version), coerceVersion(best.version))) best = d;\n }\n return best;\n}\n\n/** One row of {@link AssetManager.libraryHolders}: a library holding a ref at one version. */\nexport interface LibraryHolder {\n library: string;\n version: string;\n description: string;\n /** `true` for the holder `add <ref>` deploys. */\n picked: boolean;\n}\n\n/**\n * One origin that holds a ref, see {@link AssetManager.refOrigins}: the bundled factory\n * source, a project source clone, or a registered library.\n */\nexport interface RefOrigin {\n kind: \"factory\" | \"source\" | \"library\";\n /** `factory`, the source's short name, or the library name. */\n label: string;\n version: string;\n description: string;\n}\n\n/** Kind, name and bare publisher of an asset, as far as known; compared for deploy-folder clashes. */\ninterface FolderIdentity {\n kind?: string;\n name?: string;\n publisher?: string;\n}\n\n/**\n * Sort order of library candidates for one ref: highest version first; an equal version\n * goes to the default library, then by library name — so the pick never depends on scan order.\n */\nfunction libraryPreference(\n isDefaultLib: Map<string, boolean>,\n): (\n a: { entry: CatalogEntry; library: string },\n b: { entry: CatalogEntry; library: string },\n) => number {\n return (a, b) => {\n const va = coerceVersion(a.entry.version ?? \"\");\n const vb = coerceVersion(b.entry.version ?? \"\");\n if (semverGt(va, vb)) return -1;\n if (semverGt(vb, va)) return 1;\n const da = isDefaultLib.get(a.library) ? 0 : 1;\n const db = isDefaultLib.get(b.library) ? 0 : 1;\n return da - db || a.library.localeCompare(b.library);\n };\n}\n\n/** Library leg of a resolution: matched deploy entries, the refs they cover, and their library. */\ninterface LibraryResolution {\n entries: DeployableEntry[];\n resolved: Set<string>;\n libraryOf: Map<CatalogEntry, string>;\n}\n\n/** Where a ref that misses went when its publisher changed: see {@link AssetManager.publisherChangeHints}. */\ninterface PublisherChange {\n /** The lock holds the same kind + name under this other publisher, from the library that now publishes it elsewhere. */\n lockedAs?: string;\n /** A registered library holds the same kind + name under another publisher: its ref and library name. */\n moved?: { ref: string; library?: string };\n}\n\n/**\n * Qualify a dependency ref with `fallback` (the declaring asset's publisher) when it\n * names none: `name` / `kind:name[#pin]` become `kind:@fallback/name[#pin]`. A ref\n * that already carries a scope is returned unchanged. Same rule `resolveAll` applies\n * to a source/store candidate's transitive deps.\n */\nfunction qualifyDepRef(ref: string, fallback: string): string {\n const hash = ref.indexOf(\"#\");\n const head = hash === -1 ? ref : ref.slice(0, hash);\n if (head.includes(\"@\") || !fallback) return ref;\n const pin = hash === -1 ? undefined : ref.slice(hash + 1) || undefined;\n const colon = head.indexOf(\":\");\n return assetRefToStr({\n kind: colon === -1 ? \"skill\" : head.slice(0, colon),\n name: colon === -1 ? head : head.slice(colon + 1),\n publisher: fallback,\n pin,\n });\n}\n\n/**\n * Every dependency a library asset declares, as publisher-qualified refs: bundle\n * `dependencies` (raw refs) plus `requires` (as parsed by `parseRequires`, which also\n * carries a manifest entry's `dependencies`). A dependency without a publisher inherits\n * the declaring asset's (same-library assumption); `@publisher/name` ones keep theirs.\n */\nfunction libraryEntryDepRefs(e: CatalogEntry): string[] {\n const publisher = e.publisher ?? \"\";\n const refs = new Set<string>();\n for (const d of e.dependencies ?? []) {\n if (d) refs.add(qualifyDepRef(d, publisher));\n }\n for (const r of e.requires ?? []) {\n const p = r.publisher ?? publisher;\n if (p) refs.add(assetRefToStr({ kind: r.kind, name: r.name, publisher: p, pin: r.pin }));\n }\n return [...refs];\n}\n\n/** `<publisher>/<kind>:<name>` identity of a publisher-qualified ref; `null` when unparseable or unqualified. */\nfunction refIdentity(ref: string): string | null {\n try {\n const p = parseAssetRef(ref);\n return p.publisher ? `${p.publisher}/${p.kind}:${p.name}` : null;\n } catch {\n return null;\n }\n}\n\n/** Derive an asset's sync status from its repository's live status. */\nfunction computeSyncStatus(repoStatus: RepoStatusInfo | undefined): string {\n if (!repoStatus) return \"unknown\";\n if (repoStatus.kind === \"local\") return \"local\";\n if (repoStatus.error) return \"error\";\n if (repoStatus.upToDate) return \"synced\";\n return \"outdated\";\n}\n\n/**\n * Group overview entries by publisher, sort publishers alphabetically, and sort\n * entries within each publisher by kind then name.\n */\nfunction groupAndSortByPublisher(entries: OverviewEntry[]): Map<string, OverviewEntry[]> {\n const byPublisher = new Map<string, OverviewEntry[]>();\n for (const e of entries) {\n if (!byPublisher.has(e.publisher)) byPublisher.set(e.publisher, []);\n byPublisher.get(e.publisher)!.push(e);\n }\n\n const sorted = new Map<string, OverviewEntry[]>();\n for (const key of [...byPublisher.keys()].sort()) {\n sorted.set(\n key,\n byPublisher\n .get(key)!\n .sort((a, b) =>\n a.kind !== b.kind ? a.kind.localeCompare(b.kind) : a.name.localeCompare(b.name),\n ),\n );\n }\n return sorted;\n}\n\n/**\n * Parse a canonical lock key (`<kind>:@<publisher>/<name>#<version>`) into its\n * parts. The lock key is a canonical asset ref, so this delegates to the one ref\n * parser; `AssetRef.pin` is exposed as `version` so the callers' destructuring is\n * unchanged. Stays total — callers rely on `{}`-then-`continue`, but `parseAssetRef`\n * throws, so a genuinely malformed key is caught and returned as `{}`.\n *\n * A **content-sha pseudo-version** key (`#0.0.0-sha.<hash>`, the version every\n * manifest-less source gets) fails `parseAssetRef`'s canonical-pin check. Dropping\n * it to `{}` would strip the identity, so the install reconcile / state machine\n * could never act on such an asset (it silently survives a remove-from-yaml). Fall\n * back to parsing the bare identity, keeping the raw pin as `version`.\n *\n * @internal Exported for unit tests; not part of the stable public surface.\n */\nexport function parseCanonicalLockKey(key: string): {\n publisher?: string;\n kind?: string;\n name?: string;\n version?: string;\n} {\n try {\n const ref = parseAssetRef(key);\n return {\n publisher: ref.publisher,\n kind: ref.kind,\n name: ref.name,\n version: ref.pin,\n };\n } catch {\n // Reuse the shared pin-tolerant parse for the identity; keep the raw pin.\n const loose = parseAssetRefLoose(key);\n if (!loose) return {};\n const hash = key.indexOf(\"#\");\n return {\n publisher: loose.publisher,\n kind: loose.kind,\n name: loose.name,\n version: hash < 0 ? undefined : key.slice(hash + 1),\n };\n }\n}\n\n/**\n * Bare asset name of a soft-dep target ref (`@pub/name@ver` → `name`); splits the\n * version off the *last* `@` since the leading one is the scope sigil. The\n * present-check matches on this bare name only (under-reports — the safe direction).\n */\nexport function softDepName(ref: string): string {\n const at = ref.lastIndexOf(\"@\");\n const base = at > 0 ? ref.slice(0, at) : ref;\n const slash = base.lastIndexOf(\"/\");\n return slash >= 0 ? base.slice(slash + 1) : base;\n}\n\n/**\n * Build a **version-less** dep ref (`kind:@publisher/name`) for the `skaile add`\n * suggestion. Omits the version: a manifest-less source resolves under a content-sha\n * pin the index's frontmatter version never matches, so a pinned ref is unaddable.\n */\nfunction depRefFromDef(def: {\n kind: string;\n publisher: string;\n name: string;\n version: string;\n}): string | undefined {\n const publisher = def.publisher.replace(/^@/, \"\");\n if (!publisher) return undefined;\n return assetRefToStr({ kind: def.kind, name: def.name, publisher });\n}\n\n/**\n * Parse a ref for lookup, tolerating a **missing publisher** (`kind:name`, the\n * shape `listDeployed` emits and the strict `parseAssetRef` rejects). Returns\n * `null` when neither kind nor name is recoverable. Unlike {@link parseAssetRefLoose}\n * (publisher-required, only strips a `#pin`), this keeps the publisher optional.\n *\n * @internal Exported for unit tests; not part of the stable public surface.\n */\nexport function parseRefTolerant(ref: string): AssetRef | null {\n try {\n return parseAssetRef(ref);\n } catch {\n const colon = ref.indexOf(\":\");\n if (colon < 0) return null;\n let kind = ref.slice(0, colon).trim();\n // Mirror parseAssetRef's shorthand so a bare `mcp:name` matches `mcp-server` entries.\n if (kind === \"mcp\") kind = \"mcp-server\";\n const hash = ref.indexOf(\"#\", colon);\n const name = ref.slice(colon + 1, hash < 0 ? undefined : hash).trim();\n if (!kind || !name) return null;\n return { kind, name, publisher: undefined };\n }\n}\n\n/**\n * Lock entries a declared ref that no longer resolves keeps: every lock entry of the same\n * kind + name (and publisher, when the ref names one), so `install` neither deletes the\n * deployed files nor drops the pin, plus the `sources[]` rows those entries point at.\n * `refs` are the missed refs that matched an entry.\n */\ninterface KeptLockEntries {\n assets: Record<string, LockEntry>;\n sources: LockFile[\"sources\"];\n refs: Set<string>;\n}\n\nfunction keptLockEntries(prev: LockFile | null, missing: string[]): KeptLockEntries {\n const out: KeptLockEntries = { assets: {}, sources: [], refs: new Set() };\n if (!prev) return out;\n for (const ref of missing) {\n const want = parseRefTolerant(ref.split(\" \")[0] ?? ref);\n if (!want) continue;\n for (const [key, entry] of Object.entries(prev.assets)) {\n // `asset install` entries are carried over separately.\n if (entry.library?.installed) continue;\n const id = parseCanonicalLockKey(key);\n if (id.kind !== want.kind || id.name !== want.name) continue;\n if (want.publisher && id.publisher !== want.publisher) continue;\n out.assets[key] = entry;\n out.refs.add(ref);\n const src = entry.source ? prev.sources.find((s) => s.url === entry.source?.url) : undefined;\n if (src) out.sources.push(src);\n }\n }\n return out;\n}\n\n/** The `presets` slice of a lock built for `presets`: canonical refs, one per preset, sorted; empty when none. */\nfunction presetsLockSlice(presets: readonly PresetExpansion[]): Pick<LockFile, \"presets\"> {\n const refs = [...new Set(presets.map((p) => p.ref))].sort();\n return refs.length > 0 ? { presets: refs } : {};\n}\n\n/** `lock` plus the entries (and their sources) that `install` kept for unresolved refs. */\nfunction withKeptLockEntries(lock: LockFile, kept: KeptLockEntries): LockFile {\n if (Object.keys(kept.assets).length === 0) return lock;\n const sources = new Map(lock.sources.map((s) => [s.url, s]));\n for (const s of kept.sources) if (!sources.has(s.url)) sources.set(s.url, s);\n return {\n ...lock,\n // v4 once a library-origin entry is present (see buildLockFile).\n schema_version:\n lock.schema_version === 4 || Object.values(kept.assets).some((e) => e.library) ? 4 : 3,\n assets: { ...lock.assets, ...kept.assets },\n sources: [...sources.values()].sort((a, b) => a.url.localeCompare(b.url)),\n };\n}\n\n/**\n * Lock keys of `next` whose entry changed against `prev`: the same kind/publisher/name locked\n * at another version, or at the same version with another content hash or source commit.\n * New keys (nothing locked before) and `asset install` entries are not re-locks.\n */\nfunction relockedRefs(prev: LockFile | null, next: LockFile): string[] {\n if (!prev) return [];\n const fingerprint = (e: LockEntry): string =>\n [e.library?.version ?? \"\", e.library?.sha256 ?? e.sha256, e.source?.commit ?? \"\"].join(\"\\0\");\n const out: string[] = [];\n for (const [key, entry] of Object.entries(next.assets)) {\n if (entry.library?.installed) continue;\n const id = parseCanonicalLockKey(key);\n const before = prev.assets[key]\n ? ([key, prev.assets[key]] as const)\n : Object.entries(prev.assets).find(([k]) => {\n const o = parseCanonicalLockKey(k);\n return o.kind === id.kind && o.name === id.name && o.publisher === id.publisher;\n });\n if (!before) continue;\n if (before[0] !== key || fingerprint(before[1]) !== fingerprint(entry)) out.push(key);\n }\n return out;\n}\n\n/** A locked asset that now resolves from another library than its lock entry named. */\nexport interface LibraryMove {\n /** `kind:@publisher/name` (no version). */\n ref: string;\n /** Library name the lock entry recorded. */\n from: string;\n /** Library name the asset resolved from now. */\n to: string;\n}\n\n/**\n * The library-origin entries of `next` whose library differs from the one `prev` locked for the\n * same kind/publisher/name (any version). New assets and `asset install` entries never move.\n */\nfunction libraryMoves(prev: LockFile | null, next: Record<string, LockEntry>): LibraryMove[] {\n if (!prev) return [];\n const out: LibraryMove[] = [];\n for (const [key, entry] of Object.entries(next)) {\n const to = entry.library;\n if (!to || to.installed) continue;\n const id = parseCanonicalLockKey(key);\n for (const [prevKey, before] of Object.entries(prev.assets)) {\n const o = parseCanonicalLockKey(prevKey);\n if (o.kind !== id.kind || o.name !== id.name || o.publisher !== id.publisher) continue;\n const from = before.library;\n if (!from || from.installed || from.name === to.name) continue;\n out.push({ ref: `${id.kind}:@${id.publisher}/${id.name}`, from: from.name, to: to.name });\n break;\n }\n }\n return out;\n}\n\n/**\n * What to do about a locked library asset whose library is not registered (renamed or removed).\n * A lock entry that records the library's remote names it too, and registers the library by it:\n * no registered library has that remote either, or the lookup would have matched it.\n */\nfunction unregisteredLibraryFix(origin: { name: string; url?: string }, ref: string): string {\n const register = origin.url\n ? `\\`skaile library init ${origin.name} --git ${origin.url}\\` (no registered library has the remote ${origin.url} either)`\n : `\\`skaile library init ${origin.name} --path <dir>\\``;\n return `register library \"${origin.name}\" again with ${register}, or drop the dependency with \\`skaile remove ${ref}\\``;\n}\n\n/**\n * Why a declared ref is a gap when no registered library or source holds it: `skaile install`\n * has nothing to resolve it from, so the user registers the library or drops the ref. The one\n * text `check`, `doctor`, `outdated`, `install`, `install --locked`, `why` and `update` print.\n */\nfunction declaredNoHolderReason(ref: string): string {\n return `is declared but no library or source holds it — register the library that holds it with \\`skaile library init <name> --path <dir>\\`, or drop it with \\`skaile remove ${ref.split(\"#\")[0]}\\``;\n}\n\n/** The first half of every \"nothing holds it\" fix: register the library that holds the ref. */\nconst REGISTER_HOLDER =\n \"register the library that holds it with `skaile library init <name> --path <dir>`\";\n\n/**\n * What to do about a requirement of `asset` that no registered library or source holds:\n * `skaile install` has nothing to resolve it from, so the user registers the library that\n * holds it or drops the requirer. The one text `check`, `doctor`, `outdated`, `install` and\n * `add` print.\n */\nfunction requirementNoHolderFix(asset: string): string {\n return `${REGISTER_HOLDER}, or drop ${asset} with \\`skaile remove ${asset}\\``;\n}\n\n/** Whether `ref` names the asset `want` does: same kind and name, same publisher when both carry one. */\nfunction sameAsset(ref: string, want: { kind: string; name: string; publisher?: string }): boolean {\n const p = parseRefTolerant(ref);\n return (\n p !== null &&\n p.kind === want.kind &&\n p.name === want.name &&\n (!want.publisher || !p.publisher || p.publisher === want.publisher)\n );\n}\n\n/**\n * How a library named in a lock entry stands on this machine: usable at `path`, registered but\n * with its directory gone, or not registered at all (renamed away, removed, or never registered\n * here). One result for {@link AssetManager.lockedLibrary}, the only place that decides it.\n * `name` of an `ok` lookup is the name the library is registered under here, which is not the\n * locked name when the lock's remote URL matched another registered library.\n */\ntype LockedLibrary =\n | { state: \"ok\"; path: string; name: string }\n | { state: \"dir-missing\"; path: string }\n | { state: \"unregistered\" };\n\n/** Why a locked library cannot supply its assets, with the fix, for a lookup that is not `ok`. */\nfunction lockedLibraryProblem(\n lookup: Exclude<LockedLibrary, { state: \"ok\" }>,\n origin: { name: string; url?: string },\n ref: string,\n): string {\n return lookup.state === \"dir-missing\"\n ? missingLibraryDirMessage({ name: origin.name, path: lookup.path })\n : `library \"${origin.name}\" is not registered — renamed or removed? ${unregisteredLibraryFix(origin, ref)}`;\n}\n\n/** `kind:name` of a {@link LockGap} ref, publisher and pin left out; the raw ref when it does not parse. */\nfunction gapIdentity(ref: string): string {\n const p = parseRefTolerant(ref);\n return p ? `${p.kind}:${p.name}` : ref;\n}\n\n/** Version-agnostic identity of a member ref (see {@link memberIdentity}). */\ninterface MemberIdentity {\n kind: string;\n name: string;\n publisher?: string;\n}\n\n/**\n * Version-agnostic `{ kind, name, publisher? }` of a member ref as a preset may\n * write it: canonical `kind:@pub/name`, bare `kind:name`, or the legacy\n * `kind:name@pub`, each optionally `#pinned`. Publisher is bare (no `@`).\n */\nfunction memberIdentity(ref: string): MemberIdentity | null {\n const parsed = parseRefTolerant(ref.trim());\n if (!parsed) return null;\n let name = parsed.name;\n let publisher = parsed.publisher?.replace(/^@/, \"\") || undefined;\n const slash = name.startsWith(\"@\") ? name.indexOf(\"/\") : -1;\n if (slash > 0) {\n publisher ??= name.slice(1, slash);\n name = name.slice(slash + 1);\n }\n const at = name.indexOf(\"@\");\n if (at > 0) {\n publisher ??= name.slice(at + 1).replace(/^@/, \"\");\n name = name.slice(0, at);\n }\n return { kind: parsed.kind, name, publisher };\n}\n\n/**\n * Find the cached AssetDefinition(s) for an input ref. Tries an exact id match\n * first (canonical refs), then falls back to a name (+publisher/kind when the\n * ref carries them) match so `kind:name` / `kind:@pub/name` inputs resolve. The\n * fallback is version-agnostic, so a lock ref pinned at a content-sha\n * pseudo-version still matches the index def stored under a canonical semver.\n */\nfunction matchDefsForRef<T extends { id: string; kind: string; name: string; publisher: string }>(\n defs: T[],\n ref: string,\n): T[] {\n const exact = defs.filter((d) => d.id === ref);\n if (exact.length > 0) return exact;\n const parsed = parseAssetRefLoose(ref);\n if (!parsed) return [];\n const wantPub = parsed.publisher?.replace(/^@/, \"\");\n return defs.filter(\n (d) =>\n d.name === parsed.name &&\n d.kind === parsed.kind &&\n (wantPub === undefined || d.publisher.replace(/^@/, \"\") === wantPub),\n );\n}\n\n/**\n * Reconciliation state of a declared dependency relative to the lock + disk.\n * `invalid` flags a `dependencies:` entry that isn't a parseable canonical ref —\n * surfaced (not silently dropped) so a `skaile.yaml` typo is visible.\n */\nexport type DeclaredState = \"declared\" | \"installed\" | \"drift\" | \"invalid\";\n\n/**\n * A top-level dependency declared in `skaile.yaml`, annotated with its\n * reconciliation {@link DeclaredState}. Transitive (lock-only) deps are never\n * included — {@link AssetManager.listDeclared} walks the declared set only.\n */\nexport interface DeclaredAsset {\n /** The canonical declared ref exactly as written in `skaile.yaml`. */\n ref: string;\n kind: string;\n name: string;\n state: DeclaredState;\n}\n\n/** A deployed library asset that lacks files of its library entry. See {@link AssetManager.incompleteDeploys}. */\nexport interface IncompleteDeploy {\n /** Canonical ref of the asset. */\n ref: string;\n /** Files the deploy writes that are absent from the deployed directory, relative to it. */\n missing: string[];\n}\n\n/**\n * A tracked asset whose copy still sits in the previous default deploy dir\n * (`.claude/…`) although the project now deploys to another harness. See\n * {@link AssetManager.listLegacyClaudeDeployed}.\n */\nexport interface LegacyDeployedAsset {\n kind: string;\n name: string;\n /** Absolute path of the stale copy. */\n path: string;\n}\n\n/**\n * A global declared dependency from `~/.skaile/skaile.yaml`, reconciled against\n * **one** harness's global deploy dir. The same ref yields one entry per global\n * harness (see {@link AssetManager.globalState}) so an asset can read `installed`\n * for `claude-code` and `drift`/`declared` for `codex` simultaneously.\n */\nexport interface HarnessDeclaredAsset extends DeclaredAsset {\n /** The global harness this state was reconciled against. */\n harness: DriverTarget;\n}\n\n/** @deprecated Use {@link HarnessDeclaredAsset}; the `backend` field is now `harness`. Removed in the next major. */\nexport type BackendDeclaredAsset = HarnessDeclaredAsset;\n\n/**\n * A body-link soft-dependency edge: asset `from` references target `to` in its\n * body (not its typed `requires`). `toRef` is the parseable `skaile add` ref when\n * the target is in the index, omitted otherwise. Surfaced read-only — never\n * auto-installed (see {@link AssetManager.softDepsOf} / {@link AssetManager.reportSoftDeps}).\n */\nexport interface SoftDepEdge {\n from: string;\n to: string;\n toRef?: string;\n}\n\n/**\n * A soft-dependency target that would be left orphaned by removing some assets:\n * it is still present in the project, came in as `from`'s soft dependency, and\n * nothing else still needs it (neither a soft-dep nor a typed `requires`).\n * Report-only — {@link AssetManager.orphanedSoftDepsAfterRemoving} never removes\n * it; the caller prompts (default No). `targetRef` is the parseable `skaile\n * remove` ref when the target is in the index.\n */\nexport interface OrphanedSoftDep {\n from: string;\n target: string;\n targetRef?: string;\n}\n\n/**\n * Thrown by {@link AssetManager.listDeclared} when the project has no\n * `skaile.yaml`. The CLI maps this to a `skaile init` hint.\n */\nexport class MissingManifestError extends Error {\n constructor(readonly projectDir: string) {\n super(`No skaile.yaml in ${projectDir}.`);\n this.name = \"MissingManifestError\";\n }\n}\n\nexport type { HistoryEntry } from \"./history.js\";\nexport {\n appendHistory,\n clearHistory,\n getRecentHistory,\n loadHistory,\n} from \"./history.js\";\n// Re-export sub-modules\nexport type { DeployOptions, ScaffoldOptions } from \"./installer.js\";\nexport type { DeployableEntry } from \"./installer.js\";\nexport {\n createScaffold,\n deployAll,\n installTargetOf,\n removeAsset,\n SCAFFOLD_KINDS,\n} from \"./installer.js\";\nexport type {\n RenderMcpConfigOptions,\n RenderMcpConfigResult,\n SkippedMcpServer,\n} from \"./mcp-config.js\";\nexport { renderMcpServerConfig } from \"./mcp-config.js\";\nexport type { Log } from \"./renderers.js\";\nexport { renderAgentToFramework } from \"./renderers.js\";\n// Contrib helpers (commitChanges et al.) are still used internally by the\n// patch-submit flow but are no longer part of the public API surface — the\n// `skaile repo contrib *` command tree was removed on 2026-05-12.\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Metadata about a repository declared in `skaile.yaml`.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface RepoInfo {\n /** Repository name as declared in `skaile.yaml`. */\n name: string;\n /** How the repo is sourced: cloned from a URL, mounted from a local path, or symlinked via `skaile repo link`. */\n kind: \"local\" | \"remote\" | \"linked\";\n /** Remote URL (present when `kind === \"remote\"`). */\n url?: string;\n /** Filesystem path (present when `kind === \"local\"` or `kind === \"linked\"`). */\n path?: string;\n /** Git branch configured for this repository. */\n branch: string;\n /** Whether the repository has been cloned/resolved locally. */\n cloned: boolean;\n}\n\n/**\n * Live sync status for a repository.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface RepoStatusInfo {\n /** Repository name as declared in `skaile.yaml`. */\n name: string;\n /** How the repo is sourced. */\n kind: \"local\" | \"remote\" | \"linked\";\n /** Number of commits the local clone is behind the remote. */\n behind: number;\n /** `true` when the local clone matches the remote HEAD. */\n upToDate: boolean;\n /** Error message when status check failed. */\n error?: string;\n}\n\n/** One deployed copy `install` made equal to its locked bytes again. */\nexport interface RestoredAsset {\n /** Canonical ref of the asset. */\n ref: string;\n /** Deployed files whose hand edit was overwritten (project-relative POSIX paths). */\n restored: string[];\n /** Files the asset does not ship that were deleted from its deployed directory. */\n removed: string[];\n}\n\n/** One asset `install` moved from one locked version to another. */\nexport interface ReplacedAsset {\n /** `kind:@publisher/name`, no version. */\n ref: string;\n from: string;\n to: string;\n}\n\n/**\n * Result of a full `skaile install` or `skaile add` run.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface InstallResult {\n /** Canonical refs (`kind:@publisher/name#version`) successfully deployed in this run. */\n deployed: string[];\n /** Asset refs (`kind:name`) removed because they are no longer in the resolved set. */\n removed: string[];\n /**\n * Asset refs that could not be resolved in any configured repository. On the\n * non-locked path every entry is a bare ref; the reason a miss happened lives in\n * {@link InstallResult.missingHints}. The `--locked` path still appends its prose\n * (`ref (not found in library \"x\")`) to the entry, and also lists every\n * {@link AssetManager.projectState} gap (a declared dependency or a locked asset's\n * `requires` with no lock entry, a lock that contradicts a `skaile.yaml` pin, a library\n * that cannot supply a locked asset) as its one-line message.\n */\n missing: string[];\n /**\n * Why a ref in {@link InstallResult.missing} may have missed, keyed by that ref:\n * the asset's publisher changed (`library set publisher=`), so the lock still holds\n * it under the old one and/or a library now holds it under another. Parenthesised\n * parts such as `did you mean skill:@acme/x?` and\n * `locked as skill:@plain/x; run skaile install to re-resolve`. Only refs with a\n * hint appear; absent when none has.\n */\n missingHints?: Record<string, string>;\n /**\n * Lock keys whose entry `install` rewrote for an asset that was already locked: the\n * library or source holds another version of it, or the same version with other\n * content. A re-lock can happen with nothing to deploy. Absent when none changed.\n */\n relocked?: string[];\n /**\n * Library-origin assets whose lock entry now names another library than before. `install`\n * keeps a locked asset on its library; only `update`, a pin, or a locked library that no\n * longer holds the asset moves it. Absent when none moved.\n */\n moved?: LibraryMove[];\n /**\n * Assets whose locked version `install` replaced with another version of the same asset\n * (`ref` is `kind:@publisher/name`). Not part of {@link InstallResult.removed}: nothing\n * left the project. Absent when none changed.\n */\n replaced?: ReplacedAsset[];\n /**\n * Deployed copies `install` made equal to their locked bytes again: a file edited by hand\n * (`restored`) or an extra file in the asset directory (`removed`), both as project-relative\n * POSIX paths. Absent when every deployed copy already matched.\n */\n restored?: RestoredAsset[];\n /** Whether `skaile.lock.yaml` was written or updated. */\n lockWritten: boolean;\n /**\n * npm packages installed as a side effect of resolving runtime asset peer\n * deps (connectors / mounts declared in skaile.yaml). Empty when nothing\n * needed installing or when the runtime-deps step was skipped.\n */\n npmInstalled?: string[];\n /**\n * npm packages that the runtime-deps step tried but failed to install.\n * Non-fatal — listed for telemetry and CLI reporting.\n */\n npmFailed?: string[];\n /**\n * One entry per `preset:` dependency expanded into this install (nested presets\n * included): how many asset items joined the install set and how many instance\n * items (`library://`, placeholders) were skipped.\n */\n presets?: PresetExpansion[];\n /**\n * One entry per `skaile.yaml` agent instance (`agent:` as `default`, plus\n * `agents:`) rendered into the target harness's native agent files, with the\n * workspace-relative paths written. Absent for `--global` installs and\n * harnesses without a native agent format.\n */\n agentInstances?: InstalledAgentInstance[];\n /**\n * Workspace-relative native agent files removed because their instance left\n * `skaile.yaml` (only files an earlier `skaile install` rendered are ever removed).\n */\n agentFilesRemoved?: string[];\n /**\n * Agent instances of `skaile.yaml` whose `ref` resolves to no agent (never added, or gone):\n * one message each. Their earlier rendering is kept. `skaile install` fails on a non-empty list.\n */\n agentInstanceErrors?: string[];\n}\n\n/**\n * An installed asset whose source repository is behind the remote.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface OutdatedEntry {\n /** Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`). */\n kind: string;\n /** Asset name as registered in the catalog. */\n name: string;\n /** Repository that provides this asset. */\n publisher: string;\n /** Version string recorded in the lock file at install time. */\n currentVersion: string;\n /** Number of commits the local repository is behind the remote (always 0 for a library asset). */\n behind: number;\n /** Library-origin asset only: the version the library index now offers (newer than `currentVersion`). */\n latestVersion?: string;\n /** Library-origin asset only: name of the library the asset was locked from. */\n library?: string;\n /**\n * Set when the locked asset cannot be checked or is not in place: its library is\n * not registered (renamed or removed), its deployed copy is gone, or the lock does not\n * cover it ({@link AssetManager.projectState}). Such a row has no `latestVersion`.\n */\n problem?: string;\n /**\n * Library-origin asset only: the library's files on disk differ from the content\n * hash recorded in the lock at the same version (edited in place, no version bump).\n * `skaile update` (or `skaile install`) re-locks and re-deploys them.\n */\n contentChanged?: boolean;\n /**\n * Set on a `problem` row whose cause `skaile install` cannot fix: the asset's library is\n * gone or its publisher changed, so the ref resolves nowhere. `problem` names what to\n * change instead (`skaile library init …`, the ref under its new publisher).\n */\n manualFix?: true;\n}\n\n/**\n * Outcome of `AssetManager.diff()` — distinguishes an unknown ref from a real\n * \"no differences\" so callers never conflate the two.\n *\n * - `not-found` — the ref resolves to no asset (source, store or library).\n * - `not-deployed` — the asset resolves, but there is no deployed copy to compare.\n * - `identical` — the deployed copy matches the source.\n * - `differs` — the deployed copy differs; `diff` carries the unified diff.\n * - `no-files` — the asset kind has no files of its own (a preset: its items are the assets to\n * compare) and the lock records it.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport type DiffResult =\n | { status: \"not-found\" }\n | { status: \"not-deployed\" }\n | { status: \"identical\" }\n | { status: \"no-files\" }\n | { status: \"differs\"; diff: string };\n\n/**\n * A node in the resolved dependency tree (returned by `AssetManager.tree()`).\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface DependencyNode {\n /** Lock key (`kind:@publisher/name#version`), or `\"project\"` for the root node. */\n ref: string;\n /** Assets this node requires, nested under it. */\n children: DependencyNode[];\n}\n\n/** Outcome of {@link AssetManager.removeWithDependencies}. */\nexport interface RemoveResult {\n /** Whether anything changed (as {@link AssetManager.remove}). */\n changed: boolean;\n /** Canonical refs (`kind:@publisher/name`) of the orphaned dependencies dropped as well. */\n pruned: string[];\n /**\n * Set when the removal was refused because other assets still require it; nothing was\n * removed. `ref` is the asset (`kind:@publisher/name`), `requiredBy` the refs requiring it.\n */\n blocked?: { ref: string; requiredBy: string[] };\n}\n\n/** Identity {@link AssetManager.remove} acts on; `publisher` is absent for an unqualified short ref. */\ninterface RemoveTarget {\n kind: string;\n name: string;\n publisher?: string;\n}\n\n/**\n * A missing dependency detected by `AssetManager.doctor()`.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface DepIssue {\n /** Kind of the asset that has the unsatisfied requirement. */\n assetKind: string;\n /** Name of the asset that has the unsatisfied requirement. */\n assetName: string;\n /** Kind of the missing dependency. */\n depKind: string;\n /** Name of the missing dependency (`@<publisher>/<name>` when it names a publisher). */\n depName: string;\n /** `true` when the missing dependency exists in a configured repository but has not been installed. */\n inRepos: boolean;\n /**\n * `true` when the asset itself is lock-managed but no source or library holds it\n * any more, so its `requires` cannot be checked. `depKind`/`depName` repeat the asset.\n */\n unresolved?: boolean;\n /**\n * Set with `unresolved` when the lock ties the asset to a library: what to change\n * (`register library \"x\" again with …`, `did you mean <ref>?`). `skaile install`\n * cannot restore it. Absent when the lock names no library for it.\n */\n fix?: string;\n}\n\n/**\n * One way the project differs from what it declares and locks; see {@link AssetManager.projectState}.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface LockGap {\n type:\n | \"declared\"\n | \"invalid\"\n | \"drift\"\n | \"pin\"\n | \"requires\"\n | \"unresolved\"\n | \"library\"\n | \"incomplete\"\n | \"content\"\n | \"modified\"\n | \"agent\";\n /** The ref to act on: the declared ref, the unmet dependency `kind:name`, or the asset itself. */\n ref: string;\n /** Set on a `requires` gap: the requiring asset, `kind:@publisher/name` (`kind:name` when the lock knows no publisher). */\n asset?: string;\n /** What is wrong, as a phrase that follows `ref` (e.g. `is declared but not locked — run …`). */\n reason: string;\n /** One line naming the gap, without a leading status mark: `${ref} ${reason}`, except a `requires` gap, which leads with the requiring asset. */\n message: string;\n /** Set when `skaile install` cannot fix the gap; `reason` then names what to change instead. */\n manualFix?: true;\n}\n\n/**\n * The project's state as {@link AssetManager.projectState} computes it: the one verdict\n * `check`, `doctor`, `outdated`, `diff` and `install --locked` share.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface ProjectState {\n /** Every problem, one {@link LockGap} each; empty when the project is as declared and locked. */\n gaps: LockGap[];\n /** What {@link AssetManager.doctor} found: the unmet requirements (a `doctor` table row each) and the locked assets nothing provides. */\n requirements: DepIssue[];\n}\n\n/**\n * A single deployed asset shown in the workspace overview.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface OverviewEntry {\n /** Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`). */\n kind: string;\n /** Asset name. */\n name: string;\n /** Publisher that provides this asset (from the lock file; `\"unknown\"` when unresolvable). */\n publisher: string;\n /** Version string from the lock file. */\n version: string;\n /**\n * Sync status relative to the source repository.\n * - `\"synced\"` — local clone matches remote HEAD\n * - `\"outdated\"` — local clone is behind the remote\n * - `\"local\"` — sourced from a local path, no remote to compare\n * - `\"error\"` — status check failed\n * - `\"unknown\"` — repository not found or lock entry missing\n */\n syncStatus: string;\n}\n\n/**\n * Aggregated workspace overview returned by `AssetManager.overview()`.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface OverviewResult {\n /** Entries grouped by publisher, sorted alphabetically. Each group is sorted by kind then name. */\n byPublisher: Map<string, OverviewEntry[]>;\n /** Total number of deployed assets. */\n total: number;\n /** Sync status for each configured repository. */\n repos: RepoStatusInfo[];\n}\n\n// ── AssetManager ─────────────────────────────────────────────────────────────\n\n/**\n * Options for constructing an {@link AssetManager}.\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport interface AssetManagerOptions {\n /** Absolute or relative path to the workspace root (must contain `skaile.yaml`). */\n projectDir: string;\n /**\n * The process's asset-kind registry — the only authority on which kinds exist.\n * Typed frontmatter whose `type:` is not registered is reported, not catalogued.\n */\n registry: IAssetKindRegistry;\n /**\n * Agent framework to target for asset deployment.\n * Determines which framework directories (``.claude/``, ``.omp/``, etc.) are used.\n * Defaults to the harness the project is configured for (`skaile.yaml`\n * `agent-config.default.driver`, `.skaile/settings.json`), else `\"claude-code\"`.\n */\n driverTarget?: DriverTarget;\n /**\n * When `true`, the manager operates in **global cross-harness** mode: config\n * SSOT, lock, cache, and history root at `~/.skaile` (not the project), the\n * `dependencies:` manifest edits target `~/.skaile/skaile.yaml`, and deploy\n * fans out to every harness in {@link harnesses}. When `false` (default),\n * everything is project-scoped against the single {@link driverTarget}.\n */\n global?: boolean;\n /**\n * Global-mode harness set the deploy fans out to. When omitted in global mode,\n * resolved from `~/.skaile/skaile.yaml` `global_harnesses:` else auto-detection\n * (`resolveGlobalHarnesses`). Ignored in project mode. A `--harness` filter\n * narrows this to a subset.\n */\n harnesses?: DriverTarget[];\n /** @deprecated Use `harnesses`. Honoured only when `harnesses` is absent; removed in the next major. */\n backends?: DriverTarget[];\n /**\n * Catalog read-protocol fetcher used to resolve store-published assets. When\n * omitted, one is built per call from the configured stores\n * (`RemoteCatalogSource`). Injected mainly by tests to stay network-free.\n */\n storeFetcher?: StoreFetcher;\n /**\n * Byte fetcher used to fetch a store asset's files at its pinned commit before\n * deploy. When omitted, the production GitHub fetcher is used. Injected by\n * tests to stay network-free.\n */\n assetFetcher?: AssetFetcher;\n /**\n * Overrides the global `catalog.url` used as a store fallback when the project\n * declares no `stores:`. Pass `\"\"` to disable the fallback entirely. When\n * omitted, the URL is read from `~/.skaile/config.yaml` (`resolveConfig`).\n */\n catalogUrl?: string;\n /**\n * Overrides the index SQLite path read by {@link AssetManager.reportSoftDeps}\n * (default `~/.skaile/index.db` via `resolveIndexPath`). Injected by tests to\n * read a seeded index without touching the user's real one.\n */\n indexPath?: string;\n /**\n * Receives the warning printed when {@link AssetManager.add} picks one ref out of several\n * local libraries (which library was chosen and why); no other method warns. Defaults to\n * `console.warn`\n * with a `skaile:` prefix. A CLI with a live spinner passes a collector and\n * prints the lines after the spinner stops, so frames can't overwrite them.\n */\n onLibraryCollision?: (message: string) => void;\n}\n\n/** Canonical git URL identity for the bundled factory source. Never fetched —\n * the bytes live inside the package (`factory-assets/`); the URL is only the\n * match key the provenance walker and `candidateToCatalogEntry` key off. */\nexport const FACTORY_SOURCE_URL = \"https://github.com/skaile-ai/ai-assets\";\n\n/**\n * Locate the built-in first-party skills/bundles shipped inside the package.\n *\n * Resolves through the shared {@link factoryAssetRoots} helper — the\n * `SKAILE_FACTORY_ASSETS_DIR` override layer (when set) ahead of the bundled\n * tree (in-repo source during dev, `dist/factory-assets/` after install), so a\n * container's override is honoured here identically to `serve`. Returns the\n * highest-precedence root that carries a `skaile.manifest.yaml` (the publication\n * manifest that names the source's publisher), or `null` when none qualifies —\n * the factory source is then simply not injected rather than erroring.\n */\nfunction resolveFactoryAssetsDir(): string | null {\n for (const dir of factoryAssetRoots()) {\n if (existsSync(join(dir, \"skaile.manifest.yaml\"))) return dir;\n }\n return null;\n}\n\n/** Read the declared `publisher` from a source's root `skaile.manifest.yaml`. */\nfunction readDeclaredPublisher(sourceDir: string): string | undefined {\n try {\n const raw = parseYaml(readFileSync(join(sourceDir, \"skaile.manifest.yaml\"), \"utf8\")) as {\n publisher?: unknown;\n } | null;\n return raw && typeof raw.publisher === \"string\" && raw.publisher.length > 0\n ? raw.publisher\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The bundled factory source `{ dir, publisher }`, or `null` when no usable\n * bundle is present. Resolved once per process — the package location and the\n * bundled `skaile.manifest.yaml` are immutable for the process lifetime, so the\n * `require.resolve` + `existsSync` probes + YAML parse run a single time rather\n * than on every `loadConfig()` call. `undefined` = not yet computed.\n */\nlet factorySourceCache: { dir: string; publisher: string } | null | undefined;\n\nfunction resolveFactorySource(): { dir: string; publisher: string } | null {\n if (factorySourceCache !== undefined) return factorySourceCache;\n const dir = resolveFactoryAssetsDir();\n const publisher = dir ? readDeclaredPublisher(dir) : undefined;\n factorySourceCache = dir && publisher ? { dir, publisher } : null;\n return factorySourceCache;\n}\n\n/**\n * Programmatic API for managing AI assets in a Skaile workspace.\n *\n * `AssetManager` wraps repository management, catalog search, asset installation,\n * lock-file tracking, patch workflows, and workspace diagnostics. The CLI delegates\n * all `skaile catalog`, `skaile repo`, `skaile install`, `skaile add`, and\n * `skaile init` commands to this class.\n *\n * @example\n * ```typescript\n * import { AssetManager } from \"@skaile/workspaces/asset-manager\";\n *\n * const am = new AssetManager({ projectDir: \"/my-project\" });\n *\n * // Install all dependencies declared in skaile.yaml\n * const result = await am.install();\n * console.log(`Deployed: ${result.deployed.join(\", \")}`);\n *\n * // Add a single skill (resolves transitive deps, updates skaile.yaml)\n * const deployed = am.add(\"skill:my-skill\");\n *\n * // Search the catalog\n * const skills = am.search(\"code review\", \"skill\");\n * ```\n *\n * @docLink packages/asset-manager/concepts#asset-manager\n */\nexport class AssetManager {\n /** Resolved absolute path to the workspace root. */\n readonly projectDir: string;\n /** Agent framework driver target used for all deploy operations. */\n readonly driverTarget: DriverTarget;\n /** Whether this instance operates in global-install mode. */\n readonly global: boolean;\n /** Asset-kind registry shared with the host (one instance per process). */\n readonly registry: IAssetKindRegistry;\n private _knownKinds?: ReadonlySet<string>;\n /** Explicit global-harness override (global mode only); else auto-resolved. */\n private readonly harnessesOverride?: DriverTarget[];\n /** Injected catalog fetcher (tests / custom); falls back to a built one. */\n private readonly injectedStoreFetcher?: StoreFetcher;\n /** Injected byte fetcher for store staging; falls back to GitHub. */\n private readonly injectedAssetFetcher?: AssetFetcher;\n /** Injected global catalog URL override for the no-project-store fallback. */\n private readonly catalogUrlOverride?: string;\n /** Injected index SQLite path override (tests); else the default index.db. */\n private readonly indexPathOverride?: string;\n /** Sink for cross-library collision warnings; else `console.warn`. */\n private readonly onLibraryCollision?: (message: string) => void;\n /** Store URLs whose failed version lookup was already reported (one warning per URL). */\n private readonly warnedStoreVersionLookups = new Set<string>();\n\n constructor(opts: AssetManagerOptions) {\n this.projectDir = resolve(opts.projectDir);\n this.global = opts.global ?? false;\n this.registry = opts.registry;\n // Project mode deploys into the harness the project is configured for (the\n // `driver` that `skaile config show` resolves); `claude-code` only when the\n // project configures none. Global mode fans out over harnesses instead.\n this.driverTarget =\n opts.driverTarget ??\n (this.global ? undefined : resolveConfiguredDriverTarget(this.projectDir)) ??\n \"claude-code\";\n this.harnessesOverride = opts.harnesses ?? opts.backends;\n this.injectedStoreFetcher = opts.storeFetcher;\n this.injectedAssetFetcher = opts.assetFetcher;\n this.catalogUrlOverride = opts.catalogUrl;\n this.indexPathOverride = opts.indexPath;\n this.onLibraryCollision = opts.onLibraryCollision;\n }\n\n /** Registered kind names — the `knownKinds` argument of the manifest scanners. */\n private get knownKinds(): ReadonlySet<string> {\n this._knownKinds ??= new Set(this.registry.getAllKinds());\n return this._knownKinds;\n }\n\n /**\n * The harness component dir a kind installs into (its provider's\n * `installTarget`), or `undefined` for composition-only kinds, which are only\n * cached in the store cache and composed at session start.\n */\n private installTarget(kind: string): AiComponent | undefined {\n return installTargetOf(this.registry, kind);\n }\n\n /**\n * Root for this manager's **state** — config SSOT, lock, cache, history.\n * `~/.skaile` in global mode (the cross-harness SSOT), else the project dir.\n * Deploy dirs are unaffected; they come from `DRIVER_TARGETS[target]`.\n */\n private get stateRoot(): string {\n return this.global ? globalSkaileDir() : this.projectDir;\n }\n\n /**\n * The harnesses a global deploy fans out to: the explicit `harnesses` override\n * (a `--harness` filter), else `resolveGlobalHarnesses()`. In project mode this\n * is exactly `[driverTarget]`, so the shared fan-out loop degenerates to the\n * single-target path.\n */\n private targetHarnesses(): DriverTarget[] {\n if (!this.global) return [this.driverTarget];\n if (this.harnessesOverride && this.harnessesOverride.length > 0) return this.harnessesOverride;\n return resolveGlobalHarnesses();\n }\n\n private get storeCacheDir(): string {\n if (this.global) return join(globalCacheRoot(), \"store\");\n return migrateLegacyDir(\n join(this.projectDir, \".skaile\", \"cache\", \"store\"),\n join(this.projectDir, \".skaile\", \"store-cache\"),\n );\n }\n\n private get reposDir(): string {\n if (this.global) return join(globalCacheRoot(), \"sources\");\n return migrateLegacyDir(\n join(this.projectDir, \".skaile\", \"cache\", \"sources\"),\n join(this.projectDir, \".skaile\", \"repos\"),\n );\n }\n\n /**\n * Project-scoped cache dirs rooted at `.skaile/cache/` (`store`, `sources`)\n * relative to `projectDir`. Reading is a side effect: it triggers lazy\n * migration of the legacy `.skaile/{store-cache,repos}` dirs.\n */\n get projectCacheDirs(): { store: string; sources: string } {\n return { store: this.storeCacheDir, sources: this.reposDir };\n }\n\n private get lockPath(): string {\n return join(this.stateRoot, \"skaile.lock.yaml\");\n }\n\n private get patchDir(): string {\n return join(this.projectDir, \".skaile\", \"patches\");\n }\n\n /** Deploy options for one harness. In global mode, `driverTarget` is the\n * fan-out target (not the constructor's `driverTarget`, which is project-only). */\n private deployOptsFor(\n target: DriverTarget,\n link?: boolean,\n onSkippedSymlink?: (ref: string, path: string) => void,\n onEnvFile?: (ref: string, path: string) => void,\n ): DeployOptions {\n return {\n registry: this.registry,\n driverTarget: target,\n global: this.global,\n cwd: this.projectDir,\n link: link === true,\n ...(onSkippedSymlink\n ? { onSkippedSymlink: (entry, p) => onSkippedSymlink(canonicalEntryRef(entry), p) }\n : {}),\n ...(onEnvFile ? { onEnvFile: (entry, p) => onEnvFile(canonicalEntryRef(entry), p) } : {}),\n };\n }\n\n /**\n * Render the project's declared MCP servers into the driver target's own\n * native MCP config (`<project>/.mcp.json` for `claude-code`), so the coding\n * agent sees the same servers skaile's agent loop wires up.\n *\n * Project scope only: a `--global` install has no project-scope config to\n * write, and the coding agent's user scope is a large user-state file this\n * must not touch. Never fails an install — a render error is warned and\n * swallowed.\n */\n private async renderDriverMcpConfig(): Promise<void> {\n if (this.global) return;\n try {\n await renderMcpServerConfig(this.projectDir, this.driverTarget);\n } catch (err) {\n console.warn(\n `skaile: could not render MCP config for ${this.driverTarget}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n\n /**\n * Render every agent instance of `skaile.yaml` into the driver target's native\n * agent files (`.claude/agents/<id>.md`, …) and prune the renderings of\n * instances that left the config. Runs after the skills deploy, so composed\n * skills resolve. Project scope only. An instance whose `ref` resolves to no agent is\n * reported in `agentInstanceErrors`; any other render error is warned and swallowed.\n */\n private async renderAgentInstances(): Promise<\n Pick<InstallResult, \"agentInstances\" | \"agentFilesRemoved\" | \"agentInstanceErrors\">\n > {\n if (this.global) return {};\n try {\n const result = installAgentInstances({\n projectDir: this.projectDir,\n driverTarget: this.driverTarget,\n });\n // An `agent:` ref that finds no agent names what to do about it, the same as `check`.\n for (const u of unboundAgentInstances(this.projectDir, this.driverTarget)) {\n if (!u.ref.startsWith(\"agent:\")) continue;\n const at = result.errors.findIndex((e) => e.startsWith(`agent instance \"${u.id}\":`));\n if (at >= 0) result.errors[at] += ` — ${(await this.unboundAgentAdvice(u.ref)).advice}`;\n }\n for (const w of [...result.warnings, ...result.errors]) console.warn(`skaile: ${w}`);\n return {\n agentInstances: result.instances,\n agentFilesRemoved: result.removed,\n ...(result.errors.length > 0 ? { agentInstanceErrors: result.errors } : {}),\n };\n } catch (err) {\n console.warn(\n `skaile: could not render agent instances for ${this.driverTarget}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return {};\n }\n }\n\n private loadConfig(): {\n repositories: Record<string, SourceDeclaration>;\n sources: SourceEntry[];\n stores: StoreEntry[];\n dependencies: string[];\n overrides: OverrideEntry[];\n patches: Record<string, string>;\n config: SkWorkspaceConfig;\n } {\n // resolveSkWorkspaceConfig runs the canonical normalizer and throws on\n // legacy keys (`repositories:` / `ai_resources:`) — propagate to the caller.\n // Global mode reads ONLY the user-scope SSOT (`~/.skaile/skaile.yaml`) so a\n // project's deps never leak into a global fan-out (and vice versa).\n const config = this.global\n ? resolveGlobalSkWorkspaceConfig()\n : resolveSkWorkspaceConfig(this.projectDir);\n\n const sources = config.sources ?? [];\n const stores = config.stores ?? [];\n const dependencies = config.dependencies ?? [];\n const overrides = config.overrides ?? [];\n const patches = config.patches ?? {};\n\n // Source clones live in the global clone cache (cache/sources); the slug is\n // the cache key for ensureRepo. getGlobalCacheDir() migrates legacy roots.\n const sourcesDir = getGlobalCacheDir();\n const repositories: Record<string, SourceDeclaration> = {};\n for (const s of sources) {\n const slug = sourceCacheKey(s.url);\n if (repositories[slug]) continue;\n repositories[slug] = { path: join(sourcesDir, slug), url: s.url };\n }\n\n // Implicit built-in source: the first-party assets shipped inside the\n // package (`dist/factory-assets/`). Always available, zero config — keyed by\n // its declared publisher so refs (`kind:@<publisher>/name`) and `info`\n // resolve cleanly. Skipped when the user already declares the same source\n // explicitly (avoids duplicate catalog entries) or when no bundle is present.\n const factory = resolveFactorySource();\n const factoryUrl = normalizeRepoUrl(FACTORY_SOURCE_URL);\n const alreadyDeclared = Object.values(repositories).some(\n (d) => d.url !== undefined && normalizeRepoUrl(d.url) === factoryUrl,\n );\n if (factory && !alreadyDeclared && !repositories[factory.publisher]) {\n repositories[factory.publisher] = {\n path: factory.dir,\n url: FACTORY_SOURCE_URL,\n factory: true,\n };\n }\n\n return { repositories, sources, stores, dependencies, overrides, patches, config };\n }\n\n /** Build provenance-index clones from the resolved source declarations. */\n private buildClones(repositories: Record<string, SourceDeclaration>): SourceClone[] {\n const clones: SourceClone[] = [];\n for (const [slug, decl] of Object.entries(repositories)) {\n const localPath = this.resolveRepoDir(decl, slug);\n if (!localPath || !existsSync(localPath)) continue;\n const commit = getRepoCommit(localPath) ?? \"0\".repeat(40);\n clones.push({\n localPath,\n sourceUrl: decl.url ?? localPath,\n commit,\n tag: decl.branch,\n // A curated store manifest (`source manifest init` → the flat\n // `~/.skaile/store/manifests/<slug>.yaml`) is the authoritative inventory\n // for a foreign source. Point the walker at it so `add`/resolve honor the\n // curated publisher + asset set — the same overlay `source add` indexed.\n overlayManifestPath: decl.url ? storeOverlayPathForUrl(decl.url) : undefined,\n });\n }\n return clones;\n }\n\n /**\n * Bridge a resolved {@link ProvenanceCandidate} to a {@link CatalogEntry} for\n * the deploy pipeline. `source` is the absolute path to the asset's primary\n * manifest (or its directory) inside the clone; `publisher` is set to the\n * clone slug so `deployAll`'s repositories lookup resolves local-vs-remote.\n */\n private candidateToCatalogEntry(\n c: ProvenanceCandidate,\n repositories: Record<string, SourceDeclaration>,\n ): DeployableEntry | null {\n // Find the clone slug whose declaration URL matches the candidate's source.\n let slug: string | undefined;\n let cloneDir: string | undefined;\n for (const [s, decl] of Object.entries(repositories)) {\n if (decl.url === c.sourceUrl) {\n slug = s;\n cloneDir = this.resolveRepoDir(decl, s) ?? undefined;\n break;\n }\n }\n if (!cloneDir) {\n // Unknown source — store assets whose bytes get staged are routed via\n // `stagedCandidateToEntry` before reaching here, so this branch only hits\n // candidates without bytes. Fall back to first clone.\n const first = Object.entries(repositories)[0];\n if (first) {\n slug = first[0];\n cloneDir = this.resolveRepoDir(first[1], first[0]) ?? undefined;\n }\n }\n if (!cloneDir || !slug) return null;\n\n // Resolve a concrete manifest file (suffix-aware for prompt/flow), falling\n // back to the first file — never the clone dir, which deploy can't copy as a\n // single asset (cpSync without recursive throws on a directory).\n const mdRel =\n matchManifestPath(\n c.kind,\n c.files.map((f) => f.path),\n ) ?? c.files[0]?.path;\n const source = mdRel ? join(cloneDir, mdRel) : cloneDir;\n\n const entry: DeployableEntry = {\n ...(mdRel\n ? {\n files: filesUnderManifestDir(\n c.files.map((f) => f.path),\n mdRel,\n ),\n }\n : {}),\n name: c.name,\n kind: c.kind as CatalogEntry[\"kind\"],\n description: c.description ?? \"\",\n source,\n publisher: slug,\n version: c.version,\n // `publisher` above is the clone key; the printed ref carries the real publisher.\n canonicalRef: assetRefToStr({\n kind: c.kind,\n name: c.name,\n publisher: c.publisher,\n pin: c.version || undefined,\n }),\n requires: [],\n // Manifest-declared deps are authoritative for the candidate's deps.\n dependencies: c.deps ?? [],\n metadata: c.metadata,\n };\n if (c.category != null) entry.category = c.category;\n if (c.keywords && c.keywords.length > 0) entry.keywords = c.keywords;\n if (c.license != null) entry.license = c.license;\n if (c.homepage != null) entry.homepage = c.homepage;\n return entry;\n }\n\n /**\n * Resolve refs the source/store pass could not against the user's registered\n * **libraries** (local authoring places). Each library dir is scanned on disk\n * under its declared publisher (its root `skaile.manifest.yaml`, falling back\n * to the kebab-cased library name); a matching asset becomes a deployable\n * {@link CatalogEntry} whose `source` points at the on-disk manifest. This is\n * the consume side of `library create` — a freshly authored asset is\n * deployable with `skaile add <kind>:@<publisher>/<name>` without publishing.\n *\n * Local read (no network) and mirrors how `findSkills` discovers library\n * content. The returned `libraryOf` map names the library each entry came from\n * so callers can lock it as library-origin (see {@link libraryLockEntries}).\n *\n * @param opts.quiet - Skip the cross-library collision warning (a lookup that only\n * builds an error hint must not warn).\n * @param opts.library - Resolve only from this library (the one a lock entry names), not\n * from every registered one. Never warns: no choice is made between libraries.\n * @param opts.lockedLibraries - `kind:publisher/name` → the library its lock entry names\n * ({@link AssetManager.lockedLibraryNames}). A ref listed here resolves from that library\n * when it holds a match, whatever the default library is.\n * @returns the matched deploy entries, the set of `missing` refs covered, and\n * each entry's originating library name.\n */\n private async resolveLibraryEntries(\n missing: string[],\n opts: {\n quiet?: boolean;\n library?: string;\n lockedLibraries?: ReadonlyMap<string, string | null>;\n } = {},\n ): Promise<LibraryResolution> {\n const resolved = new Set<string>();\n const libraryOf = new Map<CatalogEntry, string>();\n if (missing.length === 0) return { entries: [], resolved, libraryOf };\n\n const scan = await this.scanLibraries();\n if (!scan) return { entries: [], resolved, libraryOf };\n const { byKey, isDefaultLib, libraryDir } = scan;\n\n const entries: DeployableEntry[] = [];\n const fileSets = new Map<string, Map<string, string[]>>();\n let snap: LibraryIndexSnapshot | null | undefined;\n const allCandidates = [...byKey.values()].flat();\n for (const ref of missing) {\n const parsed = parseRefTolerant(ref);\n if (!parsed) continue;\n const hash = ref.indexOf(\"#\");\n const pin = parsed.pin ?? (hash >= 0 ? ref.slice(hash + 1) : undefined);\n // A publisher-less ref (`kind:name`, what `info`/`diff`/`why` accept) matches\n // on kind + name across every publisher; the highest version wins below.\n const key = parsed.publisher\n ? `${parsed.kind}:@${parsed.publisher}/${parsed.name}`\n : undefined;\n // Honour an explicit version pin (SemVer range, exact, or SHA); an unpinned\n // ref accepts every on-disk version. Same matcher `resolveAll` uses for sources.\n const scanned = (\n key\n ? (byKey.get(key) ?? [])\n : allCandidates.filter(\n (c) => c.entry.kind === parsed.kind && c.entry.name === parsed.name,\n )\n ).filter((c) => !opts.library || c.library === opts.library);\n // An asset file that declares no version of its own (AGENT.md frontmatter) has the\n // indexed one, as the lock key does: a pin matches it and the ref printed for the deploy\n // carries it. A copy, so the scanned catalog entry stays as the library scan produced it.\n const pool: typeof scanned = [];\n for (const c of scanned) {\n if (c.entry.version) {\n pool.push(c);\n continue;\n }\n if (snap === undefined) snap = await this.loadLibraryIndex();\n const def = newestLibraryDef(snap, c.library, {\n kind: c.entry.kind,\n publisher: c.entry.publisher ?? \"\",\n name: c.entry.name,\n });\n pool.push(def?.version ? { ...c, entry: { ...c.entry, version: def.version } } : c);\n }\n let candidates = pool.filter((c) => !pin || matchPin(pin, c.entry.version ?? \"\"));\n // A locked asset stays on the library its lock entry names while that library still\n // holds a match; a pin it does not satisfy, or a library that dropped the asset, moves it.\n let lockedLibrary: string | null | undefined;\n if (parsed.publisher) {\n lockedLibrary = opts.lockedLibraries?.get(\n `${parsed.kind}:${parsed.publisher.replace(/^@/, \"\")}/${parsed.name}`,\n );\n } else {\n // No publisher on the ref: the lock entry is the one with this kind and name, when\n // exactly one has it.\n const same = [...(opts.lockedLibraries ?? [])].filter(([k]) => {\n const slash = k.indexOf(\"/\");\n return k.startsWith(`${parsed.kind}:`) && k.slice(slash + 1) === parsed.name;\n });\n if (same.length === 1) lockedLibrary = same[0]![1];\n }\n if (lockedLibrary) {\n const inLocked = candidates.filter((c) => c.library === lockedLibrary);\n if (inLocked.length > 0) candidates = inLocked;\n }\n if (candidates.length === 0) continue;\n // Highest version wins; an equal version goes to the default library, then\n // the library name — so the pick never depends on scan order.\n candidates.sort(libraryPreference(isDefaultLib));\n const hit = candidates[0]!;\n if (!opts.quiet && !opts.library) {\n this.warnLibraryCollision(\n `${hit.entry.kind}:@${hit.entry.publisher}/${hit.entry.name}`,\n candidates,\n hit,\n );\n }\n const entry = hit.entry;\n withLibraryFiles(entry, libraryDir.get(hit.library)!, fileSets, this.registry);\n entries.push(entry);\n libraryOf.set(entry, hit.library);\n resolved.add(ref);\n }\n return { entries, resolved, libraryOf };\n }\n\n /**\n * Scan every candidate library (the set {@link resolveLibraryEntries} resolves from)\n * into `kind:@publisher/name` → every holder, across all libraries and versions.\n *\n * @param minRoots - Return `null` without scanning when fewer candidate libraries\n * exist (a cross-library question needs at least two).\n * @returns `null` when there is no candidate library or none holds an asset.\n */\n private async scanLibraries(minRoots = 1): Promise<{\n byKey: Map<string, Array<{ entry: DeployableEntry; library: string }>>;\n isDefaultLib: Map<string, boolean>;\n libraryDir: Map<string, string>;\n } | null> {\n // Candidate libraries: every registered one at its registered path (it may\n // live anywhere, e.g. `library init --path`), plus any unregistered\n // subdirectory of the libraries dir (a hand-made library never `init`ed, and not one that\n // was unregistered with `library remove`).\n // `<libraries dir>/installed` is never a library: it holds the assets\n // `skaile install <ref>` placed from the store, reachable by their real ref.\n const roots: Array<{ name: string; dir: string; isDefault: boolean }> = [];\n for (const l of (await this.loadLibraryIndex())?.libraries ?? []) {\n if (l.name === GLOBAL_INSTALL_DIR_NAME) continue;\n if (existsSync(l.path)) roots.push({ name: l.name, dir: l.path, isDefault: l.isDefault });\n }\n const registered = new Set(roots.map((r) => r.name));\n // A library `library remove` unregistered (without `--purge`) keeps its directory, which no longer resolves.\n const unregistered = unregisteredLibraryNames();\n try {\n const librariesRoot = resolveLibraryDir();\n if (existsSync(librariesRoot)) {\n for (const dirent of readdirSync(librariesRoot, { withFileTypes: true })) {\n if (\n dirent.isDirectory() &&\n dirent.name !== GLOBAL_INSTALL_DIR_NAME &&\n !registered.has(dirent.name) &&\n !unregistered.has(dirent.name)\n ) {\n roots.push({\n name: dirent.name,\n dir: join(librariesRoot, dirent.name),\n isDefault: false,\n });\n }\n }\n }\n } catch {\n // No readable libraries dir: only registered libraries remain.\n }\n if (roots.length === 0 || roots.length < minRoots) return null;\n\n // Index every library asset by its canonical `kind:@publisher/name` key,\n // keeping EVERY candidate (all libraries, all versions): an explicit\n // `#version` must find the library that holds it even when another library\n // holds a higher one, and a cross-library collision is surfaced, not hidden.\n const byKey = new Map<string, Array<{ entry: DeployableEntry; library: string }>>();\n const libraryDir = new Map(roots.map((r) => [r.name, r.dir]));\n const isDefaultLib = new Map(roots.map((r) => [r.name, r.isDefault]));\n for (const { name, dir } of roots) {\n const publisher = readDeclaredPublisher(dir) ?? slugifyAssetName(name);\n for (const entry of await scanDirectory(dir, publisher, { knownKinds: this.knownKinds })) {\n const key = `${entry.kind}:@${entry.publisher}/${entry.name}`;\n const list = byKey.get(key);\n if (list) list.push({ entry, library: name });\n else byKey.set(key, [{ entry, library: name }]);\n }\n }\n return byKey.size === 0 ? null : { byKey, isDefaultLib, libraryDir };\n }\n\n /**\n * Every ref that more than one registered library holds, with one row per holder\n * (all libraries, all versions) in the order `add` prefers them: the first row is\n * the one `add <ref>` deploys. The local index keeps a single row per ref and\n * version, so `search` reads this to show equal-version copies in both libraries.\n *\n * @returns `kind:@publisher/name` → holders; refs held by one library are absent.\n */\n async libraryHolders(): Promise<Map<string, LibraryHolder[]>> {\n const out = new Map<string, LibraryHolder[]>();\n const scan = await this.scanLibraries(2);\n if (!scan) return out;\n for (const [key, candidates] of scan.byKey) {\n if (new Set(candidates.map((c) => c.library)).size < 2) continue;\n const sorted = [...candidates].sort(libraryPreference(scan.isDefaultLib));\n out.set(\n key,\n sorted.map((c, i) => ({\n library: c.library,\n version: c.entry.version ?? \"\",\n description: c.entry.description ?? \"\",\n picked: i === 0,\n })),\n );\n }\n return out;\n }\n\n /**\n * Every asset a registered library holds, read from the library directories themselves\n * (not the local index, which keeps one row per ref and version and loses a ref when\n * another library re-publishes it). One row per holder, all versions.\n *\n * @returns `[]` when no library holds an asset. Never warns.\n */\n async libraryAssets(): Promise<Array<{ entry: CatalogEntry; library: string }>> {\n const scan = await this.scanLibraries();\n if (!scan) return [];\n return [...scan.byKey.values()].flat();\n }\n\n /**\n * Every origin that holds `ref` (`kind:@publisher/name`) with the version it holds, in\n * the order `add <ref>` prefers them, so the first row is the one `add` deploys: the\n * project's source clones and the bundled factory source (highest version first), then\n * the registered libraries. `add`, `info` and `search` all read this, so the three name\n * one origin for one ref. Stores are not asked (no network).\n *\n * @returns one row per origin and version; `[]` for a ref without a publisher or one\n * nothing holds. Never warns.\n */\n async refOrigins(ref: string): Promise<RefOrigin[]> {\n const parsed = parseRefTolerant(ref);\n if (!parsed?.publisher) return [];\n const key = `${parsed.kind}:@${parsed.publisher}/${parsed.name}`;\n return (await this.collectOrigins(key)).get(key) ?? [];\n }\n\n /**\n * Every ref (`kind:@publisher/name`) that several origins hold at different versions,\n * with its origins in {@link refOrigins} order. A ref the origins hold at one version\n * has nothing to choose between and is left out.\n */\n async competingOrigins(): Promise<Map<string, RefOrigin[]>> {\n const out = new Map<string, RefOrigin[]>();\n for (const [key, origins] of await this.collectOrigins()) {\n if (new Set(origins.map((o) => o.version)).size > 1) out.set(key, origins);\n }\n return out;\n }\n\n /**\n * The origins of {@link refOrigins} for every ref, or for the one `only` names\n * (`kind:@publisher/name`), keyed by `kind:@publisher/name`.\n */\n private async collectOrigins(only?: string): Promise<Map<string, RefOrigin[]>> {\n const { repositories, sources } = this.loadConfig();\n this.ensureSourceClonesQuiet(repositories, sources);\n const clones = this.buildClones(repositories);\n const cloneDirs = new Set(clones.map((c) => resolve(c.localPath)));\n const index = await buildProvenanceIndex(clones, {\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n });\n const factoryUrl = normalizeRepoUrl(FACTORY_SOURCE_URL);\n const hasFactory = Object.values(repositories).some((d) => d.factory);\n const out = new Map<string, RefOrigin[]>();\n const originsOf = (key: string): RefOrigin[] => {\n let list = out.get(key);\n if (!list) {\n list = [];\n out.set(key, list);\n }\n return list;\n };\n for (const candidates of index.values()) {\n const first = candidates[0];\n if (!first) continue;\n const key = `${first.kind}:@${first.publisher}/${first.name}`;\n if (only !== undefined && key !== only) continue;\n const held = [...candidates].sort((a, b) => {\n const va = coerceVersion(a.version);\n const vb = coerceVersion(b.version);\n if (semverGt(va, vb)) return -1;\n if (semverGt(vb, va)) return 1;\n return a.sourceUrl.localeCompare(b.sourceUrl);\n });\n for (const c of held) {\n const factory = hasFactory && normalizeRepoUrl(c.sourceUrl) === factoryUrl;\n originsOf(key).push({\n kind: factory ? \"factory\" : \"source\",\n label: factory ? \"factory\" : sourceShortName(c.sourceUrl),\n version: c.version,\n description: c.description ?? \"\",\n });\n }\n }\n const scan = await this.scanLibraries();\n const prefer = libraryPreference(scan?.isDefaultLib ?? new Map());\n for (const [key, holders] of scan?.byKey ?? []) {\n if (only !== undefined && key !== only) continue;\n for (const c of [...holders].sort(prefer)) {\n // `source sync` registers a source clone as a library: the clone is listed once, as a source.\n const dir = scan?.libraryDir.get(c.library);\n if (dir && cloneDirs.has(resolve(dir))) continue;\n originsOf(key).push({\n kind: \"library\",\n label: c.library,\n version: c.entry.version ?? \"\",\n description: c.entry.description ?? \"\",\n });\n }\n }\n return out;\n }\n\n /**\n * Where each missed publisher-qualified ref went when its publisher changed, for every\n * ref at once (one library scan, one lock read):\n * - `moved` when a registered library holds the same kind + name under another publisher.\n * When the lock ties the missed ref to a library, only that library is looked at (an\n * asset of the same name in another library is a different asset). Without a lock\n * entry, a library asset the project already declares or locks under its own ref is\n * not offered, and two candidate publishers are ambiguous: no hint;\n * - `lockedAs` when the lock holds the same kind + name under another publisher, records\n * the library it came from, and that library now holds the asset under yet another\n * publisher than the locked one. An unrelated asset that merely shares kind + name does\n * not qualify.\n *\n * @param refs - Missed refs; a trailing `(reason)` after the first space is ignored.\n * @returns one finding per ref that has one. Never warns.\n */\n private async publisherChangeFindings(refs: string[]): Promise<Map<string, PublisherChange>> {\n const out = new Map<string, PublisherChange>();\n const wanted = new Map<string, { kind: string; name: string; publisher: string }>();\n for (const ref of refs) {\n const parsed = parseRefTolerant(ref.split(\" \")[0] ?? ref);\n if (parsed?.publisher) {\n wanted.set(ref, { kind: parsed.kind, name: parsed.name, publisher: parsed.publisher });\n }\n }\n if (wanted.size === 0) return out;\n\n const lockEntries = Object.entries(this.tryReadLock()?.assets ?? {});\n const scan = await this.scanLibraries();\n if (!scan) return out;\n // Identities (`publisher/kind:name`) the project already holds: not a place a ref moved to.\n const held = new Set<string>();\n for (const [key] of lockEntries) {\n const { publisher, kind, name } = parseCanonicalLockKey(key);\n if (publisher && kind && name) held.add(`${publisher}/${kind}:${name}`);\n }\n for (const d of this.loadConfig().dependencies) {\n const id = refIdentity(d);\n if (id !== null) held.add(id);\n }\n\n for (const [ref, w] of wanted) {\n const origin = lockEntries\n .map(([key, e]) => ({ id: parseCanonicalLockKey(key), library: e.library }))\n .find(\n ({ id, library }) =>\n library &&\n !library.installed &&\n id.kind === w.kind &&\n id.name === w.name &&\n id.publisher === w.publisher,\n )?.library?.name;\n const pool = [...scan.byKey.values()]\n .flat()\n .filter(\n (c) =>\n c.entry.kind === w.kind &&\n c.entry.name === w.name &&\n c.entry.publisher !== w.publisher &&\n (origin\n ? c.library === origin\n : !held.has(`${c.entry.publisher}/${c.entry.kind}:${c.entry.name}`)),\n );\n const publishers = new Set(pool.map((c) => c.entry.publisher));\n const best =\n publishers.size === 1 ? pool.sort(libraryPreference(scan.isDefaultLib))[0] : undefined;\n const moved = best?.entry;\n const movedLibrary = best?.library;\n const finding: PublisherChange = {};\n for (const [key, entry] of lockEntries) {\n const id = parseCanonicalLockKey(key);\n if (\n id.kind === w.kind &&\n id.name === w.name &&\n id.publisher &&\n id.publisher !== w.publisher &&\n entry.library &&\n moved &&\n movedLibrary === entry.library.name &&\n moved.publisher !== id.publisher\n ) {\n finding.lockedAs = `${id.kind}:@${id.publisher}/${id.name}`;\n break;\n }\n }\n if (moved && moved.publisher !== w.publisher) {\n finding.moved = {\n ref: `${moved.kind}:@${moved.publisher}/${moved.name}`,\n ...(movedLibrary ? { library: movedLibrary } : {}),\n };\n }\n if (finding.lockedAs || finding.moved) out.set(ref, finding);\n }\n return out;\n }\n\n /**\n * Explain misses caused by a publisher change, as parenthesized hint text per ref:\n * `did you mean <ref>?` when a registered library holds the same kind + name under\n * another publisher, and `locked as <lockRef>; run skaile install to re-resolve` when\n * the lock holds it under the library's previous publisher (see\n * {@link AssetManager.publisherChangeFindings}).\n *\n * @param refs - Missed refs; a trailing `(reason)` after the first space is ignored.\n * @returns hint text per ref, only for refs that have one. Never warns.\n */\n private async publisherChangeHints(refs: string[]): Promise<Record<string, string>> {\n const out: Record<string, string> = {};\n for (const [ref, f] of await this.publisherChangeFindings(refs)) {\n const hints: string[] = [];\n if (f.lockedAs) hints.push(`locked as ${f.lockedAs}; run skaile install to re-resolve`);\n if (f.moved) hints.push(`did you mean ${f.moved.ref}?`);\n out[ref] = hints.map((h) => ` (${h})`).join(\"\");\n }\n return out;\n }\n\n /**\n * What the user has to change for each ref that is locked from a library but resolves\n * nowhere any more, where `skaile install` cannot help: the library is not registered\n * (renamed away or removed), the library now publishes the asset under another\n * publisher, or the library no longer holds it. A ref the lock does not tie to a\n * library has no entry.\n *\n * @param refs - Declared or locked refs, `kind:@publisher/name` (a trailing `(reason)`\n * after the first space is ignored).\n * @returns a phrase per ref that follows the ref name, without parentheses.\n */\n private async unresolvedFixes(refs: string[]): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n if (refs.length === 0) return out;\n const lockEntries = Object.entries(this.tryReadLock()?.assets ?? {});\n const snap = await this.loadLibraryIndex();\n const findings = await this.publisherChangeFindings(refs);\n for (const ref of refs) {\n const want = parseRefTolerant(ref.split(\" \")[0] ?? ref);\n if (!want) continue;\n const origin = lockEntries\n .map(([key, e]) => ({ id: parseCanonicalLockKey(key), library: e.library }))\n .find(\n ({ id, library }) =>\n library &&\n !library.installed &&\n id.kind === want.kind &&\n id.name === want.name &&\n (!want.publisher || id.publisher === want.publisher),\n )?.library;\n if (!origin) continue;\n const plain = want.publisher\n ? `${want.kind}:@${want.publisher}/${want.name}`\n : `${want.kind}:${want.name}`;\n const moved = findings.get(ref)?.moved;\n const lookup = this.lockedLibrary(origin, snap);\n if (moved?.library && want.publisher) {\n out.set(\n ref,\n `did you mean ${moved.ref}? Change the ref in skaile.yaml to it, or keep the old ref with \\`skaile library set ${moved.library} publisher=${want.publisher}\\``,\n );\n } else if (lookup.state === \"dir-missing\") {\n out.set(ref, lockedLibraryProblem(lookup, origin, plain));\n } else if (lookup.state === \"unregistered\") {\n out.set(ref, unregisteredLibraryFix(origin, plain));\n } else {\n out.set(\n ref,\n `library \"${lookup.name}\" no longer holds it — restore it there, or drop the dependency with \\`skaile remove ${plain}\\``,\n );\n }\n }\n return out;\n }\n\n /** Collision messages already printed by this instance (one warning per ref + library set). */\n private readonly warnedLibraryCollisions = new Set<string>();\n\n /**\n * Warn once when `key` is held by more than one library: names every library\n * with its version and the one chosen, so a silent pick can't surprise.\n */\n private warnLibraryCollision(\n key: string,\n candidates: Array<{ entry: CatalogEntry; library: string }>,\n chosen: { entry: CatalogEntry; library: string },\n ): void {\n const libraries = new Set(candidates.map((c) => c.library));\n if (libraries.size < 2) return;\n const held = candidates.map((c) => `${c.library} (${c.entry.version || \"unversioned\"})`);\n const msg =\n `${key} exists in ${libraries.size} libraries: ${held.join(\", \")} — ` +\n `using ${chosen.library} (${chosen.entry.version || \"unversioned\"}). ` +\n \"Highest version wins; an equal version goes to the default library, then by name. \" +\n `Pin a version (${key}#<version>) to choose another.`;\n if (this.warnedLibraryCollisions.has(msg)) return;\n this.warnedLibraryCollisions.add(msg);\n if (this.onLibraryCollision) this.onLibraryCollision(msg);\n else console.warn(`skaile: ${msg}`);\n }\n\n /** Kind, name and bare publisher of a deploy entry; the publisher comes from its canonical ref. */\n private entryIdentity(entry: CatalogEntry): FolderIdentity {\n const ref = parseAssetRefLoose(canonicalEntryRef(entry));\n return {\n kind: entry.kind,\n name: entry.name,\n publisher: ref?.publisher ?? entry.publisher?.replace(/^@/, \"\"),\n };\n }\n\n /**\n * Refuse assets of one kind and name from different publishers: they deploy into the\n * same folder, so the later one would silently overwrite the earlier. Throws one line\n * naming the folder and the asset that holds it.\n *\n * @param incoming - Assets about to be deployed. Two of them clashing is refused.\n * @param held - Assets the project already declares or has locked; one of them\n * clashing with an incoming asset is refused when its folder is on disk.\n */\n private assertNoFolderCollision(incoming: FolderIdentity[], held: FolderIdentity[] = []): void {\n const refOf = (a: FolderIdentity) =>\n assetRefToStr({ kind: a.kind, name: a.name, publisher: a.publisher } as AssetRef);\n const differs = (a: FolderIdentity, b: FolderIdentity) =>\n !!a.publisher && !!b.publisher && a.publisher !== b.publisher;\n const shown = (dir: string) => (this.global ? dir : relative(this.projectDir, dir));\n const seen = new Map<string, FolderIdentity>();\n for (const a of incoming) {\n if (!a.kind || !a.name) continue;\n const component = installTargetOf(this.registry, a.kind);\n if (!component) continue;\n const slot = `${component}/${a.name}`;\n const prior = seen.get(slot);\n if (prior && differs(prior, a)) {\n const dir = deployedDir(component, a.name, this.driverTarget, this.global, this.projectDir);\n throw new Error(\n `${refOf(prior)} and ${refOf(a)} both deploy to ${shown(dir)} — keep only one of them`,\n );\n }\n if (!prior) seen.set(slot, a);\n const holder = held.find(\n (h) =>\n !!h.kind &&\n h.name === a.name &&\n installTargetOf(this.registry, h.kind) === component &&\n differs(h, a),\n );\n if (!holder) continue;\n const target = this.targetHarnesses().find((t) =>\n isDeployed(component, a.name!, t, this.global, this.projectDir),\n );\n if (!target) continue; // declared but never deployed: nothing to overwrite\n const dir = deployedDir(component, a.name, target, this.global, this.projectDir);\n throw new Error(\n `${refOf(a)} would overwrite ${shown(dir)}, which ${refOf(holder)} already holds — ` +\n `run skaile remove ${refOf(holder)} first`,\n );\n }\n }\n\n /**\n * Open the local index and snapshot its libraries + asset definitions.\n * Best-effort: no index file (never indexed), or any open/guard failure,\n * yields `null` — a lock/outdated read must never create `index.db` or throw.\n */\n private async loadLibraryIndex(): Promise<LibraryIndexSnapshot | null> {\n try {\n const { LocalIndex, resolveIndexPath } = await import(\"@skaile/workspaces/library\");\n const indexPath = this.indexPathOverride ?? resolveIndexPath();\n if (!existsSync(indexPath)) return null;\n const index = new LocalIndex({ indexPath });\n try {\n return { libraries: await index.listSources(), defs: await index.listAssetDefs() };\n } finally {\n index.close();\n }\n } catch {\n return null;\n }\n }\n\n /**\n * Library-origin lock entries for the assets {@link resolveLibraryEntries}\n * matched. The locked version is the one actually deployed: the on-disk\n * entry's version, falling back to the library index only when the disk entry\n * carries none — the index lags until the next `skaile library index`, so\n * preferring it would lock a stale version after an in-place bump. The hash is\n * computed from the files on disk, so it matches what `install --locked`\n * re-hashes.\n *\n * A git-backed library also records its remote URL. When the previous lock names the\n * library under another name that {@link lockedLibrary} matched to this one by URL (a\n * teammate registered the same remote under a different name), the entry keeps the locked\n * name and URL: the lock does not change because it was installed on another machine.\n */\n private async libraryLockEntries(lib: {\n entries: CatalogEntry[];\n libraryOf: Map<CatalogEntry, string>;\n }): Promise<Record<string, LockEntry>> {\n if (lib.entries.length === 0) return {};\n const snap = await this.loadLibraryIndex();\n const previous = Object.entries(this.tryReadLock()?.assets ?? {}).filter(\n ([, e]) => e.library !== undefined && !e.library.installed,\n );\n const diskHashes = new Map<string, Map<string, string>>();\n return buildLibraryLockEntries(\n lib.entries.map((e) => {\n const name = lib.libraryOf.get(e) ?? \"\";\n const publisher = e.publisher ?? \"\";\n const def = newestLibraryDef(snap, name, { kind: e.kind, publisher, name: e.name });\n const libPath = this.libraryPath({ name }, snap);\n const sha256 =\n (libPath\n ? libraryDiskHashes(libPath, diskHashes, this.registry).get(`${e.kind}:${e.name}`)\n : undefined) ?? def?.sha256;\n const registered = snap?.libraries.find((l) => l.name === name);\n let lockName = name;\n let url = registered ? libraryRemoteUrl(registered) : undefined;\n const locked = previous.find(([key]) => {\n const id = parseCanonicalLockKey(key);\n return id.kind === e.kind && id.name === e.name && id.publisher === publisher;\n })?.[1].library;\n if (locked) {\n const lookup = this.lockedLibrary(locked, snap);\n if (lookup.state === \"ok\" && lookup.name === name) {\n lockName = locked.name;\n if (locked.url && url && normalizeRepoUrl(locked.url) === normalizeRepoUrl(url)) {\n url = locked.url;\n }\n }\n }\n return {\n kind: e.kind,\n publisher,\n name: e.name,\n library: {\n name: lockName,\n version: e.version || def?.version || \"0.0.0\",\n sha256,\n ...(url ? { url } : {}),\n },\n };\n }),\n );\n }\n\n /**\n * Lock keys that `skaile.yaml` still wants: the entries a declared ref names, plus every\n * entry such an asset requires, transitively. All keys when a `preset:` is declared.\n */\n private async declaredLockKeys(\n lock: LockFile,\n declared: readonly string[],\n ): Promise<Set<string>> {\n const keys = Object.keys(lock.assets);\n const wanted = declared.map((d) => parseRefTolerant(d.split(\" \")[0] ?? d));\n if (wanted.some((w) => w?.kind === \"preset\")) return new Set(keys);\n const matching = (want: { kind?: string; name?: string; publisher?: string }): string[] =>\n keys.filter((key) => {\n const id = parseCanonicalLockKey(key);\n return (\n id.kind === want.kind &&\n id.name === want.name &&\n (!want.publisher || !id.publisher || id.publisher === want.publisher)\n );\n });\n const inScope = new Set<string>();\n const queue: string[] = [];\n const add = (key: string): void => {\n if (inScope.has(key)) return;\n inScope.add(key);\n queue.push(key);\n };\n for (const w of wanted) if (w) matching(w).forEach(add);\n for (const key of queue) {\n for (const dep of await this.deployedRequirementsOf(parseCanonicalLockKey(key))) {\n const want = memberIdentity(dep);\n if (want) matching(want).forEach(add);\n }\n }\n return inScope;\n }\n\n /**\n * The `Missing:` lines of every library-origin lock entry whose library cannot supply\n * assets on this machine (not registered, or registered with its directory gone). Plain\n * `install` stops on a non-empty list, the same lines `install --locked` prints: it must\n * not re-resolve a locked asset from another origin. The ONE function that decides \"the\n * locked library is not here\", so a lock-recorded URL fallback extends it in one place.\n *\n * Only entries `skaile.yaml` still declares, or that a declared asset requires\n * (transitively, read from the deployed copy), count. A stale entry nothing declares is\n * pruned by `install` as usual, so a removed dependency whose library is gone can be\n * cleaned up. With a declared `preset:` every entry counts: the lock records no edge\n * from a preset to its items, and the preset's own library may be the one that is gone.\n *\n * @param declared - The `dependencies:` refs as written in `skaile.yaml`.\n */\n private async unavailableLockedLibraries(\n lock: LockFile,\n declared: readonly string[],\n ): Promise<string[]> {\n const inScope = await this.declaredLockKeys(lock, declared);\n const locked = Object.entries(lock.assets).filter(\n ([key, e]) => e.library !== undefined && !e.library.installed && inScope.has(key),\n );\n if (locked.length === 0) return [];\n const snap = await this.loadLibraryIndex();\n const lines: string[] = [];\n for (const [ref, e] of locked) {\n const { publisher, kind, name } = parseCanonicalLockKey(ref);\n if (!publisher || !kind || !name) continue;\n const lookup = this.lockedLibrary(e.library!, snap);\n if (lookup.state === \"ok\") continue;\n const component = this.installTarget(kind);\n const deployed =\n component !== undefined &&\n isDeployed(component, name, this.driverTarget, this.global, this.projectDir);\n const problem = lockedLibraryProblem(lookup, e.library!, `${kind}:@${publisher}/${name}`);\n // `install` touches neither the files nor the lock entry: say so.\n const kept = deployed\n ? \"the deployed copy and its lock entry are kept\"\n : \"its lock entry is kept; no deployed copy exists\";\n lines.push(`${ref} (${problem}; ${kept})`);\n }\n return lines;\n }\n\n /**\n * Re-resolve every library-origin lock entry from its named library, for\n * `install --locked`. An entry is restored only when its library is still\n * registered/on disk, still holds the asset, and still offers the locked\n * version; anything else is reported in `missing` with the reason.\n */\n private async restoreLibraryLockEntries(\n lock: LockFile,\n ): Promise<{ entries: DeployableEntry[]; missing: string[] }> {\n const entries: DeployableEntry[] = [];\n const missing: string[] = [];\n // Direct `asset install` entries were placed in the project already; there is nothing to deploy.\n const locked = Object.entries(lock.assets).filter(\n ([, e]) => e.library !== undefined && !e.library.installed,\n );\n if (locked.length === 0) return { entries, missing };\n\n const snap = await this.loadLibraryIndex();\n /** Per library root: `kind:name` → sha256 of the files on disk. */\n const diskHashes = new Map<string, Map<string, string>>();\n /** Per library root: manifest path → the asset's deployable files. */\n const fileSets = new Map<string, Map<string, string[]>>();\n for (const [ref, e] of locked) {\n const origin = e.library!;\n const { publisher, kind, name } = parseCanonicalLockKey(ref);\n if (!publisher || !kind || !name) {\n missing.push(`${ref} (unparseable lock key)`);\n continue;\n }\n const lookup = this.lockedLibrary(origin, snap);\n if (lookup.state !== \"ok\") {\n missing.push(\n `${ref} (${lockedLibraryProblem(lookup, origin, `${kind}:@${publisher}/${name}`)})`,\n );\n continue;\n }\n const libPath = lookup.path;\n const found = (await scanDirectory(libPath, publisher, { knownKinds: this.knownKinds })).find(\n (x) => x.kind === kind && x.name === name,\n );\n if (!found) {\n missing.push(`${ref} (not found in library \"${lookup.name}\")`);\n continue;\n }\n const def = newestLibraryDef(snap, lookup.name, { kind, publisher, name });\n const current = found.version || def?.version || \"0.0.0\";\n if (current !== origin.version) {\n missing.push(\n `${ref} (library \"${lookup.name}\" is at ${current}, locked ${origin.version})`,\n );\n continue;\n }\n if (origin.sha256) {\n // Re-hash on disk: the index hash is only as fresh as the last\n // `skaile library index`, so an in-place edit would otherwise deploy silently.\n const onDisk = libraryDiskHashes(libPath, diskHashes, this.registry).get(`${kind}:${name}`);\n if (onDisk !== undefined && onDisk !== origin.sha256) {\n missing.push(\n `${ref} (library \"${lookup.name}\" content changed since lock — or the lock predates the one shared asset hash; re-lock with \\`skaile install\\`)`,\n );\n continue;\n }\n }\n // The printed ref carries the locked version even when the asset file declares none.\n found.version = current;\n entries.push(withLibraryFiles(found, libPath, fileSets, this.registry));\n }\n return { entries, missing };\n }\n\n /**\n * Whether a deployed copy exists for the lock entries `install` kept for the unresolved\n * `ref`. A kind with no install target has no deployed copy.\n */\n private keptCopyDeployed(kept: KeptLockEntries, ref: string): boolean {\n const want = parseRefTolerant(ref.split(\" \")[0] ?? ref);\n if (!want) return false;\n return Object.keys(kept.assets).some((key) => {\n const id = parseCanonicalLockKey(key);\n if (id.kind !== want.kind || id.name !== want.name) return false;\n if (want.publisher && id.publisher !== want.publisher) return false;\n const component = this.installTarget(id.kind);\n return (\n component !== undefined &&\n isDeployed(component, id.name, this.driverTarget, this.global, this.projectDir)\n );\n });\n }\n\n /**\n * How the library `origin` names stands on this machine. THE one lookup of a locked library\n * (\"is it registered here?\"): `check`, `outdated`, `install` and `install --locked` all ask it.\n *\n * - registered in the index under its name: `ok` at its registered path, or `dir-missing` when\n * that directory is gone;\n * - not registered: a directory `<libraries dir>/<name>` nobody unregistered still counts as a\n * hand-made library (`ok`). One `library remove` unregistered without `--purge` does not\n * (it stays on disk but no longer resolves), and neither does the reserved `installed` folder.\n * - otherwise, when the lock recorded the library's remote URL: another registered library\n * whose git remote is the same repository (`.git` suffix, trailing `/` and the\n * `git@host:o/r` / `https://host/o/r` forms do not matter) and whose directory exists is\n * `ok`, with `name` set to the name it is registered under here. The library name is\n * machine-local; the remote is what a clone shares.\n */\n private lockedLibrary(\n origin: { name: string; url?: string },\n snap: LibraryIndexSnapshot | null,\n ): LockedLibrary {\n const { name } = origin;\n if (name === GLOBAL_INSTALL_DIR_NAME) return { state: \"unregistered\" };\n let byName: LockedLibrary = { state: \"unregistered\" };\n const registered = snap?.libraries.find((l) => l.name === name)?.path;\n if (registered) {\n byName = existsSync(registered)\n ? { state: \"ok\", path: registered, name }\n : { state: \"dir-missing\", path: registered };\n } else {\n try {\n const guess = join(resolveLibraryDir(), name);\n if (existsSync(guess) && !unregisteredLibraryNames().has(name)) {\n byName = { state: \"ok\", path: guess, name };\n }\n } catch {\n // No libraries directory: the name resolves nowhere.\n }\n }\n // Renamed with `library rename`: a local library has no remote URL, so the rename record finds it.\n if (byName.state === \"unregistered\") {\n const renamed = renamedLibraryName(name);\n const now = renamed ? snap?.libraries.find((l) => l.name === renamed) : undefined;\n if (now && existsSync(now.path)) return { state: \"ok\", path: now.path, name: now.name };\n }\n if (byName.state === \"ok\" || !origin.url) return byName;\n const wanted = normalizeRepoUrl(origin.url);\n const byUrl = snap?.libraries.find((l) => {\n const url = libraryRemoteUrl(l);\n return (\n l.name !== name &&\n url !== undefined &&\n normalizeRepoUrl(url) === wanted &&\n existsSync(l.path)\n );\n });\n return byUrl ? { state: \"ok\", path: byUrl.path, name: byUrl.name } : byName;\n }\n\n /** On-disk root of the library `origin` names; `null` unless {@link lockedLibrary} says `ok`. */\n private libraryPath(\n origin: { name: string; url?: string },\n snap: LibraryIndexSnapshot | null,\n ): string | null {\n const found = this.lockedLibrary(origin, snap);\n return found.state === \"ok\" ? found.path : null;\n }\n\n /**\n * Where each library-origin lock entry of this project resolves on this machine: identity\n * `kind:publisher/name` (no scope sigil, no version) → the name the locked library is\n * registered under here. The name differs from the locked one when the lock's remote URL\n * matched another registered library ({@link lockedLibrary}). A deployed entry whose library\n * resolves nowhere (not registered, directory gone) maps to `null`.\n *\n * Direct `asset install` entries (`library.installed`) are included and resolved the same\n * way, but they map to the locked library name when that lookup fails: such a copy sits in\n * the project and does not depend on the library still being registered. A missing or\n * unreadable lock yields an empty map. `skaile manage` uses it to tick the right library row.\n */\n async lockedLibraryNames(): Promise<Map<string, string | null>> {\n const out = new Map<string, string | null>();\n const locked = Object.entries(this.tryReadLock()?.assets ?? {}).filter(\n ([, e]) => e.library !== undefined,\n );\n if (locked.length === 0) return out;\n const snap = await this.loadLibraryIndex();\n for (const [key, e] of locked) {\n const { publisher, kind, name } = parseCanonicalLockKey(key);\n if (!publisher || !kind || !name) continue;\n const origin = e.library!;\n const lookup = this.lockedLibrary(origin, snap);\n const resolved = lookup.state === \"ok\" ? lookup.name : origin.installed ? origin.name : null;\n out.set(`${kind}:${publisher}/${name}`, resolved);\n }\n return out;\n }\n\n // ── Store fetch-then-deploy ────────────────────────────────────────────\n\n /** A candidate's stable identity key (`<publisher>/<kind>:<name>@<version>`). */\n private candidateKey(c: ProvenanceCandidate): string {\n return `${c.publisher}/${c.kind}:${c.name}@${c.version}`;\n }\n\n /**\n * Resolve `deps`, falling back to the global `catalog.url` store when the\n * project declares no store and the first pass leaves something missing.\n *\n * The first pass uses the project stores only, so locally-resolvable refs\n * never trigger a network probe. The fallback retry is best-effort: any error\n * (offline, store down) keeps the first pass's result rather than regressing.\n */\n private async resolveWithStores(\n deps: string[],\n opts: {\n provenanceIndex: Awaited<ReturnType<typeof buildProvenanceIndex>>;\n overrides: OverrideEntry[];\n stores: StoreEntry[];\n declaredRefs?: readonly string[];\n },\n ): Promise<ResolveResult> {\n const first = await resolveAll(deps, {\n provenanceIndex: opts.provenanceIndex,\n overrides: opts.overrides,\n stores: opts.stores,\n storeFetcher: this.storeFetcherFor(opts.stores),\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n declaredRefs: opts.declaredRefs,\n });\n if (first.missing.length === 0) return first;\n\n const fallback = await this.globalStoreFallback(opts.stores);\n if (fallback.length === 0) return first;\n\n const stores = [...opts.stores, ...fallback];\n try {\n const retry = await resolveAll(deps, {\n provenanceIndex: opts.provenanceIndex,\n overrides: opts.overrides,\n stores,\n storeFetcher: this.storeFetcherFor(stores),\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n declaredRefs: opts.declaredRefs,\n });\n // Monotone: same provenanceIndex + overrides, only more stores added —\n // resolution can gain deps but never lose one, so fewer-missing wins.\n return retry.missing.length < first.missing.length ? retry : first;\n } catch {\n return first;\n }\n }\n\n /**\n * Resolve `deps` library-first, then walk the dependencies of every library\n * asset it picks.\n *\n * A publisher-qualified ref that no project source declares is looked up in the\n * registered **libraries** before any store is asked, so a locally authored\n * asset resolves (and deploys) with the store unreachable and without a\n * version-discovery round trip. Only refs the libraries did not satisfy go to\n * {@link resolveWithStores}; its misses get one more library try (a ref a source\n * knows only under another version). A `#version` pin still selects through\n * `matchPin` inside {@link resolveLibraryEntries}.\n *\n * Library assets declare `dependencies` / `requires`. Those are fed back through\n * the same resolution with a `seen` identity set (mirrors `resolveAll`), so deps\n * deploy, get lock entries, and a dependency cycle terminates.\n *\n * @returns source/store candidates, still-unresolved refs, applied overrides,\n * expanded presets, and the library leg (entries + originating library per entry).\n */\n private async resolveLibraryFirst(\n deps: string[],\n opts: {\n provenanceIndex: ProvenanceIndex;\n overrides: OverrideEntry[];\n stores: StoreEntry[];\n /** Refs `skaile.yaml` declares; a dependency of a resolved asset with the same identity resolves at the declared ref/pin. */\n declaredRefs?: readonly string[];\n /** Print the \"exists in N libraries\" warning for a ref several libraries hold (`add` only; every other command is silent about a choice the lock or a pin already made). */\n warnCollisions?: boolean;\n /** Keep a locked asset on the library its lock entry names ({@link AssetManager.lockedLibraryNames}); `install` passes it, `update` and `add` do not. */\n lockedLibraries?: ReadonlyMap<string, string | null>;\n },\n ): Promise<{\n resolved: ProvenanceCandidate[];\n missing: string[];\n overridesApplied: Set<string>;\n lib: LibraryResolution;\n presets: PresetExpansion[];\n }> {\n const resolved: ProvenanceCandidate[] = [];\n const overridesApplied = new Set<string>();\n const presets: PresetExpansion[] = [];\n const lib: LibraryResolution = { entries: [], resolved: new Set(), libraryOf: new Map() };\n const missing = new Set<string>();\n /** Identities already handed to a resolver (or satisfied by one): never resolved twice. */\n const seen = new Set<string>();\n /** Identities a source/store candidate or a library entry covers. */\n const covered = new Set<string>();\n /** Declared refs by identity: a walked dependency the project already declares keeps its declared pin. */\n const declaredById = new Map<string, string>();\n for (const d of opts.declaredRefs ?? []) {\n const id = refIdentity(d);\n if (id !== null) declaredById.set(id, d);\n }\n\n /** Preset identity → identity of the library preset that listed it (absent for a top-level one). */\n const presetParent = new Map<string, string>();\n\n /**\n * Merge a library hit into `lib`; returns the refs its assets depend on. A library\n * preset is a grouping, like a source/store preset: its asset items go on to be\n * resolved, the preset itself is never deployed nor locked (it is only reported).\n */\n const absorb = (hit: LibraryResolution): string[] => {\n const next: string[] = [];\n for (const e of hit.entries) {\n const origin = hit.libraryOf.get(e);\n const id = `${e.publisher}/${e.kind}:${e.name}`;\n seen.add(id);\n covered.add(id);\n const deps = libraryEntryDepRefs(e);\n if (e.kind === \"preset\") {\n const chain = [id];\n for (let up = presetParent.get(id); up !== undefined; up = presetParent.get(up)) {\n chain.unshift(up);\n }\n if (chain.length > MAX_PRESET_DEPTH) {\n throw new PresetDepthError(\"depth\", canonicalEntryRef(e), chain);\n }\n for (const dep of deps) {\n const depId = refIdentity(dep);\n if (depId === null || !depId.includes(\"/preset:\")) continue;\n if (chain.includes(depId)) throw new PresetDepthError(\"cycle\", dep, [...chain, depId]);\n if (!presetParent.has(depId)) presetParent.set(depId, id);\n }\n presets.push({\n ref: canonicalEntryRef(e),\n assets: deps.filter((d) => !d.startsWith(\"preset:\")).length,\n skipped: e.skippedItems ?? 0,\n ...(origin ? { library: origin } : {}),\n });\n } else {\n lib.entries.push(e);\n if (origin) lib.libraryOf.set(e, origin);\n }\n next.push(\n ...deps.map((dep) => {\n const depId = refIdentity(dep);\n return (depId !== null && declaredById.get(depId)) || dep;\n }),\n );\n }\n for (const r of hit.resolved) lib.resolved.add(r);\n return next;\n };\n\n let wave = deps;\n while (wave.length > 0) {\n const fresh: string[] = [];\n for (const ref of wave) {\n const id = refIdentity(ref);\n if (id !== null) {\n if (seen.has(id)) continue;\n seen.add(id);\n }\n fresh.push(ref);\n }\n if (fresh.length === 0) break;\n\n // Library leg first: refs no project source declares.\n const libraryTried = new Set(\n fresh.filter((ref) => {\n const id = refIdentity(ref);\n return id !== null && (opts.provenanceIndex.get(id)?.length ?? 0) === 0;\n }),\n );\n const hit = await this.resolveLibraryEntries([...libraryTried], {\n quiet: !opts.warnCollisions,\n lockedLibraries: opts.lockedLibraries,\n });\n const next = absorb(hit);\n\n // Source/store leg for what the library did not answer.\n const rest = fresh.filter((ref) => !hit.resolved.has(ref));\n if (rest.length > 0) {\n const r = await this.resolveWithStores(rest, opts);\n for (const c of r.resolved) {\n const id = `${c.publisher}/${c.kind}:${c.name}`;\n // A later wave may re-reach an identity an earlier wave or a library entry covers.\n if (covered.has(id)) continue;\n seen.add(id);\n covered.add(id);\n resolved.push(c);\n }\n for (const o of r.overridesApplied) overridesApplied.add(o);\n presets.push(...r.presets);\n // A ref sources/stores missed (an unmatched pin, or a transitive dep) may\n // still be a library asset that was not tried above.\n const hit2 = await this.resolveLibraryEntries(\n r.missing.filter((m) => !libraryTried.has(m)),\n { quiet: !opts.warnCollisions, lockedLibraries: opts.lockedLibraries },\n );\n next.push(...absorb(hit2));\n for (const m of r.missing) if (!hit2.resolved.has(m)) missing.add(m);\n }\n wave = next;\n }\n\n // A ref missed early may be covered later (a library asset's dependency).\n const stillMissing = [...missing].filter((m) => {\n const id = refIdentity(m);\n return !lib.resolved.has(m) && !(id !== null && covered.has(id));\n });\n return { resolved, missing: stillMissing, overridesApplied, lib, presets };\n }\n\n /** The catalog fetcher to use: an injected one, else built from `stores`. */\n private storeFetcherFor(stores: StoreEntry[]): StoreFetcher | undefined {\n return this.injectedStoreFetcher ?? this.buildStoreFetcher(stores);\n }\n\n /**\n * The global `catalog.url` as a single-store fallback, or `[]` when no\n * project store should be synthesized — `local` sentinel, already-declared,\n * or no URL. Honours an explicit `catalogUrl` injection (`\"\"` disables it).\n */\n private async globalStoreFallback(projectStores: StoreEntry[]): Promise<StoreEntry[]> {\n let url = this.catalogUrlOverride;\n if (url === undefined) {\n try {\n const { resolveConfig } = await import(\"@skaile/workspaces/library\");\n url = resolveConfig({ projectDir: this.projectDir }).catalog.url;\n } catch {\n return [];\n }\n }\n if (!url || url.trim().toLowerCase() === \"local\") return [];\n if (projectStores.some((s) => normalizeRepoUrl(s.url) === normalizeRepoUrl(url!))) return [];\n return [{ url }];\n }\n\n /**\n * Build deployable catalog entries from resolved candidates. Store-resolved\n * candidates (no local clone bytes) are fetched + SHA-verified into the\n * project store-cache first, then their entry points at the staged bytes so\n * the existing copy-deploy path works. Source-backed candidates keep the\n * clone-relative entry.\n */\n private async buildCatalogEntries(\n resolved: ProvenanceCandidate[],\n repositories: Record<string, SourceDeclaration>,\n ): Promise<DeployableEntry[]> {\n const staged = await this.stageStoreAssets(resolved, repositories);\n const entries: DeployableEntry[] = [];\n for (const c of resolved) {\n const stagedPath = staged.get(this.candidateKey(c));\n const entry = stagedPath\n ? this.stagedCandidateToEntry(c, stagedPath)\n : this.candidateToCatalogEntry(c, repositories);\n if (entry) entries.push(entry);\n }\n return entries;\n }\n\n /**\n * Fetch + SHA-verify the bytes of every store-resolved candidate that needs\n * bytes on disk into `.skaile/cache/store/`, reusing the same verified-fetch\n * path the pointer-only `library.install` uses (`installFromManifest` flat\n * mode). Every kind with bytes, composition-only kinds included.\n *\n * @returns Map of candidate key → staged primary-manifest path.\n */\n private async stageStoreAssets(\n resolved: ProvenanceCandidate[],\n repositories: Record<string, SourceDeclaration>,\n ): Promise<Map<string, string>> {\n const staged = new Map<string, string>();\n let installFromManifest:\n | typeof import(\"@skaile/workspaces/library\").installFromManifest\n | undefined;\n\n for (const c of resolved) {\n // Every kind with bytes is staged — kinds with an `installTarget` are then\n // copied into the harness dir, composition-only kinds (mcp-server, persona,\n // ruleset, knowledge, …) are read from the store cache at session start\n // (`loadMcpServerDeclarations` reads a staged `MCP.md`; a skipped fetch made a\n // store-sourced MCP a silent no-op, #462). Remote kinds carry no `files[]`.\n if (!c.files || c.files.length === 0 || !c.sourceUrl || !c.commit) continue;\n if (this.candidateHasLocalBytes(c, repositories)) continue;\n\n if (!installFromManifest) {\n ({ installFromManifest } = await import(\"@skaile/workspaces/library\"));\n }\n const targetDir = join(this.storeCacheDir, c.publisher, c.kind, c.name, c.version);\n // Per-file paths in c.files are attacker-controlled but validated by\n // installFromManifest before any fetch/write (rejects abs / `..`); this\n // outer guard only asserts the staging dir stays inside the cache root.\n const cacheRoot = resolve(this.storeCacheDir);\n if (!resolve(targetDir).startsWith(cacheRoot + sep)) {\n throw new Error(`unsafe store-cache path for ${this.candidateKey(c)}`);\n }\n const manifest: InstallManifest = {\n ref: `${c.kind}:@${c.publisher}/${c.name}#${c.version}`,\n source: { url: c.sourceUrl, commitSha: c.commit },\n files: c.files,\n sha256: c.sha256,\n kind: c.kind,\n // tier = catalog storage hint (S3/CDN); flat-mode verified fetch pulls\n // from source.url@commit and ignores it, so \"\" is inert.\n tier: \"\",\n };\n const { installPath } = await installFromManifest({\n manifest,\n libraryRoot: this.storeCacheDir,\n targetDir,\n fetcher: this.injectedAssetFetcher,\n });\n staged.set(this.candidateKey(c), join(installPath, this.stagedManifestRel(c)));\n }\n return staged;\n }\n\n /** Repo-relative path of a candidate's primary manifest (un-stripped). */\n private primaryManifestRel(c: ProvenanceCandidate): string | undefined {\n const paths = (c.files ?? []).map((f) => f.path);\n // Last resort: a kind with no manifest convention falls back to the first\n // file so deploy still has a concrete source rather than crashing.\n return matchManifestPath(c.kind, paths) ?? paths[0];\n }\n\n /**\n * The primary-manifest path relative to a staged asset dir. Takes the kind's\n * manifest (e.g. `SKILL.md`), then strips the same common-dir prefix\n * `installFromManifest` flat mode removed on write.\n */\n private stagedManifestRel(c: ProvenanceCandidate): string {\n const paths = (c.files ?? []).map((f) => f.path);\n const mdRel = this.primaryManifestRel(c) ?? \"\";\n const root = commonDirPrefix(paths);\n return root && mdRel.startsWith(`${root}/`) ? mdRel.slice(root.length + 1) : mdRel;\n }\n\n /**\n * `true` when a candidate's primary manifest is present on a local source\n * clone — its `sourceUrl` matches a registered source AND the manifest file\n * exists on disk at the expected path. A URL match alone is not enough: a\n * store can pin a different commit (or a subtree not bundled) of a repo that\n * is also a registered source, in which case the bytes must be fetched from\n * the store rather than read from the clone. (Only the primary manifest is\n * probed — a partially-cloned source is deployed as-is, matching the existing\n * clone-deploy path.)\n */\n private candidateHasLocalBytes(\n c: ProvenanceCandidate,\n repositories: Record<string, SourceDeclaration>,\n ): boolean {\n if (!c.sourceUrl) return false;\n const rel = this.primaryManifestRel(c);\n for (const [slug, decl] of Object.entries(repositories)) {\n if (decl.url === undefined || decl.url !== c.sourceUrl) continue;\n const dir = this.resolveRepoDir(decl, slug);\n if (!dir) continue;\n if (existsSync(rel ? join(dir, rel) : dir)) return true;\n }\n return false;\n }\n\n /** Build a copy-deploy catalog entry pointing at staged store bytes. */\n private stagedCandidateToEntry(\n c: ProvenanceCandidate,\n stagedManifestPath: string,\n ): DeployableEntry {\n // The verified pointer defines the asset: every staged file under the\n // manifest's directory, not just what the provider's default filter picks.\n const paths = (c.files ?? []).map((f) => f.path);\n const root = commonDirPrefix(paths);\n const files = filesUnderManifestDir(\n paths.map((p) => (root && p.startsWith(`${root}/`) ? p.slice(root.length + 1) : p)),\n this.stagedManifestRel(c),\n );\n const entry: DeployableEntry = {\n files,\n name: c.name,\n kind: c.kind as CatalogEntry[\"kind\"],\n description: c.description ?? \"\",\n source: stagedManifestPath,\n // Real publisher (never a clone slug) → deployAsset copies rather than\n // symlinking the ephemeral store-cache dir.\n publisher: c.publisher,\n version: c.version,\n requires: [],\n dependencies: c.deps ?? [],\n metadata: c.metadata,\n };\n if (c.category != null) entry.category = c.category;\n if (c.keywords && c.keywords.length > 0) entry.keywords = c.keywords;\n if (c.license != null) entry.license = c.license;\n if (c.homepage != null) entry.homepage = c.homepage;\n return entry;\n }\n\n // ── Install / resolve ──────────────────────────────────────────────────\n\n /**\n * Install all dependencies declared in `skaile.yaml`.\n *\n * Steps: clone/pull repositories → resolve transitive dependencies → reconcile\n * (remove stale assets) → deploy new assets → write `skaile.lock.yaml` → record history.\n *\n * @param opts - Optional installation options.\n * @param opts.locked - When `true`, restore the exact versions recorded in the existing\n * lock file instead of resolving from source. Throws if no lock file is found.\n * @param opts.link - When `true`, symlink local-path assets instead of copying them\n * (the author dev-loop). Machine-local / not for committing; a no-op for\n * store/factory sources. Defaults to copy.\n * @param opts.moveLibraries - When `true` (`skaile update`), a locked library asset is\n * re-resolved from every library and may move to another one; {@link InstallResult.moved}\n * lists the moves. Without it a locked asset stays on the library its lock entry names.\n * @returns {@link InstallResult} summarising what was deployed, what was missing, and any collisions.\n */\n async install(opts?: {\n locked?: boolean;\n link?: boolean;\n moveLibraries?: boolean;\n }): Promise<InstallResult> {\n const { repositories, sources, stores, dependencies, overrides, patches } = this.loadConfig();\n\n if (opts?.locked) {\n return this.installLocked(repositories, patches, dependencies);\n }\n\n // A lock that pins a library this machine does not have (not registered, or its directory\n // gone) is not re-resolved from another origin: that would swap the bytes and rewrite the\n // lock. Fail like `--locked` before any clone, deploy or lock write.\n const lockForLibraries = this.tryReadLock();\n if (lockForLibraries) {\n const unavailable = await this.unavailableLockedLibraries(lockForLibraries, dependencies);\n if (unavailable.length > 0) {\n return {\n deployed: [],\n removed: [],\n missing: unavailable,\n lockWritten: false,\n npmInstalled: [],\n npmFailed: [],\n };\n }\n }\n\n // 1. Ensure all source clones are present/up to date.\n const cloneError = this.ensureSourceClones(repositories, sources);\n if (cloneError) return cloneError;\n\n // 2. Build the provenance index from the clones and resolve.\n const provenanceIndex = await buildProvenanceIndex(this.buildClones(repositories), {\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n });\n const { resolved, missing, overridesApplied, lib, presets } = await this.resolveLibraryFirst(\n dependencies,\n {\n provenanceIndex,\n overrides,\n stores,\n declaredRefs: dependencies,\n // `install` restores what the lock recorded: a changed default library or a second\n // library holding the same ref does not move a locked asset. `update` re-resolves.\n ...(opts?.moveLibraries ? {} : { lockedLibraries: await this.lockedLibraryNames() }),\n },\n );\n // Two declared assets of one kind and name from different publishers share a deploy\n // folder: refuse before reconciling or deploying anything.\n this.assertNoFolderCollision([...resolved, ...lib.entries.map((e) => this.entryIdentity(e))]);\n // A ref whose publisher changed (`library set publisher=`) misses; say where it went.\n // Computed before the lock rewrite below, which drops the old publisher's entry.\n const stillMissing = missing.filter((m) => !lib.resolved.has(m));\n const missingHints = await this.publisherChangeHints(stillMissing);\n // A declared ref that no longer resolves keeps its deployed files and its lock entry: the\n // bytes are the only copy left. The user changes the library or the ref, not the project.\n const prevLock = this.tryReadLock();\n const kept = keptLockEntries(prevLock, stillMissing);\n const fixes = await this.unresolvedFixes(stillMissing);\n for (const ref of new Set([...kept.refs, ...fixes.keys()])) {\n const fix = fixes.get(ref);\n // The fix names the moved ref itself, so it replaces the bare `did you mean` hint.\n const notes = [\n kept.refs.has(ref)\n ? this.keptCopyDeployed(kept, ref)\n ? \"the deployed copy and its lock entry are kept\"\n : \"its lock entry is kept; no deployed copy exists\"\n : undefined,\n fix,\n ].filter((n): n is string => n !== undefined);\n missingHints[ref] = `${fix ? \"\" : (missingHints[ref] ?? \"\")} (${notes.join(\"; \")})`;\n }\n // `asset install` entries are not driven by skaile.yaml: carry them over so\n // neither their lock entry nor their files are reconciled away.\n const directLock = this.directInstallLockEntries();\n const libraryLock = { ...directLock, ...(await this.libraryLockEntries(lib)) };\n // The assets a kept asset requires stay as well, or the install would delete what it needs.\n const freshLock = {\n ...buildLockFile(resolved, overridesApplied, libraryLock),\n ...presetsLockSlice(presets),\n };\n await this.keepRequiredByKept(prevLock, kept, Object.keys(freshLock.assets));\n\n // 3. Reconcile: remove stale assets (in old lock but not in new resolved set).\n const { removed, replaced } = this.reconcileRemovedAssets(\n resolved,\n new Set([...Object.keys(libraryLock), ...Object.keys(kept.assets)]),\n );\n\n // 4. Map candidates to catalog entries (fetching store bytes) and deploy.\n // Fan out to every target harness (one in project mode; the resolved\n // global set in `--global` mode) — same lock, one staged byte set.\n const entries = [...(await this.buildCatalogEntries(resolved, repositories)), ...lib.entries];\n const copyDrift = await this.lockedCopyDrift();\n const deployed = [\n ...new Set(\n this.targetHarnesses().flatMap((t) =>\n deployAll(entries, repositories, patches, this.deployOptsFor(t, opts?.link)),\n ),\n ),\n ];\n const restored = this.restoredCopies(copyDrift, deployed);\n\n // 4b. Render declared MCP servers into the coding agent's own MCP config.\n await this.renderDriverMcpConfig();\n const agentRender = await this.renderAgentInstances();\n\n // 5. Write the v2 lock file (authoritative full rewrite), library-origin\n // entries included. Skip only when there is nothing lockable AND no lock\n // exists yet — a project that resolved nothing should not get a vacuous\n // `skaile.lock.yaml`. When a lock DOES exist, still write (an empty\n // rewrite clears entries for now-removed deps).\n const lockWanted = resolved.length > 0 || lib.entries.length > 0 || existsSync(this.lockPath);\n let lockWritten = false;\n let relocked: string[] = [];\n let moved: LibraryMove[] = [];\n if (lockWanted) {\n const lockData = withKeptLockEntries(freshLock, kept);\n relocked = relockedRefs(prevLock, lockData);\n moved = libraryMoves(prevLock, libraryLock);\n // `writeLock` leaves an identical lock untouched (no `locked_at` churn).\n lockWritten = writeLock(this.lockPath, lockData);\n }\n\n // 6. Record history.\n this.recordInstallHistory(deployed, removed);\n\n // 7. Install npm peer deps for any mount/connector declared in skaile.yaml.\n const { npmInstalled, npmFailed } = await this.installRuntimeAssetDeps();\n await this.adviseMissing(stillMissing, missingHints);\n\n return {\n deployed,\n removed,\n missing: stillMissing,\n ...(Object.keys(missingHints).length > 0 ? { missingHints } : {}),\n ...(relocked.length > 0 ? { relocked } : {}),\n ...(moved.length > 0 ? { moved } : {}),\n ...(replaced.length > 0 ? { replaced } : {}),\n ...(restored.length > 0 ? { restored } : {}),\n lockWritten,\n npmInstalled,\n npmFailed,\n presets,\n ...agentRender,\n };\n }\n\n /**\n * Extend `kept` (see {@link keptLockEntries}) with every previous lock entry a kept asset\n * requires, transitively, that the new lock (`freshKeys`) does not already carry. The lock\n * records no edges, so they are read from the kept asset's deployed copy, where the\n * requirement is publisher-qualified the same way a library scan does it. A copy that\n * cannot be read has no known requirements.\n */\n private async keepRequiredByKept(\n prev: LockFile | null,\n kept: KeptLockEntries,\n freshKeys: string[],\n ): Promise<void> {\n if (!prev) return;\n const fresh = freshKeys.map(parseCanonicalLockKey);\n const queue = Object.keys(kept.assets);\n for (const key of queue) {\n for (const dep of await this.deployedRequirementsOf(parseCanonicalLockKey(key))) {\n const want = memberIdentity(dep);\n if (!want) continue;\n const matches = (id: { kind?: string; name?: string; publisher?: string }): boolean =>\n id.kind === want.kind &&\n id.name === want.name &&\n (!want.publisher || !id.publisher || id.publisher === want.publisher);\n if (fresh.some(matches)) continue;\n for (const [depKey, entry] of Object.entries(prev.assets)) {\n if (depKey in kept.assets || entry.library?.installed) continue;\n if (!matches(parseCanonicalLockKey(depKey))) continue;\n kept.assets[depKey] = entry;\n queue.push(depKey);\n const src = entry.source\n ? prev.sources.find((s) => s.url === entry.source?.url)\n : undefined;\n if (src) kept.sources.push(src);\n }\n }\n }\n }\n\n /**\n * Publisher-qualified refs the deployed copy of `id` requires, read from its own\n * manifest file (`metadata.requires`, a manifest `dependencies:` entry): the one place\n * the requirements stay knowable when no source or library holds the asset any more.\n * A copy that is not deployed or cannot be read has no known requirements.\n */\n private async deployedRequirementsOf(id: {\n kind?: string;\n name?: string;\n publisher?: string;\n }): Promise<string[]> {\n const { kind, name, publisher } = id;\n const component = kind ? this.installTarget(kind) : undefined;\n if (!kind || !name || !component) return [];\n const dir = deployedDir(component, name, this.driverTarget, this.global, this.projectDir);\n if (!existsSync(dir)) return [];\n try {\n const scanned = await scanDirectory(dir, publisher ?? \"\", { knownKinds: this.knownKinds });\n const own = scanned.find((e) => e.kind === kind && e.name === name);\n return own ? libraryEntryDepRefs(own) : [];\n } catch {\n return [];\n }\n }\n\n /**\n * Ensure all source clones are present/up to date. Returns an early\n * {@link InstallResult} describing the failed source on the first error, or\n * `null` when every clone succeeds.\n */\n private ensureSourceClones(\n repositories: Record<string, SourceDeclaration>,\n sources: SourceEntry[],\n ): InstallResult | null {\n const pinBySlug = pinsBySlug(sources);\n for (const [name, decl] of Object.entries(repositories)) {\n try {\n ensureRepo(decl, name, this.reposDir, {\n projectDir: this.projectDir,\n pin: pinBySlug.get(name),\n });\n } catch (err) {\n return {\n deployed: [],\n removed: [],\n missing: [`source:${name} (${err instanceof Error ? err.message : String(err)})`],\n lockWritten: false,\n };\n }\n }\n return null;\n }\n\n /**\n * Best-effort twin of {@link ensureSourceClones} for the read-mostly entry\n * points (`add` / `lock`): same declarations and the same pins — a pinned\n * source must never be pulled off its pin — but a clone failure is swallowed\n * so resolution still runs against whatever is on disk.\n */\n private ensureSourceClonesQuiet(\n repositories: Record<string, SourceDeclaration>,\n sources: SourceEntry[],\n ): void {\n const pinBySlug = pinsBySlug(sources);\n for (const [name, decl] of Object.entries(repositories)) {\n try {\n ensureRepo(decl, name, this.reposDir, {\n projectDir: this.projectDir,\n pin: pinBySlug.get(name),\n });\n } catch {}\n }\n }\n\n /** Lock entries `skaile asset install` wrote (copied/linked straight into the project). */\n private directInstallLockEntries(): Record<string, LockEntry> {\n const entries = this.tryReadLock()?.assets ?? {};\n return Object.fromEntries(Object.entries(entries).filter(([, e]) => e.library?.installed));\n }\n\n /**\n * Remove stale assets — those recorded in the old lock but absent from the\n * newly resolved set (`resolved` source candidates plus `keep`, the canonical\n * refs of library-origin assets locked in this run). Returns the list of\n * removed refs.\n */\n private reconcileRemovedAssets(\n resolved: ProvenanceCandidate[],\n keep: ReadonlySet<string> = new Set(),\n ): { removed: string[]; replaced: ReplacedAsset[] } {\n const oldLock = this.tryReadLock();\n // Must match the canonical lock-key format from buildLockFile (core/lock.ts):\n // `<kind>:@<publisher>/<name>#<version>`. A different shape here made every\n // locked asset miss the set → wrongly \"removed\" (undeployed) then redeployed.\n const resolvedRefs = new Set([\n ...resolved.map((c) => `${c.kind}:@${c.publisher}/${c.name}#${c.version}`),\n ...keep,\n ]);\n const removed: string[] = [];\n const replaced: ReplacedAsset[] = [];\n if (oldLock) {\n for (const ref of Object.keys(oldLock.assets)) {\n if (!resolvedRefs.has(ref)) {\n const { kind, name, publisher, version } = parseCanonicalLockKey(ref);\n // A preset is a grouping with nothing deployed; a `preset:` row an older\n // release locked for a library preset just drops out of the rewritten lock.\n if (kind === \"preset\") continue;\n if (kind && name) {\n for (const t of this.targetHarnesses()) removeAsset(kind, name, this.deployOptsFor(t));\n // The same asset stays locked at another version: a replacement, not a removal.\n const successor = [...resolvedRefs].find((r) => {\n const o = parseCanonicalLockKey(r);\n return o.kind === kind && o.name === name && o.publisher === publisher;\n });\n if (successor) {\n replaced.push({\n ref: `${kind}:${publisher ? `@${publisher}/` : \"\"}${name}`,\n from: version ?? \"\",\n to: parseCanonicalLockKey(successor).version ?? \"\",\n });\n } else removed.push(ref);\n } else {\n // Surface the skip — an unparseable lock key means a stale asset can't\n // be reconciled away and would silently survive a remove-from-yaml.\n console.warn(`skaile: cannot reconcile unparseable lock key \"${ref}\" — left in place.`);\n }\n }\n }\n }\n return { removed, replaced };\n }\n\n /** Append `add`/`remove` history entries for a completed install reconcile. */\n private recordInstallHistory(deployed: string[], removed: string[]): void {\n for (const ref of deployed) {\n appendHistory(this.projectDir, {\n ref,\n action: \"add\",\n timestamp: new Date().toISOString(),\n context: this.global ? \"global\" : \"project\",\n });\n }\n for (const ref of removed) {\n appendHistory(this.projectDir, {\n ref,\n action: \"remove\",\n timestamp: new Date().toISOString(),\n context: this.global ? \"global\" : \"project\",\n });\n }\n }\n\n /** Read the lock, returning null on a legacy v1 lock instead of throwing. */\n private tryReadLock(): LockFile | null {\n try {\n return readLock(this.lockPath);\n } catch {\n return null;\n }\n }\n\n /** Build a store fetcher from the configured stores, or undefined when none. */\n private buildStoreFetcher(stores: StoreEntry[]): StoreFetcher | undefined {\n if (stores.length === 0) return undefined;\n return {\n getInstallManifest: async (storeUrl, ref) => {\n const { RemoteCatalogSource, CatalogHttpError } = await import(\n \"@skaile/workspaces/library\"\n );\n const src = new RemoteCatalogSource({ baseUrl: storeUrl });\n try {\n const m = await src.getInstallManifest(ref);\n // The install manifest has no dependency field; the catalog asset row does.\n // A failed lookup must not fail the install (the manifest above proved the\n // store is up), but warn so the missing deps are not silent.\n let deps: string[] | undefined;\n let gap: string | undefined;\n try {\n let row = await src.resolve(ref);\n // The manifest just proved the asset exists, so a `null` row is a cached miss\n // from before it was published: ask the store again (air-gapped can't).\n if (row === null && !src.cache.airGapped) row = await src.revalidate(ref);\n deps = row?.requires;\n if (row === null) gap = `has no catalog row for ${ref}`;\n // Air-gapped serves cache entries from older CLIs, which lack `requires`.\n else if (deps === undefined)\n gap = `has a cached catalog row for ${ref} without dependencies`;\n } catch (err) {\n gap = `dependency lookup for ${ref} failed — ${err}`;\n }\n if (gap) {\n console.warn(`skaile: store ${storeUrl} ${gap}; installing without its dependencies`);\n }\n return {\n sourceUrl: m.source.url,\n commit: m.source.commitSha,\n sha256: m.sha256,\n files: m.files,\n deps,\n };\n } catch (err) {\n if (err instanceof CatalogHttpError && err.status === 404) return null;\n throw err;\n }\n },\n getCanonicalDigest: async (storeUrl, ref) => {\n const { RemoteCatalogSource } = await import(\"@skaile/workspaces/library\");\n const src = new RemoteCatalogSource({ baseUrl: storeUrl });\n return src.getCanonicalDigest(ref);\n },\n listVersions: async (storeUrl, ref) => {\n const { RemoteCatalogSource } = await import(\"@skaile/workspaces/library\");\n const src = new RemoteCatalogSource({ baseUrl: storeUrl });\n try {\n return await src.listVersions(ref);\n } catch (err) {\n // Version discovery is a best-effort hint; a store/transport failure must\n // not fail the whole add/install. Warn, though — without it the ref just\n // lands in `missing` and a store outage reads as \"Asset not found\". One\n // warning per store URL: an unreachable store fails every ref the same way.\n if (!this.warnedStoreVersionLookups.has(storeUrl)) {\n this.warnedStoreVersionLookups.add(storeUrl);\n console.warn(`skaile: store ${storeUrl} version lookup for ${ref} failed — ${err}`);\n }\n return [];\n }\n },\n };\n }\n\n /**\n * Resolve runtime assets and install any missing npm peer deps.\n *\n * - Required deps: installed via `bun add --optional`. Failure is recorded\n * in `npmFailed` but does not throw — install() proceeds so users get a\n * useful error message rather than a hung command.\n * - Optional deps: not installed automatically (would force every consumer\n * to pull every connector's deps). Future: add a flag to opt in.\n */\n private async installRuntimeAssetDeps(): Promise<{\n npmInstalled: string[];\n npmFailed: string[];\n }> {\n const npmInstalled: string[] = [];\n const npmFailed: string[] = [];\n let runtimeAssets: Awaited<ReturnType<typeof resolveRuntimeAssets>> | null = null;\n try {\n runtimeAssets = await resolveRuntimeAssets(this.projectDir);\n } catch {\n // Non-fatal — projects with no skaile.yaml or unresolvable factory-assets\n // simply have no runtime deps to install.\n return { npmInstalled, npmFailed };\n }\n\n const required = runtimeAssets.requiredNpmDeps.required;\n if (required.length === 0) return { npmInstalled, npmFailed };\n\n const { findMissingPackages, installNpmPackages } = await import(\n \"@skaile/workspaces/connectors\"\n );\n const missing = findMissingPackages(required, this.projectDir);\n if (missing.length === 0) return { npmInstalled, npmFailed };\n\n const result = await installNpmPackages(missing, this.projectDir);\n if (result.success) {\n npmInstalled.push(...missing);\n } else {\n npmFailed.push(...missing);\n }\n return { npmInstalled, npmFailed };\n }\n\n /**\n * Give every ref `install` could not resolve, and that has no hint yet, the fix the shared\n * {@link AssetManager.projectState} names for it (a declared ref no library or source holds,\n * a requirement nothing holds). Runs after the deploy, so a requirer is known by then.\n * Mutates `hints`: ` <reason>` follows the ref in the `Missing:` line.\n */\n private async adviseMissing(refs: string[], hints: Record<string, string>): Promise<void> {\n const open = refs.filter((r) => !hints[r]);\n if (open.length === 0) return;\n const { gaps } = await this.projectState();\n for (const ref of open) {\n const want = parseRefTolerant(ref.split(\" \")[0] ?? ref);\n if (!want) continue;\n const gap = gaps.find(\n (g) =>\n (g.type === \"declared\" || g.type === \"requires\") && g.manualFix && sameAsset(g.ref, want),\n );\n if (gap) hints[ref] = ` ${gap.reason}`;\n }\n }\n\n private async installLocked(\n repositories: Record<string, SourceDeclaration>,\n patches: Record<string, string>,\n dependencies: string[],\n ): Promise<InstallResult> {\n const lock = this.tryReadLock();\n if (!lock) {\n // A declared ref nothing holds is not fixed by `install`: say what `check` says instead of\n // sending the user to a command that fails on it too.\n const gaps = (await this.projectState()).gaps.filter((g) => g.type !== \"agent\");\n if (gaps.some((g) => g.manualFix)) {\n return {\n deployed: [],\n removed: [],\n missing: gaps.map((g) => g.message),\n lockWritten: false,\n npmInstalled: [],\n npmFailed: [],\n };\n }\n throw new Error(\"No lock file found. Run `skaile install` first.\");\n }\n this.assertNoFolderCollision(Object.keys(lock.assets).map(parseCanonicalLockKey));\n\n // Ensure every contributing source clone exists at its pinned commit. Sources\n // are keyed by URL slug; the lock's `sources[]` carries the URL + commit.\n const declBySlug = new Map(Object.entries(repositories));\n\n // The factory source shares FACTORY_SOURCE_URL with the real ai-assets repo but ships\n // its bytes in-package (never fetched); resolve it to its bundled `path` + skip the fetch,\n // else verifyLock checks the ai-assets clone and false-reports every factory asset missing.\n const factoryUrl = normalizeRepoUrl(FACTORY_SOURCE_URL);\n const factoryDir = Object.values(repositories).find((d) => d.factory)?.path ?? null;\n\n for (const src of lock.sources) {\n if (factoryDir && normalizeRepoUrl(src.url) === factoryUrl) continue;\n const slug = sourceCacheKey(src.url);\n const decl = declBySlug.get(slug) ?? { url: src.url };\n ensureRepo(decl, slug, this.reposDir, { projectDir: this.projectDir, pin: src.commit });\n }\n\n // Resolve a source URL to its on-disk clone for verification.\n const resolveCloneDir = (sourceUrl: string): string | null => {\n if (factoryDir && normalizeRepoUrl(sourceUrl) === factoryUrl) return factoryDir;\n const slug = sourceCacheKey(sourceUrl);\n const decl = declBySlug.get(slug) ?? { url: sourceUrl };\n return this.resolveRepoDir(decl, slug);\n };\n\n // Verify integrity against the v2 lock.\n const verification = verifyLock(lock, resolveCloneDir);\n if (!verification.ok) {\n const issues = [\n ...verification.drifted.map((r) => `drifted: ${r}`),\n ...verification.missing.map((r) => `missing: ${r}`),\n ];\n throw new Error(`Lock file verification failed:\\n ${issues.join(\"\\n \")}`);\n }\n\n // A declared preset is only its items: one the lock does not cover (it never\n // resolved) must not pass as a restorable set.\n const presetGaps = await this.declaredPresetGaps(dependencies, lock);\n if (presetGaps.size > 0) {\n const lines = [...presetGaps].flatMap(([preset, gaps]) =>\n gaps.map((g) => `${preset} item ${g.ref}`),\n );\n throw new Error(\n `Lock file does not pin every item of the declared presets (not resolved by \\`skaile install\\`):\\n ${lines.join(\"\\n \")}`,\n );\n }\n\n // Rebuild catalog entries from the lock and deploy. Library-origin entries\n // have no clone: they are re-resolved from their named library below.\n const resolved: CatalogEntry[] = [];\n for (const [ref, entry] of Object.entries(lock.assets)) {\n if (!entry.source) continue;\n const { publisher, kind, name } = parseCanonicalLockKey(ref);\n if (!publisher || !kind || !name) continue;\n const slug = sourceCacheKey(entry.source.url);\n const cloneDir = resolveCloneDir(entry.source.url) ?? join(this.reposDir, slug);\n const mdRel =\n entry.files.find((f) => /\\.(md|yaml)$/i.test(f.path))?.path ?? entry.files[0]?.path ?? \"\";\n resolved.push({\n name,\n kind: kind as CatalogEntry[\"kind\"],\n description: \"\",\n source: mdRel ? join(cloneDir, mdRel) : cloneDir,\n // Keep the publisher label slash-free (repo name), not the full cache key.\n publisher: sourceShortName(entry.source.url),\n version: entry.source.commit,\n // The lock key is the canonical ref; `publisher` above is only a clone label.\n canonicalRef: ref,\n requires: [],\n dependencies: [],\n });\n // Ensure the repositories map has an entry for deployAll's local/remote check.\n if (!repositories[slug]) repositories[slug] = { url: entry.source.url, path: cloneDir };\n }\n\n const library = await this.restoreLibraryLockEntries(lock);\n const copyDrift = await this.lockedCopyDrift();\n const deployed = [\n ...new Set(\n this.targetHarnesses().flatMap((t) =>\n deployAll(\n [...resolved, ...library.entries],\n repositories,\n patches,\n this.deployOptsFor(t),\n ),\n ),\n ),\n ];\n const restored = this.restoredCopies(copyDrift, deployed);\n await this.renderDriverMcpConfig();\n const agentRender = await this.renderAgentInstances();\n // The lock is only \"restored exactly\" when it covers the project: the gaps `check`, `doctor`\n // and `outdated` report (a declared dep with no lock entry, an unlocked `requires`, a pin the\n // lock contradicts, a library that cannot supply a locked asset) are drift here too.\n // A ref already reported in `library.missing` is not listed twice.\n const alreadyMissing = new Set(\n library.missing.map((m) => {\n const p = parseRefTolerant(m.split(\" \")[0] ?? m);\n return p ? `${p.kind}:${p.name}` : m;\n }),\n );\n const gaps = (await this.projectState()).gaps\n .filter((g) => {\n // An unbound agent instance is already in `agentRender.agentInstanceErrors`.\n if (g.type === \"agent\") return false;\n const p = parseRefTolerant(g.ref);\n return !(p && alreadyMissing.has(`${p.kind}:${p.name}`));\n })\n .map((g) => g.message);\n return {\n deployed,\n removed: [],\n missing: [...library.missing, ...gaps],\n lockWritten: false,\n ...(restored.length > 0 ? { restored } : {}),\n ...agentRender,\n };\n }\n\n /**\n * Parse the ref `add` was given. A ref the grammar rejects fails with the parser's message\n * minus its manifest-migration advice (it points at a skill that is not for `add`), and:\n * - a publisher-less ref (`report-html`, `skill:report-html`) names the assets of that\n * kind and name that `add` can resolve (a source, the bundled factory source or a\n * library holds them), so `Did you mean` never names an asset that does not resolve;\n * - a `@version` suffix (`skill:@acme/x@1.0.0`) says the pin is written `#<version>`.\n */\n private async parseAddRef(\n ref: string,\n repositories: Record<string, SourceDeclaration>,\n sources: SourceEntry[],\n ): Promise<AssetRef> {\n try {\n return parseAssetRef(ref);\n } catch (err) {\n if (!(err instanceof Error)) throw err;\n const advice = \" Run the `migrate-skaile-manifest` skill on legacy manifests.\";\n const plain = err.message.endsWith(advice)\n ? err.message.slice(0, -advice.length)\n : err.message;\n if (plain.startsWith(\"publisher required\")) {\n const matches = await this.resolvableMatches(ref, repositories, sources);\n const hint =\n matches.length === 0\n ? \"\"\n : matches.length === 1\n ? ` Did you mean ${matches[0]}?`\n : ` Did you mean one of: ${matches.join(\", \")}?`;\n throw new Error(`${plain}${hint}`);\n }\n const pinned = /^(.*\\/[^@#/]+)@([^@#/]+)$/.exec(ref.trim());\n if (pinned && plain.startsWith(\"invalid asset name\")) {\n throw new Error(`${plain} To pin a version, write ${pinned[1]}#${pinned[2]}.`);\n }\n throw new Error(plain);\n }\n }\n\n /**\n * The publisher-qualified refs of the assets named like the publisher-less `ref` that\n * `add` resolves: held by a source clone, the bundled factory source or a registered\n * library. A ref without a kind means a skill, as the grammar says.\n */\n private async resolvableMatches(\n ref: string,\n repositories: Record<string, SourceDeclaration>,\n sources: SourceEntry[],\n ): Promise<string[]> {\n const trimmed = ref.trim();\n const colon = trimmed.indexOf(\":\");\n const rawKind = colon === -1 ? \"skill\" : trimmed.slice(0, colon).trim();\n const kind = rawKind === \"mcp\" ? \"mcp-server\" : rawKind;\n const hash = trimmed.indexOf(\"#\", colon + 1);\n const name = trimmed.slice(colon + 1, hash === -1 ? undefined : hash).trim();\n if (!name || /[@/\\s]/.test(name)) return [];\n const found = new Set<string>();\n const note = (c: { kind: string; name: string; publisher?: string }): void => {\n if (c.kind === kind && c.name === name && c.publisher) {\n found.add(assetRefToStr({ kind, name, publisher: c.publisher.replace(/^@/, \"\") }));\n }\n };\n try {\n this.ensureSourceClonesQuiet(repositories, sources);\n const index = await buildProvenanceIndex(this.buildClones(repositories), {\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n });\n for (const candidates of index.values()) for (const c of candidates) note(c);\n for (const { entry } of await this.libraryAssets()) note(entry);\n } catch {\n // A hint must never replace the real error.\n }\n return [...found].sort();\n }\n\n /**\n * Add a single asset (and its transitive dependencies) to the workspace.\n *\n * Resolves `ref`, deploys the asset and all requirements, then records the ref\n * in `skaile.yaml` `dependencies` so subsequent `skaile install` runs re-deploy it.\n *\n * @param ref - Asset ref in `kind:name` or `repo/kind:name` form (e.g. `skill:my-skill`).\n * @param opts - Optional deploy options.\n * @param opts.link - When `true`, symlink local-path assets instead of copying them\n * (the author dev-loop). Machine-local / not for committing; a no-op for\n * store/factory sources. Defaults to copy.\n * @param opts.onLibraryOrigin - Called once per deployed library-origin asset with its\n * canonical ref and the name of the library it was resolved from.\n * @param opts.onLibraryMoved - Called once per asset whose lock entry named another library\n * than the one this add resolved it from.\n * @param opts.onPresets - Called once with the presets expanded into this add (the\n * added preset and any it nests); a library-held preset names its library.\n * @returns Array of asset refs that were deployed in this call.\n * @throws When the asset cannot be found in any configured repository, or when a\n * preset's items do not all resolve (nothing is deployed or recorded then).\n */\n async add(\n ref: string,\n opts?: {\n link?: boolean;\n onLibraryOrigin?: (deployedRef: string, library: string) => void;\n /** Called per already-locked asset this add moved to another library than its lock entry named. */\n onLibraryMoved?: (move: LibraryMove) => void;\n onPresets?: (presets: PresetExpansion[]) => void;\n /** Called per symlink an asset's copy deploy leaves out (`ref`, path under the asset dir). */\n onSkippedSymlink?: (ref: string, path: string) => void;\n /** Called per `.env` file in an asset's directory that a copy deploy leaves out. */\n onEnvFile?: (ref: string, path: string) => void;\n },\n ): Promise<string[]> {\n const { repositories, sources, stores, dependencies, overrides, patches } = this.loadConfig();\n const parsed = await this.parseAddRef(ref, repositories, sources);\n\n this.ensureSourceClonesQuiet(repositories, sources);\n\n const provenanceIndex = await buildProvenanceIndex(this.buildClones(repositories), {\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n });\n const { resolved, missing, overridesApplied, lib, presets } = await this.resolveLibraryFirst(\n [ref],\n { provenanceIndex, overrides, stores, declaredRefs: dependencies, warnCollisions: true },\n );\n if (resolved.length === 0 && lib.entries.length === 0 && presets.length === 0) {\n // The directory may be on disk in a registered library whose manifest does not list\n // it yet: name `library index`, as the listed-but-partial case does.\n const snap = await this.loadLibraryIndex();\n const bare = (p: string | undefined) => (p ?? \"\").replace(/^@/, \"\");\n for (const l of snap?.libraries ?? []) {\n const libPath = this.libraryPath({ name: l.name }, snap);\n if (!libPath || !manifestFileHasAssetsArray(libPath)) continue;\n const unlisted = await scanUnlistedAssets(libPath, l.name, this.registry);\n const hit = unlisted.find(\n (u) =>\n !u.registeredAt &&\n u.entry.kind === parsed.kind &&\n u.entry.name === parsed.name &&\n (!parsed.publisher || bare(u.entry.publisher) === bare(parsed.publisher)),\n );\n if (hit) {\n throw new Error(\n `${canonicalEntryRef(hit.entry)} is in library \"${l.name}\" but not listed in its skaile.manifest.yaml, ` +\n `so only part of its files would be deployed. Run \\`skaile library index ${l.name}\\`, then add it again.`,\n );\n }\n }\n throw new Error(\n `Asset not found: ${ref}${(await this.publisherChangeHints([ref]))[ref] ?? \"\"}` +\n `${missing.length ? ` (missing: ${missing.join(\", \")})` : \"\"}`,\n );\n }\n // A preset is only its items: one that does not resolve would leave the project\n // declaring a set it cannot install, so refuse before deploying or recording anything.\n if (parsed.kind === \"preset\" && missing.length > 0) {\n throw new Error(\n `Preset ${ref} has items that do not resolve: ${missing.join(\", \")} — nothing was added`,\n );\n }\n // A library asset the manifest does not list would deploy without its helper files:\n // refuse before anything is written, and name the fix.\n if (lib.entries.length > 0) {\n const snap = await this.loadLibraryIndex();\n for (const e of lib.entries) {\n const origin = lib.libraryOf.get(e);\n const libPath = origin ? this.libraryPath({ name: origin }, snap) : null;\n if (origin && libPath && isUnlistedLibraryAsset(e, libPath)) {\n throw new Error(\n `${canonicalEntryRef(e)} is in library \"${origin}\" but not listed in its skaile.manifest.yaml, ` +\n `so only part of its files would be deployed. Run \\`skaile library index ${origin}\\`, then add it again.`,\n );\n }\n }\n }\n // Two publishers' assets of one kind and name share a deploy folder: refuse before\n // anything is fetched or written, rather than overwrite the one already there.\n this.assertNoFolderCollision(\n [...resolved, ...lib.entries.map((e) => this.entryIdentity(e))],\n [\n ...Object.keys(this.tryReadLock()?.assets ?? {}).map(parseCanonicalLockKey),\n ...dependencies.map((d) => parseAssetRefLoose(d) ?? {}),\n ],\n );\n // The asset resolved, but a requirement of it did not: deploying it would leave a project\n // `check`, `install` and `diff` all fail, so refuse before anything is written or recorded.\n if (missing.length > 0) {\n throw new Error(\n `${ref.split(\"#\")[0]} requires ${missing.join(\", \")} (not found — ${REGISTER_HOLDER}, or remove the requirement from the asset's manifest) — nothing was added`,\n );\n }\n\n const entries = [...(await this.buildCatalogEntries(resolved, repositories)), ...lib.entries];\n const deployed = [\n ...new Set(\n this.targetHarnesses().flatMap((t) =>\n deployAll(\n entries,\n repositories,\n patches,\n this.deployOptsFor(t, opts?.link, opts?.onSkippedSymlink, opts?.onEnvFile),\n ),\n ),\n ),\n ];\n // Tell the caller which library each library-origin asset came from, keyed by\n // the canonical ref `deployAll` returned, so its success line can name it.\n if (opts?.onLibraryOrigin) {\n for (const e of lib.entries) {\n const origin = lib.libraryOf.get(e);\n const deployedRef = canonicalEntryRef(e);\n if (origin && deployed.includes(deployedRef)) opts.onLibraryOrigin(deployedRef, origin);\n }\n }\n if (presets.length > 0) opts?.onPresets?.(presets);\n\n // Add to skaile.yaml dependencies (canonical ref string). Global mode routes\n // this to the user-scope SSOT (`~/.skaile/skaile.yaml`).\n this.addDependencyToConfig(ref);\n\n // Render declared MCP servers into the coding agent's own MCP config. Runs\n // after the dependency lands in skaile.yaml — the resolver only admits\n // declared assets.\n await this.renderDriverMcpConfig();\n await this.renderAgentInstances();\n\n // Keep the lock in sync — else a later remove-from-yaml + install has no\n // entry to diff against and the asset orphans. Merge (superset-write, never\n // drops existing entries or the plugins slice), not a full rewrite. Library\n // assets are locked as library-origin entries; a hit that resolved nothing at\n // all skips the write rather than stamp a vacuous lock into the project.\n if (resolved.length > 0 || lib.entries.length > 0) {\n const libraryLock = await this.libraryLockEntries(lib);\n const fresh = {\n ...buildLockFile(resolved, overridesApplied, libraryLock),\n ...presetsLockSlice(presets),\n };\n const prevLock = this.tryReadLock();\n if (opts?.onLibraryMoved) {\n for (const m of libraryMoves(prevLock, libraryLock)) opts.onLibraryMoved(m);\n }\n writeLock(this.lockPath, mergeLockFile(prevLock, fresh));\n }\n\n for (const d of deployed) {\n appendHistory(this.projectDir, {\n ref: d,\n action: \"add\",\n timestamp: new Date().toISOString(),\n context: this.global ? \"global\" : \"project\",\n });\n }\n\n return deployed;\n }\n\n /**\n * Report the body-link **soft dependencies** of the given assets that are not\n * already present in the project.\n *\n * Looks up each ref's persisted `softDeps` in the local index\n * (`~/.skaile/index.db`, populated by `skaile source sync`) and returns the\n * edges whose target is neither a declared dependency nor deployed on disk. It\n * does **not** install anything and never touches the resolver / lock /\n * reconcile path: callers surface the result as a hint, the user opts in with\n * a follow-up `skaile add`. Inspects exactly the passed `refs` — soft deps of\n * their transitively-deployed dependencies are not surfaced here.\n *\n * Opening the index runs its idempotent migrations, so this is not a pure\n * read — but it is **best-effort**: any failure (legacy/corrupt index, a\n * removed-backend guard) yields `[]`, so it can never fail a primary `add`\n * that already succeeded.\n *\n * @param refs - Asset refs to inspect (canonical, `kind:@pub/name`, or `kind:name`).\n * @returns One edge per absent soft-dep target (deduped by target). `toRef` is\n * the parseable `skaile add` ref, omitted when the target isn't in the index.\n */\n async reportSoftDeps(\n refs: string[],\n ): Promise<Array<{ from: string; to: string; toRef?: string }>> {\n if (refs.length === 0) return [];\n return this.withIndexDefs(\n (allDefs) => this.collectSoftDeps(allDefs, refs, true),\n [] as SoftDepEdge[],\n );\n }\n\n /**\n * Presets in the configured sources (and the bundled factory source) that list\n * `ref` as an asset item, for the `skaile add` discoverability hint. Membership is\n * not a dependency: nothing here installs the preset or its siblings.\n *\n * Matches on kind + name, and on publisher only when both sides carry one, so\n * a bare `skill:x` item still matches `skill:@pub/x`. Presets already\n * declared in `skaile.yaml` are left out. Best-effort: any failure yields `[]`,\n * so it can never fail an `add` that succeeded.\n *\n * @param ref - The added asset ref (`kind:name`, `kind:@pub/name`, optionally pinned).\n * @returns One `{ name, ref }` per containing preset, deduped by `ref`; `ref` is\n * the `skaile add` form (`preset:@pub/name`, or `preset:name` without a publisher).\n */\n async presetsContaining(ref: string): Promise<Array<{ name: string; ref: string }>> {\n const target = memberIdentity(ref);\n if (!target || target.kind === \"preset\") return [];\n try {\n const sameAsset = (id: MemberIdentity | null, want: MemberIdentity) =>\n !!id &&\n id.kind === want.kind &&\n id.name === want.name &&\n (!id.publisher || !want.publisher || id.publisher === want.publisher);\n // A preset that is already declared needs no \"add the whole set\" hint.\n const declared = this.loadConfig().dependencies.map(memberIdentity);\n const out: Array<{ name: string; ref: string }> = [];\n const seen = new Set<string>();\n for (const p of await this.search(undefined, \"preset\")) {\n const members = [...p.dependencies, ...p.requires.map(depToStr)];\n if (!members.some((m) => sameAsset(memberIdentity(m), target))) continue;\n const publisher = p.publisher?.replace(/^@/, \"\");\n const presetId = { kind: \"preset\", name: p.name, publisher };\n if (declared.some((d) => sameAsset(d, presetId))) continue;\n const presetRef = publisher\n ? assetRefToStr({ kind: \"preset\", name: p.name, publisher })\n : `preset:${p.name}`;\n if (seen.has(presetRef)) continue;\n seen.add(presetRef);\n out.push({ name: p.name, ref: presetRef });\n }\n return out;\n } catch {\n return [];\n }\n }\n\n /**\n * All body-link soft dependencies of the given assets — present or not.\n *\n * Unlike {@link reportSoftDeps} (which filters to *absent* targets so it can\n * nudge a follow-up `skaile add`), this returns the asset's full inferred\n * soft-dep set for display surfaces (`skaile info` / `tree` / `why`). Read-only\n * and best-effort: any index failure yields `[]`. Targets are deduped.\n *\n * @param refs - Asset refs to inspect (canonical, `kind:@pub/name`, or `kind:name`).\n * @returns One {@link SoftDepEdge} per soft-dep target. `toRef` is the parseable\n * ref, omitted when the target isn't in the index.\n */\n async softDepsOf(refs: string[]): Promise<SoftDepEdge[]> {\n if (refs.length === 0) return [];\n return this.withIndexDefs((allDefs) => this.collectSoftDeps(allDefs, refs, false), []);\n }\n\n /**\n * Reverse lookup: refs (canonical ids) of cached assets whose persisted\n * `softDeps` include `targetRef`. Scans the whole index, not just present\n * assets. Read-only and best-effort (`[]` on any index failure).\n *\n * @param targetRef - Canonical soft-dep target ref (`<publisher>/<name>@<version>`).\n * @returns Def ids that declare `targetRef` as a soft dependency.\n */\n async softDepDependents(targetRef: string): Promise<string[]> {\n return this.withIndexDefs(\n (allDefs) => allDefs.filter((d) => d.softDeps?.includes(targetRef)).map((d) => d.id),\n [],\n );\n }\n\n /**\n * Compute which soft-dependency targets would be left **orphaned** by removing\n * `refs`: targets still present in the project that came in as one of `refs`'\n * soft dependencies and that **nothing else still needs** — neither another\n * present asset's soft-dep ({@link softDepDependents}) nor a typed `requires`.\n *\n * Pure read — never removes anything. The CLI / manage surfaces each result as\n * a prompt (default No) so the user opts in to an extra `skaile remove`. Safe to\n * call before or after the primary remove: assets being removed are excluded\n * from the \"needed by others\" scan, so a soft target referenced only by the\n * removed asset is still reported as an orphan.\n *\n * @param refs - Asset refs being removed (canonical, `kind:@pub/name`, or `kind:name`).\n * @returns One {@link OrphanedSoftDep} per orphaned target (deduped).\n */\n async orphanedSoftDepsAfterRemoving(refs: string[]): Promise<OrphanedSoftDep[]> {\n if (refs.length === 0) return [];\n return this.withIndexDefs((allDefs) => {\n const byId = new Map(allDefs.map((d) => [d.id, d]));\n const present = this.presentRefNames();\n\n // Bare names of the assets being removed — excluded from \"needed by others\".\n const removedNames = new Set<string>();\n for (const ref of refs) {\n for (const def of matchDefsForRef(allDefs, ref)) removedNames.add(def.name);\n try {\n removedNames.add(parseAssetRef(ref).name);\n } catch {}\n }\n\n // Names still needed by a *surviving* present asset (soft-dep or typed requires).\n const neededByOthers = new Set<string>();\n for (const presentRef of this.presentRefs()) {\n for (const def of matchDefsForRef(allDefs, presentRef)) {\n if (removedNames.has(def.name)) continue;\n for (const to of def.softDeps ?? []) neededByOthers.add(softDepName(to));\n for (const req of parseRequires(def.manifest)) neededByOthers.add(softDepName(req.name));\n }\n }\n\n // A present soft target is flagged even when directly declared in\n // skaile.yaml: with no install-provenance tracking we can't tell \"added for\n // the removed asset\" from \"wanted standalone\", so we report the fact (no\n // surviving referrer) and let the user decide — never auto-remove.\n const out: OrphanedSoftDep[] = [];\n const seen = new Set<string>();\n for (const ref of refs) {\n for (const def of matchDefsForRef(allDefs, ref)) {\n for (const to of def.softDeps ?? []) {\n const targetName = softDepName(to);\n if (!present.has(targetName)) continue; // not in the project — nothing to orphan\n if (removedNames.has(targetName)) continue; // also being removed\n if (neededByOthers.has(targetName)) continue; // something else still needs it\n if (seen.has(to)) continue;\n seen.add(to);\n const targetDef = byId.get(to);\n out.push({\n from: def.id,\n target: to,\n targetRef: targetDef ? depRefFromDef(targetDef) : undefined,\n });\n }\n }\n }\n return out;\n }, []);\n }\n\n /**\n * Open the local index, run `fn` against its cached asset defs, and close it.\n * Best-effort: no index (user never ran `source sync`), a missing file, or any\n * open/guard failure yields `fallback` — so a read surface can never throw or\n * create an empty `index.db` as a side effect.\n */\n private async withIndexDefs<T>(fn: (defs: AssetDefinition[]) => T, fallback: T): Promise<T> {\n try {\n const { LocalIndex, resolveIndexPath } = await import(\"@skaile/workspaces/library\");\n const indexPath = this.indexPathOverride ?? resolveIndexPath();\n if (!existsSync(indexPath)) return fallback;\n const index = new LocalIndex({ indexPath });\n try {\n return fn(await index.listAssetDefs());\n } finally {\n index.close();\n }\n } catch {\n return fallback;\n }\n }\n\n /**\n * Build soft-dep edges for `refs` from cached defs. With `onlyAbsent`, targets\n * already present in the project are skipped (the `reportSoftDeps` nudge); else\n * the full inferred set is returned (the `softDepsOf` display). Deduped by target.\n */\n private collectSoftDeps(\n allDefs: AssetDefinition[],\n refs: string[],\n onlyAbsent: boolean,\n ): SoftDepEdge[] {\n const present = onlyAbsent ? this.presentRefNames() : null;\n const byId = new Map(allDefs.map((d) => [d.id, d]));\n const out: SoftDepEdge[] = [];\n const seen = new Set<string>();\n for (const ref of refs) {\n for (const def of matchDefsForRef(allDefs, ref)) {\n for (const to of def.softDeps ?? []) {\n if (present?.has(softDepName(to))) continue;\n if (seen.has(to)) continue;\n seen.add(to);\n const targetDef = byId.get(to);\n out.push({ from: def.id, to, toRef: targetDef ? depRefFromDef(targetDef) : undefined });\n }\n }\n }\n return out;\n }\n\n /**\n * Names of assets already in the project — declared deps + deployed on disk.\n * Bare name only (see {@link softDepName}): a same-named asset of a different\n * publisher/kind counts as present, so the report under-reports rather than\n * nags about something already installed.\n */\n private presentRefNames(): Set<string> {\n const names = new Set<string>();\n for (const ref of this.presentRefs()) {\n try {\n names.add(parseAssetRef(ref).name);\n } catch {}\n }\n return names;\n }\n\n /**\n * Present asset refs — declared `skaile.yaml` deps (canonical refs as written)\n * plus deployed assets as `kind:name`. Used by the soft-dep present-check and\n * the orphan \"needed by others\" scan.\n */\n private presentRefs(): string[] {\n const refs: string[] = [];\n try {\n for (const ref of resolveSkWorkspaceConfig(this.projectDir).dependencies ?? [])\n refs.push(ref);\n } catch {}\n for (const e of this.listDeployed()) refs.push(`${e.kind}:${e.name}`);\n return refs;\n }\n\n /**\n * Remove a deployed asset and unregister it from `skaile.yaml` and the lock.\n *\n * A declared asset is always unregistered, even when nothing is deployed any\n * more (e.g. its library file was deleted): the declaration and lock entry\n * would otherwise be stuck behind a \"not deployed\" refusal.\n *\n * Removes only `ref` itself; use {@link removeWithDependencies} to also drop the\n * dependencies it leaves orphaned.\n *\n * Deliberately does NOT re-render the driver target's MCP config: the render\n * step is async (the declaration resolver is), and making this synchronous\n * method async would break every external caller. A removed MCP server's\n * generated entry is dropped by the next {@link AssetManager.install} — see\n * {@link renderMcpServerConfig}.\n *\n * @param ref - Asset ref: `kind:@publisher/name`, or the short `kind:name` /\n * `name` form when exactly one declared, locked or deployed asset matches it.\n * @returns `true` if anything changed (files undeployed, declaration or lock\n * entry removed), `false` if the asset was neither deployed nor declared.\n * A `preset:` ref has no deployed files: only its declaration goes — its\n * expanded items leave with the next `skaile install`.\n * @throws When `ref` is malformed, or a short ref matches several assets (the\n * message lists them).\n */\n remove(ref: string): boolean {\n const target = this.resolveRemoveTarget(ref);\n return target ? this.removeResolved(target) : false;\n }\n\n /**\n * {@link remove} `ref`, then drop the dependencies that removal left orphaned:\n * locked assets `ref` required (directly or through one another) that\n * `skaile.yaml` no longer declares and no remaining locked asset requires. A\n * preset's items count as its requirements. They are undeployed and unlocked;\n * a dependency still declared or required elsewhere stays.\n *\n * An asset another locked asset (or a declared preset) requires is kept and reported in\n * `blocked`, nothing changes, unless `opts.force` (see {@link requiredByOthers}).\n *\n * @returns `changed` as {@link remove}; `pruned` the canonical refs\n * (`kind:@publisher/name`) of the dependencies dropped as well; `blocked` when the\n * removal was refused.\n */\n async removeWithDependencies(ref: string, opts?: { force?: boolean }): Promise<RemoveResult> {\n const target = this.resolveRemoveTarget(ref);\n if (!target) return { changed: false, pruned: [] };\n if (!opts?.force) {\n const blocked = await this.requiredByOthers(target);\n if (blocked) return { changed: false, pruned: [], blocked };\n }\n const asked = target.publisher\n ? assetRefToStr({ kind: target.kind, name: target.name, publisher: target.publisher })\n : `${target.kind}:${target.name}`;\n let entry: CatalogEntry | null = null;\n try {\n entry = await this.info(asked);\n } catch {\n // Unreadable source/library: nothing known to prune.\n }\n let requiredRefs: string[];\n if (entry) {\n requiredRefs = libraryEntryDepRefs(entry);\n } else {\n // No source or library holds the asset any more: the deployed copy still names\n // what it required. A bare ref takes the publisher the lock recorded for it.\n const lockedAs = Object.keys(this.tryReadLock()?.assets ?? {})\n .map(parseCanonicalLockKey)\n .find(\n (id) =>\n id.kind === target.kind &&\n id.name === target.name &&\n (!target.publisher || id.publisher === target.publisher),\n );\n requiredRefs = await this.deployedRequirementsOf({\n kind: target.kind,\n name: target.name,\n publisher: target.publisher ?? lockedAs?.publisher,\n });\n }\n const changed = this.removeResolved(target);\n if (!changed || requiredRefs.length === 0) return { changed, pruned: [] };\n return { changed, pruned: await this.pruneOrphans(requiredRefs) };\n }\n\n /**\n * Resolve the identity {@link remove} acts on. A publisher-qualified ref is taken\n * as written; a short ref (`kind:name`, or just `name`) is matched on kind + name\n * against the declared dependencies, the lock and the deployed assets, like\n * `why` / `diff` do.\n *\n * @returns the identity, or `null` when a name-only ref matches nothing.\n * @throws On a malformed ref, or when a short ref matches more than one asset.\n */\n private resolveRemoveTarget(ref: string): RemoveTarget | null {\n const trimmed = ref.trim();\n try {\n return parseAssetRef(trimmed);\n } catch (err) {\n // Only a missing publisher is resolvable; every other fault already has a clear message.\n if (!(err instanceof Error) || !err.message.startsWith(\"publisher required\")) throw err;\n const colon = trimmed.indexOf(\":\");\n const rawKind = colon === -1 ? undefined : trimmed.slice(0, colon).trim();\n const kind = rawKind === \"mcp\" ? \"mcp-server\" : rawKind;\n const hash = trimmed.indexOf(\"#\", colon + 1);\n const name = trimmed.slice(colon + 1, hash === -1 ? undefined : hash).trim();\n if (!name || /[@/\\s]/.test(name)) throw err;\n\n const found: RemoveTarget[] = [];\n const note = (id: { kind?: string; name?: string; publisher?: string } | null): void => {\n if (!id?.kind || id.name !== name || (kind && id.kind !== kind)) return;\n found.push({ kind: id.kind, name: id.name, publisher: id.publisher });\n };\n try {\n for (const dep of this.loadConfig().dependencies) note(memberIdentity(dep));\n } catch {\n // No readable skaile.yaml: the lock and deployed assets still count.\n }\n for (const key of Object.keys(this.tryReadLock()?.assets ?? {})) {\n note(parseCanonicalLockKey(key));\n }\n for (const e of this.listDeployed()) note(e);\n\n // A publisher-less hit (a deployed file) is the same asset as a qualified one.\n const qualified = found.filter((f) => f.publisher);\n const distinct = new Map<string, RemoveTarget>();\n for (const f of found) {\n if (!f.publisher && qualified.some((q) => q.kind === f.kind)) continue;\n distinct.set(`${f.kind}:${f.publisher ?? \"\"}/${f.name}`, f);\n }\n const matches = [...distinct.values()];\n if (matches.length > 1) {\n const list = matches\n .map((m) => (m.publisher ? `${m.kind}:@${m.publisher}/${m.name}` : `${m.kind}:${m.name}`))\n .join(\", \");\n throw new Error(`\"${ref}\" matches several assets (${list}) — name one with its full ref.`);\n }\n if (matches.length === 1) return matches[0];\n return kind ? { kind, name } : null;\n }\n }\n\n /**\n * The reverse guard of {@link removeWithDependencies}: which other locked assets (and\n * declared presets) require `target`. Their requirements are read the way {@link lockedGraph}\n * reads them for pruning. Never touches the project.\n *\n * @returns `ref` and `requiredBy` (both `kind:@publisher/name`, version-agnostic), or `null`\n * when `target` is not locked or nothing else requires it.\n */\n private async requiredByOthers(\n target: RemoveTarget,\n ): Promise<{ ref: string; requiredBy: string[] } | null> {\n const lock = this.tryReadLock();\n if (!lock) return null;\n const { requires, findKey } = await this.lockedGraph(lock);\n const targetKey = findKey(\n target.publisher\n ? assetRefToStr({ kind: target.kind, name: target.name, publisher: target.publisher })\n : `${target.kind}:${target.name}`,\n );\n if (!targetKey) return null;\n const display = (node: string): string => {\n if (!lock.assets[node]) return node; // a declared preset, keyed by its declared ref\n const { kind, name, publisher } = parseCanonicalLockKey(node);\n if (!kind || !name) return node;\n return publisher ? assetRefToStr({ kind, name, publisher }) : `${kind}:${name}`;\n };\n const requiredBy = [...requires]\n .filter(([node, deps]) => node !== targetKey && deps.includes(targetKey))\n .map(([node]) => display(node));\n return requiredBy.length > 0 ? { ref: display(targetKey), requiredBy } : null;\n }\n\n /**\n * Publishers under which the lock or `skaile.yaml` track `kind:name`. A deployed dir carries\n * no publisher, so this is what says whose copy it is. `undefined` stands for a\n * publisher-less declaration.\n */\n private trackedPublishers(kind: string, name: string): Set<string | undefined> {\n const found = new Set<string | undefined>();\n const note = (id: { kind?: string; name?: string; publisher?: string } | null): void => {\n if (id?.kind === kind && id.name === name) found.add(id.publisher?.replace(/^@/, \"\"));\n };\n for (const key of Object.keys(this.tryReadLock()?.assets ?? {})) {\n note(parseCanonicalLockKey(key));\n }\n try {\n for (const dep of this.loadConfig().dependencies) note(memberIdentity(dep));\n } catch {\n // No readable skaile.yaml: the lock alone says whose copy is deployed.\n }\n return found;\n }\n\n /** Undeploy `parsed` from every target harness and drop its declaration and lock entry. */\n private removeResolved(parsed: RemoveTarget): boolean {\n // Undeploy from every target harness; \"found\" if any harness had it. A ref naming a\n // publisher that was never added must not delete the deployed copy of another publisher.\n const wantPub = parsed.publisher?.replace(/^@/, \"\");\n const tracked = this.trackedPublishers(parsed.kind, parsed.name);\n const someoneElses =\n wantPub !== undefined && tracked.size > 0 && !tracked.has(wantPub) && !tracked.has(undefined);\n let undeployed = false;\n if (!someoneElses) {\n for (const t of this.targetHarnesses()) {\n if (removeAsset(parsed.kind, parsed.name, this.deployOptsFor(t))) undeployed = true;\n }\n }\n const undeclared = this.removeDependencyFromConfig(parsed);\n const unbound = this.removeAgentBindings(parsed);\n const unlocked = undeployed || undeclared || unbound ? this.pruneLockEntry(parsed) : false;\n const changed = undeployed || undeclared || unbound || unlocked;\n if (changed) {\n appendHistory(this.projectDir, {\n ref: `${parsed.kind}:${parsed.name}`,\n action: \"remove\",\n timestamp: new Date().toISOString(),\n context: this.global ? \"global\" : \"project\",\n });\n }\n return changed;\n }\n\n /**\n * Drop the locked assets among `requiredRefs` (and what they require in turn) that\n * nothing needs any more: not declared in `skaile.yaml`, not required by a locked\n * asset outside that set. Call after the requiring asset is gone.\n *\n * @returns the canonical refs of the assets dropped.\n */\n private async pruneOrphans(requiredRefs: string[]): Promise<string[]> {\n const lock = this.tryReadLock();\n if (!lock) return [];\n const { requires, roots, findKey } = await this.lockedGraph(lock);\n const closure = (seeds: string[]): Set<string> => {\n const out = new Set(seeds);\n for (const node of out) for (const dep of requires.get(node) ?? []) out.add(dep);\n return out;\n };\n const candidates = closure(requiredRefs.map(findKey).filter((k): k is string => !!k));\n const needed = closure([\n ...roots,\n ...Object.keys(lock.assets).filter((k) => !candidates.has(k)),\n ]);\n const pruned: string[] = [];\n for (const key of candidates) {\n if (needed.has(key) || !lock.assets[key]) continue;\n const { kind, name, publisher } = parseCanonicalLockKey(key);\n if (!kind || !name) continue;\n this.removeResolved({ kind, name, publisher });\n // A dependency whose files are already gone still leaves the lock.\n this.pruneLockEntry({ kind, name, publisher });\n pruned.push(publisher ? assetRefToStr({ kind, name, publisher }) : `${kind}:${name}`);\n }\n return pruned;\n }\n\n /**\n * Drop every lock entry matching a removed asset's identity, version-agnostic so\n * a content-sha pseudo-version key is pruned too. Symmetric with {@link add}'s\n * lock-merge — stops a stale entry reporting a phantom \"removed\" on next install.\n *\n * @returns `true` when at least one lock entry was dropped.\n */\n private pruneLockEntry(parsed: { kind: string; name: string; publisher?: string }): boolean {\n const lock = this.tryReadLock();\n if (!lock) return false;\n let changed = false;\n for (const key of Object.keys(lock.assets)) {\n const id = parseCanonicalLockKey(key);\n if (\n id.kind === parsed.kind &&\n id.name === parsed.name &&\n (!parsed.publisher || id.publisher === parsed.publisher)\n ) {\n delete lock.assets[key];\n changed = true;\n }\n }\n // A preset is never a lock asset: its record lives in `presets`, dropped with the preset.\n if (parsed.kind === \"preset\" && lock.presets) {\n const kept = lock.presets.filter((key) => {\n const id = parseCanonicalLockKey(key);\n return !(\n id.kind === parsed.kind &&\n id.name === parsed.name &&\n (!parsed.publisher || id.publisher === parsed.publisher)\n );\n });\n if (kept.length !== lock.presets.length) {\n if (kept.length > 0) lock.presets = kept;\n else delete lock.presets;\n changed = true;\n }\n }\n if (changed) writeLock(this.lockPath, lock);\n return changed;\n }\n\n // ── Query ──────────────────────────────────────────────────────────────\n\n /**\n * Search the catalog across all configured repositories.\n *\n * @param query - Substring to match against entry names and descriptions (case-insensitive).\n * Omit to return all entries.\n * @param kind - Filter by asset kind (`\"skill\"`, `\"agent\"`, `\"prompt\"`, `\"flow\"`, `\"contract\"`).\n * Omit to return all kinds.\n * @returns Array of matching {@link CatalogEntry} objects from all accessible repositories.\n */\n async search(query?: string, kind?: string): Promise<CatalogEntry[]> {\n const { repositories } = this.loadConfig();\n let all: CatalogEntry[] = [];\n\n for (const [name, decl] of Object.entries(repositories)) {\n const repoDir = this.resolveRepoDir(decl, name);\n if (!repoDir) continue;\n all = [...all, ...(await scanRepo(repoDir, name, { knownKinds: this.knownKinds }))];\n }\n\n if (kind) all = all.filter((e) => e.kind === kind);\n if (query) {\n const q = query.toLowerCase();\n all = all.filter(\n (e) => e.name.toLowerCase().includes(q) || e.description.toLowerCase().includes(q),\n );\n }\n return all;\n }\n\n /**\n * On-disk root + config slug for every declared (and the implicit factory)\n * source that has a local clone. Companion to {@link search}: callers that\n * need to relate a scanned entry back to its source root (e.g. to stamp\n * plugin grouping) can't recover the root from the flat\n * {@link CatalogEntry} list `search` returns.\n */\n searchRepoRoots(): { repoName: string; root: string }[] {\n const { repositories } = this.loadConfig();\n const out: { repoName: string; root: string }[] = [];\n for (const [name, decl] of Object.entries(repositories)) {\n const repoDir = this.resolveRepoDir(decl, name);\n if (repoDir) out.push({ repoName: name, root: repoDir });\n }\n return out;\n }\n\n /**\n * Look up a single asset's full catalog entry.\n *\n * Accepts a bare `kind:name` ref (no publisher) in addition to the fully-qualified\n * `kind:@publisher/name` form — {@link listDeployed} emits publisher-less refs and\n * {@link doctor} passes them straight to this method.\n *\n * @param ref - Asset ref in `kind:name`, `kind:@publisher/name`, or `repo/kind:name` form.\n * @returns The matching {@link CatalogEntry}, or `null` when not found.\n */\n async info(ref: string): Promise<DeployableEntry | null> {\n const { repositories } = this.loadConfig();\n const parsed = parseRefTolerant(ref);\n if (!parsed) return null;\n\n // Several repositories may hold the ref: take the highest version, as `add` resolves\n // it (the first one on a tie), so `info` shows the version `add` installs.\n let best: DeployableEntry | undefined;\n for (const [name, decl] of Object.entries(repositories)) {\n const repoDir = this.resolveRepoDir(decl, name);\n if (!repoDir) continue;\n // Match on the entry's scanned (manifest) publisher, not the repo map key\n // (= URL slug). The two are unrelated identities under canonical schema.\n const entries = await scanRepo(repoDir, name, { knownKinds: this.knownKinds });\n const match = entries.find(\n (e) =>\n e.kind === parsed.kind &&\n e.name === parsed.name &&\n (!parsed.publisher || e.publisher === parsed.publisher),\n );\n if (\n match &&\n (!best || semverGt(coerceVersion(match.version ?? \"\"), coerceVersion(best.version ?? \"\")))\n ) {\n best = match;\n }\n }\n if (best) return best;\n // Not in any source: a publisher-qualified ref may be a local library asset.\n const lib = await this.resolveLibraryEntries([ref], { quiet: true });\n return lib.entries[0] ?? null;\n }\n\n /**\n * List all assets currently deployed in the workspace (or global cache).\n *\n * Scans the framework deploy directories rather than the lock file, so it\n * also returns assets that were installed manually or outside of `skaile install`.\n *\n * @param kind - Filter by asset kind. Omit to return all kinds.\n * @returns Shallow {@link CatalogEntry} objects (description and version will be empty).\n */\n listDeployed(kind?: string): CatalogEntry[] {\n // Only kinds with an install target have a deploy dir to scan.\n const kinds: AiComponent[] = kind\n ? [this.installTarget(kind)].filter((k): k is AiComponent => k !== undefined)\n : [\n ...new Set(\n this.registry\n .getAllProviders()\n .map((p) => p.installTarget)\n .filter((t): t is AiComponent => t !== undefined),\n ),\n ];\n const result: CatalogEntry[] = [];\n const seen = new Set<string>();\n for (const k of kinds) {\n try {\n const base = deployedBase(k, this.driverTarget, this.global, this.projectDir);\n if (!existsSync(base)) continue;\n for (const item of readdirSync(base, { withFileTypes: true })) {\n // Directories and symlinks use the directory name directly (skills, omp agents, etc.)\n // Files use the stem without extension (claude-code agents → .md, codex agents → .toml,\n // prompts → .prompt.md, flows → .flow.yaml/.flow.json)\n let name: string;\n if (item.isDirectory() || item.isSymbolicLink()) {\n name = item.name;\n } else if (item.isFile()) {\n name = item.name\n .replace(/\\.prompt\\.md$/, \"\")\n .replace(/\\.flow\\.(yaml|json)$/, \"\")\n .replace(/\\.(md|toml|yaml|json)$/, \"\");\n } else {\n continue;\n }\n const key = `${k}:${name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n result.push({\n name,\n kind: k as any,\n description: \"\",\n source: join(base, item.name),\n version: \"\",\n requires: [],\n dependencies: [],\n });\n }\n } catch {}\n }\n return result;\n }\n\n /**\n * Tracked assets (`skaile.lock.yaml` or declared in `skaile.yaml`) whose copy\n * still sits in the project's `.claude/…` dirs although this manager deploys\n * to another harness. Before the default followed the configured harness every\n * project deployed to `.claude/`, so an omp/codex project upgraded from then\n * holds orphans there that `remove` / `clean` / `list` no longer look at.\n *\n * Read-only: nothing is deleted. Empty for `claude-code`, for global mode, and\n * for kinds whose dir is shared with the active target (flows).\n *\n * @returns One {@link LegacyDeployedAsset} per stale copy, sorted by kind then name.\n */\n listLegacyClaudeDeployed(): LegacyDeployedAsset[] {\n if (this.global || this.driverTarget === \"claude-code\") return [];\n const tracked = new Map<string, { kind: string; name: string; component: AiComponent }>();\n const track = (kind: string | undefined, name: string | undefined): void => {\n const component = kind ? this.installTarget(kind) : undefined;\n if (kind && name && component) {\n tracked.set(`${kind}:${name}`, { kind, name, component });\n }\n };\n const lock = this.tryReadLock();\n if (lock) {\n for (const key of Object.keys(lock.assets)) {\n const { kind, name } = parseCanonicalLockKey(key);\n track(kind, name);\n }\n }\n try {\n for (const ref of resolveSkWorkspaceConfig(this.projectDir).dependencies ?? []) {\n try {\n const parsed = parseAssetRef(ref);\n track(parsed.kind, parsed.name);\n } catch {\n // unparseable ref: reported as `invalid` by listDeclared, nothing to look up here\n }\n }\n } catch {\n // no / legacy skaile.yaml: the lock alone decides\n }\n const out: LegacyDeployedAsset[] = [];\n for (const { kind, name, component: k } of tracked.values()) {\n const legacy = deployedDir(k, name, \"claude-code\", false, this.projectDir);\n // Flows deploy to `.skaile/flows` for every harness — not a legacy copy.\n if (legacy === deployedDir(k, name, this.driverTarget, false, this.projectDir)) continue;\n // A flat agent (`<name>.md` / `.toml`) sits beside the `<name>` dir: name the path that exists.\n const found = deployedPaths(k, name, \"claude-code\", false, this.projectDir).find((p) => {\n try {\n lstatSync(p);\n return true;\n } catch {\n return false;\n }\n });\n if (found) out.push({ kind, name, path: found });\n }\n return out.sort((a, b) => a.kind.localeCompare(b.kind) || a.name.localeCompare(b.name));\n }\n\n /**\n * List the **declared** top-level dependencies from `skaile.yaml`, each tagged\n * with a reconciliation {@link DeclaredState}:\n *\n * - `declared` — in `skaile.yaml`, not yet resolved into the lock.\n * - `installed` — declared + locked, and (for kinds with an `installTarget`)\n * materialized on disk. An `mcp-server` is instead checked against the\n * declarations the runner would actually wire (store-staged or materialized\n * `MCP.md`); the remaining composition-only kinds (no `installTarget`) count as\n * installed once locked — they are resolved at session start with no harness\n * footprint here.\n * - `drift` — declared + locked but the deployed files are missing on disk.\n * - `invalid` — the `dependencies:` entry isn't a parseable canonical ref. Only\n * surfaced in the unfiltered listing (a `kind` filter can't classify it).\n *\n * Transitive (lock-only) deps are excluded by construction — only the declared\n * set is walked, so a lock entry with no matching `dependencies:` ref never shows.\n *\n * @param kind - Filter by asset kind. Omit to return all kinds.\n * @returns One {@link DeclaredAsset} per declared dep (after the optional kind filter).\n * @throws {MissingManifestError} when the project has no `skaile.yaml`.\n * @throws {Error} with a `migrate-skaile-manifest` hint on legacy `repositories:` / `ai_resources:` keys.\n */\n async listDeclared(kind?: string): Promise<DeclaredAsset[]> {\n if (!existsSync(join(this.projectDir, SKAILE_YAML_DEFAULT))) {\n throw new MissingManifestError(this.projectDir);\n }\n // resolveSkWorkspaceConfig runs the canonical normalizer (throws on legacy\n // keys) — used directly rather than loadConfig() to avoid the latter's\n // repositories-map build + getGlobalCacheDir() migration side effects on a read.\n const dependencies = resolveSkWorkspaceConfig(this.projectDir).dependencies ?? [];\n const lock = this.tryReadLock();\n const lockKeys = lock ? Object.keys(lock.assets).map(parseCanonicalLockKey) : [];\n const presetGaps = await this.declaredPresetGaps(dependencies, lock);\n\n // Names of every MCP the runner would actually wire, in both scoped and\n // unscoped form. Built at most once per call and only when a locked\n // mcp-server is reached — the load builds a provenance index, too expensive\n // to pay for a listing that has none. A throw degrades to \"nothing wired\"\n // (→ drift) rather than failing the whole read-only listing.\n let wiredMcps: Set<string> | undefined;\n const wiredMcpNames = async (): Promise<Set<string>> => {\n if (wiredMcps === undefined) {\n try {\n const decls = await loadMcpServerDeclarations(this.projectDir);\n wiredMcps = new Set(decls.flatMap((d) => [d.id, unscopedName(d.id)]));\n } catch {\n wiredMcps = new Set<string>();\n }\n }\n return wiredMcps;\n };\n\n const out: DeclaredAsset[] = [];\n for (const ref of dependencies) {\n let parsed: ReturnType<typeof parseAssetRef>;\n try {\n parsed = parseAssetRef(ref);\n } catch {\n // An unparseable ref has no kind to match a filter against; surface it\n // as `invalid` in the unfiltered listing rather than dropping it silently.\n if (!kind) out.push({ ref, kind: \"\", name: ref, state: \"invalid\" });\n continue;\n }\n if (kind && parsed.kind !== kind) continue;\n\n // A declared ref need not carry a publisher; match on kind+name and, when\n // present, the publisher — the lock key is always fully canonical.\n // A preset is never locked itself (the lock lists its expanded items), so a\n // declared preset counts as resolved once a lock exists and covers every item.\n const locked =\n parsed.kind === \"preset\"\n ? lock !== null && !presetGaps.get(ref)?.length\n : lockKeys.some(\n (k) =>\n k.kind === parsed.kind &&\n k.name === parsed.name &&\n (!parsed.publisher || k.publisher === parsed.publisher),\n );\n\n let state: DeclaredState;\n if (!locked) {\n state = \"declared\";\n } else if (parsed.kind === \"mcp-server\") {\n // An mcp-server has no target-dir footprint, but it is not bytes-free\n // either: it is wired from a store-staged or materialized `MCP.md`. Only\n // \"the runner would see a declaration for this name\" counts as installed\n // — locked-but-invisible is real drift, fixable by `skaile install`.\n const wired = await wiredMcpNames();\n state =\n wired.has(parsed.name) || wired.has(unscopedName(parsed.name)) ? \"installed\" : \"drift\";\n } else {\n const component = this.installTarget(parsed.kind);\n if (!component) {\n state = \"installed\";\n } else {\n const onDisk = isDeployed(\n component,\n parsed.name,\n this.driverTarget,\n this.global,\n this.projectDir,\n );\n state = onDisk ? \"installed\" : \"drift\";\n }\n }\n out.push({ ref, kind: parsed.kind, name: parsed.name, state });\n }\n return out;\n }\n\n /**\n * Library-locked assets whose deployed directory lacks files the deploy writes —\n * a deleted `build.py` / `scripts/` helper next to an intact `SKILL.md`. The\n * expected set is the library entry's file set (every file under its manifest\n * `root:`), the same bytes the lock hashes; only presence is checked, so a\n * local edit never counts. An asset with no deployed directory is not listed\n * (`listDeclared` reports it as drift); an agent is rendered, not copied, so it\n * has no file mirror to compare. `skaile install` restores what is listed.\n *\n * @returns One {@link IncompleteDeploy} per affected asset; empty when healthy\n * or when the project has no lock.\n */\n async incompleteDeploys(): Promise<IncompleteDeploy[]> {\n const lock = this.tryReadLock();\n if (!lock) return [];\n const locked = Object.entries(lock.assets)\n .filter(([, e]) => e.library !== undefined && !e.library.installed)\n .map(([key]) => key);\n if (locked.length === 0) return [];\n const lib = await this.resolveLibraryEntries(locked, { quiet: true });\n const out: IncompleteDeploy[] = [];\n for (const entry of lib.entries) {\n const component = this.installTarget(entry.kind);\n if (!entry.files || !component || component === \"agent\") continue;\n const dest = join(\n deployedBase(component, this.driverTarget, this.global, this.projectDir),\n entry.name,\n );\n if (!existsSync(dest)) continue;\n const missing = entry.files.filter((rel) => !existsSync(join(dest, rel)));\n if (missing.length > 0) out.push({ ref: canonicalEntryRef(entry), missing });\n }\n return out;\n }\n\n /**\n * Per-harness reconciliation of the **global** declared deps\n * (`~/.skaile/skaile.yaml`) against each global harness's deploy dir. The\n * global twin of {@link listDeclared}: the same `declared` / `installed` /\n * `drift` / `invalid` vocabulary, but one row **per (ref, harness)** so an\n * asset can be `installed` for `claude-code` and `drift`/`declared` for\n * `codex` at once.\n *\n * Reads the SSOT + the global lock (`~/.skaile/skaile.lock.yaml`) — construct\n * the manager with `global: true`. Unlike `listDeclared`, a missing SSOT is\n * **not** an error: it yields an empty list (a fresh machine has no globals).\n *\n * @param opts.harness - Reconcile against this one harness only (the\n * `--harness` filter); omit for every harness in {@link targetHarnesses}.\n * @param opts.kind - Filter by asset kind.\n * @returns One {@link HarnessDeclaredAsset} per declared dep × harness.\n * @throws {Error} on legacy keys in `~/.skaile/skaile.yaml` (migration hint).\n */\n globalState(opts?: {\n harness?: DriverTarget;\n /** @deprecated Use `harness`. Honoured only when `harness` is absent; removed in the next major. */\n backend?: DriverTarget;\n kind?: string;\n }): HarnessDeclaredAsset[] {\n const dependencies = resolveGlobalSkWorkspaceConfig().dependencies ?? [];\n const lock = this.tryReadLock();\n const lockKeys = lock ? Object.keys(lock.assets).map(parseCanonicalLockKey) : [];\n const harnessFilter = opts?.harness ?? opts?.backend;\n const harnesses = harnessFilter ? [harnessFilter] : this.targetHarnesses();\n\n const out: HarnessDeclaredAsset[] = [];\n for (const ref of dependencies) {\n let parsed: ReturnType<typeof parseAssetRef>;\n try {\n parsed = parseAssetRef(ref);\n } catch {\n if (!opts?.kind) {\n for (const harness of harnesses)\n out.push({ ref, kind: \"\", name: ref, state: \"invalid\", harness });\n }\n continue;\n }\n if (opts?.kind && parsed.kind !== opts.kind) continue;\n\n // A preset is never locked itself (the lock lists its expanded items), so a\n // declared preset counts as resolved once any lock exists.\n const locked =\n parsed.kind === \"preset\"\n ? lock !== null\n : lockKeys.some(\n (k) =>\n k.kind === parsed.kind &&\n k.name === parsed.name &&\n (!parsed.publisher || k.publisher === parsed.publisher),\n );\n\n for (const harness of harnesses) {\n let state: DeclaredState;\n if (!locked) {\n state = \"declared\";\n } else {\n const component = this.installTarget(parsed.kind);\n state =\n !component || isDeployed(component, parsed.name, harness, true) ? \"installed\" : \"drift\";\n }\n out.push({ ref, kind: parsed.kind, name: parsed.name, state, harness });\n }\n }\n return out;\n }\n\n /**\n * Build an aggregated workspace overview with publisher grouping and sync status.\n *\n * Combines deployed assets, lock file metadata, and live repository status\n * into a single structured result. Used by `skaile status`.\n *\n * @returns {@link OverviewResult} with entries grouped by publisher and per-repo sync status.\n */\n overview(): OverviewResult {\n const { repositories } = this.loadConfig();\n const lock = this.tryReadLock();\n const deployed = this.listDeployed();\n\n const repoStatuses = this.buildRepoStatuses(repositories);\n const lockByKindName = indexLockByKindName(lock);\n\n // Build entries with publisher + sync info. Entries are grouped by the\n // lock-entry publisher; assets without one fall under `\"unknown\"`.\n const entries: OverviewEntry[] = [];\n for (const d of deployed) {\n const lockEntry = lockByKindName.get(`${d.kind}:${d.name}`);\n const publisher = lockEntry?.publisher || \"unknown\";\n const version = lockEntry?.version ?? \"\";\n const slug = lockEntry && !lockEntry.library ? sourceCacheKey(lockEntry.url) : \"\";\n // A library asset has no remote to be behind: it is as local as a path source.\n const syncStatus = lockEntry?.library\n ? \"local\"\n : slug\n ? computeSyncStatus(repoStatuses.get(slug))\n : \"unknown\";\n entries.push({ kind: d.kind, name: d.name, publisher, version, syncStatus });\n }\n\n return {\n byPublisher: groupAndSortByPublisher(entries),\n total: entries.length,\n repos: [...repoStatuses.values()],\n };\n }\n\n /** Collect live sync status for every configured repository, keyed by name. */\n private buildRepoStatuses(\n repositories: Record<string, SourceDeclaration>,\n ): Map<string, RepoStatusInfo> {\n const repoStatuses = new Map<string, RepoStatusInfo>();\n for (const [name, decl] of Object.entries(repositories)) {\n const status = checkRepoStatus(decl, name, this.reposDir);\n repoStatuses.set(name, {\n name,\n kind: status.kind,\n behind: status.behind,\n upToDate: status.upToDate,\n error: status.error,\n });\n }\n return repoStatuses;\n }\n\n /**\n * Requirement graph of the locked assets, for {@link tree} / {@link why} / removal pruning.\n *\n * The lock records no edges, so they are rebuilt from each locked asset's own\n * declaration (`requires`, manifest `dependencies`, a preset's items) — the same\n * source the install walk reads, via {@link info}. An asset that no source or\n * library can be found for has no known requirements. Nodes are lock keys, plus\n * each declared `preset:` that the lock does not carry (a preset is expanded at\n * install, never locked), keyed by its declared ref.\n *\n * @returns `requires` (node → the lock keys it requires), `roots` (nodes\n * `skaile.yaml` declares) and `findKey` (a ref → its lock key, version-agnostic).\n */\n private async lockedGraph(lock: LockFile): Promise<{\n requires: Map<string, string[]>;\n roots: string[];\n findKey: (ref: string) => string | undefined;\n }> {\n const locked = Object.keys(lock.assets).map((key) => ({ key, ...parseCanonicalLockKey(key) }));\n const findKey = (ref: string): string | undefined => {\n const id = memberIdentity(ref);\n if (!id) return undefined;\n return locked.find(\n (l) =>\n l.kind === id.kind &&\n l.name === id.name &&\n (!id.publisher || !l.publisher || l.publisher === id.publisher),\n )?.key;\n };\n const requires = new Map<string, string[]>();\n const link = async (node: string, ref: string): Promise<void> => {\n const out: string[] = [];\n try {\n const entry = await this.info(ref);\n // No source or library holds a locked asset any more: its deployed copy still\n // names what it requires.\n const deps = entry\n ? libraryEntryDepRefs(entry)\n : lock.assets[node]\n ? await this.deployedRequirementsOf(parseCanonicalLockKey(node))\n : [];\n for (const dep of deps) {\n const key = findKey(dep);\n if (key && key !== node && !out.includes(key)) out.push(key);\n }\n } catch {\n // Unreadable source/library: its requirements stay unknown.\n }\n requires.set(node, out);\n };\n for (const l of locked) {\n await link(\n l.key,\n l.publisher ? `${l.kind}:@${l.publisher}/${l.name}` : `${l.kind}:${l.name}`,\n );\n }\n\n const roots: string[] = [];\n let declared: string[] = [];\n try {\n declared = this.loadConfig().dependencies;\n } catch {\n // No readable skaile.yaml: nothing is declared.\n }\n for (const dep of declared) {\n const key = findKey(dep);\n if (key) {\n if (!roots.includes(key)) roots.push(key);\n } else if (memberIdentity(dep)?.kind === \"preset\" && !roots.includes(dep)) {\n await link(dep, dep);\n roots.push(dep);\n }\n }\n return { requires, roots, findKey };\n }\n\n /**\n * Build the resolved dependency tree from the lock file.\n *\n * Required assets nest under the asset that requires them (see {@link lockedGraph});\n * an asset required by several parents appears under each, and a dependency cycle\n * is cut where it would repeat.\n *\n * @returns Root {@link DependencyNode} with `ref === \"project\"` whose children\n * are the directly-declared assets, followed by locked assets nothing requires,\n * each with the assets it requires as children.\n * Returns a single node with `ref === \"(no lock file)\"` when no lock exists.\n */\n async tree(): Promise<DependencyNode> {\n const lock = this.tryReadLock();\n if (!lock) return { ref: \"(no lock file)\", children: [] };\n\n const { requires, roots } = await this.lockedGraph(lock);\n const required = new Set([...requires.values()].flat());\n const build = (ref: string, path: Set<string>): DependencyNode => ({\n ref,\n children: (requires.get(ref) ?? [])\n .filter((child) => !path.has(child))\n .map((child) => build(child, new Set([...path, child]))),\n });\n const shown = new Set<string>();\n const top: DependencyNode[] = [];\n const addTop = (ref: string): void => {\n const node = build(ref, new Set([ref]));\n top.push(node);\n const walk = (n: DependencyNode): void => {\n shown.add(n.ref);\n for (const c of n.children) walk(c);\n };\n walk(node);\n };\n const lockKeys = Object.keys(lock.assets);\n for (const ref of roots) addTop(ref);\n for (const ref of lockKeys) if (!roots.includes(ref) && !required.has(ref)) addTop(ref);\n // Assets that only require each other (a cycle nothing declared reaches).\n for (const ref of lockKeys) if (!shown.has(ref)) addTop(ref);\n return { ref: \"project\", children: top };\n }\n\n /**\n * Explain why an asset is installed by tracing its dependency chain.\n *\n * The chain is read from the requirement graph ({@link lockedGraph}): the asset,\n * then the asset that requires it, and so on up to a dependency `skaile.yaml`\n * declares (the shortest such path; cycles are not followed twice).\n *\n * @param ref - Asset ref in `kind:name` form.\n * @returns Chain of refs from the asset back to `\"direct (skaile.yaml)\"`; an asset\n * no declared dependency reaches ends in `\"not required by a declared dependency\"`\n * instead. `[]` when the asset is not in the lock file.\n */\n async why(ref: string): Promise<string[]> {\n const lock = this.tryReadLock();\n if (!lock) return [];\n // Exact lock-key hit, else a version-agnostic match on the `kind:@pub/name`\n // prefix — the lock can pin a content-sha pseudo-version, so a bare\n // `kind:@pub/name` ref would otherwise never find its locked entry. A ref\n // without a publisher (`kind:name`) matches on kind + name alone.\n const bare = (s: string) => (s.includes(\"#\") ? s.slice(0, s.indexOf(\"#\")) : s);\n const asked = parseRefTolerant(ref);\n const matchesIdentity = (k: string): boolean => {\n if (bare(k) === bare(ref)) return true;\n if (!asked || asked.publisher) return false;\n const locked = parseCanonicalLockKey(k);\n return locked.kind === asked.kind && locked.name === asked.name;\n };\n const key = lock.assets[ref] ? ref : Object.keys(lock.assets).find(matchesIdentity);\n if (!key) return asked?.kind === \"preset\" ? this.whyPreset(lock, asked) : []; // not in lock file\n\n const { requires, roots } = await this.lockedGraph(lock);\n if (roots.includes(key)) return [key, \"direct (skaile.yaml)\"];\n const requirers = new Map<string, string[]>();\n for (const [node, deps] of requires) {\n for (const dep of deps) requirers.set(dep, [...(requirers.get(dep) ?? []), node]);\n }\n // Breadth-first upward from the asset to the nearest declared requirer.\n const child = new Map<string, string>();\n const seen = new Set([key]);\n const queue = [key];\n for (let node = queue.shift(); node !== undefined; node = queue.shift()) {\n for (const parent of requirers.get(node) ?? []) {\n if (seen.has(parent)) continue;\n seen.add(parent);\n child.set(parent, node);\n if (roots.includes(parent)) {\n const chain: string[] = [];\n for (let c: string | undefined = parent; c !== undefined; c = child.get(c)) chain.push(c);\n return [...chain.reverse(), \"direct (skaile.yaml)\"];\n }\n queue.push(parent);\n }\n }\n return [key, \"not required by a declared dependency\"];\n }\n\n /**\n * The {@link AssetManager.why} chain of a preset. A preset is never a lock asset: its record\n * is the lock's `presets` slice. Declared in `skaile.yaml` it is `direct`; one only a declared\n * preset nests is traced through the presets that list it.\n *\n * @returns `[]` when the lock does not record the preset.\n */\n private async whyPreset(lock: LockFile, asked: AssetRef): Promise<string[]> {\n const wanted = memberIdentity(assetRefToStr(asked));\n const same = (ref: string): boolean => {\n const id = memberIdentity(ref);\n return (\n id !== null &&\n wanted !== null &&\n id.kind === \"preset\" &&\n id.name === wanted.name &&\n (!id.publisher || !wanted.publisher || id.publisher === wanted.publisher)\n );\n };\n const recorded = (lock.presets ?? []).find(same);\n if (!recorded) return [];\n\n let declared: string[] = [];\n try {\n declared = this.loadConfig().dependencies;\n } catch {\n // No readable skaile.yaml: nothing is declared.\n }\n const roots = declared.filter((d) => memberIdentity(d)?.kind === \"preset\");\n if (roots.some(same)) return [recorded, \"direct (skaile.yaml)\"];\n\n // Breadth-first down the declared presets to the one that nests the asked preset.\n const parent = new Map<string, string>();\n const seen = new Set<string>(roots);\n const queue = [...roots];\n for (let node = queue.shift(); node !== undefined; node = queue.shift()) {\n let items: string[] = [];\n try {\n const entry = await this.info(node);\n items = entry ? libraryEntryDepRefs(entry) : [];\n } catch {\n // Unreadable preset: its items stay unknown.\n }\n for (const item of items) {\n if (memberIdentity(item)?.kind !== \"preset\" || seen.has(item)) continue;\n seen.add(item);\n parent.set(item, node);\n if (same(item)) {\n const chain: string[] = [];\n for (let c: string | undefined = item; c !== undefined; c = parent.get(c)) chain.push(c);\n return [...chain, \"direct (skaile.yaml)\"];\n }\n queue.push(item);\n }\n }\n return [recorded, \"not required by a declared dependency\"];\n }\n\n /**\n * List installed assets that have a newer upstream available.\n *\n * Two kinds of staleness are reported:\n * - **Source assets** — only remote repositories (not local paths) are checked;\n * `behind` counts the commits the clone is missing from the remote plus the\n * commits the clone moved past the locked commit (`source sync` after `add`).\n * - **Library assets** — a library-origin lock entry whose library files on disk\n * (not the index, which lags until `skaile library index`) hold a newer version\n * than the locked one (`latestVersion`, `library` set), or the same version with\n * different bytes (`contentChanged`). `behind` is 0.\n * - **Project state** — every {@link AssetManager.projectState} gap (an unregistered or\n * renamed library, a missing deployed copy, a declared dependency or a deployed asset's\n * `requires` with no lock entry, a lock that contradicts a `skaile.yaml` pin) as a\n * `problem` row, so `outdated` lists what `check`, `doctor` and `install --locked` fail\n * on. An asset that also has a version row is listed once, with that row.\n *\n * @returns Array of {@link OutdatedEntry} objects.\n */\n async outdated(): Promise<OutdatedEntry[]> {\n const { repositories } = this.loadConfig();\n const lock = this.tryReadLock();\n if (!lock) return this.addLockGapRows([]);\n\n const result: OutdatedEntry[] = [];\n /** `from..to` → commit count, shared by every lock entry of a source. */\n const commitCounts = new Map<string, number>();\n for (const src of lock.sources) {\n const slug = sourceCacheKey(src.url);\n const decl = repositories[slug];\n // Every `sources:` entry carries a `path:` into the clone cache; a\n // user-owned local path reports `behind: 0` from checkRepoStatus.\n if (!decl) continue;\n const status = checkRepoStatus(decl, slug, this.reposDir);\n // A user-owned local path (or a clone that was never made) has no commit to compare.\n if (status.kind !== \"remote\" || !status.localHead) continue;\n const clone = decl.path ?? join(this.reposDir, slug);\n for (const [ref, entry] of Object.entries(lock.assets)) {\n if (entry.source?.url !== src.url) continue;\n const { publisher, kind, name, version } = parseCanonicalLockKey(ref);\n if (!kind || !name) continue;\n // Behind the remote (`status.behind`) AND/OR the clone itself moved past the\n // locked commit (`source sync` pulled it): either way the deployed copy is stale.\n const lockedCommit = entry.source.commit || src.commit;\n const moved =\n lockedCommit && !/^0+$/.test(lockedCommit) && lockedCommit !== status.localHead\n ? commitsBetween(clone, lockedCommit, status.localHead, commitCounts)\n : 0;\n const behind = status.behind + moved;\n if (behind <= 0) continue;\n result.push({\n kind,\n name,\n publisher: publisher ?? sourceShortName(src.url),\n currentVersion: version ?? \"\",\n behind,\n });\n }\n }\n\n // Direct `asset install` entries (`library.installed`) were placed in the project\n // by hand; there is no library or deploy-dir copy to compare against.\n const libraryAssets = Object.entries(lock.assets).filter(\n ([, e]) => e.library && !e.library.installed,\n );\n if (libraryAssets.length > 0) {\n const snap = await this.loadLibraryIndex();\n /** Per library root: `kind:name` → sha256 of the files on disk. */\n const diskHashes = new Map<string, Map<string, string>>();\n /** Per library root + default publisher: the on-disk scan `add`/`update` resolve from. */\n const scans = new Map<string, CatalogEntry[]>();\n for (const [ref, entry] of libraryAssets) {\n const origin = entry.library!;\n const { publisher, kind, name } = parseCanonicalLockKey(ref);\n if (!publisher || !kind || !name) continue;\n // A library that is gone is a `projectState` gap, listed as a problem row below.\n const lookup = this.lockedLibrary(origin, snap);\n if (lookup.state !== \"ok\") continue;\n const libPath = lookup.path;\n // The library's files on disk are the truth (what `add`/`update` deploy), not\n // the index, which lags until the next `skaile library index`.\n const scanKey = `${libPath}\\0${publisher}`;\n let scanned = scans.get(scanKey);\n if (!scanned) {\n scanned = await scanDirectory(libPath, publisher, { knownKinds: this.knownKinds });\n scans.set(scanKey, scanned);\n }\n const found = scanned.find((x) => x.kind === kind && x.name === name);\n if (!found) continue; // gone from the library: a `projectState` gap\n const diskVersion =\n found.version || newestLibraryDef(snap, lookup.name, { kind, publisher, name })?.version;\n if (diskVersion && semverGt(coerceVersion(diskVersion), coerceVersion(origin.version))) {\n result.push({\n kind,\n name,\n publisher,\n currentVersion: origin.version,\n behind: 0,\n latestVersion: diskVersion,\n library: lookup.name,\n });\n continue;\n }\n // Same (or older) version, different bytes: an in-place edit with no bump.\n if (origin.sha256) {\n const onDisk = libraryDiskHashes(libPath, diskHashes, this.registry).get(\n `${kind}:${name}`,\n );\n if (onDisk !== undefined && onDisk !== origin.sha256) {\n result.push({\n kind,\n name,\n publisher,\n currentVersion: origin.version,\n behind: 0,\n library: lookup.name,\n contentChanged: true,\n });\n }\n }\n }\n }\n\n return this.addLockGapRows(result);\n }\n\n /**\n * Add one `problem` row per {@link AssetManager.projectState} gap whose asset is not\n * listed yet, so `outdated` lists the same assets `check`, `doctor` and `install --locked`\n * fail on. An asset that is behind its source and also broken is listed once, with its\n * version row.\n */\n private async addLockGapRows(rows: OutdatedEntry[]): Promise<OutdatedEntry[]> {\n const listed = new Set(rows.map((r) => `${r.kind}:${r.name}`));\n for (const gap of (await this.projectState()).gaps) {\n const parsed = parseRefTolerant(gap.ref);\n const id = parsed ? `${parsed.kind}:${parsed.name}` : gap.ref;\n if (listed.has(id)) continue;\n listed.add(id);\n rows.push({\n kind: parsed?.kind ?? \"\",\n name: parsed?.name ?? gap.ref,\n publisher: parsed?.publisher ?? \"\",\n currentVersion: \"\",\n behind: 0,\n problem: gap.reason,\n ...(gap.manualFix ? { manualFix: true as const } : {}),\n });\n }\n return rows;\n }\n\n /**\n * The deploy entry of a library-origin asset from the library its lock entry records,\n * at the locked version when that library still holds it (else its newest). Other\n * libraries holding the same ref are not consulted: the lock already chose.\n *\n * @param want - Kind, name and optional publisher of the asset.\n * @returns `null` when the lock has no library-origin entry for it, or the recorded\n * library is gone or no longer holds it (callers fall back to a general lookup).\n */\n private async lockedLibraryEntry(want: AssetRef): Promise<DeployableEntry | null> {\n const snap = await this.loadLibraryIndex();\n for (const [key, e] of Object.entries(this.tryReadLock()?.assets ?? {})) {\n const id = parseCanonicalLockKey(key);\n if (!e.library || e.library.installed || !id.publisher) continue;\n if (id.kind !== want.kind || id.name !== want.name) continue;\n if (want.publisher && id.publisher !== want.publisher) continue;\n const canonical = `${id.kind}:@${id.publisher}/${id.name}`;\n const refs = e.library.version\n ? [`${canonical}#${e.library.version}`, canonical]\n : [canonical];\n // The library may be registered here under another name than the lock's.\n const lookup = this.lockedLibrary(e.library, snap);\n const library = lookup.state === \"ok\" ? lookup.name : e.library.name;\n for (const r of refs) {\n const hit = (await this.resolveLibraryEntries([r], { library })).entries[0];\n if (hit) return hit;\n }\n }\n return null;\n }\n\n /**\n * Produce a unified diff from the deployed asset to its catalog source: `-` lines\n * are in the deployed copy only (local edits `update` would overwrite), `+` lines\n * are in the source only (what `update` would add).\n *\n * Useful for detecting manual edits to deployed files or seeing what an upstream\n * change would bring in; also for verifying that a patch\n * was applied correctly.\n *\n * @param ref - Asset ref in `kind:name` form.\n * @returns A {@link DiffResult}: `not-found` (unknown ref), `not-deployed`,\n * `identical`, or `differs` with the unified diff.\n * @throws When `diff(1)` itself fails (exit status other than 0/1).\n */\n async diff(ref: string): Promise<DiffResult> {\n const parsed = parseRefTolerant(ref);\n if (!parsed) return { status: \"not-found\" };\n const entry = (await this.lockedLibraryEntry(parsed)) ?? (await this.info(ref));\n if (!entry || !existsSync(entry.source)) return { status: \"not-found\" };\n\n const component = this.installTarget(parsed.kind);\n // A preset has no deployed copy: the lock's `presets` records it and its items are the\n // assets to compare.\n if (parsed.kind === \"preset\" && this.presetRecorded(parsed)) return { status: \"no-files\" };\n if (!component) return { status: \"not-deployed\" };\n // An agent is rendered into the harness's native file (`<name>.md`, `<name>.toml`, `<name>/`),\n // never copied to `<base>/<name>`: compare the source rendered the way the deploy renders it.\n if (component === \"agent\") {\n const diff = diffDeployedAgent(entry, this.deployOptsFor(this.driverTarget));\n if (diff === null) return { status: \"not-deployed\" };\n return diff === \"\" ? { status: \"identical\" } : { status: \"differs\", diff };\n }\n const deployedPath = join(\n deployedBase(component, this.driverTarget, this.global, this.projectDir),\n parsed.name,\n );\n if (!existsSync(deployedPath)) return { status: \"not-deployed\" };\n\n // An entry with a file set (a library asset under its manifest `root:`) is\n // compared file by file — the set a deploy writes. A deleted or edited helper\n // shows; the manifest alone would answer \"identical\".\n const pairs = entry.files\n ? entry.files.map((rel) => [join(deployedPath, rel), join(dirname(entry.source), rel)])\n : [[deployedPath, entry.source]];\n const diffs: string[] = [];\n for (const [from, to] of pairs) {\n const r = spawnSync(\"diff\", [entry.files ? \"-uN\" : \"-ruN\", from!, to!], {\n encoding: \"utf8\",\n });\n if (r.status === 1) diffs.push(r.stdout);\n else if (r.status !== 0) {\n throw new Error(\n `diff failed for ${ref}: ${r.stderr || r.error?.message || \"unknown error\"}`,\n );\n }\n }\n return diffs.length > 0 ? { status: \"differs\", diff: diffs.join(\"\") } : { status: \"identical\" };\n }\n\n // ── Lock ───────────────────────────────────────────────────────────────\n\n /**\n * Resolve all declared dependencies and write (or overwrite) `skaile.lock.yaml`.\n *\n * Performs repository sync and full dependency resolution without deploying assets.\n * Use this to regenerate the lock file after manually editing `skaile.yaml`.\n *\n * @returns The written {@link LockFile} data.\n */\n async lock(): Promise<LockFile> {\n const { repositories, sources, stores, dependencies, overrides } = this.loadConfig();\n\n this.ensureSourceClonesQuiet(repositories, sources);\n\n const provenanceIndex = await buildProvenanceIndex(this.buildClones(repositories), {\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n });\n const { resolved, overridesApplied, lib } = await this.resolveLibraryFirst(dependencies, {\n provenanceIndex,\n overrides,\n stores,\n declaredRefs: dependencies,\n });\n const libraryLock = await this.libraryLockEntries(lib);\n const lockData = buildLockFile(resolved, overridesApplied, libraryLock);\n writeLock(this.lockPath, lockData);\n return lockData;\n }\n\n // ── Patch workflow ─────────────────────────────────────────────────────\n\n /**\n * Extract a deployed asset into a patch working directory for editing.\n *\n * Copies the deployed asset to `.skaile/patches/<kind>-<name>/` so changes\n * can be made there and then committed as a patch file via `patchCommit`.\n *\n * @param ref - Asset ref in `kind:name` form.\n * @returns Absolute path to the patch working directory.\n * @throws When the asset cannot be found in the catalog.\n */\n async patch(ref: string): Promise<string> {\n const entry = await this.info(ref);\n if (!entry) throw new Error(`Asset not found: ${ref}`);\n return extractForPatch(entry, this.patchDir);\n }\n\n /**\n * Generate a `.patch` file from changes made in the patch working directory.\n *\n * Diffs the patch working directory against the original catalog source and\n * writes the result to `.skaile/patches/<kind>-<name>.patch`.\n *\n * @param ref - Asset ref in `kind:name` form.\n * @returns Absolute path to the generated `.patch` file.\n * @throws When the patch working directory does not exist or no differences are found.\n */\n async patchCommit(ref: string): Promise<string> {\n const parsed = parseAssetRef(ref);\n const entry = await this.info(ref);\n if (!entry) throw new Error(`Asset not found: ${ref}`);\n\n const patchedDir = join(this.patchDir, `${parsed.kind}-${parsed.name}`);\n if (!existsSync(patchedDir)) {\n throw new Error(`No patch working dir found. Run \\`skaile patch ${ref}\\` first.`);\n }\n\n const originalDir = dirname(entry.source);\n const content = generatePatch(originalDir, patchedDir);\n if (!content) throw new Error(\"No differences found.\");\n\n const patchFile = join(this.patchDir, `${parsed.kind}-${parsed.name}.patch`);\n savePatch(patchFile, content);\n return patchFile;\n }\n\n /**\n * Apply the committed patch file to the repository clone and open a contribution branch.\n *\n * Applies `.skaile/patches/<kind>-<name>.patch` to the repository clone, creates a\n * `patch/<kind>-<name>` branch, and stages a commit — ready to push via `contribPush`.\n *\n * @param ref - Asset ref in `kind:name` form.\n * @throws When the asset is not found, has no repository, or the patch file is missing.\n */\n async patchSubmit(ref: string): Promise<void> {\n const parsed = parseAssetRef(ref);\n const entry = await this.info(ref);\n if (!entry?.publisher) throw new Error(`Asset not found or no publisher: ${ref}`);\n\n const { repositories } = this.loadConfig();\n const decl = repositories[entry.publisher];\n if (!decl?.url) throw new Error(\"Can only submit patches for remote sources.\");\n\n // Resolve through the same helper search/info use so patch + read agree on the clone dir.\n const repoDir = this.resolveRepoDir(decl, entry.publisher);\n if (!repoDir) throw new Error(`Repository clone not found for ${entry.publisher}.`);\n const branchName = `patch/${parsed.kind}-${parsed.name}`;\n\n // Apply patch to repo clone\n const patchFile = join(this.patchDir, `${parsed.kind}-${parsed.name}.patch`);\n if (!existsSync(patchFile)) throw new Error(\"No patch file. Run `skaile patch-commit` first.\");\n\n coreApplyPatch(repoDir, patchFile);\n commitChanges(repoDir, `fix: improve ${parsed.kind} ${parsed.name}`, branchName);\n }\n\n /**\n * Delete the patch working directory and patch file for an asset.\n *\n * @param ref - Asset ref in `kind:name` form.\n */\n patchRemove(ref: string): void {\n const parsed = parseAssetRef(ref);\n const patchFile = join(this.patchDir, `${parsed.kind}-${parsed.name}.patch`);\n const patchedDir = join(this.patchDir, `${parsed.kind}-${parsed.name}`);\n try {\n rmSync(patchFile);\n } catch {}\n try {\n rmSync(patchedDir, { recursive: true });\n } catch {}\n }\n\n // ── Doctor ─────────────────────────────────────────────────────────────\n\n /**\n * Scan deployed assets for unsatisfied transitive dependencies.\n *\n * For each deployed asset, checks that all entries in its `requires` list are\n * also deployed. Returns a list of issues with a flag indicating whether the\n * missing dependency can be resolved from a configured repository or library.\n *\n * A deployed asset is looked up by its publisher-qualified identity taken from\n * the lock key (`kind:@pub/name`), so library and source assets resolve alike.\n * A lock-managed asset that no source or library can be found for is reported\n * as an issue with `unresolved: true` (its `requires` cannot be verified);\n * unmanaged deployed files carry no declared origin and are skipped.\n *\n * @returns Array of {@link DepIssue} objects. An empty array means the workspace is healthy.\n */\n async doctor(): Promise<DepIssue[]> {\n const { repositories, dependencies } = this.loadConfig();\n const deployed = this.listDeployed();\n const issues: DepIssue[] = [];\n\n const lock = this.tryReadLock();\n const lockedPublisher: Record<string, string> = {};\n for (const key of Object.keys(lock?.assets ?? {})) {\n const { kind, name, publisher } = parseCanonicalLockKey(key);\n if (kind && name && publisher) lockedPublisher[`${kind}:${name}`] = publisher;\n }\n\n for (const entry of deployed) {\n const publisher = lockedPublisher[`${entry.kind}:${entry.name}`];\n const full = await this.info(\n publisher ? `${entry.kind}:@${publisher}/${entry.name}` : `${entry.kind}:${entry.name}`,\n );\n if (!full) {\n if (publisher) {\n const canonical = `${entry.kind}:@${publisher}/${entry.name}`;\n const fix = (await this.unresolvedFixes([canonical])).get(canonical);\n issues.push({\n assetKind: entry.kind,\n assetName: entry.name,\n depKind: entry.kind,\n depName: entry.name,\n inRepos: false,\n unresolved: true,\n ...(fix ? { fix } : {}),\n });\n }\n continue;\n }\n const gaps: Array<{ issue: DepIssue; ref: string }> = [];\n // One requirement per `publisher/kind:name`: the SKILL.md form (bare) and the\n // manifest `dependencies:` form (qualified) of the same asset are one gap, and a\n // bare one is the requiring asset's own publisher.\n const requirements = dedupeRequirements(full.requires, publisher).map((r) =>\n r.publisher || !publisher ? r : { ...r, publisher },\n );\n for (const req of requirements) {\n // A cross-publisher `requires` carries its publisher; deploy dirs and\n // source catalogs key on the bare name.\n const dep = memberIdentity(depToStr(req));\n if (!dep) continue;\n const depComponent = this.installTarget(dep.kind);\n if (\n depComponent &&\n !isDeployed(depComponent, dep.name, this.driverTarget, this.global, this.projectDir)\n ) {\n const inRepos =\n (await resolveAsset({ kind: dep.kind, name: dep.name }, repositories, this.reposDir, {\n knownKinds: this.knownKinds,\n })) !== null;\n const issue: DepIssue = {\n assetKind: entry.kind,\n assetName: entry.name,\n depKind: req.kind,\n depName: req.publisher ? `@${req.publisher}/${req.name}` : req.name,\n inRepos,\n };\n issues.push(issue);\n if (!inRepos) gaps.push({ issue, ref: depToStr(req) });\n }\n }\n // A dep no source offers may still be a library asset: one library scan per asset.\n const inLibrary = await this.resolveLibraryEntries(\n gaps.map((g) => g.ref),\n { quiet: true },\n );\n for (const g of gaps) g.issue.inRepos = inLibrary.resolved.has(g.ref);\n }\n // A declared preset's items are declared dependencies: one the lock does not\n // cover never resolved, so the project is missing it.\n for (const [presetRef, gaps] of await this.declaredPresetGaps(dependencies, lock)) {\n const preset = parseRefTolerant(presetRef);\n if (!preset) continue;\n for (const g of gaps) {\n const item = parseRefTolerant(g.ref);\n if (!item) continue;\n issues.push({\n assetKind: \"preset\",\n assetName: preset.name,\n depKind: item.kind,\n depName: item.publisher ? `@${item.publisher}/${item.name}` : item.name,\n inRepos: g.resolvable,\n });\n }\n }\n return issues;\n }\n\n /**\n * The project's state as one verdict: every way the project differs from what it\n * declares and locks. `skaile check`, `skaile doctor`, `skaile outdated`, `skaile diff`\n * and `skaile install --locked` all take their verdict and exit code from this one list,\n * so one situation reads the same in all five.\n *\n * - `declared` — a `skaile.yaml` dependency with no lock entry (library or source gone,\n * unresolvable ref, never installed);\n * - `invalid` — a `dependencies:` entry that is not a parseable ref;\n * - `drift` — a locked asset whose deployed files are missing;\n * - `pin` — a declared `#pin` that no lock entry for that asset satisfies;\n * - `requires` — a deployed asset's `requires` (or a declared preset's item) that is not\n * deployed (so not locked either);\n * - `unresolved` — a lock-managed deployed asset that no source or library holds any more;\n * - `library` — a locked library asset whose library is not registered (renamed or\n * removed) or no longer holds it, while another library holds it now;\n * - `incomplete` — a deployed library asset that lacks files of its library entry;\n * - `content` — a locked library asset whose files in the library changed since the lock\n * (or whose lock hash predates the one shared asset hash); `skaile install` re-locks it;\n * - `agent` — an `agents.<id>.ref` (or `agent.definition`) that binds to no agent.\n *\n * An asset appears once for what the lock says about it (`unresolved`, else `library`,\n * else `drift`). A declared ref no registered library or source holds names\n * `skaile library init` / `skaile remove`, never `skaile install`: `install` has nothing\n * to resolve it from.\n *\n * Project mode only: a global manager (`global: true`) has no gaps. A project without\n * `skaile.yaml` has no declared set, so only the lock and deployed-asset gaps can appear.\n *\n * @returns The {@link ProjectState}; `gaps` is empty when the project is as declared and locked.\n */\n async projectState(): Promise<ProjectState> {\n if (this.global) return { gaps: [], requirements: [] };\n const lock = this.tryReadLock();\n const lockedIds = Object.keys(lock?.assets ?? {}).map(parseCanonicalLockKey);\n const requirements = await this.doctor();\n let gaps: LockGap[] = [];\n /** `kind:@publisher/name` of a deployed asset when the lock knows its publisher, else `kind:name`. */\n const lockIdentity = (kind: string, name: string): string => {\n const publisher = lockedIds.find((id) => id.kind === kind && id.name === name)?.publisher;\n return publisher ? `${kind}:@${publisher}/${name}` : `${kind}:${name}`;\n };\n\n for (const i of requirements) {\n if (i.unresolved) {\n // The lock knows the publisher; the deployed copy alone does not.\n const publisher = lockedIds.find(\n (id) => id.kind === i.assetKind && id.name === i.assetName,\n )?.publisher;\n const ref = publisher\n ? `${i.assetKind}:@${publisher}/${i.assetName}`\n : `${i.assetKind}:${i.assetName}`;\n const reason = `is locked but no source or library provides it any more — its requirements cannot be checked${i.fix ? ` (${i.fix})` : \"\"}`;\n gaps.push({\n type: \"unresolved\",\n ref,\n reason,\n message: `${ref} ${reason}`,\n ...(i.fix ? { manualFix: true as const } : {}),\n });\n continue;\n }\n const asset = lockIdentity(i.assetKind, i.assetName);\n const dep = `${i.depKind}:${i.depName}`;\n if (i.inRepos) {\n gaps.push({\n type: \"requires\",\n ref: dep,\n asset,\n reason: `is required by ${asset} but neither deployed nor locked (fixable)`,\n message: `${asset} requires ${dep} (fixable)`,\n });\n } else {\n // Nothing holds it: `install` cannot fix it, the user registers a library or drops the requirer.\n const fix = requirementNoHolderFix(asset);\n gaps.push({\n type: \"requires\",\n ref: dep,\n asset,\n reason: `is required by ${asset} but neither deployed nor locked (not found — ${fix})`,\n message: `${asset} requires ${dep} (not found — ${fix})`,\n manualFix: true,\n });\n }\n }\n\n // What the lock says about an asset is reported once, most specific first.\n const named = new Set(\n gaps.filter((g) => g.type === \"unresolved\").map((g) => gapIdentity(g.ref)),\n );\n for (const gap of await this.libraryOriginGaps(named)) {\n gaps.push(gap);\n named.add(gapIdentity(gap.ref));\n }\n // A requirement the lock ties to a library that cannot supply it is that library's gap, said\n // once: `install` cannot restore it, whatever the requirement check says about its source.\n const libraryHeld = (dep: string): boolean => {\n const want = parseRefTolerant(dep);\n return want !== null && gaps.some((g) => g.type === \"library\" && sameAsset(g.ref, want));\n };\n gaps = gaps.filter((g) => !(g.type === \"requires\" && libraryHeld(g.ref)));\n for (const gap of this.undeployedLockGaps(lock, named)) {\n gaps.push(gap);\n named.add(gapIdentity(gap.ref));\n }\n // A deployed file edited by hand, or one the asset does not ship, differs from the bytes\n // the lock covers: `install` / `install --locked` restore it.\n for (const d of await this.lockedCopyDrift()) {\n if (named.has(gapIdentity(d.ref))) continue;\n const parts = [\n ...d.modified.map((f) => `${f} was edited`),\n ...d.extra.map((f) => `${f} is not part of the asset`),\n ];\n const reason = `is locked, but its deployed copy differs from the lock (${parts.join(\"; \")}) — run \\`skaile install --locked\\` to restore it`;\n gaps.push({ type: \"modified\", ref: d.ref, reason, message: `${d.ref} ${reason}` });\n named.add(gapIdentity(d.ref));\n }\n gaps.push(...(await this.declaredGaps(requirements, named)));\n for (const d of await this.incompleteDeploys()) {\n const reason = `is deployed without ${d.missing.join(\", \")} — run \\`skaile install\\` to restore it`;\n gaps.push({ type: \"incomplete\", ref: d.ref, reason, message: `${d.ref} ${reason}` });\n }\n for (const u of unboundAgentInstances(this.projectDir, this.driverTarget)) {\n // `install` cannot fix it: the agent is added (or the binding dropped) by hand.\n const reason = u.ref.startsWith(\"agent:\")\n ? await this.unboundAgentReason(u.id, u.ref)\n : `is bound by agent instance \"${u.id}\" but resolves to no agent.yaml — fix the path, or drop the binding from skaile.yaml`;\n gaps.push({\n type: \"agent\",\n ref: u.ref,\n reason,\n message: `${u.ref} ${reason}`,\n manualFix: true,\n });\n }\n return {\n gaps,\n requirements: requirements.filter(\n (i) => i.unresolved || !libraryHeld(`${i.depKind}:${i.depName}`),\n ),\n };\n }\n\n /**\n * Why the `agent:` ref of agent instance `id` binds to nothing, as the phrase that follows\n * the ref in a {@link LockGap}; see {@link AssetManager.unboundAgentAdvice}.\n */\n private async unboundAgentReason(id: string, ref: string): Promise<string> {\n const { lead, advice } = await this.unboundAgentAdvice(ref);\n return `is bound by agent instance \"${id}\" but ${lead} — ${advice}`;\n }\n\n /**\n * What is wrong with an `agent:` ref bound by an agent instance and what to do (`lead`, then\n * `advice`). `skaile add` is named only when a registered library or source holds the agent\n * and `add` takes the ref (it needs a publisher); otherwise the user registers the library\n * that holds it, writes the publisher, or drops the binding.\n */\n private async unboundAgentAdvice(ref: string): Promise<{ lead: string; advice: string }> {\n const drop = \"or drop the binding from skaile.yaml\";\n const publisher = parseRefTolerant(ref)?.publisher;\n if (publisher && (await this.info(ref)) !== null) {\n return {\n lead: \"no agent was added for it\",\n advice: `run \\`skaile add ${ref}\\` first, ${drop}`,\n };\n }\n if (!publisher) {\n return {\n lead: \"names no publisher\",\n advice: `write it as agent:@<publisher>/<name> (\\`skaile add\\` needs the publisher), ${drop}`,\n };\n }\n // The lock may know the library that held it: say what is wrong with that library.\n const fix = (await this.unresolvedFixes([ref])).get(ref);\n if (fix) {\n const register = fix.replace(/, or drop the dependency with `skaile remove [^`]*`$/, \"\");\n return {\n lead: \"no agent was added for it, and `skaile add` cannot resolve it\",\n advice: `${register}, ${drop}`,\n };\n }\n return {\n lead: \"no registered library or source holds it\",\n advice: `register the library that holds it with \\`skaile library init <name> --path <dir>\\`, ${drop}`,\n };\n }\n\n /** @deprecated Use `(await projectState()).gaps`; removed in the next major. */\n async lockGaps(): Promise<LockGap[]> {\n return (await this.projectState()).gaps;\n }\n\n /**\n * The {@link ProjectState} gaps that name `ref`: as the gap's own ref, or as the asset\n * whose requirement is unmet. A ref without a publisher matches any publisher.\n *\n * @param ref - Asset ref in `kind:name` or `kind:@publisher/name` form.\n */\n async gapsOf(ref: string): Promise<LockGap[]> {\n const want = parseRefTolerant(ref);\n if (!want) return [];\n const names = (gapRef: string): boolean => {\n const p = parseRefTolerant(gapRef);\n return (\n p !== null &&\n p.kind === want.kind &&\n p.name === want.name &&\n (!want.publisher || !p.publisher || p.publisher === want.publisher)\n );\n };\n return (await this.projectState()).gaps.filter(\n (g) => names(g.ref) || (g.asset && names(g.asset)),\n );\n }\n\n /**\n * Locked library assets whose library cannot supply them: the library is not registered\n * (renamed or removed) or no longer holds the asset. Another library holding it makes the\n * gap fixable by `skaile install` (it re-locks); otherwise the user registers the library\n * again or drops the dependency.\n *\n * @param named - `kind:name` identities already reported; they are skipped.\n */\n private async libraryOriginGaps(named: ReadonlySet<string>): Promise<LockGap[]> {\n const locked = Object.entries(this.tryReadLock()?.assets ?? {}).filter(\n ([, e]) => e.library !== undefined && !e.library.installed,\n );\n if (locked.length === 0) return [];\n const snap = await this.loadLibraryIndex();\n /** Per library root + default publisher: the on-disk scan `add`/`update` resolve from. */\n const scans = new Map<string, CatalogEntry[]>();\n /** Per library root: `kind:name` → sha256 of the files on disk. */\n const diskHashes = new Map<string, Map<string, string>>();\n const gaps: LockGap[] = [];\n for (const [key, entry] of locked) {\n const origin = entry.library!;\n const { publisher, kind, name } = parseCanonicalLockKey(key);\n if (!publisher || !kind || !name || named.has(`${kind}:${name}`)) continue;\n const ref = `${kind}:@${publisher}/${name}`;\n const lookup = this.lockedLibrary(origin, snap);\n const libPath = lookup.state === \"ok\" ? lookup.path : null;\n if (lookup.state === \"ok\" && libPath) {\n const scanKey = `${libPath}\\0${publisher}`;\n let scanned = scans.get(scanKey);\n if (!scanned) {\n scanned = await scanDirectory(libPath, publisher, { knownKinds: this.knownKinds });\n scans.set(scanKey, scanned);\n }\n const found = scanned.find((x) => x.kind === kind && x.name === name);\n if (found) {\n // The files in the library are the truth (the index lags): changed bytes under the\n // locked version make `install --locked` fail, so `check` fails on them too. A newer\n // version in the library is `outdated` news, not a gap.\n const onDisk = origin.sha256\n ? libraryDiskHashes(libPath, diskHashes, this.registry).get(`${kind}:${name}`)\n : undefined;\n if (onDisk !== undefined && onDisk !== origin.sha256) {\n const diskVersion =\n found.version ||\n newestLibraryDef(snap, lookup.name, { kind, publisher, name })?.version;\n if (\n !diskVersion ||\n !semverGt(coerceVersion(diskVersion), coerceVersion(origin.version))\n ) {\n const reason = `is locked, but library \"${lookup.name}\" content changed since lock — or the lock predates the one shared asset hash; run \\`skaile install\\` to re-lock it`;\n gaps.push({ type: \"content\", ref, reason, message: `${ref} ${reason}` });\n }\n }\n continue;\n }\n }\n // A library that is not here (not registered, or its directory gone) is never re-locked\n // by `install`: it fails like `install --locked`, so the fix is manual.\n if (lookup.state === \"dir-missing\") {\n const reason = `is locked, but ${lockedLibraryProblem(lookup, origin, ref)}`;\n gaps.push({ type: \"library\", ref, reason, message: `${ref} ${reason}`, manualFix: true });\n continue;\n }\n if (lookup.state === \"unregistered\") {\n const reason = `is locked, but library \"${origin.name}\" is not registered (renamed or removed?) — ${unregisteredLibraryFix(origin, ref)}`;\n gaps.push({ type: \"library\", ref, reason, message: `${ref} ${reason}`, manualFix: true });\n continue;\n }\n const heldElsewhere =\n (await this.resolveLibraryEntries([ref], { quiet: true })).resolved.size > 0;\n if (heldElsewhere) {\n const reason = `is locked, but library \"${lookup.name}\" no longer holds it — run \\`skaile install\\` to re-lock it against the library that holds it now`;\n gaps.push({ type: \"library\", ref, reason, message: `${ref} ${reason}` });\n continue;\n }\n const reason = `is locked, but library \"${lookup.name}\" no longer holds it — restore it there, or drop the dependency with \\`skaile remove ${ref}\\``;\n gaps.push({ type: \"library\", ref, reason, message: `${ref} ${reason}`, manualFix: true });\n }\n return gaps;\n }\n\n /**\n * The {@link RestoredAsset} rows for the drifted copies (see {@link lockedCopyDrift}) a\n * deploy just wrote again: those whose ref is among the `deployed` canonical refs.\n */\n private restoredCopies(\n drifts: ReadonlyArray<{ ref: string; key: string } & DeployedDrift>,\n deployed: readonly string[],\n ): RestoredAsset[] {\n const rewritten = new Set(deployed.map((d) => d.split(\"#\")[0]));\n const out: RestoredAsset[] = [];\n for (const d of drifts) {\n if (!rewritten.has(d.ref)) continue;\n const { kind, name } = parseCanonicalLockKey(d.key);\n const component = kind ? this.installTarget(kind) : undefined;\n if (!kind || !name || !component) continue;\n const dir = relative(\n this.projectDir,\n deployedDir(component, name, this.driverTarget, this.global, this.projectDir),\n )\n .split(sep)\n .join(\"/\");\n out.push({\n ref: d.key,\n restored: d.modified.map((f) => `${dir}/${f}`),\n removed: d.extra.map((f) => `${dir}/${f}`),\n });\n }\n return out;\n }\n\n /**\n * Locked assets whose deployed copy differs from the bytes the lock covers: a file edited by\n * hand, or a file the asset does not ship. One row per asset, `ref` being `kind:@publisher/name`\n * and `key` its lock key. The one comparison behind the `modified` gap and the `Restored` lines\n * of `install`.\n *\n * - A library-origin asset is compared with its library's files, but only while those equal the\n * locked hash (changed library content is the `content` gap's business), both modified and\n * extra files.\n * - A source asset is compared with the per-file hashes the lock records (modified files only:\n * the lock lists what the source covers, not what the deploy copies).\n *\n * An agent (rendered, not copied), a `--link` deploy, an asset with a configured patch, and a\n * copy that is missing are not compared: other gaps cover them. Project mode only.\n */\n private async lockedCopyDrift(): Promise<\n Array<{ ref: string; key: string } & DeployedDrift & { library: boolean }>\n > {\n if (this.global) return [];\n const lock = this.tryReadLock();\n if (!lock) return [];\n const { patches } = this.loadConfig();\n const out: Array<{ ref: string; key: string } & DeployedDrift & { library: boolean }> = [];\n const deployOpts = {\n registry: this.registry,\n driverTarget: this.driverTarget,\n global: this.global,\n cwd: this.projectDir,\n };\n const refOf = (key: string): string => {\n const { kind, publisher, name } = parseCanonicalLockKey(key);\n return publisher ? `${kind}:@${publisher}/${name}` : `${kind}:${name}`;\n };\n const keyOf = new Map<string, string>();\n for (const key of Object.keys(lock.assets)) keyOf.set(refOf(key), key);\n\n const { entries } = await this.restoreLibraryLockEntries(lock);\n for (const e of entries) {\n if (patches[`${e.kind}:${e.name}`]) continue;\n const drift = deployedAssetDrift(e, deployOpts);\n if (!drift || (drift.modified.length === 0 && drift.extra.length === 0)) continue;\n const ref = `${e.kind}:@${(e.publisher ?? \"\").replace(/^@/, \"\")}/${e.name}`;\n out.push({ ref, key: keyOf.get(ref) ?? ref, ...drift, library: true });\n }\n\n for (const [key, entry] of Object.entries(lock.assets)) {\n if (!entry.source || entry.files.length === 0) continue;\n const { kind, name } = parseCanonicalLockKey(key);\n const component = kind ? this.installTarget(kind) : undefined;\n if (!kind || !name || !component || component === \"agent\") continue;\n if (patches[`${kind}:${name}`]) continue;\n const dest = deployedDir(component, name, this.driverTarget, this.global, this.projectDir);\n try {\n const deployed = lstatSync(dest);\n if (deployed.isSymbolicLink() || !deployed.isDirectory()) continue;\n } catch {\n continue;\n }\n // The asset root is the directory every locked file shares.\n const dirs = entry.files.map((f) =>\n posix\n .dirname(f.path)\n .split(\"/\")\n .filter((s) => s !== \".\"),\n );\n let common = dirs[0] ?? [];\n for (const d of dirs.slice(1)) {\n let i = 0;\n while (i < common.length && i < d.length && common[i] === d[i]) i++;\n common = common.slice(0, i);\n }\n const prefix = common.length > 0 ? `${common.join(\"/\")}/` : \"\";\n const modified: string[] = [];\n for (const f of entry.files) {\n const rel = f.path.startsWith(prefix) ? f.path.slice(prefix.length) : f.path;\n const deployedFile = join(dest, rel);\n if (!existsSync(deployedFile)) continue;\n try {\n if (computeHash(deployedFile) !== f.sha256) modified.push(rel);\n } catch {\n modified.push(rel);\n }\n }\n if (modified.length > 0)\n out.push({ ref: refOf(key), key, modified, extra: [], library: false });\n }\n return out;\n }\n\n /**\n * Locked assets (declared or required by one) whose deployed copy is gone: `skaile install`\n * restores them. Same deployability rule as {@link AssetManager.listDeclared}'s `drift`.\n *\n * @param named - `kind:name` identities already reported; they are skipped.\n */\n private undeployedLockGaps(lock: LockFile | null, named: ReadonlySet<string>): LockGap[] {\n const gaps: LockGap[] = [];\n for (const [key, entry] of Object.entries(lock?.assets ?? {})) {\n if (entry.library?.installed) continue;\n const { publisher, kind, name } = parseCanonicalLockKey(key);\n const component = kind ? this.installTarget(kind) : undefined;\n if (!kind || !name || !component || named.has(`${kind}:${name}`)) continue;\n if (isDeployed(component, name, this.driverTarget, this.global, this.projectDir)) continue;\n const ref = publisher ? `${kind}:@${publisher}/${name}` : `${kind}:${name}`;\n const reason = \"is locked but its deployed copy is missing — run `skaile install`\";\n gaps.push({ type: \"drift\", ref, reason, message: `${ref} ${reason}` });\n }\n return gaps;\n }\n\n /**\n * The `skaile.yaml` side of {@link AssetManager.projectState}: declared refs that do not\n * parse, never resolved into the lock, are not materialized, or contradict a `#pin`.\n * A project with no (or an unreadable) `skaile.yaml` has no declared set to reconcile.\n *\n * @param requirements - What {@link AssetManager.doctor} found; a declared preset whose\n * items it already named needs no second line.\n * @param named - `kind:name` identities already reported; a declared asset among them\n * needs no `drift` line.\n */\n private async declaredGaps(\n requirements: readonly DepIssue[],\n named: ReadonlySet<string>,\n ): Promise<LockGap[]> {\n let declared: DeclaredAsset[];\n try {\n declared = await this.listDeclared();\n } catch {\n return [];\n }\n const gaps: LockGap[] = [];\n const unlocked = declared.filter((d) => d.state === \"declared\").map((d) => d.ref);\n const hints = await this.publisherChangeHints(unlocked);\n const lockKeys = Object.keys(this.tryReadLock()?.assets ?? {});\n for (const d of declared) {\n if (\n d.kind === \"preset\" &&\n requirements.some((i) => i.assetKind === \"preset\" && i.assetName === d.name)\n ) {\n continue;\n }\n let gap: Pick<LockGap, \"type\" | \"reason\" | \"manualFix\"> | undefined;\n if (d.state === \"invalid\") {\n gap = {\n type: \"invalid\",\n reason: \"is not a valid asset ref (expected kind:@<publisher>/<name>#<version>)\",\n };\n } else if (d.state === \"drift\") {\n if (named.has(`${d.kind}:${d.name}`)) continue;\n gap = {\n type: \"drift\",\n reason: \"is declared and locked but not materialized — run `skaile install`\",\n };\n } else if (d.state === \"declared\") {\n const hint = hints[d.ref];\n if (hint) {\n // A moved publisher is not fixed by `install`: the hint names the new ref instead.\n gap = {\n type: \"declared\",\n reason: `is declared but does not resolve${hint}`,\n manualFix: true,\n };\n } else if (await this.declaredRefResolvable(d.ref)) {\n gap = { type: \"declared\", reason: \"is declared but not locked — run `skaile install`\" };\n } else {\n gap = {\n type: \"declared\",\n reason: declaredNoHolderReason(d.ref),\n manualFix: true,\n };\n }\n } else {\n const want = parseAssetRef(d.ref);\n if (want.kind === \"preset\") {\n // A preset is never locked as an asset: it resolved once `install` / `add` recorded it\n // in the lock's `presets`, or a local library or source holds it right now.\n if (this.presetRecorded(want) || (await this.info(d.ref)) !== null) continue;\n gap = (await this.declaredRefResolvable(d.ref))\n ? { type: \"declared\", reason: \"is declared but not locked — run `skaile install`\" }\n : {\n type: \"declared\",\n reason: declaredNoHolderReason(d.ref),\n manualFix: true,\n };\n gaps.push({ ...gap, ref: d.ref, message: `${d.ref} ${gap.reason}` });\n continue;\n }\n if (!want.pin) continue;\n const held = lockKeys\n .map((key) => ({ key, id: parseCanonicalLockKey(key) }))\n .filter(\n ({ id }) =>\n id.kind === want.kind &&\n id.name === want.name &&\n (!want.publisher || id.publisher === want.publisher),\n );\n if (\n held.length > 0 &&\n !held.some(({ id }) => !id.version || matchPin(want.pin, id.version))\n ) {\n gap = {\n type: \"pin\",\n reason: `is pinned in skaile.yaml but the lock holds ${held.map((h) => h.key).join(\", \")} — run \\`skaile install\\``,\n };\n }\n }\n if (gap) gaps.push({ ...gap, ref: d.ref, message: `${d.ref} ${gap.reason}` });\n }\n return gaps;\n }\n\n /** Whether the lock's `presets` slice records `want` (kind, name and, when both carry one, publisher). */\n private presetRecorded(want: AssetRef): boolean {\n return (this.tryReadLock()?.presets ?? []).some((ref) => {\n const p = parseRefTolerant(ref);\n return (\n p !== null &&\n p.kind === want.kind &&\n p.name === want.name &&\n (!want.publisher || !p.publisher || p.publisher === want.publisher)\n );\n });\n }\n\n /**\n * Whether `skaile install` can resolve a declared ref: a source or library holds it, or the\n * project declares a store that may. The global catalog is not asked: a check never goes\n * to the network.\n */\n private async declaredRefResolvable(ref: string): Promise<boolean> {\n if ((await this.info(ref)) !== null) return true;\n return this.loadConfig().stores.length > 0;\n }\n\n /**\n * Items of each declared `preset:` dependency that the lock does not cover.\n *\n * A preset is never locked itself; the lock lists only its expanded items, so an\n * item missing from the lock never resolved (or was declared after the last\n * install). Presets are read from the local sources and libraries (nested presets\n * followed); one only a store holds cannot be read without the network and\n * reports no gaps. Without a lock nothing is reported: `list` and `check` already\n * show a never-installed declaration as `declared`.\n *\n * @param declared - The `dependencies:` refs as written in `skaile.yaml`.\n * @param lock - The current lock, or `null` when none exists.\n * @returns Declared preset ref → its uncovered items; `resolvable` is `true` when a\n * local source or library offers the item (so `skaile install` can fix it).\n * Presets without gaps are absent.\n */\n private async declaredPresetGaps(\n declared: readonly string[],\n lock: LockFile | null,\n ): Promise<Map<string, Array<{ ref: string; resolvable: boolean }>>> {\n const gaps = new Map<string, Array<{ ref: string; resolvable: boolean }>>();\n if (!lock) return gaps;\n const presetRefs = declared.filter((d) => parseRefTolerant(d)?.kind === \"preset\");\n if (presetRefs.length === 0) return gaps;\n\n const { repositories } = this.loadConfig();\n const provenanceIndex = await buildProvenanceIndex(this.buildClones(repositories), {\n projectDir: this.projectDir,\n knownKinds: this.knownKinds,\n });\n const lockKeys = Object.keys(lock.assets).map(parseCanonicalLockKey);\n\n /** Best source candidate of a publisher-qualified ref: pin honoured, highest version. */\n const sourceCandidate = (ref: string): ProvenanceCandidate | undefined => {\n const p = parseRefTolerant(ref);\n if (!p?.publisher) return undefined;\n const hash = ref.indexOf(\"#\");\n const pin = p.pin ?? (hash >= 0 ? ref.slice(hash + 1) : undefined);\n return (provenanceIndex.get(`${p.publisher}/${p.kind}:${p.name}`) ?? [])\n .filter((c) => matchPin(pin, c.version))\n .sort((a, b) => {\n const va = coerceVersion(a.version);\n const vb = coerceVersion(b.version);\n return semverGt(va, vb) ? -1 : semverGt(vb, va) ? 1 : 0;\n })[0];\n };\n /** Dependency refs a locally known preset lists; `null` when no local source or library holds it. */\n const itemsOf = async (ref: string): Promise<string[] | null> => {\n const src = sourceCandidate(ref);\n if (src) return (src.deps ?? []).map((d) => qualifyDepRef(d, src.publisher));\n const entry = (await this.resolveLibraryEntries([ref], { quiet: true })).entries[0];\n return entry ? libraryEntryDepRefs(entry) : null;\n };\n const resolvableLocally = async (ref: string): Promise<boolean> =>\n sourceCandidate(ref) !== undefined ||\n (await this.resolveLibraryEntries([ref], { quiet: true })).resolved.has(ref);\n const isLocked = (item: AssetRef): boolean =>\n lockKeys.some(\n (k) =>\n k.kind === item.kind &&\n k.name === item.name &&\n (!item.publisher || k.publisher === item.publisher),\n );\n\n for (const presetRef of presetRefs) {\n const out: Array<{ ref: string; resolvable: boolean }> = [];\n const visited = new Set<string>();\n const walk = async (ref: string): Promise<void> => {\n if (visited.has(ref)) return;\n visited.add(ref);\n for (const item of (await itemsOf(ref)) ?? []) {\n const p = parseRefTolerant(item);\n if (!p) continue;\n if (p.kind === \"preset\") await walk(item);\n else if (!isLocked(p)) out.push({ ref: item, resolvable: await resolvableLocally(item) });\n }\n };\n await walk(presetRef);\n if (out.length > 0) gaps.set(presetRef, out);\n }\n return gaps;\n }\n\n // ── Scaffold ───────────────────────────────────────────────────────────\n\n /**\n * Create a minimal asset scaffold directory (delegates to {@link createScaffold}).\n *\n * @param name - Asset name (also used as the directory name).\n * @param kind - Asset kind: `skill` | `agent` | `preset` | `flow` | `prompt` | `contract`.\n * @param destDir - Parent directory to create the asset in.\n * @param opts - Optional scaffold content (`description`).\n * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the\n * directory already exists or `kind` has no scaffold template.\n */\n create(\n name: string,\n kind: string,\n destDir: string,\n opts?: ScaffoldOptions,\n ): { ok: boolean; path: string } {\n return createScaffold(name, kind, destDir, opts);\n }\n\n // ── Contrib (REMOVED 2026-05-12) ───────────────────────────────────────\n //\n // The `contribChanges / contribDiff / contribCommit / contribPush /\n // contribCompare` methods were retired alongside `skaile repo contrib *`.\n // The refinement push-back workflow is being re-introduced in Phase 4 as\n // `skaile publish` + `skaile preset push` against the Library Source model.\n\n // ── History ────────────────────────────────────────────────────────────\n\n /**\n * Return recent asset action history entries, newest first.\n *\n * @param limit - Maximum number of entries to return. Defaults to `20`.\n * @returns Array of {@link HistoryEntry} objects in reverse-chronological order.\n */\n history(limit = 20): HistoryEntry[] {\n return getRecentHistory(this.projectDir, limit);\n }\n\n /**\n * Erase all asset action history for this workspace.\n */\n clearHistory(): void {\n clearHistory(this.projectDir);\n }\n\n // ── Clean ───────────────────────────────────────────────────────────────\n\n /**\n * Remove deployed assets tracked by the lock file and report unmanaged ones.\n *\n * With `opts.all`, also deletes `.skaile/history.yaml`, `.skaile/patches/`,\n * `.skaile/cache/sources/`, and `skaile.lock.yaml` — effectively resetting the\n * workspace to a pre-install state.\n *\n * @param opts - Optional cleanup options.\n * @param opts.all - When `true`, remove all Skaile-managed state in addition to deployed assets.\n * @returns Object with `removed` (successfully cleaned refs), `skipped` (with reasons),\n * and `unmanaged` (deployed assets not in the lock file).\n */\n clean(opts?: { all?: boolean }): {\n removed: string[];\n skipped: Array<{ ref: string; reason: string }>;\n unmanaged: string[];\n } {\n const lock = this.tryReadLock();\n const skipped: Array<{ ref: string; reason: string }> = [];\n\n const removed = this.cleanLockedDeployedAssets(lock);\n const unmanaged = this.collectUnmanagedAssets(lock);\n\n if (opts?.all) this.removeAllManagedState();\n\n return { removed, skipped, unmanaged };\n }\n\n /**\n * Remove the deployed dir of every asset tracked by the lock; missing dirs\n * still count as removed. Returns the list of cleaned refs.\n */\n private cleanLockedDeployedAssets(lock: LockFile | null): string[] {\n const removed: string[] = [];\n if (!lock) return removed;\n for (const ref of Object.keys(lock.assets)) {\n const { kind, name } = parseCanonicalLockKey(ref);\n const component = kind ? this.installTarget(kind) : undefined;\n if (!kind || !name || !component) continue;\n for (const dest of deployedPaths(\n component,\n name,\n this.driverTarget,\n this.global,\n this.projectDir,\n )) {\n try {\n const stat = lstatSync(dest);\n if (stat.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n } catch {\n // Already gone — counts as removed\n }\n }\n removed.push(ref);\n }\n return removed;\n }\n\n /**\n * Report deployed assets not tracked by the lock file. Deployed assets are\n * keyed by <kind>:<name>; lock canonical refs are mapped to that shape.\n */\n private collectUnmanagedAssets(lock: LockFile | null): string[] {\n const lockRefs = lock\n ? new Set(\n Object.keys(lock.assets).map((r) => {\n const p = parseCanonicalLockKey(r);\n return p.kind && p.name ? `${p.kind}:${p.name}` : r;\n }),\n )\n : new Set<string>();\n const unmanaged: string[] = [];\n const allDeployed = this.listDeployed();\n for (const d of allDeployed) {\n const ref = `${d.kind}:${d.name}`;\n if (!lockRefs.has(ref)) {\n unmanaged.push(ref);\n }\n }\n return unmanaged;\n }\n\n /** Delete all Skaile-managed state: history file, patches/, cache/sources/, lock. */\n private removeAllManagedState(): void {\n // Delete history file\n const historyFile = join(this.projectDir, \".skaile\", \"history.yaml\");\n try {\n unlinkSync(historyFile);\n } catch {}\n\n // Remove patches dir\n try {\n rmSync(this.patchDir, { recursive: true, force: true });\n } catch {}\n\n // Remove repos dir\n try {\n rmSync(this.reposDir, { recursive: true, force: true });\n } catch {}\n\n // Remove lock file\n try {\n unlinkSync(this.lockPath);\n } catch {}\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────\n\n /**\n * Add a dependency ref to the manifest `dependencies:` if not already present.\n * Project mode edits `<projectDir>/skaile.yaml`; global mode edits the\n * user-scope SSOT `~/.skaile/skaile.yaml`, **bootstrapping** the file (and its\n * parent dir) when absent so `skaile add --global` works on a fresh machine.\n */\n private addDependencyToConfig(ref: string): void {\n const configPath = join(this.stateRoot, \"skaile.yaml\");\n if (!existsSync(configPath)) {\n if (!this.global) return; // project mode never bootstraps a manifest\n mkdirSync(this.stateRoot, { recursive: true });\n writeFileSync(configPath, stringifyYaml({ dependencies: [ref] }, { lineWidth: 120 }));\n return;\n }\n const raw = parseYaml(readFileSync(configPath, \"utf8\")) ?? {};\n if (!Array.isArray(raw.dependencies)) raw.dependencies = [];\n const deps: unknown[] = raw.dependencies;\n if (deps.includes(ref) && deps.filter((d) => this.sameDeclaredAsset(d, ref)).length === 1) {\n return;\n }\n // One line per asset: a re-add with a new pin (`add x#0.2.0` after `add x`)\n // replaces the earlier declaration in place instead of appending a second one.\n const next: unknown[] = [];\n let placed = false;\n for (const dep of deps) {\n if (!this.sameDeclaredAsset(dep, ref)) {\n next.push(dep);\n } else if (!placed) {\n next.push(ref);\n placed = true;\n }\n }\n if (!placed) next.push(ref);\n raw.dependencies = next;\n writeFileSync(configPath, stringifyYaml(raw, { lineWidth: 120 }));\n }\n\n /**\n * Whether the declared `dep` names the same asset (kind, publisher, name) as\n * `ref`, ignoring the version pin. A publisher must agree on both sides —\n * unlike {@link removeDependencyFromConfig}, a bare `kind:name` never replaces a\n * publisher-qualified line. Unparseable entries only match on string equality.\n */\n private sameDeclaredAsset(dep: unknown, ref: string): boolean {\n if (typeof dep !== \"string\") return false;\n if (dep === ref) return true;\n const a = parseAssetRefLoose(dep);\n const b = parseAssetRefLoose(ref);\n if (!a || !b) return false;\n return (\n a.kind === b.kind &&\n a.name === b.name &&\n a.publisher?.replace(/^@/, \"\") === b.publisher?.replace(/^@/, \"\")\n );\n }\n\n /**\n * Remove a dependency ref from the manifest `dependencies:`. Targets the same\n * file as {@link addDependencyToConfig} (`~/.skaile/skaile.yaml` in global mode).\n *\n * @returns `true` when a declaration was removed.\n */\n private removeDependencyFromConfig(target: {\n kind: string;\n name: string;\n publisher?: string;\n }): boolean {\n const configPath = join(this.stateRoot, \"skaile.yaml\");\n if (!existsSync(configPath)) return false;\n const raw = parseYaml(readFileSync(configPath, \"utf8\")) ?? {};\n if (!Array.isArray(raw.dependencies)) return false;\n // Match by parsed identity, not by an exact string: `add` stores deps\n // publisher-qualified (`skill:@pub/name`) while a remove caller only knows\n // `kind:name`, so an `indexOf` of the bare key never matched. When both\n // sides carry a publisher they must agree; otherwise fall back to kind+name.\n const wantPub = target.publisher?.replace(/^@/, \"\");\n // Drop every matching line: a project that hit the old duplicate-pin bug\n // (`skill:@pub/x` and `skill:@pub/x#0.2.0`) has more than one.\n const before = raw.dependencies.length;\n raw.dependencies = raw.dependencies.filter((dep: unknown) => {\n if (typeof dep !== \"string\") return true;\n const p = parseAssetRefLoose(dep);\n if (!p || p.kind !== target.kind || p.name !== target.name) return true;\n const havePub = p.publisher?.replace(/^@/, \"\");\n return !(wantPub === undefined || havePub === undefined || havePub === wantPub);\n });\n if (raw.dependencies.length === before) return false;\n writeFileSync(configPath, stringifyYaml(raw, { lineWidth: 120 }));\n return true;\n }\n\n /**\n * Drop the agent instances of `skaile.yaml` (`agents.<id>`, or the `agent.definition`\n * default) whose `ref` binds to `target`, and the native agent files an install rendered for\n * them. Only an `agent` target has bindings; project mode only. A `ref` without a publisher\n * matches any publisher, and a pin is ignored.\n *\n * @returns `true` when a binding was removed.\n */\n private removeAgentBindings(target: { kind: string; name: string; publisher?: string }): boolean {\n if (this.global || target.kind !== \"agent\") return false;\n const configPath = join(this.stateRoot, \"skaile.yaml\");\n if (!existsSync(configPath)) return false;\n let raw: {\n agents?: Record<string, { ref?: unknown } | null>;\n agent?: Record<string, unknown>;\n } | null;\n try {\n raw = parseYaml(readFileSync(configPath, \"utf8\"));\n } catch {\n return false;\n }\n if (!raw || typeof raw !== \"object\") return false;\n const wantPub = target.publisher?.replace(/^@/, \"\");\n const binds = (ref: unknown): boolean => {\n const p = typeof ref === \"string\" ? parseRefTolerant(ref) : null;\n if (!p || p.kind !== \"agent\" || p.name !== target.name) return false;\n const havePub = p.publisher?.replace(/^@/, \"\");\n return wantPub === undefined || havePub === undefined || havePub === wantPub;\n };\n const ids: string[] = [];\n const instances = raw.agents;\n if (instances && typeof instances === \"object\") {\n for (const [id, instance] of Object.entries(instances)) {\n if (!binds(instance?.ref)) continue;\n ids.push(id);\n delete instances[id];\n }\n if (Object.keys(instances).length === 0) delete raw.agents;\n }\n if (raw.agent && typeof raw.agent === \"object\" && binds(raw.agent.definition)) {\n ids.push(DEFAULT_AGENT_INSTANCE_ID);\n delete raw.agent.definition;\n if (Object.keys(raw.agent).length === 0) delete raw.agent;\n }\n if (ids.length === 0) return false;\n writeFileSync(configPath, stringifyYaml(raw, { lineWidth: 120 }));\n for (const driverTarget of this.targetHarnesses()) {\n removeAgentInstanceRenderings({ projectDir: this.projectDir, driverTarget, ids });\n }\n return true;\n }\n\n private resolveRepoDir(decl: SourceDeclaration, name: string): string | null {\n // Check links first\n const links = readLinks(this.projectDir);\n if (links[name]) {\n return existsSync(links[name]) ? links[name] : null;\n }\n\n if (decl.path) {\n const resolved = resolve(this.projectDir, decl.path);\n return existsSync(resolved) ? resolved : null;\n }\n\n // Check project-local symlink, then global cache\n const dest = join(this.reposDir, name);\n if (existsSync(dest)) return dest;\n\n const globalDest = join(getGlobalCacheDir(), name);\n if (existsSync(join(globalDest, \".git\"))) return globalDest;\n\n return null;\n }\n}\n\n// ── Agent install (renders GitAgent packages to framework-native files) ──\n\nexport { installAgent } from \"./install-agent.js\";\nexport type {\n InstalledAgentInstance,\n InstallAgentInstancesOptions,\n InstallAgentInstancesResult,\n} from \"./install-instances.js\";\nexport { installAgentInstances } from \"./install-instances.js\";\n\n// ── Renderers ─────────────────────────────────────────────────────────────\n\nexport type { AgentRenderer, AgentRenderInput, AgentRenderResult } from \"./renderers.js\";\nexport {\n AGENT_RENDERERS,\n claudeCodeRenderer,\n codexRenderer,\n driverTargetSupportsAgents,\n ompRenderer,\n} from \"./renderers.js\";\n\n// ── Fragments ─────────────────────────────────────────────────────────────\n\nexport type {\n AbilityRef,\n ConnectorRef,\n ContractRef,\n FragmentContext,\n FragmentId,\n} from \"./fragments.js\";\nexport { BUILT_IN_FRAGMENTS, loadPromptExtensions, resolveFragments } from \"./fragments.js\";\n"]}