@skaile/workspaces 4.39.0 → 5.0.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 (337) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{asset-feeds-KXL45ALC.js → asset-feeds-HIWT4DVT.js} +24 -96
  3. package/dist/asset-feeds-HIWT4DVT.js.map +1 -0
  4. package/dist/asset-manager/catalog-deployer.js +10 -9
  5. package/dist/asset-manager/index.js +15 -14
  6. package/dist/asset-manager/installer.js +10 -9
  7. package/dist/asset-manager/src/catalog-deployer.d.ts +1 -3
  8. package/dist/asset-manager/src/catalog-deployer.d.ts.map +1 -1
  9. package/dist/asset-manager/src/index.d.ts +6 -8
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/bridge/drivers/claude-sdk.js +23 -11
  12. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  13. package/dist/bridge/drivers/codex.js +11 -10
  14. package/dist/bridge/drivers/codex.js.map +1 -1
  15. package/dist/bridge/drivers/continue.js +12 -11
  16. package/dist/bridge/drivers/continue.js.map +1 -1
  17. package/dist/bridge/drivers/echo.js +2 -2
  18. package/dist/bridge/drivers/gemini.js +6 -6
  19. package/dist/bridge/drivers/goose.js +12 -11
  20. package/dist/bridge/drivers/goose.js.map +1 -1
  21. package/dist/bridge/drivers/omp.js +3 -3
  22. package/dist/bridge/drivers/opencode.js +12 -11
  23. package/dist/bridge/drivers/opencode.js.map +1 -1
  24. package/dist/bridge/drivers/qwen.js +6 -6
  25. package/dist/bridge/index.js +13 -12
  26. package/dist/bridge/src/drivers/claude-sdk.d.ts +4 -0
  27. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  28. package/dist/bridge/src/types.d.ts +7 -0
  29. package/dist/bridge/src/types.d.ts.map +1 -1
  30. package/dist/{chunk-7RC37XFW.js → chunk-22DN3DB2.js} +59 -12
  31. package/dist/chunk-22DN3DB2.js.map +1 -0
  32. package/dist/{chunk-SM6EUQMY.js → chunk-32DMH2GD.js} +8 -8
  33. package/dist/{chunk-SM6EUQMY.js.map → chunk-32DMH2GD.js.map} +1 -1
  34. package/dist/{chunk-A5EDMBFG.js → chunk-43ZBF3WH.js} +5 -8
  35. package/dist/chunk-43ZBF3WH.js.map +1 -0
  36. package/dist/{chunk-5RWL4L3X.js → chunk-53WMBXSL.js} +60 -14
  37. package/dist/chunk-53WMBXSL.js.map +1 -0
  38. package/dist/{chunk-YCMZHL4T.js → chunk-7QMRP6BC.js} +4 -4
  39. package/dist/{chunk-YCMZHL4T.js.map → chunk-7QMRP6BC.js.map} +1 -1
  40. package/dist/chunk-A2ULN3KX.js +40 -0
  41. package/dist/chunk-A2ULN3KX.js.map +1 -0
  42. package/dist/{chunk-DSB6X25D.js → chunk-AG44ZJ7W.js} +3 -3
  43. package/dist/{chunk-DSB6X25D.js.map → chunk-AG44ZJ7W.js.map} +1 -1
  44. package/dist/{chunk-SSCPTAFJ.js → chunk-CFL5IJHV.js} +3 -3
  45. package/dist/{chunk-SSCPTAFJ.js.map → chunk-CFL5IJHV.js.map} +1 -1
  46. package/dist/{chunk-36ML6SFP.js → chunk-CGJ7B6MZ.js} +4 -4
  47. package/dist/{chunk-36ML6SFP.js.map → chunk-CGJ7B6MZ.js.map} +1 -1
  48. package/dist/{chunk-6X4DHKHP.js → chunk-CT6NQSA4.js} +3 -3
  49. package/dist/{chunk-6X4DHKHP.js.map → chunk-CT6NQSA4.js.map} +1 -1
  50. package/dist/{chunk-5K2VT6E2.js → chunk-DXUQCMVT.js} +3 -3
  51. package/dist/{chunk-5K2VT6E2.js.map → chunk-DXUQCMVT.js.map} +1 -1
  52. package/dist/{chunk-B4IAZTZZ.js → chunk-EB6OPURC.js} +3 -3
  53. package/dist/{chunk-B4IAZTZZ.js.map → chunk-EB6OPURC.js.map} +1 -1
  54. package/dist/{chunk-252TK4RU.js → chunk-GFPG27HK.js} +12 -14
  55. package/dist/chunk-GFPG27HK.js.map +1 -0
  56. package/dist/{chunk-2EL2PBRC.js → chunk-H4EGUQ7M.js} +3 -3
  57. package/dist/{chunk-2EL2PBRC.js.map → chunk-H4EGUQ7M.js.map} +1 -1
  58. package/dist/{chunk-YQEF36D5.js → chunk-H5G3OYY6.js} +4 -4
  59. package/dist/{chunk-YQEF36D5.js.map → chunk-H5G3OYY6.js.map} +1 -1
  60. package/dist/{chunk-C75VKXAM.js → chunk-HD5K3BYW.js} +3 -3
  61. package/dist/{chunk-C75VKXAM.js.map → chunk-HD5K3BYW.js.map} +1 -1
  62. package/dist/{chunk-VJNTB4DN.js → chunk-HTBGJCKP.js} +4 -4
  63. package/dist/{chunk-VJNTB4DN.js.map → chunk-HTBGJCKP.js.map} +1 -1
  64. package/dist/{chunk-JEPSP6XK.js → chunk-HWE3FXF4.js} +17 -11
  65. package/dist/chunk-HWE3FXF4.js.map +1 -0
  66. package/dist/{chunk-QVLQGXT6.js → chunk-I3ITSUWS.js} +5 -5
  67. package/dist/{chunk-QVLQGXT6.js.map → chunk-I3ITSUWS.js.map} +1 -1
  68. package/dist/{chunk-H7N6RWNF.js → chunk-I7Z4FN52.js} +4 -4
  69. package/dist/{chunk-H7N6RWNF.js.map → chunk-I7Z4FN52.js.map} +1 -1
  70. package/dist/{chunk-WCWFS36P.js → chunk-IGXKUCLI.js} +3 -3
  71. package/dist/{chunk-WCWFS36P.js.map → chunk-IGXKUCLI.js.map} +1 -1
  72. package/dist/{chunk-VXPFSZDT.js → chunk-JFVEX4G5.js} +6 -6
  73. package/dist/{chunk-VXPFSZDT.js.map → chunk-JFVEX4G5.js.map} +1 -1
  74. package/dist/{chunk-YYH5EVPM.js → chunk-JUXQUZOQ.js} +12 -4
  75. package/dist/{chunk-YYH5EVPM.js.map → chunk-JUXQUZOQ.js.map} +1 -1
  76. package/dist/{chunk-M7GPCWEV.js → chunk-KREXWKVX.js} +3 -3
  77. package/dist/{chunk-M7GPCWEV.js.map → chunk-KREXWKVX.js.map} +1 -1
  78. package/dist/{chunk-TQ6XNACF.js → chunk-LHFZTVIM.js} +23 -24
  79. package/dist/chunk-LHFZTVIM.js.map +1 -0
  80. package/dist/{chunk-YV3YI3TA.js → chunk-MBVNMPG7.js} +4 -4
  81. package/dist/{chunk-YV3YI3TA.js.map → chunk-MBVNMPG7.js.map} +1 -1
  82. package/dist/{chunk-3C3ODIDE.js → chunk-MX7IRKTO.js} +6 -6
  83. package/dist/{chunk-3C3ODIDE.js.map → chunk-MX7IRKTO.js.map} +1 -1
  84. package/dist/{chunk-UDFWBALP.js → chunk-NFGRW3L7.js} +3 -3
  85. package/dist/{chunk-UDFWBALP.js.map → chunk-NFGRW3L7.js.map} +1 -1
  86. package/dist/{chunk-5LF27VUB.js → chunk-ODT7HSLI.js} +16 -15
  87. package/dist/chunk-ODT7HSLI.js.map +1 -0
  88. package/dist/{chunk-QBQITQAM.js → chunk-PV4OBVA3.js} +3 -3
  89. package/dist/{chunk-QBQITQAM.js.map → chunk-PV4OBVA3.js.map} +1 -1
  90. package/dist/{chunk-ORH2BZEM.js → chunk-QCI6D7E4.js} +69 -22
  91. package/dist/chunk-QCI6D7E4.js.map +1 -0
  92. package/dist/{chunk-DIQDYNXZ.js → chunk-QZLWJETK.js} +3 -3
  93. package/dist/{chunk-DIQDYNXZ.js.map → chunk-QZLWJETK.js.map} +1 -1
  94. package/dist/{chunk-TSVRKUGV.js → chunk-RP4B4HVX.js} +11 -2
  95. package/dist/chunk-RP4B4HVX.js.map +1 -0
  96. package/dist/{chunk-X4DKUGV4.js → chunk-RSHMAEK3.js} +7 -13
  97. package/dist/chunk-RSHMAEK3.js.map +1 -0
  98. package/dist/chunk-RVRB27AN.js +64 -0
  99. package/dist/chunk-RVRB27AN.js.map +1 -0
  100. package/dist/{chunk-5NYBY6ZE.js → chunk-TVOODIZE.js} +3 -3
  101. package/dist/{chunk-5NYBY6ZE.js.map → chunk-TVOODIZE.js.map} +1 -1
  102. package/dist/{chunk-FTPKMJFD.js → chunk-TVYLXZTT.js} +2 -2
  103. package/dist/{chunk-FTPKMJFD.js.map → chunk-TVYLXZTT.js.map} +1 -1
  104. package/dist/{chunk-EOKAFBJ7.js → chunk-TYUJB336.js} +3 -3
  105. package/dist/{chunk-EOKAFBJ7.js.map → chunk-TYUJB336.js.map} +1 -1
  106. package/dist/{chunk-OLMNDIAU.js → chunk-UVOJSWD2.js} +95 -320
  107. package/dist/chunk-UVOJSWD2.js.map +1 -0
  108. package/dist/{chunk-DOVURNRK.js → chunk-VDJKWKH2.js} +3 -3
  109. package/dist/chunk-VDJKWKH2.js.map +1 -0
  110. package/dist/{chunk-VDBP6Y5M.js → chunk-WCQMXBO5.js} +21 -47
  111. package/dist/chunk-WCQMXBO5.js.map +1 -0
  112. package/dist/{chunk-NLKIW2VI.js → chunk-WOJ4AK3Q.js} +3 -3
  113. package/dist/{chunk-NLKIW2VI.js.map → chunk-WOJ4AK3Q.js.map} +1 -1
  114. package/dist/{chunk-XU7JET5Z.js → chunk-X7MHVL4R.js} +16 -100
  115. package/dist/chunk-X7MHVL4R.js.map +1 -0
  116. package/dist/{chunk-K3IBZ2UZ.js → chunk-XUUYAS3Z.js} +3 -3
  117. package/dist/{chunk-K3IBZ2UZ.js.map → chunk-XUUYAS3Z.js.map} +1 -1
  118. package/dist/{chunk-BCUVRJXV.js → chunk-XWLEXD34.js} +3 -3
  119. package/dist/{chunk-BCUVRJXV.js.map → chunk-XWLEXD34.js.map} +1 -1
  120. package/dist/{chunk-P7BU6DAC.js → chunk-YOWFUJO7.js} +69 -31
  121. package/dist/chunk-YOWFUJO7.js.map +1 -0
  122. package/dist/{chunk-OQRB7JUS.js → chunk-YV4J7V53.js} +3 -3
  123. package/dist/{chunk-OQRB7JUS.js.map → chunk-YV4J7V53.js.map} +1 -1
  124. package/dist/{chunk-JXT46QFC.js → chunk-ZDKJHQY2.js} +2 -2
  125. package/dist/{chunk-JXT46QFC.js.map → chunk-ZDKJHQY2.js.map} +1 -1
  126. package/dist/cli/index.js +375 -699
  127. package/dist/cli/index.js.map +1 -1
  128. package/dist/cli/src/asset-feeds.d.ts +1 -8
  129. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  130. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  131. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  132. package/dist/cli/src/commands/library-index.d.ts +5 -12
  133. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  134. package/dist/cli/src/commands/manage.d.ts +74 -58
  135. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  136. package/dist/cli/src/commands/show.d.ts +1 -1
  137. package/dist/cli/src/commands/skailify-lib.d.ts +0 -31
  138. package/dist/cli/src/commands/skailify-lib.d.ts.map +1 -1
  139. package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
  140. package/dist/cli/src/commands/validate.d.ts +20 -2
  141. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  142. package/dist/cli/src/flow-discovery.d.ts +2 -2
  143. package/dist/cli/src/hooks/pre-commit-version.d.ts +1 -1
  144. package/dist/cli/src/skill-walker.d.ts +7 -10
  145. package/dist/cli/src/skill-walker.d.ts.map +1 -1
  146. package/dist/connectors/config.js +6 -5
  147. package/dist/connectors/index.js +21 -20
  148. package/dist/core/discovery.js +1 -1
  149. package/dist/core/index.js +9 -8
  150. package/dist/core/manifest.js +2 -2
  151. package/dist/core/models.js +1 -1
  152. package/dist/core/plugin-groupings.d.ts +2 -0
  153. package/dist/core/plugin-groupings.js +4 -0
  154. package/dist/core/plugin-groupings.js.map +1 -0
  155. package/dist/core/publish-manifest.js +2 -2
  156. package/dist/core/ref.js +1 -1
  157. package/dist/core/runtime-assets.js +6 -5
  158. package/dist/core/src/discovery.d.ts +11 -51
  159. package/dist/core/src/discovery.d.ts.map +1 -1
  160. package/dist/core/src/index.d.ts +3 -2
  161. package/dist/core/src/index.d.ts.map +1 -1
  162. package/dist/core/src/models.d.ts +6 -33
  163. package/dist/core/src/models.d.ts.map +1 -1
  164. package/dist/core/src/plugin-groupings.d.ts +31 -0
  165. package/dist/core/src/plugin-groupings.d.ts.map +1 -0
  166. package/dist/core/src/repo-manager.d.ts.map +1 -1
  167. package/dist/core/src/settings.d.ts +1 -1
  168. package/dist/core/src/workspace-config.d.ts +1 -1
  169. package/dist/core/workspace-config.js +5 -4
  170. package/dist/deploy/index.js +9 -8
  171. package/dist/deploy/index.js.map +1 -1
  172. package/dist/discovery/index.js +6 -5
  173. package/dist/discovery/src/discover.d.ts +9 -25
  174. package/dist/discovery/src/discover.d.ts.map +1 -1
  175. package/dist/discovery/src/index.d.ts +0 -2
  176. package/dist/discovery/src/index.d.ts.map +1 -1
  177. package/dist/discovery/src/source-config.d.ts +13 -9
  178. package/dist/discovery/src/source-config.d.ts.map +1 -1
  179. package/dist/discovery/src/tree-entries.d.ts +6 -11
  180. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  181. package/dist/{ensure-sources-J5CDTQ36.js → ensure-sources-G4FXTJDB.js} +18 -17
  182. package/dist/ensure-sources-G4FXTJDB.js.map +1 -0
  183. package/dist/factory-assets/README.md +1 -1
  184. package/dist/factory-assets/connectors/box.js +21 -20
  185. package/dist/factory-assets/connectors/deploy.js +21 -20
  186. package/dist/factory-assets/connectors/devserver.js +21 -20
  187. package/dist/factory-assets/connectors/flow/CONNECTOR.md +6 -1
  188. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  189. package/dist/factory-assets/connectors/flow/adapter.js +21 -20
  190. package/dist/factory-assets/connectors/flow/contract/flow.v2.schema.json +13 -3
  191. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -0
  192. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  193. package/dist/factory-assets/connectors/flow/contract/output-fields.d.ts +21 -5
  194. package/dist/factory-assets/connectors/flow/contract/output-fields.d.ts.map +1 -1
  195. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +2 -0
  196. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  197. package/dist/factory-assets/connectors/flow/contract/sub-flow-output.d.ts +20 -0
  198. package/dist/factory-assets/connectors/flow/contract/sub-flow-output.d.ts.map +1 -0
  199. package/dist/factory-assets/connectors/flow/contract.js +4 -4
  200. package/dist/factory-assets/connectors/flow/engine/bindings.d.ts.map +1 -1
  201. package/dist/factory-assets/connectors/flow/engine/flow-output.d.ts +12 -0
  202. package/dist/factory-assets/connectors/flow/engine/flow-output.d.ts.map +1 -0
  203. package/dist/factory-assets/connectors/flow/engine/index.d.ts +1 -0
  204. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
  205. package/dist/factory-assets/connectors/flow/engine/loader.d.ts +3 -3
  206. package/dist/factory-assets/connectors/flow/engine/locate.d.ts +2 -2
  207. package/dist/factory-assets/connectors/flow/engine/locate.d.ts.map +1 -1
  208. package/dist/factory-assets/connectors/flow/engine/types.d.ts +0 -2
  209. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
  210. package/dist/factory-assets/connectors/flow/engine.js +13 -12
  211. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts.map +1 -1
  212. package/dist/factory-assets/connectors/flow/prompt-fragments.js +3 -3
  213. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  214. package/dist/factory-assets/connectors/flow/run-flow.js +23 -22
  215. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts +6 -5
  216. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts.map +1 -1
  217. package/dist/factory-assets/connectors/flow.js +21 -20
  218. package/dist/factory-assets/connectors/git.js +21 -20
  219. package/dist/factory-assets/connectors/gmail.js +21 -20
  220. package/dist/factory-assets/connectors/googledrive.js +21 -20
  221. package/dist/factory-assets/connectors/local.js +21 -20
  222. package/dist/factory-assets/connectors/mattermost.js +21 -20
  223. package/dist/factory-assets/connectors/memory.js +21 -20
  224. package/dist/factory-assets/connectors/minio.js +21 -20
  225. package/dist/factory-assets/connectors/postgres.js +21 -20
  226. package/dist/factory-assets/connectors/s3.js +21 -20
  227. package/dist/factory-assets/connectors/sharepoint.js +21 -20
  228. package/dist/factory-assets/connectors/sqlite.js +21 -20
  229. package/dist/factory-assets/connectors/static-server.js +21 -20
  230. package/dist/factory-assets/connectors/tunnel.js +21 -20
  231. package/dist/factory-assets/connectors/webdav.js +21 -20
  232. package/dist/factory-assets/connectors/xstate-store.js +21 -20
  233. package/dist/factory-assets/connectors/xstate.js +21 -20
  234. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +37 -26
  235. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +2 -2
  236. package/dist/factory-assets/skills/skailify/SKILL.md +10 -19
  237. package/dist/{flows-PX53XFV7.js → flows-7E2GVW5L.js} +14 -13
  238. package/dist/{flows-PX53XFV7.js.map → flows-7E2GVW5L.js.map} +1 -1
  239. package/dist/{helpers-EP6H3O3S.js → helpers-EVPKJXGS.js} +18 -17
  240. package/dist/{helpers-EP6H3O3S.js.map → helpers-EVPKJXGS.js.map} +1 -1
  241. package/dist/library/index.js +13 -12
  242. package/dist/library/install.js +2 -2
  243. package/dist/library/src/index.d.ts +1 -1
  244. package/dist/library/src/index.d.ts.map +1 -1
  245. package/dist/library/src/local/db.d.ts.map +1 -1
  246. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  247. package/dist/library/src/local/library.d.ts.map +1 -1
  248. package/dist/library/src/local/local-catalog-source.d.ts +0 -9
  249. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  250. package/dist/library/src/local/schema.d.ts +1 -20
  251. package/dist/library/src/local/schema.d.ts.map +1 -1
  252. package/dist/library/src/remote/remote-catalog-source.d.ts +1 -11
  253. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  254. package/dist/library/src/sync/manifest-writeback.d.ts +5 -5
  255. package/dist/library/src/sync/manifest-writeback.d.ts.map +1 -1
  256. package/dist/library/src/user-library.d.ts +1 -9
  257. package/dist/library/src/user-library.d.ts.map +1 -1
  258. package/dist/{library-publish-KKT73FJK.js → library-publish-SBEWWTPM.js} +25 -24
  259. package/dist/library-publish-SBEWWTPM.js.map +1 -0
  260. package/dist/open-library-UAZIGZUQ.js +39 -0
  261. package/dist/{open-library-R62UBL6E.js.map → open-library-UAZIGZUQ.js.map} +1 -1
  262. package/dist/paths-U7TA7MTE.js +22 -0
  263. package/dist/{paths-W4LDORQQ.js.map → paths-U7TA7MTE.js.map} +1 -1
  264. package/dist/{plugin-store-D45CREMJ.js → plugin-store-TT45MGQZ.js} +11 -10
  265. package/dist/plugin-store-TT45MGQZ.js.map +1 -0
  266. package/dist/plugins/index.js +1 -1
  267. package/dist/plugins/src/catalog-source.d.ts +4 -55
  268. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  269. package/dist/plugins/src/index.d.ts +1 -1
  270. package/dist/plugins/src/index.d.ts.map +1 -1
  271. package/dist/{project-GCW5DFAB.js → project-JLD5RCVK.js} +19 -18
  272. package/dist/{project-GCW5DFAB.js.map → project-JLD5RCVK.js.map} +1 -1
  273. package/dist/resolver/index.js +10 -9
  274. package/dist/runner/index.js +32 -31
  275. package/dist/runner/src/compaction/orchestrator.d.ts +2 -1
  276. package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
  277. package/dist/runner/src/compaction-gate.d.ts +13 -0
  278. package/dist/runner/src/compaction-gate.d.ts.map +1 -1
  279. package/dist/runner/src/serve.d.ts.map +1 -1
  280. package/dist/sdk/asset-manager.js +15 -14
  281. package/dist/sdk/bridge.js +13 -12
  282. package/dist/sdk/core.js +9 -8
  283. package/dist/sdk/flow.js +13 -12
  284. package/dist/sdk/index.js +32 -31
  285. package/dist/sdk/index.js.map +1 -1
  286. package/dist/sdk/resolver.js +10 -9
  287. package/dist/sdk/runner.js +32 -31
  288. package/dist/secrets/index.js +2 -2
  289. package/dist/{setup-Q3LXY5AE.js → setup-PGZM4SOO.js} +23 -22
  290. package/dist/setup-PGZM4SOO.js.map +1 -0
  291. package/dist/skills-7QVYPIXI.js +26 -0
  292. package/dist/{skills-R3RPIPWP.js.map → skills-7QVYPIXI.js.map} +1 -1
  293. package/dist/source-SDZYXVVV.js +40 -0
  294. package/dist/{source-CFQESKJU.js.map → source-SDZYXVVV.js.map} +1 -1
  295. package/dist/{source-manifest-publish-3TCBA2RV.js → source-manifest-publish-UDLTYV6Y.js} +26 -25
  296. package/dist/source-manifest-publish-UDLTYV6Y.js.map +1 -0
  297. package/dist/tui/index.js +32 -31
  298. package/dist/tui/index.js.map +1 -1
  299. package/dist/workspace-plugin/adapters/mcp.js +16 -15
  300. package/dist/workspace-plugin/adapters/omp.js +13 -13
  301. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  302. package/dist/workspace-plugin/index.js +1 -1
  303. package/dist/workspace-plugin/src/adapters/mcp.d.ts +4 -4
  304. package/dist/workspace-plugin/src/adapters/mcp.d.ts.map +1 -1
  305. package/dist/workspace-plugin/src/adapters/omp.d.ts +2 -2
  306. package/dist/workspace-plugin/src/tools/skills.d.ts +5 -17
  307. package/dist/workspace-plugin/src/tools/skills.d.ts.map +1 -1
  308. package/package.json +7 -1
  309. package/dist/asset-feeds-KXL45ALC.js.map +0 -1
  310. package/dist/chunk-252TK4RU.js.map +0 -1
  311. package/dist/chunk-5LF27VUB.js.map +0 -1
  312. package/dist/chunk-5RWL4L3X.js.map +0 -1
  313. package/dist/chunk-7RC37XFW.js.map +0 -1
  314. package/dist/chunk-A5EDMBFG.js.map +0 -1
  315. package/dist/chunk-DOVURNRK.js.map +0 -1
  316. package/dist/chunk-JEPSP6XK.js.map +0 -1
  317. package/dist/chunk-OLMNDIAU.js.map +0 -1
  318. package/dist/chunk-ORH2BZEM.js.map +0 -1
  319. package/dist/chunk-P7BU6DAC.js.map +0 -1
  320. package/dist/chunk-QVZA2MDT.js +0 -81
  321. package/dist/chunk-QVZA2MDT.js.map +0 -1
  322. package/dist/chunk-TQ6XNACF.js.map +0 -1
  323. package/dist/chunk-TSVRKUGV.js.map +0 -1
  324. package/dist/chunk-VDBP6Y5M.js.map +0 -1
  325. package/dist/chunk-X4DKUGV4.js.map +0 -1
  326. package/dist/chunk-XU7JET5Z.js.map +0 -1
  327. package/dist/discovery/src/domains.d.ts +0 -149
  328. package/dist/discovery/src/domains.d.ts.map +0 -1
  329. package/dist/ensure-sources-J5CDTQ36.js.map +0 -1
  330. package/dist/library-publish-KKT73FJK.js.map +0 -1
  331. package/dist/open-library-R62UBL6E.js +0 -38
  332. package/dist/paths-W4LDORQQ.js +0 -21
  333. package/dist/plugin-store-D45CREMJ.js.map +0 -1
  334. package/dist/setup-Q3LXY5AE.js.map +0 -1
  335. package/dist/skills-R3RPIPWP.js +0 -25
  336. package/dist/source-CFQESKJU.js +0 -39
  337. package/dist/source-manifest-publish-3TCBA2RV.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { tryWithFsDeadline, withFsDeadline, fsDeadlineMs } from './chunk-5K2VT6E2.js';
