@skaile/workspaces 5.18.0 → 5.19.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 (332) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/{asset-feeds-WAKBHGEV.js → asset-feeds-QGLI3AXI.js} +16 -16
  3. package/dist/{asset-feeds-WAKBHGEV.js.map → asset-feeds-QGLI3AXI.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +5 -5
  5. package/dist/asset-manager/index.js +12 -12
  6. package/dist/asset-manager/installer.js +8 -8
  7. package/dist/asset-manager/renderers.js +7 -7
  8. package/dist/asset-manager/src/index.d.ts +91 -2
  9. package/dist/asset-manager/src/index.d.ts.map +1 -1
  10. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  11. package/dist/asset-manager/src/mcp-config.d.ts +29 -3
  12. package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
  13. package/dist/bridge/drivers/claude-sdk.js +22 -20
  14. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  15. package/dist/bridge/drivers/codex.js +11 -11
  16. package/dist/bridge/drivers/continue.js +10 -10
  17. package/dist/bridge/drivers/echo.js +27 -8
  18. package/dist/bridge/drivers/echo.js.map +1 -1
  19. package/dist/bridge/drivers/gemini.js +8 -8
  20. package/dist/bridge/drivers/goose.js +10 -10
  21. package/dist/bridge/drivers/omp.js +18 -460
  22. package/dist/bridge/drivers/omp.js.map +1 -1
  23. package/dist/bridge/drivers/opencode.js +10 -10
  24. package/dist/bridge/drivers/qwen.js +8 -8
  25. package/dist/bridge/index.js +15 -13
  26. package/dist/bridge/src/driver-model-check.d.ts +8 -4
  27. package/dist/bridge/src/driver-model-check.d.ts.map +1 -1
  28. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -1
  29. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  30. package/dist/bridge/src/drivers/echo.d.ts +3 -0
  31. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  32. package/dist/bridge/src/drivers/omp-models-yml.d.ts +11 -0
  33. package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
  34. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  35. package/dist/{chunk-E5YNGE3I.js → chunk-25ZVWL2R.js} +4 -4
  36. package/dist/{chunk-E5YNGE3I.js.map → chunk-25ZVWL2R.js.map} +1 -1
  37. package/dist/{chunk-GRKU3S5V.js → chunk-2GXSSZAM.js} +3 -3
  38. package/dist/{chunk-GRKU3S5V.js.map → chunk-2GXSSZAM.js.map} +1 -1
  39. package/dist/{chunk-RO2BPKXK.js → chunk-2LSDMJI2.js} +3 -3
  40. package/dist/{chunk-RO2BPKXK.js.map → chunk-2LSDMJI2.js.map} +1 -1
  41. package/dist/{chunk-CKBCX3HQ.js → chunk-2PBSAH3Z.js} +4 -4
  42. package/dist/{chunk-CKBCX3HQ.js.map → chunk-2PBSAH3Z.js.map} +1 -1
  43. package/dist/{chunk-CKNIYIV2.js → chunk-335ENCCS.js} +5 -5
  44. package/dist/chunk-335ENCCS.js.map +1 -0
  45. package/dist/{chunk-V4RV2NJF.js → chunk-7NT4F6SR.js} +151 -27
  46. package/dist/chunk-7NT4F6SR.js.map +1 -0
  47. package/dist/{chunk-L6IFN6ER.js → chunk-7SCS64BG.js} +13 -7
  48. package/dist/chunk-7SCS64BG.js.map +1 -0
  49. package/dist/{chunk-U2FI547Z.js → chunk-7XSAW5OC.js} +3 -3
  50. package/dist/{chunk-U2FI547Z.js.map → chunk-7XSAW5OC.js.map} +1 -1
  51. package/dist/{chunk-ZNN7ONJX.js → chunk-A6SMCEEE.js} +2 -2
  52. package/dist/{chunk-ZNN7ONJX.js.map → chunk-A6SMCEEE.js.map} +1 -1
  53. package/dist/{chunk-SRNCN4X2.js → chunk-C7WBGSBV.js} +4 -4
  54. package/dist/{chunk-SRNCN4X2.js.map → chunk-C7WBGSBV.js.map} +1 -1
  55. package/dist/chunk-COJIL7G4.js +505 -0
  56. package/dist/chunk-COJIL7G4.js.map +1 -0
  57. package/dist/{chunk-X54YR4AW.js → chunk-CQJH4G2K.js} +2 -2
  58. package/dist/{chunk-X54YR4AW.js.map → chunk-CQJH4G2K.js.map} +1 -1
  59. package/dist/{chunk-WJLYL6RY.js → chunk-F6AA42GW.js} +5 -5
  60. package/dist/{chunk-WJLYL6RY.js.map → chunk-F6AA42GW.js.map} +1 -1
  61. package/dist/{chunk-EZVZDCHZ.js → chunk-FPHNJE4M.js} +102 -32
  62. package/dist/chunk-FPHNJE4M.js.map +1 -0
  63. package/dist/{chunk-EELKR2WP.js → chunk-HT35SQZD.js} +15 -14
  64. package/dist/chunk-HT35SQZD.js.map +1 -0
  65. package/dist/chunk-HU5HVKY7.js +285 -0
  66. package/dist/chunk-HU5HVKY7.js.map +1 -0
  67. package/dist/{chunk-HPVMTX6M.js → chunk-I37INEWE.js} +47 -12
  68. package/dist/chunk-I37INEWE.js.map +1 -0
  69. package/dist/{chunk-WJCQFNF6.js → chunk-I7TWVK6N.js} +3 -3
  70. package/dist/{chunk-WJCQFNF6.js.map → chunk-I7TWVK6N.js.map} +1 -1
  71. package/dist/{chunk-D6UBEYQH.js → chunk-IF6IA3PZ.js} +6 -6
  72. package/dist/chunk-IF6IA3PZ.js.map +1 -0
  73. package/dist/{chunk-DJD36HC5.js → chunk-IP2IPMEH.js} +7 -7
  74. package/dist/{chunk-DJD36HC5.js.map → chunk-IP2IPMEH.js.map} +1 -1
  75. package/dist/{chunk-ODDATIII.js → chunk-J24CY3PF.js} +8 -8
  76. package/dist/chunk-J24CY3PF.js.map +1 -0
  77. package/dist/{chunk-YZ3N7IUU.js → chunk-JTOWA6RS.js} +60 -19
  78. package/dist/{chunk-YZ3N7IUU.js.map → chunk-JTOWA6RS.js.map} +1 -1
  79. package/dist/{chunk-L5XUEC2W.js → chunk-MKRWN7XP.js} +4 -4
  80. package/dist/{chunk-L5XUEC2W.js.map → chunk-MKRWN7XP.js.map} +1 -1
  81. package/dist/{chunk-TDQ2ERCM.js → chunk-MRHVPQNO.js} +519 -86
  82. package/dist/chunk-MRHVPQNO.js.map +1 -0
  83. package/dist/{chunk-A2ULN3KX.js → chunk-MWXYN6NY.js} +2 -2
  84. package/dist/{chunk-A2ULN3KX.js.map → chunk-MWXYN6NY.js.map} +1 -1
  85. package/dist/{chunk-T2TQAH2X.js → chunk-N46LQR46.js} +74 -18
  86. package/dist/chunk-N46LQR46.js.map +1 -0
  87. package/dist/{chunk-CD7SVH6W.js → chunk-PYJS5K7V.js} +3 -3
  88. package/dist/{chunk-CD7SVH6W.js.map → chunk-PYJS5K7V.js.map} +1 -1
  89. package/dist/{chunk-K5LVU2MN.js → chunk-QG6GHTRM.js} +4 -4
  90. package/dist/{chunk-K5LVU2MN.js.map → chunk-QG6GHTRM.js.map} +1 -1
  91. package/dist/{chunk-RD6N2D7I.js → chunk-R4I3VBSS.js} +2 -2
  92. package/dist/{chunk-RD6N2D7I.js.map → chunk-R4I3VBSS.js.map} +1 -1
  93. package/dist/{chunk-JY7GVNYU.js → chunk-RO6VOM6Z.js} +15 -15
  94. package/dist/{chunk-JY7GVNYU.js.map → chunk-RO6VOM6Z.js.map} +1 -1
  95. package/dist/{chunk-B4X2N7JQ.js → chunk-RPZVHXQ3.js} +12 -12
  96. package/dist/chunk-RPZVHXQ3.js.map +1 -0
  97. package/dist/{chunk-KC6HGWXN.js → chunk-TIIXG3PN.js} +3 -3
  98. package/dist/{chunk-KC6HGWXN.js.map → chunk-TIIXG3PN.js.map} +1 -1
  99. package/dist/{chunk-CKICWXMU.js → chunk-UQ33Y4DM.js} +139 -10
  100. package/dist/chunk-UQ33Y4DM.js.map +1 -0
  101. package/dist/{chunk-2NOLF7B2.js → chunk-V257LUBM.js} +16 -7
  102. package/dist/chunk-V257LUBM.js.map +1 -0
  103. package/dist/{chunk-N5P2WBUL.js → chunk-VIM3PWZM.js} +3 -3
  104. package/dist/{chunk-N5P2WBUL.js.map → chunk-VIM3PWZM.js.map} +1 -1
  105. package/dist/{chunk-3KMREAR2.js → chunk-VJ7NU7GD.js} +22 -22
  106. package/dist/{chunk-3KMREAR2.js.map → chunk-VJ7NU7GD.js.map} +1 -1
  107. package/dist/{chunk-6HK6RUFM.js → chunk-VSZWNUZC.js} +3 -3
  108. package/dist/{chunk-6HK6RUFM.js.map → chunk-VSZWNUZC.js.map} +1 -1
  109. package/dist/{chunk-MQIRRN76.js → chunk-W4Q6CKJ5.js} +6 -6
  110. package/dist/chunk-W4Q6CKJ5.js.map +1 -0
  111. package/dist/{chunk-FHIMIXT3.js → chunk-WG6V4ISA.js} +34 -15
  112. package/dist/chunk-WG6V4ISA.js.map +1 -0
  113. package/dist/{chunk-DA2MCPFN.js → chunk-WOIRYY5L.js} +110 -37
  114. package/dist/chunk-WOIRYY5L.js.map +1 -0
  115. package/dist/{chunk-JJ7LDI3S.js → chunk-WST6UITC.js} +6 -6
  116. package/dist/{chunk-JJ7LDI3S.js.map → chunk-WST6UITC.js.map} +1 -1
  117. package/dist/{chunk-FV2MSBVA.js → chunk-X4ZZTHU3.js} +4 -4
  118. package/dist/{chunk-FV2MSBVA.js.map → chunk-X4ZZTHU3.js.map} +1 -1
  119. package/dist/{chunk-PZ6NF5DE.js → chunk-XJVBUDDJ.js} +5 -5
  120. package/dist/{chunk-PZ6NF5DE.js.map → chunk-XJVBUDDJ.js.map} +1 -1
  121. package/dist/{chunk-VKPBUPH7.js → chunk-XM6T2AZ2.js} +36 -11
  122. package/dist/chunk-XM6T2AZ2.js.map +1 -0
  123. package/dist/{chunk-YU6AURJY.js → chunk-XWOPZW26.js} +3 -3
  124. package/dist/{chunk-YU6AURJY.js.map → chunk-XWOPZW26.js.map} +1 -1
  125. package/dist/{chunk-LW7ZI6EQ.js → chunk-Y5MBW5EU.js} +3 -3
  126. package/dist/chunk-Y5MBW5EU.js.map +1 -0
  127. package/dist/{chunk-24AXETE3.js → chunk-ZQSOJH6I.js} +36 -18
  128. package/dist/chunk-ZQSOJH6I.js.map +1 -0
  129. package/dist/{chunk-JYWW32JI.js → chunk-ZX4KRWRB.js} +17 -5
  130. package/dist/chunk-ZX4KRWRB.js.map +1 -0
  131. package/dist/claude-code-2PU7TITZ.js +10 -0
  132. package/dist/claude-code-2PU7TITZ.js.map +1 -0
  133. package/dist/cli/index.js +574 -492
  134. package/dist/cli/index.js.map +1 -1
  135. package/dist/cli/src/agent-checks.d.ts +5 -0
  136. package/dist/cli/src/agent-checks.d.ts.map +1 -1
  137. package/dist/cli/src/agent-pins.d.ts +18 -0
  138. package/dist/cli/src/agent-pins.d.ts.map +1 -0
  139. package/dist/cli/src/commands/catalog.d.ts +6 -0
  140. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  141. package/dist/cli/src/commands/config.d.ts.map +1 -1
  142. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  143. package/dist/cli/src/commands/flow.d.ts +8 -8
  144. package/dist/cli/src/commands/flow.d.ts.map +1 -1
  145. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  146. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  147. package/dist/cli/src/commands/library-index.d.ts +17 -5
  148. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  149. package/dist/cli/src/commands/library-publish.d.ts +3 -0
  150. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  151. package/dist/cli/src/commands/migrate-assets.d.ts +2 -0
  152. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  153. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  154. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  155. package/dist/cli/src/commands/plugin/claude-code.d.ts +6 -0
  156. package/dist/cli/src/commands/plugin/claude-code.d.ts.map +1 -1
  157. package/dist/cli/src/commands/plugin/codex.d.ts +19 -4
  158. package/dist/cli/src/commands/plugin/codex.d.ts.map +1 -1
  159. package/dist/cli/src/commands/preset-cmd.d.ts.map +1 -1
  160. package/dist/cli/src/commands/project.d.ts +6 -3
  161. package/dist/cli/src/commands/project.d.ts.map +1 -1
  162. package/dist/cli/src/commands/providers.d.ts +13 -0
  163. package/dist/cli/src/commands/providers.d.ts.map +1 -1
  164. package/dist/cli/src/commands/run.d.ts.map +1 -1
  165. package/dist/cli/src/commands/serve-preflight.d.ts +23 -0
  166. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  167. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  168. package/dist/cli/src/commands/update.d.ts.map +1 -1
  169. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  170. package/dist/cli/src/driver-error.d.ts +7 -0
  171. package/dist/cli/src/driver-error.d.ts.map +1 -1
  172. package/dist/cli/src/flow-discovery.d.ts +69 -53
  173. package/dist/cli/src/flow-discovery.d.ts.map +1 -1
  174. package/dist/cli/src/plugin-store/index.d.ts +6 -2
  175. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  176. package/dist/cli/src/skill-checks.d.ts +32 -1
  177. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  178. package/dist/connectors/config.js +3 -3
  179. package/dist/connectors/index.js +18 -16
  180. package/dist/{connectors-QL4GBMH3.js → connectors-RBGZ3M7G.js} +21 -19
  181. package/dist/{connectors-QL4GBMH3.js.map → connectors-RBGZ3M7G.js.map} +1 -1
  182. package/dist/core/discovery.js +1 -1
  183. package/dist/core/index.js +5 -5
  184. package/dist/core/publish-manifest.js +1 -1
  185. package/dist/core/runtime-assets.js +3 -3
  186. package/dist/core/src/asset-roots.d.ts +14 -0
  187. package/dist/core/src/asset-roots.d.ts.map +1 -1
  188. package/dist/core/src/bind.d.ts +33 -14
  189. package/dist/core/src/bind.d.ts.map +1 -1
  190. package/dist/core/src/discovery.d.ts +1 -1
  191. package/dist/core/src/index.d.ts +4 -4
  192. package/dist/core/src/index.d.ts.map +1 -1
  193. package/dist/core/src/lock.d.ts +8 -0
  194. package/dist/core/src/lock.d.ts.map +1 -1
  195. package/dist/core/src/publish-manifest.d.ts +45 -10
  196. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  197. package/dist/core/src/workspace-config.d.ts +18 -1
  198. package/dist/core/src/workspace-config.d.ts.map +1 -1
  199. package/dist/core/workspace-config.js +2 -2
  200. package/dist/deploy/index.js +5 -5
  201. package/dist/discovery/index.js +3 -3
  202. package/dist/discovery/src/discover-manifest.d.ts +1 -1
  203. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  204. package/dist/discovery/src/discover.d.ts.map +1 -1
  205. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  206. package/dist/{ensure-sources-CEFODJCE.js → ensure-sources-GKVLE6L5.js} +15 -15
  207. package/dist/{ensure-sources-CEFODJCE.js.map → ensure-sources-GKVLE6L5.js.map} +1 -1
  208. package/dist/factory-assets/connectors/box.js +18 -16
  209. package/dist/factory-assets/connectors/deploy.js +18 -16
  210. package/dist/factory-assets/connectors/devserver.js +18 -16
  211. package/dist/factory-assets/connectors/flow/adapter.js +18 -16
  212. package/dist/factory-assets/connectors/flow/engine/loader.d.ts +1 -1
  213. package/dist/factory-assets/connectors/flow/engine/locate.d.ts +8 -5
  214. package/dist/factory-assets/connectors/flow/engine/locate.d.ts.map +1 -1
  215. package/dist/factory-assets/connectors/flow/engine.js +6 -6
  216. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  217. package/dist/factory-assets/connectors/flow/run-flow.js +19 -17
  218. package/dist/factory-assets/connectors/flow.js +18 -16
  219. package/dist/factory-assets/connectors/git.js +18 -16
  220. package/dist/factory-assets/connectors/gmail.js +18 -16
  221. package/dist/factory-assets/connectors/googledrive.js +18 -16
  222. package/dist/factory-assets/connectors/local.js +18 -16
  223. package/dist/factory-assets/connectors/mattermost.js +18 -16
  224. package/dist/factory-assets/connectors/memory.js +18 -16
  225. package/dist/factory-assets/connectors/minio.js +18 -16
  226. package/dist/factory-assets/connectors/postgres.js +18 -16
  227. package/dist/factory-assets/connectors/s3.js +18 -16
  228. package/dist/factory-assets/connectors/sharepoint.js +18 -16
  229. package/dist/factory-assets/connectors/sqlite.js +18 -16
  230. package/dist/factory-assets/connectors/static-server.js +18 -16
  231. package/dist/factory-assets/connectors/tunnel.js +18 -16
  232. package/dist/factory-assets/connectors/webdav.js +18 -16
  233. package/dist/factory-assets/connectors/xstate/adapter.d.ts +1 -1
  234. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -1
  235. package/dist/factory-assets/connectors/xstate-store.js +18 -16
  236. package/dist/factory-assets/connectors/xstate.js +18 -16
  237. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +1 -1
  238. package/dist/{flows-BHY73K3O.js → flows-W2FB7WIM.js} +8 -8
  239. package/dist/{flows-BHY73K3O.js.map → flows-W2FB7WIM.js.map} +1 -1
  240. package/dist/{helpers-R22QNPFN.js → helpers-34QNVIGB.js} +15 -15
  241. package/dist/{helpers-R22QNPFN.js.map → helpers-34QNVIGB.js.map} +1 -1
  242. package/dist/library/index.js +9 -9
  243. package/dist/library/install.js +2 -2
  244. package/dist/library/src/index.d.ts +1 -1
  245. package/dist/library/src/index.d.ts.map +1 -1
  246. package/dist/library/src/manifest-writer.d.ts +13 -0
  247. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  248. package/dist/{library-publish-VBE3X2TH.js → library-publish-RUQTKTJU.js} +125 -48
  249. package/dist/library-publish-RUQTKTJU.js.map +1 -0
  250. package/dist/model-endpoint/index.js +8 -8
  251. package/dist/{open-library-JP5TC5UX.js → open-library-PVTIUQUF.js} +18 -18
  252. package/dist/{open-library-JP5TC5UX.js.map → open-library-PVTIUQUF.js.map} +1 -1
  253. package/dist/{open-registry-RBELV5YH.js → open-registry-SOIS3TA2.js} +13 -13
  254. package/dist/{open-registry-RBELV5YH.js.map → open-registry-SOIS3TA2.js.map} +1 -1
  255. package/dist/{paths-BFM6K2QO.js → paths-JLNX7Y4X.js} +8 -8
  256. package/dist/{paths-BFM6K2QO.js.map → paths-JLNX7Y4X.js.map} +1 -1
  257. package/dist/{plugin-store-QOQDM24E.js → plugin-store-G2GWAHSD.js} +8 -8
  258. package/dist/{plugin-store-QOQDM24E.js.map → plugin-store-G2GWAHSD.js.map} +1 -1
  259. package/dist/{project-6ETXGQWD.js → project-EX47PUBN.js} +38 -37
  260. package/dist/{project-6ETXGQWD.js.map → project-EX47PUBN.js.map} +1 -1
  261. package/dist/resolver/index.js +5 -5
  262. package/dist/runner/index.js +30 -29
  263. package/dist/runner/src/agents/instances.d.ts.map +1 -1
  264. package/dist/runner/src/composition/compile.d.ts +11 -0
  265. package/dist/runner/src/composition/compile.d.ts.map +1 -1
  266. package/dist/runner/src/composition/index.d.ts +1 -1
  267. package/dist/runner/src/composition/index.d.ts.map +1 -1
  268. package/dist/runner/src/serve.d.ts.map +1 -1
  269. package/dist/runner/src/turn-end-contract.d.ts +55 -0
  270. package/dist/runner/src/turn-end-contract.d.ts.map +1 -0
  271. package/dist/runner/src/turn-scheduler.d.ts +5 -0
  272. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  273. package/dist/sdk/asset-manager.js +12 -12
  274. package/dist/sdk/bridge.js +15 -13
  275. package/dist/sdk/core.js +5 -5
  276. package/dist/sdk/flow.js +6 -6
  277. package/dist/sdk/index.js +30 -29
  278. package/dist/sdk/index.js.map +1 -1
  279. package/dist/sdk/resolver.js +5 -5
  280. package/dist/sdk/runner.js +30 -29
  281. package/dist/sdk/transport/ws/server.js +6 -6
  282. package/dist/sdk/transport/ws.js +6 -6
  283. package/dist/sdk/transport.js +6 -6
  284. package/dist/serve-preflight-QXRKGOI5.js +108 -0
  285. package/dist/serve-preflight-QXRKGOI5.js.map +1 -0
  286. package/dist/{setup-JQDTYPSD.js → setup-AFZQNGKA.js} +25 -23
  287. package/dist/setup-AFZQNGKA.js.map +1 -0
  288. package/dist/{skills-RSZVUIYZ.js → skills-YYYC6D5X.js} +8 -8
  289. package/dist/{skills-RSZVUIYZ.js.map → skills-YYYC6D5X.js.map} +1 -1
  290. package/dist/{source-FPLHY3DP.js → source-DGPCT5IC.js} +40 -39
  291. package/dist/{source-FPLHY3DP.js.map → source-DGPCT5IC.js.map} +1 -1
  292. package/dist/{source-manifest-publish-LY4H63VA.js → source-manifest-publish-AGJ63JF2.js} +42 -41
  293. package/dist/source-manifest-publish-AGJ63JF2.js.map +1 -0
  294. package/dist/transport/index.js +6 -6
  295. package/dist/transport/src/ws/server.d.ts +1 -1
  296. package/dist/transport/src/ws/server.d.ts.map +1 -1
  297. package/dist/transport/ws/server.js +6 -6
  298. package/dist/transport/ws.js +6 -6
  299. package/dist/tui/index.js +30 -29
  300. package/dist/tui/index.js.map +1 -1
  301. package/dist/types/manifests.js +1 -1
  302. package/dist/types/src/manifests/scaffold-body.d.ts +6 -3
  303. package/dist/types/src/manifests/scaffold-body.d.ts.map +1 -1
  304. package/dist/workspace-plugin/adapters/mcp.js +22 -20
  305. package/dist/workspace-plugin/adapters/omp.js +14 -14
  306. package/dist/workspace-plugin/index.js +1 -1
  307. package/package.json +1 -1
  308. package/dist/chunk-24AXETE3.js.map +0 -1
  309. package/dist/chunk-2NOLF7B2.js.map +0 -1
  310. package/dist/chunk-B4X2N7JQ.js.map +0 -1
  311. package/dist/chunk-CKICWXMU.js.map +0 -1
  312. package/dist/chunk-CKNIYIV2.js.map +0 -1
  313. package/dist/chunk-D6UBEYQH.js.map +0 -1
  314. package/dist/chunk-DA2MCPFN.js.map +0 -1
  315. package/dist/chunk-EELKR2WP.js.map +0 -1
  316. package/dist/chunk-EZVZDCHZ.js.map +0 -1
  317. package/dist/chunk-FHIMIXT3.js.map +0 -1
  318. package/dist/chunk-HPVMTX6M.js.map +0 -1
  319. package/dist/chunk-JYWW32JI.js.map +0 -1
  320. package/dist/chunk-L6IFN6ER.js.map +0 -1
  321. package/dist/chunk-LW7ZI6EQ.js.map +0 -1
  322. package/dist/chunk-MQIRRN76.js.map +0 -1
  323. package/dist/chunk-ODDATIII.js.map +0 -1
  324. package/dist/chunk-T2TQAH2X.js.map +0 -1
  325. package/dist/chunk-TDQ2ERCM.js.map +0 -1
  326. package/dist/chunk-V4RV2NJF.js.map +0 -1
  327. package/dist/chunk-VKPBUPH7.js.map +0 -1
  328. package/dist/library-publish-VBE3X2TH.js.map +0 -1
  329. package/dist/serve-preflight-BTGTZUDN.js +0 -60
  330. package/dist/serve-preflight-BTGTZUDN.js.map +0 -1
  331. package/dist/setup-JQDTYPSD.js.map +0 -1
  332. package/dist/source-manifest-publish-LY4H63VA.js.map +0 -1
@@ -0,0 +1,285 @@
1
+ import { buildClaudePluginFiles } from './chunk-A6SMCEEE.js';
2
+ import { createHash } from 'crypto';
3
+ import { existsSync } from 'fs';
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+
7
+ var SKAILE_MCP_NAME = "skaile-workspace";
8
+ var MCP_SERVER_ENTRY = {
9
+ command: "skaile",
10
+ args: ["mcp-server"],
11
+ env: {}
12
+ };
13
+ function mcpFilePath(projectDir) {
14
+ return path.join(projectDir, ".mcp.json");
15
+ }
16
+ function legacyMcpFilePath(projectDir) {
17
+ return path.join(projectDir, ".claude", "mcp.json");
18
+ }
19
+ async function removeSkaileMcpEntry(mcpPath) {
20
+ const mcp = await readJsonStrict(mcpPath);
21
+ if (!mcp?.mcpServers || !(SKAILE_MCP_NAME in mcp.mcpServers)) return false;
22
+ const { [SKAILE_MCP_NAME]: _removed, ...rest } = mcp.mcpServers;
23
+ const updated = { ...mcp, mcpServers: rest };
24
+ if (Object.keys(rest).length === 0) delete updated.mcpServers;
25
+ if (Object.keys(updated).length === 0) await fs.unlink(mcpPath);
26
+ else await writeJson(mcpPath, updated);
27
+ return true;
28
+ }
29
+ function pluginDir(projectDir) {
30
+ return path.join(projectDir, ".claude", "plugins", "skaile");
31
+ }
32
+ async function readJsonStrict(p) {
33
+ let raw;
34
+ try {
35
+ raw = await fs.readFile(p, "utf-8");
36
+ } catch {
37
+ return null;
38
+ }
39
+ try {
40
+ return JSON.parse(raw);
41
+ } catch (e) {
42
+ throw new Error(
43
+ `cannot parse ${p}: ${e instanceof Error ? e.message : String(e)}; please fix or remove`
44
+ );
45
+ }
46
+ }
47
+ async function writeJson(p, value) {
48
+ await fs.mkdir(path.dirname(p), { recursive: true });
49
+ await fs.writeFile(p, `${JSON.stringify(value, null, 2)}
50
+ `);
51
+ }
52
+ var SKIPPED_IN_SKILL = /* @__PURE__ */ new Set(["__pycache__", "node_modules", ".DS_Store"]);
53
+ async function installedSkillSources(projectDir) {
54
+ const sources = /* @__PURE__ */ new Map();
55
+ for (const root of [
56
+ path.join(projectDir, ".claude", "skills"),
57
+ path.join(projectDir, ".skaile", "skills")
58
+ ]) {
59
+ for (const name of await fs.readdir(root).catch(() => [])) {
60
+ const from = path.join(root, name);
61
+ if (existsSync(path.join(from, "SKILL.md"))) sources.set(name, from);
62
+ }
63
+ }
64
+ return sources;
65
+ }
66
+ async function copyInstalledSkills(projectDir, skillsDir) {
67
+ for (const entry of await fs.readdir(skillsDir).catch(() => [])) {
68
+ if (entry !== ".gitkeep")
69
+ await fs.rm(path.join(skillsDir, entry), { recursive: true, force: true });
70
+ }
71
+ for (const [name, from] of await installedSkillSources(projectDir)) {
72
+ await fs.cp(from, path.join(skillsDir, name), {
73
+ recursive: true,
74
+ dereference: true,
75
+ filter: (src) => !SKIPPED_IN_SKILL.has(path.basename(src))
76
+ });
77
+ }
78
+ }
79
+ async function skillDigest(dir, rel = "") {
80
+ const out = [];
81
+ for (const entry of (await fs.readdir(path.join(dir, rel)).catch(() => [])).sort()) {
82
+ if (SKIPPED_IN_SKILL.has(entry)) continue;
83
+ const relPath = path.join(rel, entry);
84
+ const stat = await fs.stat(path.join(dir, relPath)).catch(() => void 0);
85
+ if (!stat) continue;
86
+ if (stat.isDirectory()) out.push(...await skillDigest(dir, relPath));
87
+ else {
88
+ const hash = createHash("sha256").update(await fs.readFile(path.join(dir, relPath))).digest("hex");
89
+ out.push(`${relPath}:${hash}`);
90
+ }
91
+ }
92
+ return out;
93
+ }
94
+ async function pluginSkillsStale(projectDir) {
95
+ const skillsDir = path.join(pluginDir(projectDir), "skills");
96
+ const expected = await installedSkillSources(projectDir);
97
+ const actual = (await fs.readdir(skillsDir).catch(() => [])).filter(
98
+ (n) => n !== ".gitkeep"
99
+ );
100
+ if (actual.length !== expected.size || actual.some((n) => !expected.has(n))) return true;
101
+ for (const [name, from] of expected) {
102
+ const [want, have] = await Promise.all([
103
+ skillDigest(from),
104
+ skillDigest(path.join(skillsDir, name))
105
+ ]);
106
+ if (want.join("\n") !== have.join("\n")) return true;
107
+ }
108
+ return false;
109
+ }
110
+ async function refreshPluginSkills(projectDir) {
111
+ if ((await detectInstall(projectDir))?.method !== "plugin") return false;
112
+ if (!await pluginSkillsStale(projectDir)) return false;
113
+ await copyInstalledSkills(projectDir, path.join(pluginDir(projectDir), "skills"));
114
+ return true;
115
+ }
116
+ async function install(projectDir, opts) {
117
+ return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);
118
+ }
119
+ async function installMcp(projectDir) {
120
+ const mcpPath = mcpFilePath(projectDir);
121
+ const existing = await readJsonStrict(mcpPath) ?? {};
122
+ const mcpServers = { ...existing.mcpServers ?? {} };
123
+ const previous = mcpServers[SKAILE_MCP_NAME];
124
+ const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);
125
+ let warning;
126
+ if (previous && !matches) {
127
+ warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path.relative(projectDir, mcpPath)}`;
128
+ }
129
+ mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;
130
+ await writeJson(mcpPath, { ...existing, mcpServers });
131
+ const migrated = await removeSkaileMcpEntry(legacyMcpFilePath(projectDir));
132
+ return { changed: !matches || migrated, method: "mcp", warning };
133
+ }
134
+ async function dropSymlink(p) {
135
+ const stat = await fs.lstat(p).catch(() => void 0);
136
+ if (stat?.isSymbolicLink()) await fs.unlink(p);
137
+ }
138
+ async function installFullPlugin(projectDir) {
139
+ const dir = pluginDir(projectDir);
140
+ await dropSymlink(dir);
141
+ await dropSymlink(path.join(dir, "skills"));
142
+ for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {
143
+ const dest = path.join(dir, rel);
144
+ await fs.mkdir(path.dirname(dest), { recursive: true });
145
+ await fs.writeFile(dest, content);
146
+ }
147
+ await copyInstalledSkills(projectDir, path.join(dir, "skills"));
148
+ const settingsPath = path.join(projectDir, ".claude", "settings.json");
149
+ const settings = await readJsonStrict(settingsPath) ?? {};
150
+ const plugins = settings.plugins ?? [];
151
+ if (!plugins.includes(dir)) plugins.push(dir);
152
+ await writeJson(settingsPath, { ...settings, plugins });
153
+ return { changed: true, method: "plugin" };
154
+ }
155
+ async function uninstall(projectDir) {
156
+ const settingsPath = path.join(projectDir, ".claude", "settings.json");
157
+ const mcpPath = mcpFilePath(projectDir);
158
+ const dir = pluginDir(projectDir);
159
+ const rel = (p) => path.relative(projectDir, p);
160
+ const files = [];
161
+ const settings = await readJsonStrict(settingsPath);
162
+ if (settings && Array.isArray(settings.plugins)) {
163
+ const next = settings.plugins.filter((p) => p !== dir);
164
+ if (next.length !== settings.plugins.length) {
165
+ files.push(rel(settingsPath));
166
+ const updated = { ...settings, plugins: next };
167
+ if (next.length === 0) delete updated.plugins;
168
+ if (Object.keys(updated).length === 0) await fs.unlink(settingsPath);
169
+ else await writeJson(settingsPath, updated);
170
+ }
171
+ }
172
+ if (existsSync(dir)) {
173
+ await fs.rm(dir, { recursive: true, force: true });
174
+ files.push(rel(dir));
175
+ }
176
+ if (await removeSkaileMcpEntry(mcpPath)) files.push(rel(mcpPath));
177
+ const legacyPath = legacyMcpFilePath(projectDir);
178
+ if (await removeSkaileMcpEntry(legacyPath)) files.push(rel(legacyPath));
179
+ for (const emptyDir of [path.dirname(dir), path.join(projectDir, ".claude")]) {
180
+ await fs.rmdir(emptyDir).catch(() => void 0);
181
+ }
182
+ return { changed: files.length > 0, files };
183
+ }
184
+ async function detectInstall(projectDir) {
185
+ const dir = pluginDir(projectDir);
186
+ const settings = await readJsonStrict(
187
+ path.join(projectDir, ".claude", "settings.json")
188
+ );
189
+ if (existsSync(path.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
190
+ return { method: "plugin", pluginPath: dir };
191
+ }
192
+ const mcp = await readJsonStrict(mcpFilePath(projectDir));
193
+ if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {
194
+ return { method: "mcp" };
195
+ }
196
+ return null;
197
+ }
198
+ async function enable(projectDir) {
199
+ const detected = await detectInstall(projectDir);
200
+ if (!detected) throw new Error("plugin not installed for claude-code");
201
+ const settingsPath = path.join(projectDir, ".claude", "settings.json");
202
+ const settings = await readJsonStrict(settingsPath) ?? {};
203
+ if (detected.method === "plugin") {
204
+ const disabled2 = settings.disabledPlugins ?? [];
205
+ const next2 = disabled2.filter((p) => p !== detected.pluginPath);
206
+ if (next2.length === disabled2.length) return { changed: false };
207
+ const updated2 = { ...settings, disabledPlugins: next2 };
208
+ if (next2.length === 0) delete updated2.disabledPlugins;
209
+ await writeJson(settingsPath, updated2);
210
+ return { changed: true };
211
+ }
212
+ const disabled = settings.disabledMcpjsonServers ?? [];
213
+ const next = disabled.filter((n) => n !== SKAILE_MCP_NAME);
214
+ if (next.length === disabled.length) return { changed: false };
215
+ const updated = { ...settings, disabledMcpjsonServers: next };
216
+ if (next.length === 0) delete updated.disabledMcpjsonServers;
217
+ await writeJson(settingsPath, updated);
218
+ return { changed: true };
219
+ }
220
+ async function disable(projectDir) {
221
+ const detected = await detectInstall(projectDir);
222
+ if (!detected) throw new Error("plugin not installed for claude-code");
223
+ const settingsPath = path.join(projectDir, ".claude", "settings.json");
224
+ const settings = await readJsonStrict(settingsPath) ?? {};
225
+ if (detected.method === "plugin") {
226
+ const list2 = settings.disabledPlugins ?? [];
227
+ if (list2.includes(detected.pluginPath)) return { changed: false };
228
+ await writeJson(settingsPath, {
229
+ ...settings,
230
+ disabledPlugins: [...list2, detected.pluginPath]
231
+ });
232
+ return { changed: true };
233
+ }
234
+ const list = settings.disabledMcpjsonServers ?? [];
235
+ if (list.includes(SKAILE_MCP_NAME)) return { changed: false };
236
+ await writeJson(settingsPath, {
237
+ ...settings,
238
+ disabledMcpjsonServers: [...list, SKAILE_MCP_NAME]
239
+ });
240
+ return { changed: true };
241
+ }
242
+ async function status(projectDir) {
243
+ const settingsPath = path.join(projectDir, ".claude", "settings.json");
244
+ const mcpPath = mcpFilePath(projectDir);
245
+ const dir = pluginDir(projectDir);
246
+ const settings = await readJsonStrict(settingsPath);
247
+ const mcp = await readJsonStrict(mcpPath);
248
+ const pluginInstalled = !!(existsSync(path.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
249
+ const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);
250
+ if (!pluginInstalled && !mcpInstalled) {
251
+ return {
252
+ harness: "claude-code",
253
+ installed: "no",
254
+ enabled: "n/a",
255
+ method: "\u2014",
256
+ location: "\u2014"
257
+ };
258
+ }
259
+ if (pluginInstalled) {
260
+ const disabled2 = settings?.disabledPlugins?.includes(dir) ?? false;
261
+ const stale = await pluginSkillsStale(projectDir);
262
+ return {
263
+ harness: "claude-code",
264
+ installed: "yes",
265
+ enabled: disabled2 ? "no" : "yes",
266
+ method: "plugin",
267
+ location: path.relative(projectDir, dir),
268
+ ...stale ? {
269
+ detail: "the skills copy is stale: run skaile integration install --driver claude-code --full"
270
+ } : {}
271
+ };
272
+ }
273
+ const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;
274
+ return {
275
+ harness: "claude-code",
276
+ installed: "yes",
277
+ enabled: disabled ? "no" : "yes",
278
+ method: "mcp",
279
+ location: path.relative(projectDir, mcpPath)
280
+ };
281
+ }
282
+
283
+ export { disable, enable, install, refreshPluginSkills, status, uninstall };
284
+ //# sourceMappingURL=chunk-HU5HVKY7.js.map
285
+ //# sourceMappingURL=chunk-HU5HVKY7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli/src/commands/plugin/claude-code.ts"],"names":["disabled","next","updated","list"],"mappings":"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","file":"chunk-HU5HVKY7.js","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { buildClaudePluginFiles } from \"@skaile/workspaces/workspace-plugin\";\nimport type { HarnessStatus, InstallResult, ToggleResult, UninstallResult } from \"./types.ts\";\n\nconst SKAILE_MCP_NAME = \"skaile-workspace\";\n\nconst MCP_SERVER_ENTRY = {\n command: \"skaile\",\n args: [\"mcp-server\"],\n env: {} as Record<string, string>,\n};\n\ninterface ClaudeSettings {\n plugins?: string[];\n enabledPlugins?: string[];\n disabledPlugins?: string[];\n disabledMcpjsonServers?: string[];\n [k: string]: unknown;\n}\n\ninterface ClaudeMcpFile {\n mcpServers?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\n/**\n * Project-scope MCP file. Claude Code reads `<project>/.mcp.json`; the\n * `.claude/mcp.json` that earlier versions wrote is never read (`claude mcp\n * list` reported \"No MCP servers configured\").\n */\nfunction mcpFilePath(projectDir: string): string {\n return path.join(projectDir, \".mcp.json\");\n}\n\n/** The dead `.claude/mcp.json` of earlier versions; entries in it are removed. */\nfunction legacyMcpFilePath(projectDir: string): string {\n return path.join(projectDir, \".claude\", \"mcp.json\");\n}\n\n/**\n * Drop the skaile entry from an MCP file, deleting the file when nothing is\n * left. Returns whether the file changed.\n */\nasync function removeSkaileMcpEntry(mcpPath: string): Promise<boolean> {\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpPath);\n if (!mcp?.mcpServers || !(SKAILE_MCP_NAME in mcp.mcpServers)) return false;\n const { [SKAILE_MCP_NAME]: _removed, ...rest } = mcp.mcpServers;\n const updated: ClaudeMcpFile = { ...mcp, mcpServers: rest };\n if (Object.keys(rest).length === 0) delete updated.mcpServers;\n if (Object.keys(updated).length === 0) await fs.unlink(mcpPath);\n else await writeJson(mcpPath, updated);\n return true;\n}\n\n/** Absolute path to the generated Claude Code plugin directory. */\nfunction pluginDir(projectDir: string): string {\n return path.join(projectDir, \".claude\", \"plugins\", \"skaile\");\n}\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\n/** Skill folders that are never copied into the plugin: bytecode and dependency trees. */\nconst SKIPPED_IN_SKILL = new Set([\"__pycache__\", \"node_modules\", \".DS_Store\"]);\n\n/**\n * The project's installed skills, name to source folder: the folders with a `SKILL.md` that\n * `skaile add` deployed to `.claude/skills/`, and any under `.skaile/skills/` (the folder an\n * earlier release read; it wins over a deployed copy of the same name).\n */\nasync function installedSkillSources(projectDir: string): Promise<Map<string, string>> {\n const sources = new Map<string, string>();\n for (const root of [\n path.join(projectDir, \".claude\", \"skills\"),\n path.join(projectDir, \".skaile\", \"skills\"),\n ]) {\n for (const name of await fs.readdir(root).catch(() => [] as string[])) {\n const from = path.join(root, name);\n if (existsSync(path.join(from, \"SKILL.md\"))) sources.set(name, from);\n }\n }\n return sources;\n}\n\n/**\n * Fill the plugin's `skills/` with the project's installed skills (p1190). A skill the project\n * no longer has is removed from the plugin, so a repeated install matches the project. A linked\n * skill is copied as files.\n */\nasync function copyInstalledSkills(projectDir: string, skillsDir: string): Promise<void> {\n for (const entry of await fs.readdir(skillsDir).catch(() => [] as string[])) {\n if (entry !== \".gitkeep\")\n await fs.rm(path.join(skillsDir, entry), { recursive: true, force: true });\n }\n for (const [name, from] of await installedSkillSources(projectDir)) {\n await fs.cp(from, path.join(skillsDir, name), {\n recursive: true,\n dereference: true,\n filter: (src) => !SKIPPED_IN_SKILL.has(path.basename(src)),\n });\n }\n}\n\n/** Relative file path to content hash of everything the plugin copy would hold for `dir`. */\nasync function skillDigest(dir: string, rel = \"\"): Promise<string[]> {\n const out: string[] = [];\n for (const entry of (await fs.readdir(path.join(dir, rel)).catch(() => [] as string[])).sort()) {\n if (SKIPPED_IN_SKILL.has(entry)) continue;\n const relPath = path.join(rel, entry);\n const stat = await fs.stat(path.join(dir, relPath)).catch(() => undefined);\n if (!stat) continue;\n if (stat.isDirectory()) out.push(...(await skillDigest(dir, relPath)));\n else {\n const hash = createHash(\"sha256\")\n .update(await fs.readFile(path.join(dir, relPath)))\n .digest(\"hex\");\n out.push(`${relPath}:${hash}`);\n }\n }\n return out;\n}\n\n/**\n * True when the `--full` plugin's `skills/` copy differs from what `copyInstalledSkills` would\n * write now: a skill added, removed or changed since the copy was made (p1350).\n */\nasync function pluginSkillsStale(projectDir: string): Promise<boolean> {\n const skillsDir = path.join(pluginDir(projectDir), \"skills\");\n const expected = await installedSkillSources(projectDir);\n const actual = (await fs.readdir(skillsDir).catch(() => [] as string[])).filter(\n (n) => n !== \".gitkeep\",\n );\n if (actual.length !== expected.size || actual.some((n) => !expected.has(n))) return true;\n for (const [name, from] of expected) {\n const [want, have] = await Promise.all([\n skillDigest(from),\n skillDigest(path.join(skillsDir, name)),\n ]);\n if (want.join(\"\\n\") !== have.join(\"\\n\")) return true;\n }\n return false;\n}\n\n/**\n * Bring the `--full` plugin's skills copy up to date after `add`, `remove`, `install` or\n * `update` changed the project's skills (p1350). Does nothing when the plugin is not installed\n * (the MCP method has no copy) or the copy is current. Returns whether it rewrote the copy.\n */\nexport async function refreshPluginSkills(projectDir: string): Promise<boolean> {\n if ((await detectInstall(projectDir))?.method !== \"plugin\") return false;\n if (!(await pluginSkillsStale(projectDir))) return false;\n await copyInstalledSkills(projectDir, path.join(pluginDir(projectDir), \"skills\"));\n return true;\n}\n\n// ── install ────────────────────────────────────────────────────────────────\n\n/**\n * Install the skaile integration for Claude Code.\n *\n * Two modes:\n * - **mcp** (default) — write project-root `.mcp.json` pointing at `skaile mcp-server`.\n * - **full** (`opts.full`) — generate the `.claude/plugins/skaile/` directory\n * (MCP + lifecycle hooks) and register it in `.claude/settings.json`.\n */\nexport async function install(\n projectDir: string,\n opts?: { full?: boolean },\n): Promise<InstallResult> {\n return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);\n}\n\nasync function installMcp(projectDir: string): Promise<InstallResult> {\n const mcpPath = mcpFilePath(projectDir);\n const existing = (await readJsonStrict<ClaudeMcpFile>(mcpPath)) ?? {};\n const mcpServers = { ...(existing.mcpServers ?? {}) };\n const previous = mcpServers[SKAILE_MCP_NAME];\n const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);\n let warning: string | undefined;\n if (previous && !matches) {\n warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path.relative(projectDir, mcpPath)}`;\n }\n mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;\n await writeJson(mcpPath, { ...existing, mcpServers });\n const migrated = await removeSkaileMcpEntry(legacyMcpFilePath(projectDir));\n return { changed: !matches || migrated, method: \"mcp\", warning };\n}\n\n/**\n * Unlink `p` when it is a symlink (never what it points at), so the install below writes into\n * a real folder of its own instead of through the link into the user's files (`skills/ ->\n * ../../skills` would otherwise have its target cleared).\n */\nasync function dropSymlink(p: string): Promise<void> {\n const stat = await fs.lstat(p).catch(() => undefined);\n if (stat?.isSymbolicLink()) await fs.unlink(p);\n}\n\nasync function installFullPlugin(projectDir: string): Promise<InstallResult> {\n const dir = pluginDir(projectDir);\n await dropSymlink(dir);\n await dropSymlink(path.join(dir, \"skills\"));\n\n // Generate the plugin directory from the in-memory file map.\n for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {\n const dest = path.join(dir, rel);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n await fs.writeFile(dest, content);\n }\n\n await copyInstalledSkills(projectDir, path.join(dir, \"skills\"));\n\n // Register the generated dir in .claude/settings.json#plugins[].\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n const plugins = settings.plugins ?? [];\n if (!plugins.includes(dir)) plugins.push(dir);\n await writeJson(settingsPath, { ...settings, plugins });\n\n return { changed: true, method: \"plugin\" };\n}\n\n// ── uninstall ──────────────────────────────────────────────────────────────\n\nexport async function uninstall(projectDir: string): Promise<UninstallResult> {\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const mcpPath = mcpFilePath(projectDir);\n const dir = pluginDir(projectDir);\n const rel = (p: string): string => path.relative(projectDir, p);\n\n /** Project-relative paths the uninstall changed or deleted, in the order it touched them. */\n const files: string[] = [];\n\n // Remove the generated plugin dir from plugins[] if registered.\n const settings = await readJsonStrict<ClaudeSettings>(settingsPath);\n if (settings && Array.isArray(settings.plugins)) {\n const next = settings.plugins.filter((p) => p !== dir);\n if (next.length !== settings.plugins.length) {\n files.push(rel(settingsPath));\n const updated: ClaudeSettings = { ...settings, plugins: next };\n if (next.length === 0) delete updated.plugins;\n // A settings file that held only the skaile plugin is left empty: delete it.\n if (Object.keys(updated).length === 0) await fs.unlink(settingsPath);\n else await writeJson(settingsPath, updated);\n }\n }\n\n // Delete the generated plugin directory.\n if (existsSync(dir)) {\n await fs.rm(dir, { recursive: true, force: true });\n files.push(rel(dir));\n }\n\n // Remove from .mcp.json — and from the legacy .claude/mcp.json — if present.\n if (await removeSkaileMcpEntry(mcpPath)) files.push(rel(mcpPath));\n const legacyPath = legacyMcpFilePath(projectDir);\n if (await removeSkaileMcpEntry(legacyPath)) files.push(rel(legacyPath));\n\n // Leave no empty `.claude/` or `.claude/plugins/` behind.\n for (const emptyDir of [path.dirname(dir), path.join(projectDir, \".claude\")]) {\n await fs.rmdir(emptyDir).catch(() => undefined);\n }\n\n return { changed: files.length > 0, files };\n}\n\n// ── enable / disable ───────────────────────────────────────────────────────\n\nasync function detectInstall(\n projectDir: string,\n): Promise<{ method: \"plugin\" | \"mcp\"; pluginPath?: string } | null> {\n const dir = pluginDir(projectDir);\n const settings = await readJsonStrict<ClaudeSettings>(\n path.join(projectDir, \".claude\", \"settings.json\"),\n );\n if (\n existsSync(path.join(dir, \".claude-plugin\", \"plugin.json\")) &&\n settings?.plugins?.includes(dir)\n ) {\n return { method: \"plugin\", pluginPath: dir };\n }\n\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpFilePath(projectDir));\n if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {\n return { method: \"mcp\" };\n }\n return null;\n}\n\nexport async function enable(projectDir: string): Promise<ToggleResult> {\n const detected = await detectInstall(projectDir);\n if (!detected) throw new Error(\"plugin not installed for claude-code\");\n\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n\n if (detected.method === \"plugin\") {\n const disabled = settings.disabledPlugins ?? [];\n const next = disabled.filter((p) => p !== detected.pluginPath);\n if (next.length === disabled.length) return { changed: false };\n const updated: ClaudeSettings = { ...settings, disabledPlugins: next };\n if (next.length === 0) delete updated.disabledPlugins;\n await writeJson(settingsPath, updated);\n return { changed: true };\n }\n\n const disabled = settings.disabledMcpjsonServers ?? [];\n const next = disabled.filter((n) => n !== SKAILE_MCP_NAME);\n if (next.length === disabled.length) return { changed: false };\n const updated: ClaudeSettings = { ...settings, disabledMcpjsonServers: next };\n if (next.length === 0) delete updated.disabledMcpjsonServers;\n await writeJson(settingsPath, updated);\n return { changed: true };\n}\n\nexport async function disable(projectDir: string): Promise<ToggleResult> {\n const detected = await detectInstall(projectDir);\n if (!detected) throw new Error(\"plugin not installed for claude-code\");\n\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const settings = (await readJsonStrict<ClaudeSettings>(settingsPath)) ?? {};\n\n if (detected.method === \"plugin\") {\n const list = settings.disabledPlugins ?? [];\n if (list.includes(detected.pluginPath as string)) return { changed: false };\n await writeJson(settingsPath, {\n ...settings,\n disabledPlugins: [...list, detected.pluginPath as string],\n });\n return { changed: true };\n }\n\n const list = settings.disabledMcpjsonServers ?? [];\n if (list.includes(SKAILE_MCP_NAME)) return { changed: false };\n await writeJson(settingsPath, {\n ...settings,\n disabledMcpjsonServers: [...list, SKAILE_MCP_NAME],\n });\n return { changed: true };\n}\n\n// ── status ─────────────────────────────────────────────────────────────────\n\nexport async function status(projectDir: string): Promise<HarnessStatus> {\n const settingsPath = path.join(projectDir, \".claude\", \"settings.json\");\n const mcpPath = mcpFilePath(projectDir);\n const dir = pluginDir(projectDir);\n const settings = await readJsonStrict<ClaudeSettings>(settingsPath);\n const mcp = await readJsonStrict<ClaudeMcpFile>(mcpPath);\n\n const pluginInstalled = !!(\n existsSync(path.join(dir, \".claude-plugin\", \"plugin.json\")) && settings?.plugins?.includes(dir)\n );\n const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);\n\n if (!pluginInstalled && !mcpInstalled) {\n return {\n harness: \"claude-code\",\n installed: \"no\",\n enabled: \"n/a\",\n method: \"—\",\n location: \"—\",\n };\n }\n\n if (pluginInstalled) {\n const disabled = settings?.disabledPlugins?.includes(dir) ?? false;\n // The plugin's skills are a copy; `add`, `remove`, `install` and `update` refresh it, but a\n // skill changed by hand since is not in it (p1350).\n const stale = await pluginSkillsStale(projectDir);\n return {\n harness: \"claude-code\",\n installed: \"yes\",\n enabled: disabled ? \"no\" : \"yes\",\n method: \"plugin\",\n location: path.relative(projectDir, dir),\n ...(stale\n ? {\n detail:\n \"the skills copy is stale: run skaile integration install --driver claude-code --full\",\n }\n : {}),\n };\n }\n\n const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;\n return {\n harness: \"claude-code\",\n installed: \"yes\",\n enabled: disabled ? \"no\" : \"yes\",\n method: \"mcp\",\n location: path.relative(projectDir, mcpPath),\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { AssetKindRegistryFrozenError, AssetKindConflictError, AssetKindPatternConflictError, AssetKindPathAmbiguityError } from './chunk-3TXEJN4W.js';
2
- import { validateSkill, validateAgent, validateConnector, validateMcpServer, validateContract, validatePrompt, validatePersona, validateRuleset, validatePreset } from './chunk-CKNIYIV2.js';
3
- import { sha256Hex, decodeSkaileManifest, SKAILE_MANIFEST_FILENAME, isNonAssetPath, isNonAssetFile, compositeSha256, isNonAssetDir } from './chunk-CKICWXMU.js';
2
+ import { validateSkill, validateAgent, validateConnector, validateMcpServer, validateContract, validatePrompt, validatePersona, validateRuleset, validatePreset } from './chunk-335ENCCS.js';
3
+ import { sha256Hex, decodeSkaileManifest, SKAILE_MANIFEST_FILENAME, expandManifestFiles, onlyPublished, gitPublishedFiles, isNonAssetPath, expandManifestFilesFromPaths, isNonAssetFile, compositeSha256, isNonAssetDir } from './chunk-UQ33Y4DM.js';
4
4
  import { readPluginGroupings } from './chunk-RVRB27AN.js';
5
5
  import { parseFrontmatter } from './chunk-GOCWM7FN.js';
6
6
  import { isValidPublisher, PUBLISHER_HINT, isValidAssetName } from './chunk-WDXZA7QW.js';
@@ -558,7 +558,7 @@ function parseManifestFile(relativePath, text) {
558
558
  const encoding = text.startsWith("\uFEFF") ? " (the file starts with a UTF-8 BOM; check that `---` is its first line)" : text.includes("\r\n") ? " (the file has CRLF line endings; check the block is closed by a `---` line)" : "";
559
559
  return {
560
560
  ok: false,
561
- reason: `no parsable YAML frontmatter (expected a \`---\` block with at least one key)${encoding}`
561
+ reason: `no parsable YAML frontmatter (expected a \`---\` block with at least one key)${encoding || ": add a `---` block with `name` and `description` at the top of the file"}`
562
562
  };
563
563
  }
564
564
  return { ok: true, data };
@@ -925,7 +925,7 @@ function loadSourceConfigFromFile(filePath, fallbackPublisher) {
925
925
  }
926
926
 
927
927
  // discovery/src/discover-manifest.ts
928
- function discoverFromManifest(rootPath, sourceConfig, registry, includeDev = false) {
928
+ function discoverFromManifest(rootPath, sourceConfig, registry, includeDev = false, published = null) {
929
929
  const assets = [];
930
930
  const errors = [];
931
931
  const warnings = [];
@@ -934,7 +934,7 @@ function discoverFromManifest(rootPath, sourceConfig, registry, includeDev = fal
934
934
  const sortedEntries = [...sourceConfig.assets].sort((a, b) => a.path < b.path ? -1 : 1);
935
935
  for (const entry of sortedEntries) {
936
936
  if (!includeDev && isExcludedDevPath(entry.path, devPaths)) continue;
937
- const result = processEntry(rootPath, entry, registry);
937
+ const result = processEntry(rootPath, entry, registry, published);
938
938
  warnings.push(...result.warnings);
939
939
  if (result.errors.length > 0) {
940
940
  errors.push(...result.errors);
@@ -948,12 +948,20 @@ function discoverFromManifest(rootPath, sourceConfig, registry, includeDev = fal
948
948
  const graph = buildRequiresGraph(allEdges);
949
949
  return { assets, graph, errors, warnings };
950
950
  }
951
- function processEntry(rootPath, entry, registry) {
951
+ function processEntry(rootPath, entry, registry, published) {
952
952
  const errors = [];
953
953
  const warnings = [];
954
954
  const assetRoot = path.resolve(rootPath, entry.path);
955
955
  const assetRootRelative = entry.path;
956
- const files = entry.files ?? expandRootFiles(assetRoot);
956
+ const expanded = entry.files === void 0 ? void 0 : expandManifestFiles(assetRoot, entry.files);
957
+ if (expanded && expanded.unmatched.length > 0) {
958
+ errors.push({
959
+ path: assetRootRelative,
960
+ error: `ManifestFileMissing: ${expanded.unmatched.join(", ")}`
961
+ });
962
+ return { asset: null, errors, warnings };
963
+ }
964
+ const files = expanded?.files ?? onlyPublished(published, rootPath, assetRoot, expandRootFiles(assetRoot));
957
965
  if (entry.files === void 0 && files.length === 0) {
958
966
  errors.push({
959
967
  path: assetRootRelative,
@@ -1313,9 +1321,10 @@ function lintUncoveredReferences(manifestRelPath, assetRootOrFs, includedFiles)
1313
1321
  var DEFAULT_ATOMIZATION_POLICY = "strict";
1314
1322
  function discoverAssetsInTree(rootPath, optionsOrSourceConfig) {
1315
1323
  const { sourceConfig, registry, includeDev, atomization, fallbackPublisher } = normalizeDiscoveryArgs(rootPath, optionsOrSourceConfig);
1324
+ const published = gitPublishedFiles(rootPath);
1316
1325
  if (sourceConfig && isManifestMode(sourceConfig)) {
1317
1326
  return stampPlugins(
1318
- discoverFromManifest(rootPath, sourceConfig, registry, includeDev),
1327
+ discoverFromManifest(rootPath, sourceConfig, registry, includeDev, published),
1319
1328
  rootPath
1320
1329
  );
1321
1330
  }
@@ -1327,6 +1336,7 @@ function discoverAssetsInTree(rootPath, optionsOrSourceConfig) {
1327
1336
  const seen = /* @__PURE__ */ new Set();
1328
1337
  for (const { absPath, relativePath } of walkTree(rootPath)) {
1329
1338
  if (!includeDev && isExcludedDevPath(relativePath, devPaths)) continue;
1339
+ if (published && !published.has(relativePath)) continue;
1330
1340
  let kind;
1331
1341
  try {
1332
1342
  kind = registry.resolveKind(relativePath);
@@ -1344,7 +1354,7 @@ function discoverAssetsInTree(rootPath, optionsOrSourceConfig) {
1344
1354
  seen.add(dedupKey);
1345
1355
  processDiscoveredEntry(
1346
1356
  { absPath, relativePath, kind },
1347
- { registry, sourceConfig, atomization, fallbackPublisher, rootPath },
1357
+ { registry, sourceConfig, atomization, fallbackPublisher, rootPath, published },
1348
1358
  { assets, errors, warnings, allEdges }
1349
1359
  );
1350
1360
  }
@@ -1421,6 +1431,12 @@ function processDiscoveredEntry(entry, ctx, acc) {
1421
1431
  files: [path.basename(absPath)]
1422
1432
  };
1423
1433
  applyAtomizationPolicy(atomization, relativePath, fileFilter, registry, acc.warnings);
1434
+ fileFilter.files = onlyPublished(
1435
+ ctx.published,
1436
+ ctx.rootPath,
1437
+ fileFilter.assetRoot,
1438
+ fileFilter.files
1439
+ );
1424
1440
  const sha256 = computeDeterministicHash(
1425
1441
  fileFilter.assetRoot,
1426
1442
  fileFilter.files,
@@ -2093,7 +2109,26 @@ async function processManifestEntryTree(entry, blobByPath, fetchBlob, registry)
2093
2109
  }
2094
2110
  function resolveEntryFilesTree(entry, blobByPath, errors) {
2095
2111
  const assetRootRelative = entry.path;
2096
- const files = entry.files ?? expandRootFilesTree(entry.path, blobByPath);
2112
+ let files;
2113
+ if (entry.files === void 0) {
2114
+ files = expandRootFilesTree(entry.path, blobByPath);
2115
+ } else {
2116
+ const root = entry.path === "." ? "" : entry.path;
2117
+ const under = [];
2118
+ for (const blobPath of blobByPath.keys()) {
2119
+ if (isInDir(blobPath, root))
2120
+ under.push(root === "" ? blobPath : blobPath.slice(root.length + 1));
2121
+ }
2122
+ const expanded = expandManifestFilesFromPaths(under, entry.files);
2123
+ if (expanded.unmatched.length > 0) {
2124
+ errors.push({
2125
+ path: assetRootRelative,
2126
+ error: `ManifestFileMissing: ${expanded.unmatched.join(", ")}`
2127
+ });
2128
+ return null;
2129
+ }
2130
+ files = expanded.files;
2131
+ }
2097
2132
  if (entry.files === void 0 && files.length === 0) {
2098
2133
  errors.push({
2099
2134
  path: assetRootRelative,
@@ -2212,5 +2247,5 @@ function expandRootFilesTree(assetPath, blobByPath) {
2212
2247
  var VERSION = "0.0.0";
2213
2248
 
2214
2249
  export { AGENT_COMPANION_DIRS, AssetKindRegistry, BUILTIN_PROVIDERS, DEFAULT_ATOMIZATION_POLICY, REQUIRES_ENTRY_RE, SEMVER_RE, SKILL_COMPANION_DIRS, SourceConfigSchema, VERSION, agentProvider, barePublisher, buildRequiresGraph, closeOverReferences, computeDeterministicHash, computeDeterministicHashDetailed, connectorProvider, contractProvider, createDefaultKindRegistry, createNodeAssetFs, decodeManifestSourceConfig, detectCycles, discoverAssetsInTree, discoverAssetsInTreeEntries, discoverFromManifest, extractPathCandidates, extractRequires, extractSlashCommands, flowFileNameError, invalidSemverMessage, isExcludedDevPath, isManifestMode, lintUncoveredReferences, loadMergedSourceConfig, loadMergedSourceConfigFromFile, loadSourceConfig, manifestToSourceConfig, mcpServerProvider, mergeSourceConfigs, parseManifestFile, parseSourceConfig, personaProvider, presetProvider, promptProvider, readManifestSourceConfig, requiresSyntaxErrors, rulesetProvider, scanAssetReferences, scanSlashCommandNames, sharesItsFolder, skillProvider, validateSourceConfig };
2215
- //# sourceMappingURL=chunk-HPVMTX6M.js.map
2216
- //# sourceMappingURL=chunk-HPVMTX6M.js.map
2250
+ //# sourceMappingURL=chunk-I37INEWE.js.map
2251
+ //# sourceMappingURL=chunk-I37INEWE.js.map