1
+ import { tryWithFsDeadline, withFsDeadline, fsDeadlineMs } from './chunk-DXUQCMVT.js';
2
2
  import { createLogger } from './chunk-BOFL7GIF.js';
3
3
  import { stat, mkdir, cp, writeFile, rm } from 'fs/promises';
4
4
  import { resolve, sep, join } from 'path';
@@ -155,5 +155,5 @@ function resolveFlowSkills(flow, allEntries) {
155
155
  }
156
156
 
157
157
  export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs };
158
- //# sourceMappingURL=chunk-DOVURNRK.js.map
159
- //# sourceMappingURL=chunk-DOVURNRK.js.map
158
+ //# sourceMappingURL=chunk-VDJKWKH2.js.map
159
+ //# sourceMappingURL=chunk-VDJKWKH2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../asset-manager/src/catalog-deployer.ts"],"names":[],"mappings":"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","file":"chunk-VDJKWKH2.js","sourcesContent":["/**\n * Platform-triggered asset deployment.\n *\n * Takes catalog entries (with source_path relative to ai-assets/) and deploys\n * them to a session's .claude/skills/ directory. Handles skill context injection\n * and catalog priority-based name resolution.\n */\n\nimport { cp, mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\nimport { fsDeadlineMs, tryWithFsDeadline, withFsDeadline } from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\n\n// ---------------------------------------------------------------------------\n// Types (formerly in catalog-compiler.ts, inlined after tear-out in Task 1.5)\n// ---------------------------------------------------------------------------\n\n/**\n * A single user-facing input parameter declared in a SKILL.md.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface InputSpec {\n /** Input parameter key used in skill invocation. */\n key: string;\n /** Whether the input must be provided before running the skill. */\n required?: boolean;\n /** Question string shown to the user when collecting this input. */\n prompt?: string;\n /** Short display label for UI forms. */\n label?: string;\n /** Input data type hint (e.g. `\"string\"`, `\"number\"`, `\"file\"`). */\n type?: string;\n /** Additional guidance text shown alongside the input field. */\n hint?: string;\n}\n\n/**\n * A compiled catalog entry (skill or flow).\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface CatalogEntryCompiled {\n /** Unique ID in `publisher/name` form (e.g. `skaileup/cf_overview`). */\n id: string;\n /** Asset kind. */\n kind: \"skill\" | \"flow\";\n /** Human-readable asset name. */\n name: string;\n /** One-line description. */\n description: string;\n /** Semantic version string. */\n version: string;\n /** Maturity stage. */\n stage: \"alpha\" | \"beta\" | \"stable\";\n /** Searchable keywords. */\n keywords: string[];\n /** User-facing input specifications. */\n inputs: InputSpec[];\n /** Asset path relative to assetsRoot. */\n source_path: string;\n /** Optional icon identifier. */\n icon?: string;\n /** Flow-only: required skill names. */\n required_skills?: string[];\n /** Flow-only: optional skill names. */\n optional_skills?: string[];\n}\n\n/**\n * Options controlling how platform-triggered skill deployment is performed.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface DeployFromCatalogOptions {\n /** Root directory of ai-assets (where `source_path` in catalog entries is relative to). */\n assetsRoot: string;\n /** Target directory for deployed skills (e.g. `/workspace/.claude/skills/`). */\n skillsDir: string;\n /** Optional context markdown appended to the deployed skill directory as `CONTEXT.md`. */\n context?: string;\n}\n\n/**\n * Result of a platform-triggered batch skill deployment.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface DeployResult {\n /** IDs of catalog entries successfully deployed. */\n deployed: string[];\n /** IDs of catalog entries skipped (non-skill kinds). */\n skipped: string[];\n /** Error messages for entries that could not be deployed. */\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Workspace-mount awareness\n// ---------------------------------------------------------------------------\n\n/**\n * Multiplier applied to the base filesystem deadline for whole-tree operations\n * (recursive copy / remove), which legitimately outlast a single `stat`.\n */\nconst TREE_OP_DEADLINE_FACTOR = 4;\n\n/** Default number of parent levels {@link findAiAssetsRoot} inspects. */\nconst AI_ASSETS_WALK_LEVELS = 6;\n\nlet deployerLogger: ReturnType<typeof createLogger> | undefined;\n\nfunction log(): ReturnType<typeof createLogger> {\n deployerLogger ??= createLogger({ kind: \"runner\", subkind: \"catalog-deployer\" });\n return deployerLogger;\n}\n\n/**\n * Where the agent container binds its rclone FUSE mount. Nothing under this\n * path is a safe place to read an asset tree from: the mount is remote\n * (SharePoint / OneDrive / WebDAV) and can wedge indefinitely.\n */\nconst DEFAULT_WORKSPACE_MOUNT_DIR = \"/skaile/workspace\";\n\n/**\n * Env override for the workspace-mount path(s), comma-separated.\n *\n * Set it when the runner binds the mount somewhere other than\n * {@link DEFAULT_WORKSPACE_MOUNT_DIR}; set it to the empty string to disable\n * the guard entirely (single-machine dev, where nothing is a network mount).\n */\nexport const WORKSPACE_MOUNT_ENV_VAR = \"SKAILE_WORKSPACE_MOUNT_DIR\";\n\n/**\n * Resolve the directories treated as network mounts.\n *\n * Read per call rather than cached: the runner mutates `process.env` while\n * wiring a session, so a module-load snapshot would pin a pre-configuration\n * value.\n *\n * @returns Absolute mount paths; empty when the guard is disabled.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function workspaceMountDirs(): string[] {\n const raw = process.env[WORKSPACE_MOUNT_ENV_VAR];\n if (raw === undefined) return [DEFAULT_WORKSPACE_MOUNT_DIR];\n return raw\n .split(\",\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .map((segment) => resolve(segment));\n}\n\n/**\n * Is `candidate` at, or inside, one of the known workspace mount paths?\n *\n * Pure path arithmetic — deliberately no filesystem access, because the whole\n * point is to decide *before* touching a path that might be unresponsive.\n *\n * @param candidate - Path to test.\n * @param mountDirs - Mount roots; defaults to {@link workspaceMountDirs}.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function isUnderWorkspaceMount(\n candidate: string,\n mountDirs: string[] = workspaceMountDirs(),\n): boolean {\n const target = resolve(candidate);\n return mountDirs.some((dir) => {\n const root = resolve(dir);\n return target === root || target.startsWith(root + sep);\n });\n}\n\n/**\n * Walk upward from `startDir` looking for an `ai-assets/` directory.\n *\n * Two properties matter beyond \"find the folder\":\n *\n * 1. **Never synchronous.** The walk probes up to six directories; any one of\n * them can be on a FUSE mount, and the former `existsSync` chain blocked the\n * event loop on the first unresponsive probe. Each probe is now awaited and\n * deadline-bounded, so a wedged mount costs one skipped candidate.\n * 2. **Never resolves onto a mount.** A hit under the workspace mount is\n * skipped with a warning rather than returned: accepting it would wire every\n * later skill deploy — a recursive copy — to a remote filesystem. The walk\n * continues upward, so a legitimate `ai-assets/` in a parent still wins.\n *\n * Only a **directory** counts. An `ai-assets` file would otherwise be returned\n * as a root and every later `join(root, source_path)` would fail with ENOTDIR.\n *\n * @param startDir - Directory to start from (typically the project dir).\n * @param opts - `levels` caps the upward walk; `mountDirs` overrides the mount\n * roots (defaults to {@link workspaceMountDirs}).\n * @returns Absolute path to the `ai-assets/` directory, or `null` if none is\n * reachable within `levels`.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function findAiAssetsRoot(\n startDir: string,\n opts?: { levels?: number; mountDirs?: string[] },\n): Promise<string | null> {\n const mountDirs = opts?.mountDirs ?? workspaceMountDirs();\n const levels = opts?.levels ?? AI_ASSETS_WALK_LEVELS;\n let dir = resolve(startDir);\n // Every level of a `/skaile/workspace/...` start dir is under the mount, so\n // an unconditional warn would fire once per level for one lookup. Collect and\n // report once — the operator needs the fact, not six copies of it.\n const refused: string[] = [];\n\n for (let i = 0; i < levels; i++) {\n const candidate = join(dir, \"ai-assets\");\n if (isUnderWorkspaceMount(candidate, mountDirs)) {\n refused.push(candidate);\n } else {\n const isDir = await tryWithFsDeadline(\n `stat ${candidate}`,\n async () => (await stat(candidate)).isDirectory(),\n false,\n );\n if (isDir) {\n if (refused.length > 0) warnRefused(refused, mountDirs);\n return candidate;\n }\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break; // filesystem root — nothing further up\n dir = parent;\n }\n if (refused.length > 0) warnRefused(refused, mountDirs);\n return null;\n}\n\n/** Single warning for every `ai-assets` candidate skipped for sitting on a mount. */\nfunction warnRefused(refused: string[], mountDirs: string[]): void {\n log().warn(\n \"findAiAssetsRoot refused candidates under a workspace mount — deploying skills from a network mount can stall the session\",\n { refused, mountDirs },\n );\n}\n\n/**\n * Deploy a single catalog entry to the session skills directory.\n *\n * Copies the entire skill source directory into `skillsDir/<entry.name>/`.\n * If `context` is provided, a separate `CONTEXT.md` is written alongside\n * `SKILL.md` so the source file is never modified.\n *\n * Only `skill` entries are deployable; other kinds return an error.\n *\n * **Async by necessity.** This runs from the `session_init` command handler\n * with the WebSocket live, and both `assetsRoot` and `skillsDir` can sit on a\n * network mount. The former `cpSync`/`rmSync` pair parked the event loop for\n * the whole copy; every call is now awaited and deadline-bounded, so an\n * unresponsive mount fails one deployment instead of the session.\n *\n * @param entry - Compiled catalog entry to deploy.\n * @param options - Deployment target and optional context.\n * @returns `{ success: true }` on success, `{ success: false, error }` on failure.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function deployCatalogEntry(\n entry: CatalogEntryCompiled,\n options: DeployFromCatalogOptions,\n): Promise<{ success: boolean; error?: string }> {\n const { assetsRoot, skillsDir, context } = options;\n\n if (entry.kind !== \"skill\") {\n return { success: false, error: `Cannot deploy ${entry.kind} directly — only skills` };\n }\n\n const sourcePath = join(assetsRoot, entry.source_path);\n const skillMdPath = join(sourcePath, \"SKILL.md\");\n\n const hasSkillMd = await tryWithFsDeadline(\n `stat ${skillMdPath}`,\n async () => {\n await stat(skillMdPath);\n return true;\n },\n false,\n );\n if (!hasSkillMd) {\n return { success: false, error: `SKILL.md not found at ${skillMdPath}` };\n }\n\n const destDir = join(skillsDir, entry.name);\n\n try {\n await withFsDeadline(`mkdir ${destDir}`, () => mkdir(destDir, { recursive: true }));\n\n // Copy the entire skill directory\n await withFsDeadline(\n `cp ${sourcePath} -> ${destDir}`,\n () => cp(sourcePath, destDir, { recursive: true }),\n fsDeadlineMs() * TREE_OP_DEADLINE_FACTOR,\n );\n\n // Write context to a separate CONTEXT.md — never modify the original SKILL.md.\n // The agent discovers both files in the skill directory.\n const contextPath = join(destDir, \"CONTEXT.md\");\n if (context) {\n await withFsDeadline(`write ${contextPath}`, () =>\n writeFile(contextPath, `# Additional Context\\n\\n${context}\\n`, \"utf8\"),\n );\n } else {\n // `force: true` makes this a single call: a stale CONTEXT.md is removed,\n // an absent one is a no-op. The former existsSync probe only added a\n // second trip to the same possibly-wedged mount.\n await withFsDeadline(`rm ${contextPath}`, () => rm(contextPath, { force: true }));\n }\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n return { success: true };\n}\n\n/**\n * Remove a deployed skill directory from the session skills directory.\n *\n * @param name - Skill name (directory basename under `skillsDir`).\n * @param skillsDir - Absolute path to the session skills directory.\n * @returns `true` if the skill was found and removed; `false` if it was not\n * deployed, or if the directory could not be reached within the deadline.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function undeployCatalogEntry(name: string, skillsDir: string): Promise<boolean> {\n const destDir = join(skillsDir, name);\n const exists = await tryWithFsDeadline(\n `stat ${destDir}`,\n async () => {\n await stat(destDir);\n return true;\n },\n false,\n );\n if (!exists) return false;\n await withFsDeadline(\n `rm -r ${destDir}`,\n () => rm(destDir, { recursive: true, force: true }),\n fsDeadlineMs() * TREE_OP_DEADLINE_FACTOR,\n );\n return true;\n}\n\n/**\n * Deploy multiple catalog entries in a single batch operation.\n *\n * Non-skill entries (flows, agents, etc.) are automatically skipped and\n * recorded in `result.skipped`. Deployment failures are collected in\n * `result.errors` without aborting the rest of the batch.\n *\n * @param entries - Compiled catalog entries to deploy.\n * @param options - Deployment target and optional context.\n * @returns Aggregated {@link DeployResult} with deployed, skipped, and error lists.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function deployAll(\n entries: CatalogEntryCompiled[],\n options: DeployFromCatalogOptions,\n): Promise<DeployResult> {\n const result: DeployResult = { deployed: [], skipped: [], errors: [] };\n\n for (const entry of entries) {\n if (entry.kind !== \"skill\") {\n result.skipped.push(entry.id);\n continue;\n }\n\n // Serial on purpose: concurrent recursive copies onto one mount multiply\n // the queue depth on the exact resource that is already the bottleneck.\n const r = await deployCatalogEntry(entry, options);\n if (r.success) {\n result.deployed.push(entry.id);\n } else {\n result.errors.push(`${entry.id}: ${r.error}`);\n }\n }\n\n return result;\n}\n\n/**\n * Resolve a flow's skill dependencies from the full catalog entry list.\n *\n * Partitions `flow.required_skills` and `flow.optional_skills` into resolved\n * entries and a list of names that could not be found. Missing optional skills\n * are silently ignored (they do not appear in `missing`).\n *\n * @param flow - Compiled flow entry whose skill dependencies should be resolved.\n * @param allEntries - Full set of compiled catalog entries to search.\n * @returns Object containing resolved `required` entries, resolved `optional` entries,\n * and `missing` skill names that were listed as required but not found.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function resolveFlowSkills(\n flow: CatalogEntryCompiled,\n allEntries: CatalogEntryCompiled[],\n): { required: CatalogEntryCompiled[]; optional: CatalogEntryCompiled[]; missing: string[] } {\n const skillsByName = new Map<string, CatalogEntryCompiled>();\n for (const e of allEntries) {\n if (e.kind === \"skill\") skillsByName.set(e.name, e);\n }\n\n const required: CatalogEntryCompiled[] = [];\n const optional: CatalogEntryCompiled[] = [];\n const missing: string[] = [];\n\n for (const name of flow.required_skills ?? []) {\n const entry = skillsByName.get(name);\n if (entry) required.push(entry);\n else missing.push(name);\n }\n\n for (const name of flow.optional_skills ?? []) {\n const entry = skillsByName.get(name);\n if (entry) optional.push(entry);\n // Optional skills don't count as missing\n }\n\n return { required, optional, missing };\n}\n"]}
@@ -1,10 +1,11 @@
1
- import { findAiAssetsRoot } from './chunk-EOKAFBJ7.js';
1
+ import { findAiAssetsRoot } from './chunk-TYUJB336.js';
2
2
  import { okJson, err, ok } from './chunk-X5YPJV4N.js';
3
- import { parseSkillRequirements, validateRequirements, buildRequiresPreamble, parseSkillFrontmatter } from './chunk-OQRB7JUS.js';
3
+ import { parseSkillRequirements, validateRequirements, buildRequiresPreamble, parseSkillFrontmatter } from './chunk-YV4J7V53.js';
4
+ import { findKindDirs } from './chunk-A2ULN3KX.js';
4
5
  import fs from 'fs/promises';
5
6
  import path from 'path';
6
7
 
7
- async function walkForSkillMd(dir, domain, acc) {
8
+ async function walkForSkillMd(dir, acc) {
8
9
  let entries;
9
10
  try {
10
11
  entries = await fs.readdir(dir, { withFileTypes: true });
@@ -29,8 +30,7 @@ async function walkForSkillMd(dir, domain, acc) {
29
30
  source,
30
31
  version,
31
32
  keywords,
32
- path: skillMdPath,
33
- domain
33
+ path: skillMdPath
34
34
  });
35
35
  } catch {
36
36
  }
@@ -38,35 +38,22 @@ async function walkForSkillMd(dir, domain, acc) {
38
38
  }
39
39
  for (const entry of entries) {
40
40
  if (entry.isDirectory()) {
41
- await walkForSkillMd(path.join(dir, entry.name), domain, acc);
41
+ await walkForSkillMd(path.join(dir, entry.name), acc);
42
42
  }
43
43
  }
44
44
  }
45
- async function scanSkills(aiAssetsRoot, domainFilter) {
46
- let domains;
47
- try {
48
- const entries = await fs.readdir(aiAssetsRoot, { withFileTypes: true });
49
- domains = entries.filter((e) => e.isDirectory()).map((e) => e.name).filter((name) => !domainFilter || name === domainFilter);
50
- } catch {
51
- return [];
52
- }
45
+ async function scanSkills(aiAssetsRoot) {
53
46
  const acc = [];
54
- for (const domain of domains) {
55
- const skillsDir = path.join(aiAssetsRoot, domain, "skills");
56
- try {
57
- await fs.access(skillsDir);
58
- } catch {
59
- continue;
60
- }
61
- await walkForSkillMd(skillsDir, domain, acc);
47
+ for (const skillsDir of findKindDirs(aiAssetsRoot, "skills")) {
48
+ await walkForSkillMd(skillsDir, acc);
62
49
  }
63
- return acc;
50
+ return [...new Map(acc.map((s) => [s.path, s])).values()];
64
51
  }
65
- async function skillList(projectDir, domain) {
52
+ async function skillList(projectDir) {
66
53
  try {
67
54
  const aiAssetsRoot = await findAiAssetsRoot(projectDir);
68
55
  if (!aiAssetsRoot) return okJson([]);
69
- const skills = await scanSkills(aiAssetsRoot, domain);
56
+ const skills = await scanSkills(aiAssetsRoot);
70
57
  return okJson(
71
58
  skills.map((s) => ({
72
59
  id: s.id,
@@ -74,30 +61,18 @@ async function skillList(projectDir, domain) {
74
61
  description: s.description,
75
62
  source: s.source,
76
63
  version: s.version,
77
- keywords: s.keywords,
78
- domain: s.domain
64
+ keywords: s.keywords
79
65
  }))
80
66
  );
81
67
  } catch (e) {
82
68
  return err(e instanceof Error ? e.message : String(e));
83
69
  }
84
70
  }
85
- async function skillListDomains(projectDir) {
86
- try {
87
- const aiAssetsRoot = await findAiAssetsRoot(projectDir);
88
- if (!aiAssetsRoot) return okJson([]);
89
- const entries = await fs.readdir(aiAssetsRoot, { withFileTypes: true });
90
- const domains = entries.filter((e) => e.isDirectory()).map((e) => ({ name: e.name, path: path.join(aiAssetsRoot, e.name) }));
91
- return okJson(domains);
92
- } catch (e) {
93
- return err(e instanceof Error ? e.message : String(e));
94
- }
95
- }
96
71
  async function skillShow(projectDir, skillId) {
97
72
  try {
98
73
  const aiAssetsRoot = await findAiAssetsRoot(projectDir);
99
74
  if (!aiAssetsRoot) return err(`Skill not found: ${skillId}`);
100
- const skills = await scanSkills(aiAssetsRoot, void 0);
75
+ const skills = await scanSkills(aiAssetsRoot);
101
76
  const skill = skills.find((s) => s.id === skillId);
102
77
  if (!skill) return err(`Skill not found: ${skillId}`);
103
78
  const content = await fs.readFile(skill.path, "utf-8");
@@ -110,7 +85,7 @@ async function skillSearch(projectDir, query) {
110
85
  try {
111
86
  const aiAssetsRoot = await findAiAssetsRoot(projectDir);
112
87
  if (!aiAssetsRoot) return okJson([]);
113
- const skills = await scanSkills(aiAssetsRoot, void 0);
88
+ const skills = await scanSkills(aiAssetsRoot);
114
89
  const q = query.toLowerCase();
115
90
  const matched = skills.filter(
116
91
  (s) => s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q) || s.id.toLowerCase().includes(q) || (s.keywords ?? []).some((k) => k.toLowerCase().includes(q))
@@ -122,8 +97,7 @@ async function skillSearch(projectDir, query) {
122
97
  description: s.description,
123
98
  source: s.source,
124
99
  version: s.version,
125
- keywords: s.keywords,
126
- domain: s.domain
100
+ keywords: s.keywords
127
101
  }))
128
102
  );
129
103
  } catch (e) {
@@ -134,7 +108,7 @@ async function skillCheckRequirements(projectDir, skillId, targetDir) {
134
108
  try {
135
109
  const aiAssetsRoot = await findAiAssetsRoot(projectDir);
136
110
  if (!aiAssetsRoot) return err(`Skill not found: ${skillId}`);
137
- const skills = await scanSkills(aiAssetsRoot, void 0);
111
+ const skills = await scanSkills(aiAssetsRoot);
138
112
  const skill = skills.find((s) => s.id === skillId);
139
113
  if (!skill) return err(`Skill not found: ${skillId}`);
140
114
  const content = await fs.readFile(skill.path, "utf-8");
@@ -149,7 +123,7 @@ async function skillGetPreamble(projectDir, skillId) {
149
123
  try {
150
124
  const aiAssetsRoot = await findAiAssetsRoot(projectDir);
151
125
  if (!aiAssetsRoot) return err(`Skill not found: ${skillId}`);
152
- const skills = await scanSkills(aiAssetsRoot, void 0);
126
+ const skills = await scanSkills(aiAssetsRoot);
153
127
  const skill = skills.find((s) => s.id === skillId);
154
128
  if (!skill) return err(`Skill not found: ${skillId}`);
155
129
  const content = await fs.readFile(skill.path, "utf-8");
@@ -161,6 +135,6 @@ async function skillGetPreamble(projectDir, skillId) {
161
135
  }
162
136
  }
163
137
 
164
- export { skillCheckRequirements, skillGetPreamble, skillList, skillListDomains, skillSearch, skillShow };
165
- //# sourceMappingURL=chunk-VDBP6Y5M.js.map
166
- //# sourceMappingURL=chunk-VDBP6Y5M.js.map
138
+ export { skillCheckRequirements, skillGetPreamble, skillList, skillSearch, skillShow };
139
+ //# sourceMappingURL=chunk-WCQMXBO5.js.map
140
+ //# sourceMappingURL=chunk-WCQMXBO5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workspace-plugin/src/tools/skills.ts"],"names":[],"mappings":"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","file":"chunk-WCQMXBO5.js","sourcesContent":["// src/tools/skills.ts\n\nimport type { Dirent } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { findKindDirs } from \"@skaile/workspaces/core/discovery\";\nimport {\n buildRequiresPreamble,\n parseSkillFrontmatter,\n parseSkillRequirements,\n validateRequirements,\n} from \"@skaile/workspaces/resolver\";\nimport type { ToolResult } from \"../types.js\";\nimport { err, ok, okJson } from \"../types.js\";\nimport { findAiAssetsRoot } from \"../utils/ai-assets.js\";\n\ninterface SkillEntry {\n id: string;\n name: string;\n description: string;\n source?: string;\n version?: string;\n keywords?: string[];\n path: string;\n}\n\nasync function walkForSkillMd(dir: string, acc: SkillEntry[]): Promise<void> {\n let entries: Dirent<string>[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n // Check if this directory contains a SKILL.md\n const hasSkillMd = entries.some((e) => e.isFile() && e.name === \"SKILL.md\");\n if (hasSkillMd) {\n const skillMdPath = path.join(dir, \"SKILL.md\");\n try {\n const content = await fs.readFile(skillMdPath, \"utf-8\");\n const fm = parseSkillFrontmatter(content);\n const name = typeof fm.name === \"string\" ? fm.name : path.basename(dir);\n const description = typeof fm.description === \"string\" ? fm.description : \"\";\n const source = typeof fm.source === \"string\" ? fm.source : undefined;\n const version = typeof fm.version === \"string\" ? fm.version : undefined;\n const keywords = Array.isArray(fm.keywords) ? (fm.keywords as string[]) : undefined;\n acc.push({\n id: path.basename(dir),\n name,\n description,\n source,\n version,\n keywords,\n path: skillMdPath,\n });\n } catch {\n // skip unreadable files\n }\n return; // don't recurse inside a skill directory\n }\n\n // Recurse into subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n await walkForSkillMd(path.join(dir, entry.name), acc);\n }\n }\n}\n\nasync function scanSkills(aiAssetsRoot: string): Promise<SkillEntry[]> {\n const acc: SkillEntry[] = [];\n for (const skillsDir of findKindDirs(aiAssetsRoot, \"skills\")) {\n await walkForSkillMd(skillsDir, acc);\n }\n // A `skills/` dir nested inside another is walked twice; keep each SKILL.md once.\n return [...new Map(acc.map((s) => [s.path, s])).values()];\n}\n\n// ── Exported tool functions ────────────────────────────────────────────────────\n\n/**\n * List all skills in the `ai-assets` catalog.\n *\n * Walks every `skills/` directory at any depth under the `ai-assets` root\n * looking for `SKILL.md` files. Returns a JSON array of skill summaries\n * `{ id, name, description, source, version, keywords }`.\n *\n * @param projectDir - Absolute path to the skaile project root.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function skillList(projectDir: string): Promise<ToolResult> {\n try {\n const aiAssetsRoot = await findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return okJson([]);\n const skills = await scanSkills(aiAssetsRoot);\n return okJson(\n skills.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n source: s.source,\n version: s.version,\n keywords: s.keywords,\n })),\n );\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Show the full `SKILL.md` content for a skill.\n *\n * @param projectDir - Absolute path to the skaile project root.\n * @param skillId - Skill ID (directory name) as returned by {@link skillList}.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function skillShow(projectDir: string, skillId: string): Promise<ToolResult> {\n try {\n const aiAssetsRoot = await findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return err(`Skill not found: ${skillId}`);\n const skills = await scanSkills(aiAssetsRoot);\n const skill = skills.find((s) => s.id === skillId);\n if (!skill) return err(`Skill not found: ${skillId}`);\n const content = await fs.readFile(skill.path, \"utf-8\");\n return ok(content);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Search skills by name, description, ID, or keywords.\n *\n * Case-insensitive substring match against all text fields in every skill\n * entry. Returns the same summary shape as {@link skillList}.\n *\n * @param projectDir - Absolute path to the skaile project root.\n * @param query - Search string.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function skillSearch(projectDir: string, query: string): Promise<ToolResult> {\n try {\n const aiAssetsRoot = await findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return okJson([]);\n const skills = await scanSkills(aiAssetsRoot);\n const q = query.toLowerCase();\n const matched = skills.filter(\n (s) =>\n s.name.toLowerCase().includes(q) ||\n s.description.toLowerCase().includes(q) ||\n s.id.toLowerCase().includes(q) ||\n (s.keywords ?? []).some((k) => k.toLowerCase().includes(q)),\n );\n return okJson(\n matched.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n source: s.source,\n version: s.version,\n keywords: s.keywords,\n })),\n );\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Validate that all prerequisites declared in a skill's `SKILL.md` are\n * satisfied in `targetDir`.\n *\n * Uses `@skaile/workspaces/resolver` to parse the `REQUIRES` / `READS` / `WRITES`\n * DSL and run the requirement checks against the filesystem. Returns a\n * validation report as JSON.\n *\n * @param projectDir - Absolute path to the skaile project root (for skill lookup).\n * @param skillId - Skill ID as returned by {@link skillList}.\n * @param targetDir - Directory to validate against (typically the user's project).\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function skillCheckRequirements(\n projectDir: string,\n skillId: string,\n targetDir: string,\n): Promise<ToolResult> {\n try {\n const aiAssetsRoot = await findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return err(`Skill not found: ${skillId}`);\n const skills = await scanSkills(aiAssetsRoot);\n const skill = skills.find((s) => s.id === skillId);\n if (!skill) return err(`Skill not found: ${skillId}`);\n const content = await fs.readFile(skill.path, \"utf-8\");\n\n const requirements = parseSkillRequirements(content);\n const report = await validateRequirements(skillId, requirements, targetDir);\n return okJson(report);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Get the formatted `REQUIRES`/`INPUT`/`READS`/`WRITES` DSL preamble for a skill.\n *\n * Uses `@skaile/workspaces/resolver` to build the requirements preamble that can be\n * prepended to the skill prompt for injection into the agent's context.\n * Returns `\"(no requirements declared)\"` when the skill has no requirements.\n *\n * @param projectDir - Absolute path to the skaile project root.\n * @param skillId - Skill ID as returned by {@link skillList}.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function skillGetPreamble(projectDir: string, skillId: string): Promise<ToolResult> {\n try {\n const aiAssetsRoot = await findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return err(`Skill not found: ${skillId}`);\n const skills = await scanSkills(aiAssetsRoot);\n const skill = skills.find((s) => s.id === skillId);\n if (!skill) return err(`Skill not found: ${skillId}`);\n const content = await fs.readFile(skill.path, \"utf-8\");\n\n const requirements = parseSkillRequirements(content);\n const preamble = buildRequiresPreamble(requirements, skillId);\n return ok(preamble || \"(no requirements declared)\");\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { softDepName } from './chunk-TQ6XNACF.js';
1
+ import { softDepName } from './chunk-LHFZTVIM.js';
2
2
  import pc from 'picocolors';
3
3
 
4
4
  var S = {
@@ -94,5 +94,5 @@ function formatRelativeTime(date) {
94
94
  }
95
95
 
96
96
  export { KIND_COL_WIDTH, S, bareSoftDepName, colorRef, fitWidth, formatRelativeTime, formatSoftDepAddPreview, formatSoftDepHint, formatSoftDepRemovePreview, formatSoftDepSection, kindColor, kindColorPad, logErr, logInfo, logOk, logWarn };
97
- //# sourceMappingURL=chunk-NLKIW2VI.js.map
98
- //# sourceMappingURL=chunk-NLKIW2VI.js.map
97
+ //# sourceMappingURL=chunk-WOJ4AK3Q.js.map
98
+ //# sourceMappingURL=chunk-WOJ4AK3Q.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/helpers.ts"],"names":[],"mappings":"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","file":"chunk-NLKIW2VI.js","sourcesContent":["import { softDepName } from \"@skaile/workspaces/asset-manager\";\nimport pc from \"picocolors\";\n\n/**\n * Terminal styling helpers used across all CLI commands.\n *\n * @docLink cli/dev-guide#helpers\n */\nexport const S = {\n brand: (s: string) => pc.cyan(pc.bold(s)),\n cmd: (s: string) => pc.cyan(s),\n heading: (s: string) => pc.bold(s),\n bold: (s: string) => pc.bold(s),\n dim: (s: string) => pc.dim(s),\n ok: (s: string) => pc.green(s),\n warn: (s: string) => pc.yellow(s),\n err: (s: string) => pc.red(s),\n label: (s: string) => pc.dim(s),\n rule: (w = 40) => pc.dim(\"─\".repeat(w)),\n};\n\nconst KIND_COLORS: Record<string, (s: string) => string> = {\n skill: pc.blue,\n agent: pc.magenta,\n prompt: pc.yellow,\n flow: pc.green,\n bundle: pc.cyan,\n contract: pc.red,\n connector: pc.green,\n mount: pc.green,\n knowledge: pc.cyan,\n persona: pc.cyan,\n ruleset: pc.cyan,\n \"mcp-server\": pc.magenta,\n};\n\n/**\n * Fit a plain (ANSI-free) string into exactly `width` columns: truncate with a\n * trailing `…` when too long, pad with spaces when too short. Keeps fixed-width\n * columns from overflowing the row when a value (e.g. an asset name) is wider\n * than its budget.\n */\nexport function fitWidth(s: string, width: number): string {\n if (width <= 0) return \"\";\n if (s.length > width) return width === 1 ? \"…\" : `${s.slice(0, width - 1)}…`;\n return s.padEnd(width);\n}\n\n/** Color-code an asset kind string. */\nexport function kindColor(kind: string): string {\n const colorFn = KIND_COLORS[kind] ?? pc.dim;\n return colorFn(kind);\n}\n\n/**\n * Widest kind label (`mcp-server`); the default kind-column width fits it so\n * long kinds don't shove the rest of the row out of alignment.\n */\nexport const KIND_COL_WIDTH = 10;\n\n/**\n * Color-code an asset kind string fit to exactly `width` columns — pads short\n * kinds, truncates over-long ones (via {@link fitWidth}) so the column can never\n * overflow and break row alignment.\n */\nexport function kindColorPad(kind: string, width = KIND_COL_WIDTH): string {\n const colorFn = KIND_COLORS[kind] ?? pc.dim;\n return colorFn(fitWidth(kind, width));\n}\n\n/** Color-code a \"kind:name\" reference string. */\nexport function colorRef(ref: string): string {\n const colonIdx = ref.indexOf(\":\");\n if (colonIdx === -1) return ref;\n const kind = ref.slice(0, colonIdx);\n const rest = ref.slice(colonIdx);\n return `${kindColor(kind)}${rest}`;\n}\n\n/**\n * Print a success line prefixed with a green check mark.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logOk(msg: string) {\n console.log(` ${pc.green(\"✓\")} ${msg}`);\n}\n/**\n * Print an error line prefixed with a red cross to stderr.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logErr(msg: string) {\n console.error(` ${pc.red(\"✗\")} ${msg}`);\n}\n/**\n * Print a warning line prefixed with a yellow exclamation mark.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logWarn(msg: string) {\n console.log(` ${pc.yellow(\"!\")} ${msg}`);\n}\n/**\n * Print an info line prefixed with a dim dot.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logInfo(msg: string) {\n console.log(` ${pc.dim(\"·\")} ${msg}`);\n}\n\n/**\n * Bare asset name of a canonical soft-dep target ref (`@pub/name@ver` → `name`),\n * for compact rendering in `info` / `tree` / `why`. Delegates to the asset-manager\n * parser (the soft-dep read surface) so the two never diverge.\n */\nexport function bareSoftDepName(ref: string): string {\n return softDepName(ref);\n}\n\n/**\n * The report-only soft-dep hint line shared by the `add` no-TTY branch and the\n * `install` surface, so the two user-facing wordings can't drift. Appends a\n * runnable `skaile add` suffix only when the target has a parseable ref.\n */\nexport function formatSoftDepHint(edge: { from: string; to: string; toRef?: string }): string {\n const suffix = edge.toRef ? ` — run \\`skaile add ${edge.toRef}\\` to include it.` : \"\";\n return `${bareSoftDepName(edge.from)} references ${bareSoftDepName(edge.to)} (soft dependency)${suffix}`;\n}\n\n/**\n * Build the \"Soft dependencies (inferred)\" section for `skaile info`. Returns one\n * header line plus one line per soft-dep target, each marked `(soft)` to read\n * differently from a typed `requires`. Empty array when there are no soft deps,\n * so the caller prints nothing.\n */\nexport function formatSoftDepSection(targets: string[]): string[] {\n if (targets.length === 0) return [];\n const out = [` ${S.label(\"Soft dependencies (inferred)\")}:`];\n for (const t of targets) out.push(` ${S.dim(\"·\")} ${t} ${S.dim(\"(soft)\")}`);\n return out;\n}\n\n/**\n * Footer line previewing the soft deps that *adding* the highlighted asset would\n * reference (manage TUI). \"references\" + \"not auto-added\" makes clear the pull is\n * report-only. Empty string when there are no targets, so the caller clears.\n */\nexport function formatSoftDepAddPreview(name: string, targets: string[]): string {\n if (targets.length === 0) return \"\";\n return S.dim(`${name} references ${targets.join(\", \")} (soft dep, not auto-added)`);\n}\n\n/**\n * Footer line previewing the soft deps that *removing* the highlighted asset\n * would orphan (manage TUI) — symmetric with {@link formatSoftDepAddPreview}.\n * Empty string when nothing would be orphaned, so the caller clears.\n */\nexport function formatSoftDepRemovePreview(name: string, targets: string[]): string {\n if (targets.length === 0) return \"\";\n return S.dim(`removing ${name} would orphan ${targets.join(\", \")} (soft dep)`);\n}\n\n/** Format a Date as a human-readable relative time string (e.g. \"5m ago\"). */\nexport function formatRelativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return \"just now\";\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/helpers.ts"],"names":[],"mappings":"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","file":"chunk-WOJ4AK3Q.js","sourcesContent":["import { softDepName } from \"@skaile/workspaces/asset-manager\";\nimport pc from \"picocolors\";\n\n/**\n * Terminal styling helpers used across all CLI commands.\n *\n * @docLink cli/dev-guide#helpers\n */\nexport const S = {\n brand: (s: string) => pc.cyan(pc.bold(s)),\n cmd: (s: string) => pc.cyan(s),\n heading: (s: string) => pc.bold(s),\n bold: (s: string) => pc.bold(s),\n dim: (s: string) => pc.dim(s),\n ok: (s: string) => pc.green(s),\n warn: (s: string) => pc.yellow(s),\n err: (s: string) => pc.red(s),\n label: (s: string) => pc.dim(s),\n rule: (w = 40) => pc.dim(\"─\".repeat(w)),\n};\n\nconst KIND_COLORS: Record<string, (s: string) => string> = {\n skill: pc.blue,\n agent: pc.magenta,\n prompt: pc.yellow,\n flow: pc.green,\n bundle: pc.cyan,\n contract: pc.red,\n connector: pc.green,\n mount: pc.green,\n knowledge: pc.cyan,\n persona: pc.cyan,\n ruleset: pc.cyan,\n \"mcp-server\": pc.magenta,\n};\n\n/**\n * Fit a plain (ANSI-free) string into exactly `width` columns: truncate with a\n * trailing `…` when too long, pad with spaces when too short. Keeps fixed-width\n * columns from overflowing the row when a value (e.g. an asset name) is wider\n * than its budget.\n */\nexport function fitWidth(s: string, width: number): string {\n if (width <= 0) return \"\";\n if (s.length > width) return width === 1 ? \"…\" : `${s.slice(0, width - 1)}…`;\n return s.padEnd(width);\n}\n\n/** Color-code an asset kind string. */\nexport function kindColor(kind: string): string {\n const colorFn = KIND_COLORS[kind] ?? pc.dim;\n return colorFn(kind);\n}\n\n/**\n * Widest kind label (`mcp-server`); the default kind-column width fits it so\n * long kinds don't shove the rest of the row out of alignment.\n */\nexport const KIND_COL_WIDTH = 10;\n\n/**\n * Color-code an asset kind string fit to exactly `width` columns — pads short\n * kinds, truncates over-long ones (via {@link fitWidth}) so the column can never\n * overflow and break row alignment.\n */\nexport function kindColorPad(kind: string, width = KIND_COL_WIDTH): string {\n const colorFn = KIND_COLORS[kind] ?? pc.dim;\n return colorFn(fitWidth(kind, width));\n}\n\n/** Color-code a \"kind:name\" reference string. */\nexport function colorRef(ref: string): string {\n const colonIdx = ref.indexOf(\":\");\n if (colonIdx === -1) return ref;\n const kind = ref.slice(0, colonIdx);\n const rest = ref.slice(colonIdx);\n return `${kindColor(kind)}${rest}`;\n}\n\n/**\n * Print a success line prefixed with a green check mark.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logOk(msg: string) {\n console.log(` ${pc.green(\"✓\")} ${msg}`);\n}\n/**\n * Print an error line prefixed with a red cross to stderr.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logErr(msg: string) {\n console.error(` ${pc.red(\"✗\")} ${msg}`);\n}\n/**\n * Print a warning line prefixed with a yellow exclamation mark.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logWarn(msg: string) {\n console.log(` ${pc.yellow(\"!\")} ${msg}`);\n}\n/**\n * Print an info line prefixed with a dim dot.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logInfo(msg: string) {\n console.log(` ${pc.dim(\"·\")} ${msg}`);\n}\n\n/**\n * Bare asset name of a canonical soft-dep target ref (`@pub/name@ver` → `name`),\n * for compact rendering in `info` / `tree` / `why`. Delegates to the asset-manager\n * parser (the soft-dep read surface) so the two never diverge.\n */\nexport function bareSoftDepName(ref: string): string {\n return softDepName(ref);\n}\n\n/**\n * The report-only soft-dep hint line shared by the `add` no-TTY branch and the\n * `install` surface, so the two user-facing wordings can't drift. Appends a\n * runnable `skaile add` suffix only when the target has a parseable ref.\n */\nexport function formatSoftDepHint(edge: { from: string; to: string; toRef?: string }): string {\n const suffix = edge.toRef ? ` — run \\`skaile add ${edge.toRef}\\` to include it.` : \"\";\n return `${bareSoftDepName(edge.from)} references ${bareSoftDepName(edge.to)} (soft dependency)${suffix}`;\n}\n\n/**\n * Build the \"Soft dependencies (inferred)\" section for `skaile info`. Returns one\n * header line plus one line per soft-dep target, each marked `(soft)` to read\n * differently from a typed `requires`. Empty array when there are no soft deps,\n * so the caller prints nothing.\n */\nexport function formatSoftDepSection(targets: string[]): string[] {\n if (targets.length === 0) return [];\n const out = [` ${S.label(\"Soft dependencies (inferred)\")}:`];\n for (const t of targets) out.push(` ${S.dim(\"·\")} ${t} ${S.dim(\"(soft)\")}`);\n return out;\n}\n\n/**\n * Footer line previewing the soft deps that *adding* the highlighted asset would\n * reference (manage TUI). \"references\" + \"not auto-added\" makes clear the pull is\n * report-only. Empty string when there are no targets, so the caller clears.\n */\nexport function formatSoftDepAddPreview(name: string, targets: string[]): string {\n if (targets.length === 0) return \"\";\n return S.dim(`${name} references ${targets.join(\", \")} (soft dep, not auto-added)`);\n}\n\n/**\n * Footer line previewing the soft deps that *removing* the highlighted asset\n * would orphan (manage TUI) — symmetric with {@link formatSoftDepAddPreview}.\n * Empty string when nothing would be orphaned, so the caller clears.\n */\nexport function formatSoftDepRemovePreview(name: string, targets: string[]): string {\n if (targets.length === 0) return \"\";\n return S.dim(`removing ${name} would orphan ${targets.join(\", \")} (soft dep)`);\n}\n\n/** Format a Date as a human-readable relative time string (e.g. \"5m ago\"). */\nexport function formatRelativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return \"just now\";\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n"]}
@@ -1,10 +1,10 @@
1
- import { readManifestSourceConfig, discoverAssetsInTree, isManifestMode } from './chunk-OLMNDIAU.js';
2
- import { installFromManifest } from './chunk-2EL2PBRC.js';
3
- import { defaultLibraryDir, resolveLibraryDir } from './chunk-YV3YI3TA.js';
4
- import { getGlobalCacheDir, resolveSourcePublisher } from './chunk-JEPSP6XK.js';
1
+ import { readManifestSourceConfig, discoverAssetsInTree } from './chunk-UVOJSWD2.js';
2
+ import { installFromManifest } from './chunk-H4EGUQ7M.js';
3
+ import { defaultLibraryDir, resolveLibraryDir } from './chunk-MBVNMPG7.js';
4
+ import { getGlobalCacheDir, resolveSourcePublisher } from './chunk-HWE3FXF4.js';
5
5
  import { globalSkaileDir, mergeLegacyEntriesInto, migrateLegacyDir, globalCacheRoot } from './chunk-TLKM4M47.js';
6
- import { encodeSkaileManifest } from './chunk-DSB6X25D.js';
7
- import { parseAssetRef } from './chunk-A5EDMBFG.js';
6
+ import { encodeSkaileManifest } from './chunk-AG44ZJ7W.js';
7
+ import { parseAssetRef } from './chunk-43ZBF3WH.js';
8
8
  import { PresetManifestSchema } from './chunk-5CYEWBPB.js';
9
9
  import { __export } from './chunk-NSBPE2FW.js';
10
10
  import * as fs10 from 'fs';
@@ -275,8 +275,6 @@ var libraries = sqliteTable("libraries", {
275
275
  backendConfig: text("backend_config").notNull().default("{}"),
276
276
  /** Ownership: `owner | contributor | reader`. */
277
277
  ownership: text("ownership").notNull(),
278
- /** Layout: `flat | domain` or null when not yet detected. */
279
- structure: text("structure"),
280
278
  /** Boolean (0/1) — true iff this is the auto-target for `asset migrate`. */
281
279
  isDefault: integer("is_default", { mode: "boolean" }).notNull().default(false),
282
280
  /** Boolean (0/1) — true iff the CLI generated the on-disk manifest. */
@@ -450,7 +448,6 @@ CREATE TABLE IF NOT EXISTS libraries (
450
448
  backend TEXT NOT NULL,
451
449
  backend_config TEXT NOT NULL DEFAULT '{}',
452
450
  ownership TEXT NOT NULL,
453
- structure TEXT,
454
451
  is_default INTEGER NOT NULL DEFAULT 0,
455
452
  manifest_generated INTEGER NOT NULL DEFAULT 0,
456
453
  last_sync_at TEXT,
@@ -534,7 +531,6 @@ async function runLibrariesMigration(client) {
534
531
  backend TEXT NOT NULL,
535
532
  backend_config TEXT NOT NULL DEFAULT '{}',
536
533
  ownership TEXT NOT NULL,
537
- structure TEXT,
538
534
  is_default INTEGER NOT NULL DEFAULT 0,
539
535
  manifest_generated INTEGER NOT NULL DEFAULT 0,
540
536
  last_sync_at TEXT,
@@ -792,7 +788,6 @@ function rowToLibrary(row) {
792
788
  backend: row.backend,
793
789
  backendConfig: cfg,
794
790
  ownership: row.ownership,
795
- structure: row.structure ?? void 0,
796
791
  isDefault: row.isDefault,
797
792
  manifestGenerated: row.manifestGenerated,
798
793
  lastSyncAt: row.lastSyncAt ? new Date(row.lastSyncAt) : void 0,
@@ -927,7 +922,6 @@ var LocalIndex = class {
927
922
  ownership: input.ownership ?? (input.backend === "local" ? "owner" : "reader"),
928
923
  isDefault: input.isDefault ?? false,
929
924
  manifestGenerated: input.manifestGenerated ?? false,
930
- structure: input.structure ?? null,
931
925
  createdAt: now,
932
926
  updatedAt: now
933
927
  }).run();
@@ -1225,7 +1219,6 @@ var LocalIndex = class {
1225
1219
  // library/src/user-library.ts
1226
1220
  var LIBRARY_BACKENDS = ["local", "git"];
1227
1221
  var LIBRARY_OWNERSHIPS = ["owner", "contributor", "reader"];
1228
- var LIBRARY_STRUCTURES = ["flat", "domain"];
1229
1222
  var LibrarySyncError = class extends Error {
1230
1223
  constructor(message, code) {
1231
1224
  super(message);
@@ -1491,7 +1484,6 @@ function rowToLibrary2(row) {
1491
1484
  backend: row.backend,
1492
1485
  backendConfig: cfg,
1493
1486
  ownership: row.ownership,
1494
- structure: row.structure ?? void 0,
1495
1487
  isDefault: row.isDefault,
1496
1488
  manifestGenerated: row.manifestGenerated,
1497
1489
  lastSyncAt: row.lastSyncAt ? new Date(row.lastSyncAt) : void 0,
@@ -1531,7 +1523,6 @@ var LibraryManager = class {
1531
1523
  backend: input.backend,
1532
1524
  backendConfig: JSON.stringify(input.backendConfig ?? {}),
1533
1525
  ownership: input.ownership,
1534
- structure: input.structure ?? null,
1535
1526
  isDefault: input.isDefault ?? false,
1536
1527
  manifestGenerated: input.manifestGenerated ?? false,
1537
1528
  createdAt: now,
@@ -1569,7 +1560,6 @@ var LibraryManager = class {
1569
1560
  if (patch.backendConfig !== void 0)
1570
1561
  updates.backendConfig = JSON.stringify(patch.backendConfig);
1571
1562
  if (patch.ownership !== void 0) updates.ownership = patch.ownership;
1572
- if (patch.structure !== void 0) updates.structure = patch.structure;
1573
1563
  if (patch.manifestGenerated !== void 0) updates.manifestGenerated = patch.manifestGenerated;
1574
1564
  if (patch.isDefault !== void 0) updates.isDefault = patch.isDefault;
1575
1565
  if (patch.lastSyncAt !== void 0) updates.lastSyncAt = patch.lastSyncAt.toISOString();
@@ -1624,7 +1614,6 @@ var LibraryManager = class {
1624
1614
  backend: "local",
1625
1615
  backendConfig: {},
1626
1616
  ownership: "owner",
1627
- structure: "domain",
1628
1617
  isDefault: true,
1629
1618
  manifestGenerated: false
1630
1619
  });
@@ -1635,8 +1624,6 @@ var LibraryManager = class {
1635
1624
  return { library: lib, created: true };
1636
1625
  }
1637
1626
  };
1638
-
1639
- // library/src/local/local-catalog-source.ts
1640
1627
  function describeSyncError(err) {
1641
1628
  if (!(err instanceof Error)) return String(err);
1642
1629
  const parts = [err.message];
@@ -1712,14 +1699,16 @@ var LocalCatalogSource = class {
1712
1699
  * (missing sha256, unknown kind) — the latter never signal a failed index.
1713
1700
  */
1714
1701
  async sync(syncOpts) {
1702
+ const fallbackPublisher = resolveSourcePublisher(this.rootPath) ?? (path5.basename(this.rootPath) || "unknown");
1715
1703
  const opts = {
1716
1704
  registry: this.registry,
1717
1705
  sidecarManifestFile: this.sidecarManifestFile,
1718
1706
  sidecarPath: this.sidecarPath,
1719
- includeDev: syncOpts?.includeDev ?? false
1707
+ includeDev: syncOpts?.includeDev ?? false,
1708
+ publisher: fallbackPublisher
1720
1709
  };
1721
1710
  if (!this.sidecarPath && !this.sidecarManifestFile) {
1722
- opts.sourceConfig = this.alignPublisher(readManifestSourceConfig(this.rootPath));
1711
+ opts.sourceConfig = readManifestSourceConfig(this.rootPath, fallbackPublisher);
1723
1712
  }
1724
1713
  const result = discoverAssetsInTree(this.rootPath, opts);
1725
1714
  let assetsUpdated = 0;
@@ -1777,29 +1766,6 @@ var LocalCatalogSource = class {
1777
1766
  if (keepRefs.length > 0) await this.library.pruneAssetDefs(this.sourceId, keepRefs);
1778
1767
  return { assetsFound: result.assets.length, assetsUpdated, errors, advisories };
1779
1768
  }
1780
- /**
1781
- * When the loaded source config declares no publisher (no manifest, or a
1782
- * manifest without `publisher`), substitute the canonical publisher derived
1783
- * the same way the provenance walker derives it (`resolveSourcePublisher`).
1784
- * Leaves manifest-mode (`assets:` inventory) and explicitly-published configs
1785
- * untouched, and is a no-op outside a git checkout (`resolveSourcePublisher`
1786
- * returns `undefined`) — preserving the legacy first-path-segment fallback.
1787
- */
1788
- alignPublisher(config) {
1789
- if (config && (isManifestMode(config) || !config.publisher_default.includes("<domain>"))) {
1790
- return config;
1791
- }
1792
- const publisher = resolveSourcePublisher(this.rootPath);
1793
- if (!publisher) return config;
1794
- const base = config ?? {
1795
- version: 1,
1796
- publisher_default: `@${publisher}`,
1797
- default_ref: "main",
1798
- publisher_overrides: [],
1799
- dev_paths: []
1800
- };
1801
- return { ...base, publisher_default: `@${publisher}` };
1802
- }
1803
1769
  };
1804
1770
  function defToCatalogAsset(def) {
1805
1771
  return {
@@ -2184,8 +2150,8 @@ function resolveTemplate(template, context) {
2184
2150
  });
2185
2151
  return { value: result, hasSecret: false };
2186
2152
  }
2187
- function setNestedValue(obj, path14, value) {
2188
- const parts = path14.split(".");
2153
+ function setNestedValue(obj, path15, value) {
2154
+ const parts = path15.split(".");
2189
2155
  let current = obj;
2190
2156
  for (let i = 0; i < parts.length - 1; i++) {
2191
2157
  const key = parts[i];
@@ -3120,32 +3086,6 @@ var RemoteCatalogSource = class {
3120
3086
  async listSources() {
3121
3087
  return [{ id: this.id, type: "remote-catalog", url: this.baseUrl }];
3122
3088
  }
3123
- /**
3124
- * List navigational domains via `GET /trpc/catalog.listDomains`. Display-only,
3125
- * so this **never throws**: a missing endpoint (older store → 404), a transport
3126
- * error, or a malformed payload all degrade to `[]` rather than jeopardize the
3127
- * asset feed this call accompanies. Air-gapped mode returns `[]` (domains are
3128
- * not part of the offline cache in v1).
3129
- *
3130
- * Not cached — domains are read once per `skaile manage` open and are cheap.
3131
- */
3132
- async listDomains(filter) {
3133
- if (this.cache.airGapped) return [];
3134
- try {
3135
- const input = filter && (filter.publisher || filter.source) ? filter : {};
3136
- const url = trpcGetUrl(this.baseUrl, "catalog.listDomains", input);
3137
- const res = await this.httpClient(url, {
3138
- method: "GET",
3139
- headers: { Accept: "application/json" }
3140
- });
3141
- if (!res.ok) return [];
3142
- const data = await parseTrpcGet(res);
3143
- if (!Array.isArray(data)) return [];
3144
- return data.map(normalizeCatalogDomain).filter((d) => d !== null);
3145
- } catch {
3146
- return [];
3147
- }
3148
- }
3149
3089
  // ── extension API ───────────────────────────────────────────────────────
3150
3090
  /**
3151
3091
  * Force a metadata-cache refresh. Wipes all resolve/list entries and
@@ -3397,8 +3337,6 @@ function normalizeCatalogAsset(raw) {
3397
3337
  if (category) asset.category = category;
3398
3338
  const repo = pickString(r, "repo");
3399
3339
  if (repo) asset.repo = repo;
3400
- const domainSlug = pickString(r, "domainSlug");
3401
- if (domainSlug) asset.domainSlug = domainSlug;
3402
3340
  const softDeps = pickRefs(r, "softDepsJson");
3403
3341
  if (softDeps.length > 0) asset.softDeps = softDeps;
3404
3342
  return asset;
@@ -3415,26 +3353,6 @@ function pickString(r, key) {
3415
3353
  const v = r[key];
3416
3354
  return typeof v === "string" ? v : void 0;
3417
3355
  }
3418
- function normalizeCatalogDomain(raw) {
3419
- if (!raw || typeof raw !== "object") return null;
3420
- const r = raw;
3421
- const slug = pickString(r, "slug");
3422
- const title = pickString(r, "title");
3423
- if (!slug || !title) return null;
3424
- const domain = { slug, title };
3425
- const description = pickString(r, "description");
3426
- if (description) domain.description = description;
3427
- const relation = pickString(r, "relation");
3428
- if (relation === "additions" || relation === "alternatives" || relation === "sequence") {
3429
- domain.relation = relation;
3430
- }
3431
- if (typeof r.order === "number") domain.order = r.order;
3432
- const recommendedRef = pickString(r, "recommendedRef");
3433
- if (recommendedRef) domain.recommendedRef = recommendedRef;
3434
- const sidecarSource = pickString(r, "sidecarSource");
3435
- if (sidecarSource) domain.sidecarSource = sidecarSource;
3436
- return domain;
3437
- }
3438
3356
  var CATALOG_REQUEST_TIMEOUT_MS = 1e4;
3439
3357
  var defaultFetch = async (url, init) => {
3440
3358
  if (typeof fetch === "undefined") {
@@ -3759,8 +3677,6 @@ function normalizeRestAsset(raw) {
3759
3677
  if (license) asset.license = license;
3760
3678
  const category = pickString2(r, "category");
3761
3679
  if (category) asset.category = category;
3762
- const domainSlug = pickString2(r, "domainSlug");
3763
- if (domainSlug) asset.domainSlug = domainSlug;
3764
3680
  const softDeps = refsFrom(tryParseJson(pickString2(r, "softDepsJson")));
3765
3681
  if (softDeps.length > 0) asset.softDeps = softDeps;
3766
3682
  return asset;
@@ -3803,7 +3719,7 @@ async function writeManifestIfMissing(input) {
3803
3719
  const manifestPath = path5.join(input.libraryPath, MANIFEST_FILENAME);
3804
3720
  if (fs10.existsSync(manifestPath)) return { wrote: false, manifestPath };
3805
3721
  const now = (/* @__PURE__ */ new Date()).toISOString();
3806
- const yaml = `# Generated by skaile library add on ${now} (structure: ${input.structure})
3722
+ const yaml = `# Generated by skaile library add on ${now}
3807
3723
  # Edit by hand to inline discovered assets; or run \`skaile library refresh-manifest\`.
3808
3724
  publisher: ""
3809
3725
  assets: []
@@ -3979,6 +3895,6 @@ function detectWorkspaceVersion(dir, filename = "skaile.yaml") {
3979
3895
  return raw.version === 2 ? 2 : 1;
3980
3896
  }
3981
3897
 
3982
- export { AssignmentNotFoundError, CatalogCache, CatalogConfigSchema, CatalogHttpError, DuplicateAssignmentError, DuplicateLibraryNameError, GitSyncDriver, InstanceHasConsumersError, InstanceNotFoundError, InterpolationError, KNOWN_ASSET_KINDS, KnowledgeManifestSchema, LIBRARY_BACKENDS, LIBRARY_OWNERSHIPS, LIBRARY_STRUCTURES, LOCAL_CATALOG_URL, LibraryConfigSchema, LibraryError, LibraryInstanceRefSchema, LibraryManager, LibrarySectionSchema, LibrarySyncError, LocalCatalogSource, LocalIndex, LocalSyncDriver, LockAssignmentSchema, LockFileSchema, OfflineError, OperationNotPermittedError, PIN_POLICIES, PinPolicySchema, PresetAppliedSchema, PresetExpandedSchema, RemoteCatalogSource, RequiresEdgeSchema, RestCatalogSource, SidecarGit, SkaileConfigSchema, SourceNotFoundError, TarballHashMismatchError, UserLibraryNotFoundError, WorkspaceConfigV2Schema, applyNonStructuralUpgrade, applyPreset, applyPresetFromData, classifyRef, cloneOrInitGitRepo, createEmptyLockFile, deriveSlug, detectChanges, detectNestedPresetRefs, detectWorkspaceVersion, ensureGitRepo, evaluateUpgrade, extractLibraryInstanceId, extractReferencedKeys, filterKey, getConfigDefaults, getDefaultValue, getSidecarRoot, getStoreManifestsDir, getStoreRoot, hasInterpolationTokens, interpolate, isGitRepo, isLocalCatalogUrl, isSecretPlaceholder, knowledgeKindProvider, listSidecarSlugsOnDisk, loadLockFile, loadWorkspaceV2, migrateSidecarsToStoreIfNeeded, migrateWorkspaceConfig, parsePreset, parsePresetYaml, parseWorkspaceV2, projectConfigPath, queryInstancePickerChoices, resolveAllItems, resolveConfig, resolveIndexPath, resolveItem, resolvePin, resolveSidecarPaths, saveConfig, saveLockFile, saveWorkspaceV2, setOriginUrl, sha256Hex, storeSecrets, trpcGetUrl, userConfigPath, validateAllPlaceholders, validateKnowledge, validateNestingDepth, validatePlaceholder, writeCuratedManifest, writeManifestIfMissing };
3983
- //# sourceMappingURL=chunk-XU7JET5Z.js.map
3984
- //# sourceMappingURL=chunk-XU7JET5Z.js.map
3898
+ export { AssignmentNotFoundError, CatalogCache, CatalogConfigSchema, CatalogHttpError, DuplicateAssignmentError, DuplicateLibraryNameError, GitSyncDriver, InstanceHasConsumersError, InstanceNotFoundError, InterpolationError, KNOWN_ASSET_KINDS, KnowledgeManifestSchema, LIBRARY_BACKENDS, LIBRARY_OWNERSHIPS, LOCAL_CATALOG_URL, LibraryConfigSchema, LibraryError, LibraryInstanceRefSchema, LibraryManager, LibrarySectionSchema, LibrarySyncError, LocalCatalogSource, LocalIndex, LocalSyncDriver, LockAssignmentSchema, LockFileSchema, OfflineError, OperationNotPermittedError, PIN_POLICIES, PinPolicySchema, PresetAppliedSchema, PresetExpandedSchema, RemoteCatalogSource, RequiresEdgeSchema, RestCatalogSource, SidecarGit, SkaileConfigSchema, SourceNotFoundError, TarballHashMismatchError, UserLibraryNotFoundError, WorkspaceConfigV2Schema, applyNonStructuralUpgrade, applyPreset, applyPresetFromData, classifyRef, cloneOrInitGitRepo, createEmptyLockFile, deriveSlug, detectChanges, detectNestedPresetRefs, detectWorkspaceVersion, ensureGitRepo, evaluateUpgrade, extractLibraryInstanceId, extractReferencedKeys, filterKey, getConfigDefaults, getDefaultValue, getSidecarRoot, getStoreManifestsDir, getStoreRoot, hasInterpolationTokens, interpolate, isGitRepo, isLocalCatalogUrl, isSecretPlaceholder, knowledgeKindProvider, listSidecarSlugsOnDisk, loadLockFile, loadWorkspaceV2, migrateSidecarsToStoreIfNeeded, migrateWorkspaceConfig, parsePreset, parsePresetYaml, parseWorkspaceV2, projectConfigPath, queryInstancePickerChoices, resolveAllItems, resolveConfig, resolveIndexPath, resolveItem, resolvePin, resolveSidecarPaths, saveConfig, saveLockFile, saveWorkspaceV2, setOriginUrl, sha256Hex, storeSecrets, trpcGetUrl, userConfigPath, validateAllPlaceholders, validateKnowledge, validateNestingDepth, validatePlaceholder, writeCuratedManifest, writeManifestIfMissing };
3899
+ //# sourceMappingURL=chunk-X7MHVL4R.js.map
3900
+ //# sourceMappingURL=chunk-X7MHVL4R.js.map