@skaile/workspaces 0.24.0 → 0.26.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 (520) hide show
  1. package/CHANGELOG.md +276 -0
  2. package/README.md +2 -2
  3. package/dist/{asset-feeds-WKIKSZ6Z.js → asset-feeds-WMVTI7KW.js} +11 -10
  4. package/dist/asset-feeds-WMVTI7KW.js.map +1 -0
  5. package/dist/asset-manager/index.js +11 -10
  6. package/dist/asset-manager/installer.js +10 -9
  7. package/dist/asset-manager/renderers.js +2 -2
  8. package/dist/asset-manager/src/index.d.ts +6 -7
  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/bridge/drivers/claude-sdk.js +14 -7
  12. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  13. package/dist/bridge/drivers/codex.js +8 -34
  14. package/dist/bridge/drivers/codex.js.map +1 -1
  15. package/dist/bridge/drivers/echo.js +1 -1
  16. package/dist/bridge/drivers/omp.js +64 -50
  17. package/dist/bridge/drivers/omp.js.map +1 -1
  18. package/dist/bridge/index.js +4 -4
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  20. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  21. package/dist/bridge/src/drivers/omp.d.ts +20 -4
  22. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  23. package/dist/bridge/src/error-classifier.d.ts +17 -0
  24. package/dist/bridge/src/error-classifier.d.ts.map +1 -1
  25. package/dist/bridge/src/models.d.ts +1 -1
  26. package/dist/bridge/src/models.d.ts.map +1 -1
  27. package/dist/bridge/src/provider-endpoints.d.ts +16 -0
  28. package/dist/bridge/src/provider-endpoints.d.ts.map +1 -0
  29. package/dist/bridge/src/validation.d.ts +1 -1
  30. package/dist/bridge/src/validation.d.ts.map +1 -1
  31. package/dist/{chunk-M5TE6YI5.js → chunk-23M4XZQW.js} +10 -52
  32. package/dist/chunk-23M4XZQW.js.map +1 -0
  33. package/dist/{chunk-DH4N5AW4.js → chunk-2FS4FPZ7.js} +3 -3
  34. package/dist/{chunk-DH4N5AW4.js.map → chunk-2FS4FPZ7.js.map} +1 -1
  35. package/dist/{chunk-6VTG73UY.js → chunk-45H3UO2R.js} +2 -2
  36. package/dist/{chunk-6VTG73UY.js.map → chunk-45H3UO2R.js.map} +1 -1
  37. package/dist/chunk-4SQ6Y6U7.js +28 -0
  38. package/dist/chunk-4SQ6Y6U7.js.map +1 -0
  39. package/dist/{chunk-LSGAYQ2E.js → chunk-5YO3H5Q4.js} +3 -3
  40. package/dist/{chunk-LSGAYQ2E.js.map → chunk-5YO3H5Q4.js.map} +1 -1
  41. package/dist/{chunk-JDX54X4Y.js → chunk-7GWYRVAX.js} +12 -9
  42. package/dist/chunk-7GWYRVAX.js.map +1 -0
  43. package/dist/{chunk-46COM7M5.js → chunk-7OBGSR7O.js} +5 -5
  44. package/dist/chunk-7OBGSR7O.js.map +1 -0
  45. package/dist/{chunk-2RFOFHSM.js → chunk-BKF3UFF4.js} +21 -9
  46. package/dist/chunk-BKF3UFF4.js.map +1 -0
  47. package/dist/{chunk-KOVLSBXK.js → chunk-BMQKMOQY.js} +81 -79
  48. package/dist/chunk-BMQKMOQY.js.map +1 -0
  49. package/dist/{chunk-J2TITSXF.js → chunk-BQRRBGDE.js} +2 -2
  50. package/dist/{chunk-J2TITSXF.js.map → chunk-BQRRBGDE.js.map} +1 -1
  51. package/dist/{chunk-5ESCS2OS.js → chunk-C32BRO2W.js} +67 -35
  52. package/dist/chunk-C32BRO2W.js.map +1 -0
  53. package/dist/{chunk-GZWJGNNN.js → chunk-DEYYRFQU.js} +3 -3
  54. package/dist/chunk-DEYYRFQU.js.map +1 -0
  55. package/dist/{chunk-YX3UWPJ5.js → chunk-IEJ5IOC3.js} +27 -49
  56. package/dist/chunk-IEJ5IOC3.js.map +1 -0
  57. package/dist/chunk-IERB3UXJ.js +215 -0
  58. package/dist/chunk-IERB3UXJ.js.map +1 -0
  59. package/dist/{chunk-FVTV7M76.js → chunk-IFGTRL2I.js} +3 -3
  60. package/dist/chunk-IFGTRL2I.js.map +1 -0
  61. package/dist/{chunk-LJ52ZKIU.js → chunk-JIQLLZ65.js} +203 -39
  62. package/dist/chunk-JIQLLZ65.js.map +1 -0
  63. package/dist/{chunk-Z3M5K67G.js → chunk-KL2MQ6WI.js} +114 -63
  64. package/dist/chunk-KL2MQ6WI.js.map +1 -0
  65. package/dist/{chunk-6FNCZYJY.js → chunk-MBOR7D65.js} +3 -3
  66. package/dist/{chunk-6FNCZYJY.js.map → chunk-MBOR7D65.js.map} +1 -1
  67. package/dist/{chunk-QAVZOJCV.js → chunk-OVRSNIKJ.js} +2 -2
  68. package/dist/chunk-OVRSNIKJ.js.map +1 -0
  69. package/dist/{chunk-DQWREFRQ.js → chunk-PAYAFNXG.js} +22 -3
  70. package/dist/chunk-PAYAFNXG.js.map +1 -0
  71. package/dist/{chunk-D3VO6WNC.js → chunk-PRLD7EXG.js} +3 -3
  72. package/dist/chunk-PRLD7EXG.js.map +1 -0
  73. package/dist/{chunk-N6TA6RSH.js → chunk-PY7AQRGH.js} +59 -13
  74. package/dist/chunk-PY7AQRGH.js.map +1 -0
  75. package/dist/{chunk-NELZIQ2E.js → chunk-QDJKE557.js} +20 -3
  76. package/dist/chunk-QDJKE557.js.map +1 -0
  77. package/dist/{chunk-OYRW5RCM.js → chunk-QHXS3YDV.js} +9 -9
  78. package/dist/chunk-QHXS3YDV.js.map +1 -0
  79. package/dist/{chunk-2F3RUZXC.js → chunk-RTAIGPTF.js} +161 -106
  80. package/dist/chunk-RTAIGPTF.js.map +1 -0
  81. package/dist/{chunk-IPUYL6TD.js → chunk-TV72ZJYN.js} +8 -5
  82. package/dist/{chunk-IPUYL6TD.js.map → chunk-TV72ZJYN.js.map} +1 -1
  83. package/dist/{chunk-ICS76R4T.js → chunk-W7W66MDZ.js} +10 -8
  84. package/dist/chunk-W7W66MDZ.js.map +1 -0
  85. package/dist/{chunk-JQBHCJ6N.js → chunk-WD4LP66U.js} +329 -121
  86. package/dist/chunk-WD4LP66U.js.map +1 -0
  87. package/dist/{chunk-AFLH7B64.js → chunk-XGLGS5B4.js} +3 -3
  88. package/dist/{chunk-AFLH7B64.js.map → chunk-XGLGS5B4.js.map} +1 -1
  89. package/dist/{chunk-HIIARTRZ.js → chunk-YDTW4GT6.js} +450 -207
  90. package/dist/chunk-YDTW4GT6.js.map +1 -0
  91. package/dist/{chunk-2XY6732A.js → chunk-YRU4WB6Y.js} +5 -5
  92. package/dist/chunk-YRU4WB6Y.js.map +1 -0
  93. package/dist/{chunk-542K7SR6.js → chunk-Z5DI7PDG.js} +173 -90
  94. package/dist/chunk-Z5DI7PDG.js.map +1 -0
  95. package/dist/{chunk-KLNL7QHN.js → chunk-ZAP2BDHG.js} +30 -5
  96. package/dist/chunk-ZAP2BDHG.js.map +1 -0
  97. package/dist/{chunk-GCJXPUHG.js → chunk-ZONCCO5N.js} +9 -4
  98. package/dist/chunk-ZONCCO5N.js.map +1 -0
  99. package/dist/{chunk-ODPII24X.js → chunk-ZYDE52WE.js} +3 -3
  100. package/dist/{chunk-ODPII24X.js.map → chunk-ZYDE52WE.js.map} +1 -1
  101. package/dist/cli/index.js +566 -425
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
  104. package/dist/cli/src/commands/config.d.ts.map +1 -1
  105. package/dist/cli/src/commands/connector.d.ts +7 -0
  106. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  107. package/dist/cli/src/commands/flow.d.ts +3 -2
  108. package/dist/cli/src/commands/flow.d.ts.map +1 -1
  109. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  110. package/dist/cli/src/commands/project.d.ts.map +1 -1
  111. package/dist/cli/src/commands/run.d.ts.map +1 -1
  112. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  113. package/dist/cli/src/flow-discovery.d.ts +24 -0
  114. package/dist/cli/src/flow-discovery.d.ts.map +1 -0
  115. package/dist/cli/src/open-registry.d.ts +2 -2
  116. package/dist/cli/src/paths.d.ts +26 -9
  117. package/dist/cli/src/paths.d.ts.map +1 -1
  118. package/dist/cli/src/skill-walker.d.ts +9 -5
  119. package/dist/cli/src/skill-walker.d.ts.map +1 -1
  120. package/dist/connectors/config.js +8 -7
  121. package/dist/connectors/index.js +13 -12
  122. package/dist/connectors/rclone-config.js +1 -1
  123. package/dist/connectors/src/connector-manager.d.ts +24 -2
  124. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  125. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  126. package/dist/connectors/src/connector-registry.d.ts +3 -3
  127. package/dist/connectors/src/credential-helper-script.d.ts.map +1 -1
  128. package/dist/connectors/src/index.d.ts +4 -2
  129. package/dist/connectors/src/index.d.ts.map +1 -1
  130. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  131. package/dist/connectors/src/mount-placeholder.d.ts +68 -0
  132. package/dist/connectors/src/mount-placeholder.d.ts.map +1 -0
  133. package/dist/connectors/src/rclone-config/googledrive.d.ts +1 -1
  134. package/dist/core/discovery.js +1 -1
  135. package/dist/core/index.js +7 -6
  136. package/dist/core/manifest.js +2 -2
  137. package/dist/core/models.js +1 -1
  138. package/dist/core/publish-manifest.d.ts +2 -0
  139. package/dist/core/publish-manifest.js +5 -0
  140. package/dist/core/publish-manifest.js.map +1 -0
  141. package/dist/core/runtime-assets.js +5 -4
  142. package/dist/core/src/discovery.d.ts +27 -0
  143. package/dist/core/src/discovery.d.ts.map +1 -1
  144. package/dist/core/src/index.d.ts +9 -6
  145. package/dist/core/src/index.d.ts.map +1 -1
  146. package/dist/core/src/lock.d.ts.map +1 -1
  147. package/dist/core/src/manifest-yaml-editor.d.ts +62 -0
  148. package/dist/core/src/manifest-yaml-editor.d.ts.map +1 -0
  149. package/dist/core/src/models.d.ts +16 -3
  150. package/dist/core/src/models.d.ts.map +1 -1
  151. package/dist/core/src/publish-manifest.d.ts +160 -0
  152. package/dist/core/src/publish-manifest.d.ts.map +1 -0
  153. package/dist/core/src/repo-manager.d.ts +9 -1
  154. package/dist/core/src/repo-manager.d.ts.map +1 -1
  155. package/dist/core/src/runtime-assets.d.ts +80 -29
  156. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  157. package/dist/core/src/walker.d.ts +19 -6
  158. package/dist/core/src/walker.d.ts.map +1 -1
  159. package/dist/core/src/workspace-config.d.ts +30 -36
  160. package/dist/core/src/workspace-config.d.ts.map +1 -1
  161. package/dist/core/src/workspace-yaml-editor.d.ts +1 -15
  162. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  163. package/dist/core/workspace-config.js +4 -3
  164. package/dist/deploy/index.js +50 -79
  165. package/dist/deploy/index.js.map +1 -1
  166. package/dist/deploy/src/targets/container-runtime.d.ts +1 -1
  167. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  168. package/dist/deploy/src/targets/local.d.ts.map +1 -1
  169. package/dist/deploy/src/targets/nix.d.ts.map +1 -1
  170. package/dist/deploy/src/targets/process-handle.d.ts +7 -5
  171. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -1
  172. package/dist/discovery/index.js +5 -4
  173. package/dist/discovery/src/discover-manifest.d.ts +3 -2
  174. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  175. package/dist/discovery/src/discover.d.ts +2 -2
  176. package/dist/discovery/src/discover.d.ts.map +1 -1
  177. package/dist/discovery/src/index.d.ts +1 -1
  178. package/dist/discovery/src/index.d.ts.map +1 -1
  179. package/dist/discovery/src/source-config.d.ts +53 -12
  180. package/dist/discovery/src/source-config.d.ts.map +1 -1
  181. package/dist/discovery/src/tree-entries.d.ts +2 -2
  182. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  183. package/dist/{ensure-sources-OJUBGX6Z.js → ensure-sources-CVULUVH4.js} +12 -11
  184. package/dist/ensure-sources-CVULUVH4.js.map +1 -0
  185. package/dist/factory-assets/.skaile-source.yaml +6 -0
  186. package/dist/factory-assets/README.md +36 -0
  187. package/dist/factory-assets/bundles/workspaces-authoring/workspaces-authoring.bundle.yaml +9 -0
  188. package/dist/factory-assets/connectors/deploy/CONNECTOR.md +41 -0
  189. package/dist/{base-assets → factory-assets}/connectors/deploy/adapter.d.ts +2 -2
  190. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -0
  191. package/dist/factory-assets/connectors/deploy.js +22 -0
  192. package/dist/factory-assets/connectors/devserver/CONNECTOR.md +44 -0
  193. package/dist/{base-assets → factory-assets}/connectors/devserver/adapter.d.ts +2 -2
  194. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -0
  195. package/dist/factory-assets/connectors/devserver.js +22 -0
  196. package/dist/factory-assets/connectors/flow/CONNECTOR.md +47 -0
  197. package/dist/{base-assets → factory-assets}/connectors/flow/adapter.d.ts +2 -2
  198. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -0
  199. package/dist/factory-assets/connectors/flow/adapter.js +22 -0
  200. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -0
  201. package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
  202. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -0
  203. package/dist/factory-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -0
  204. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -0
  205. package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -0
  206. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -0
  207. package/dist/factory-assets/connectors/flow/engine.js +15 -0
  208. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -0
  209. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.d.ts +5 -5
  210. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -0
  211. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js +1 -1
  212. package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.d.ts +8 -8
  213. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -0
  214. package/dist/factory-assets/connectors/flow/run-flow.js +25 -0
  215. package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.d.ts +2 -2
  216. package/dist/factory-assets/connectors/flow/stimulus-driver.d.ts.map +1 -0
  217. package/dist/factory-assets/connectors/flow/stimulus-driver.js +4 -0
  218. package/dist/factory-assets/connectors/flow.js +22 -0
  219. package/dist/factory-assets/connectors/git/CONNECTOR.md +145 -0
  220. package/dist/{base-assets → factory-assets}/connectors/git/driver.d.ts +2 -2
  221. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -0
  222. package/dist/factory-assets/connectors/git.js +22 -0
  223. package/dist/factory-assets/connectors/gmail/CONNECTOR.md +50 -0
  224. package/dist/{base-assets → factory-assets}/connectors/gmail/adapter.d.ts +2 -2
  225. package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -0
  226. package/dist/factory-assets/connectors/gmail.js +22 -0
  227. package/dist/factory-assets/connectors/googledrive/CONNECTOR.md +150 -0
  228. package/dist/{base-assets → factory-assets}/connectors/googledrive/driver.d.ts +2 -2
  229. package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -0
  230. package/dist/factory-assets/connectors/googledrive.js +22 -0
  231. package/dist/factory-assets/connectors/local/CONNECTOR.md +40 -0
  232. package/dist/{base-assets → factory-assets}/connectors/local/driver.d.ts +2 -2
  233. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -0
  234. package/dist/factory-assets/connectors/local.js +22 -0
  235. package/dist/factory-assets/connectors/mattermost/CONNECTOR.md +65 -0
  236. package/dist/{base-assets → factory-assets}/connectors/mattermost/adapter.d.ts +2 -2
  237. package/dist/factory-assets/connectors/mattermost/adapter.d.ts.map +1 -0
  238. package/dist/factory-assets/connectors/mattermost.js +22 -0
  239. package/dist/factory-assets/connectors/memory/CONNECTOR.md +40 -0
  240. package/dist/{base-assets → factory-assets}/connectors/memory/adapter.d.ts +2 -2
  241. package/dist/factory-assets/connectors/memory/adapter.d.ts.map +1 -0
  242. package/dist/factory-assets/connectors/memory.js +22 -0
  243. package/dist/factory-assets/connectors/minio/CONNECTOR.md +68 -0
  244. package/dist/{base-assets → factory-assets}/connectors/minio/adapter.d.ts +2 -2
  245. package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -0
  246. package/dist/factory-assets/connectors/minio.js +22 -0
  247. package/dist/factory-assets/connectors/postgres/CONNECTOR.md +46 -0
  248. package/dist/{base-assets → factory-assets}/connectors/postgres/adapter.d.ts +2 -2
  249. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -0
  250. package/dist/factory-assets/connectors/postgres.js +22 -0
  251. package/dist/factory-assets/connectors/s3/CONNECTOR.md +76 -0
  252. package/dist/{base-assets → factory-assets}/connectors/s3/driver.d.ts +2 -2
  253. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -0
  254. package/dist/factory-assets/connectors/s3.js +22 -0
  255. package/dist/factory-assets/connectors/sharepoint/CONNECTOR.md +181 -0
  256. package/dist/{base-assets → factory-assets}/connectors/sharepoint/driver.d.ts +2 -2
  257. package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -0
  258. package/dist/factory-assets/connectors/sharepoint.js +22 -0
  259. package/dist/factory-assets/connectors/sqlite/CONNECTOR.md +44 -0
  260. package/dist/{base-assets → factory-assets}/connectors/sqlite/adapter.d.ts +2 -2
  261. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -0
  262. package/dist/factory-assets/connectors/sqlite.js +22 -0
  263. package/dist/factory-assets/connectors/static-server/CONNECTOR.md +41 -0
  264. package/dist/{base-assets → factory-assets}/connectors/static-server/adapter.d.ts +2 -2
  265. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -0
  266. package/dist/factory-assets/connectors/static-server.js +22 -0
  267. package/dist/factory-assets/connectors/tunnel/CONNECTOR.md +40 -0
  268. package/dist/{base-assets → factory-assets}/connectors/tunnel/adapter.d.ts +2 -2
  269. package/dist/factory-assets/connectors/tunnel/adapter.d.ts.map +1 -0
  270. package/dist/factory-assets/connectors/tunnel.js +22 -0
  271. package/dist/factory-assets/connectors/webdav/CONNECTOR.md +139 -0
  272. package/dist/{base-assets → factory-assets}/connectors/webdav/driver.d.ts +2 -2
  273. package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -0
  274. package/dist/factory-assets/connectors/webdav.js +22 -0
  275. package/dist/factory-assets/connectors/xstate/CONNECTOR.md +57 -0
  276. package/dist/{base-assets → factory-assets}/connectors/xstate/adapter.d.ts +2 -2
  277. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -0
  278. package/dist/factory-assets/connectors/xstate-store/CONNECTOR.md +48 -0
  279. package/dist/{base-assets → factory-assets}/connectors/xstate-store/adapter.d.ts +2 -2
  280. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -0
  281. package/dist/factory-assets/connectors/xstate-store.js +22 -0
  282. package/dist/factory-assets/connectors/xstate.js +22 -0
  283. package/dist/{base-assets → factory-assets}/index.d.ts +1 -1
  284. package/dist/factory-assets/index.d.ts.map +1 -0
  285. package/dist/{base-assets → factory-assets}/index.js +1 -1
  286. package/dist/factory-assets/index.js.map +1 -0
  287. package/dist/factory-assets/skaile.manifest.yaml +25 -0
  288. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +176 -0
  289. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +243 -0
  290. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +197 -0
  291. package/dist/factory-assets/skills/manifest-compliance/SKILL.md +140 -0
  292. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +239 -0
  293. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +168 -0
  294. package/dist/{flows-DYFTPCPM.js → flows-JZFJD5IN.js} +3 -3
  295. package/dist/{flows-DYFTPCPM.js.map → flows-JZFJD5IN.js.map} +1 -1
  296. package/dist/library/index.js +14 -5
  297. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
  298. package/dist/library/src/library.d.ts +2 -0
  299. package/dist/library/src/library.d.ts.map +1 -1
  300. package/dist/library/src/local/library.d.ts +2 -0
  301. package/dist/library/src/local/library.d.ts.map +1 -1
  302. package/dist/library/src/local/local-catalog-source.d.ts +2 -1
  303. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  304. package/dist/library/src/local/sidecar-paths.d.ts +4 -4
  305. package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
  306. package/dist/library/src/local/store-paths.d.ts +4 -3
  307. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  308. package/dist/library/src/pin-resolver.d.ts.map +1 -1
  309. package/dist/library/src/preset/apply.d.ts.map +1 -1
  310. package/dist/library/src/preset/placeholders.d.ts.map +1 -1
  311. package/dist/library/src/remote/remote-catalog-source.d.ts +7 -0
  312. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  313. package/dist/library/src/remote/rest-catalog-source.d.ts +7 -0
  314. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  315. package/dist/library/src/sync/manifest-writeback.d.ts +1 -1
  316. package/dist/library/src/sync/manifest-writeback.d.ts.map +1 -1
  317. package/dist/open-library-WYASW4BH.js +22 -0
  318. package/dist/{open-library-67FSSQWE.js.map → open-library-WYASW4BH.js.map} +1 -1
  319. package/dist/paths-BMW6JYW6.js +15 -0
  320. package/dist/{paths-FKKGS6BA.js.map → paths-BMW6JYW6.js.map} +1 -1
  321. package/dist/{plugin-store-IZ5SCRAV.js → plugin-store-O5VR45CA.js} +9 -8
  322. package/dist/plugin-store-O5VR45CA.js.map +1 -0
  323. package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
  324. package/dist/plugins/src/catalog-source.d.ts +13 -0
  325. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  326. package/dist/resolver/index.js +1 -1
  327. package/dist/resolver/src/parser.d.ts.map +1 -1
  328. package/dist/runner/index.js +20 -19
  329. package/dist/runner/src/capability-registry.d.ts +1 -1
  330. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  331. package/dist/runner/src/external-mcp.d.ts +112 -0
  332. package/dist/runner/src/external-mcp.d.ts.map +1 -0
  333. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  334. package/dist/runner/src/resources.d.ts +10 -2
  335. package/dist/runner/src/resources.d.ts.map +1 -1
  336. package/dist/runner/src/serve.d.ts.map +1 -1
  337. package/dist/runner/src/session-builder.d.ts +12 -0
  338. package/dist/runner/src/session-builder.d.ts.map +1 -1
  339. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  340. package/dist/sdk/asset-manager.js +11 -10
  341. package/dist/sdk/bridge.js +4 -4
  342. package/dist/sdk/core.js +7 -6
  343. package/dist/sdk/flow.js +12 -1
  344. package/dist/sdk/index.js +23 -22
  345. package/dist/sdk/index.js.map +1 -1
  346. package/dist/sdk/resolver.js +1 -1
  347. package/dist/sdk/runner.js +20 -19
  348. package/dist/sdk/session.js +1 -1
  349. package/dist/sdk/src/flow/index.d.ts +1 -1
  350. package/dist/sdk/src/flow/index.d.ts.map +1 -1
  351. package/dist/sdk/src/workspace.d.ts +3 -2
  352. package/dist/sdk/src/workspace.d.ts.map +1 -1
  353. package/dist/sdk/telemetry.js +1 -1
  354. package/dist/secrets/index.js +1 -1
  355. package/dist/secrets/src/providers/env.d.ts.map +1 -1
  356. package/dist/secrets/src/providers/local.d.ts.map +1 -1
  357. package/dist/session/index.js +1 -1
  358. package/dist/session/src/mentions.d.ts.map +1 -1
  359. package/dist/{setup-J7CYEQOF.js → setup-YNLFR5GB.js} +13 -12
  360. package/dist/setup-YNLFR5GB.js.map +1 -0
  361. package/dist/skills-6HJ3WINN.js +7 -0
  362. package/dist/{skills-CRL3VJNN.js.map → skills-6HJ3WINN.js.map} +1 -1
  363. package/dist/store-client-CENBEASX.js +15 -0
  364. package/dist/{store-client-AEI6Y3KD.js.map → store-client-CENBEASX.js.map} +1 -1
  365. package/dist/telemetry/index.js +1 -1
  366. package/dist/telemetry/src/config.d.ts +0 -16
  367. package/dist/telemetry/src/config.d.ts.map +1 -1
  368. package/dist/tui/index.js +20 -19
  369. package/dist/tui/index.js.map +1 -1
  370. package/dist/types/manifests.js +1 -1
  371. package/dist/types/src/flow.d.ts +2 -2
  372. package/dist/types/src/install-manifest.d.ts +1 -1
  373. package/dist/types/src/install-manifest.d.ts.map +1 -1
  374. package/dist/types/src/manifests/index.d.ts +1 -1
  375. package/dist/types/src/manifests/skill.d.ts +21 -0
  376. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  377. package/dist/workspace-plugin/adapters/mcp.js +4 -4
  378. package/dist/workspace-plugin/adapters/omp.js +7 -7
  379. package/dist/workspace-plugin/index.js +1 -1
  380. package/dist/workspace-plugin/src/tools/flows.d.ts.map +1 -1
  381. package/package.json +158 -151
  382. package/dist/asset-feeds-WKIKSZ6Z.js.map +0 -1
  383. package/dist/base-assets/connectors/deploy/adapter.d.ts.map +0 -1
  384. package/dist/base-assets/connectors/deploy.js +0 -21
  385. package/dist/base-assets/connectors/devserver/adapter.d.ts.map +0 -1
  386. package/dist/base-assets/connectors/devserver.js +0 -21
  387. package/dist/base-assets/connectors/flow/adapter.d.ts.map +0 -1
  388. package/dist/base-assets/connectors/flow/adapter.js +0 -21
  389. package/dist/base-assets/connectors/flow/engine/engine.d.ts.map +0 -1
  390. package/dist/base-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +0 -1
  391. package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +0 -1
  392. package/dist/base-assets/connectors/flow/engine/index.d.ts.map +0 -1
  393. package/dist/base-assets/connectors/flow/engine/loader.d.ts.map +0 -1
  394. package/dist/base-assets/connectors/flow/engine/types.d.ts.map +0 -1
  395. package/dist/base-assets/connectors/flow/engine.js +0 -4
  396. package/dist/base-assets/connectors/flow/index.d.ts.map +0 -1
  397. package/dist/base-assets/connectors/flow/prompt-fragments.d.ts.map +0 -1
  398. package/dist/base-assets/connectors/flow/run-flow.d.ts.map +0 -1
  399. package/dist/base-assets/connectors/flow/run-flow.js +0 -24
  400. package/dist/base-assets/connectors/flow/stimulus-driver.d.ts.map +0 -1
  401. package/dist/base-assets/connectors/flow/stimulus-driver.js +0 -4
  402. package/dist/base-assets/connectors/flow.js +0 -21
  403. package/dist/base-assets/connectors/git/driver.d.ts.map +0 -1
  404. package/dist/base-assets/connectors/git.js +0 -21
  405. package/dist/base-assets/connectors/gmail/adapter.d.ts.map +0 -1
  406. package/dist/base-assets/connectors/gmail.js +0 -21
  407. package/dist/base-assets/connectors/googledrive/driver.d.ts.map +0 -1
  408. package/dist/base-assets/connectors/googledrive.js +0 -21
  409. package/dist/base-assets/connectors/local/driver.d.ts.map +0 -1
  410. package/dist/base-assets/connectors/local.js +0 -21
  411. package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +0 -1
  412. package/dist/base-assets/connectors/mattermost.js +0 -21
  413. package/dist/base-assets/connectors/memory/adapter.d.ts.map +0 -1
  414. package/dist/base-assets/connectors/memory.js +0 -21
  415. package/dist/base-assets/connectors/minio/adapter.d.ts.map +0 -1
  416. package/dist/base-assets/connectors/minio.js +0 -21
  417. package/dist/base-assets/connectors/postgres/adapter.d.ts.map +0 -1
  418. package/dist/base-assets/connectors/postgres.js +0 -21
  419. package/dist/base-assets/connectors/s3/driver.d.ts.map +0 -1
  420. package/dist/base-assets/connectors/s3.js +0 -21
  421. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +0 -1
  422. package/dist/base-assets/connectors/sharepoint.js +0 -21
  423. package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +0 -1
  424. package/dist/base-assets/connectors/sqlite.js +0 -21
  425. package/dist/base-assets/connectors/static-server/adapter.d.ts.map +0 -1
  426. package/dist/base-assets/connectors/static-server.js +0 -21
  427. package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +0 -1
  428. package/dist/base-assets/connectors/tunnel.js +0 -21
  429. package/dist/base-assets/connectors/webdav/driver.d.ts.map +0 -1
  430. package/dist/base-assets/connectors/webdav.js +0 -21
  431. package/dist/base-assets/connectors/xstate/adapter.d.ts.map +0 -1
  432. package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +0 -1
  433. package/dist/base-assets/connectors/xstate-store.js +0 -21
  434. package/dist/base-assets/connectors/xstate.js +0 -21
  435. package/dist/base-assets/index.d.ts.map +0 -1
  436. package/dist/base-assets/index.js.map +0 -1
  437. package/dist/chunk-2F3RUZXC.js.map +0 -1
  438. package/dist/chunk-2M3XTMOL.js +0 -23
  439. package/dist/chunk-2M3XTMOL.js.map +0 -1
  440. package/dist/chunk-2RFOFHSM.js.map +0 -1
  441. package/dist/chunk-2XY6732A.js.map +0 -1
  442. package/dist/chunk-46COM7M5.js.map +0 -1
  443. package/dist/chunk-542K7SR6.js.map +0 -1
  444. package/dist/chunk-5ESCS2OS.js.map +0 -1
  445. package/dist/chunk-D3VO6WNC.js.map +0 -1
  446. package/dist/chunk-DQWREFRQ.js.map +0 -1
  447. package/dist/chunk-FVTV7M76.js.map +0 -1
  448. package/dist/chunk-GCJXPUHG.js.map +0 -1
  449. package/dist/chunk-GZWJGNNN.js.map +0 -1
  450. package/dist/chunk-HIIARTRZ.js.map +0 -1
  451. package/dist/chunk-ICS76R4T.js.map +0 -1
  452. package/dist/chunk-JDX54X4Y.js.map +0 -1
  453. package/dist/chunk-JQBHCJ6N.js.map +0 -1
  454. package/dist/chunk-KLNL7QHN.js.map +0 -1
  455. package/dist/chunk-KOVLSBXK.js.map +0 -1
  456. package/dist/chunk-LJ52ZKIU.js.map +0 -1
  457. package/dist/chunk-M5TE6YI5.js.map +0 -1
  458. package/dist/chunk-N6TA6RSH.js.map +0 -1
  459. package/dist/chunk-NELZIQ2E.js.map +0 -1
  460. package/dist/chunk-OYRW5RCM.js.map +0 -1
  461. package/dist/chunk-QAVZOJCV.js.map +0 -1
  462. package/dist/chunk-YX3UWPJ5.js.map +0 -1
  463. package/dist/chunk-Z3M5K67G.js.map +0 -1
  464. package/dist/ensure-sources-OJUBGX6Z.js.map +0 -1
  465. package/dist/open-library-67FSSQWE.js +0 -13
  466. package/dist/paths-FKKGS6BA.js +0 -4
  467. package/dist/plugin-store-IZ5SCRAV.js.map +0 -1
  468. package/dist/setup-J7CYEQOF.js.map +0 -1
  469. package/dist/skills-CRL3VJNN.js +0 -7
  470. package/dist/store-client-AEI6Y3KD.js +0 -14
  471. /package/dist/{base-assets → factory-assets}/connectors/deploy.d.ts +0 -0
  472. /package/dist/{base-assets → factory-assets}/connectors/deploy.js.map +0 -0
  473. /package/dist/{base-assets → factory-assets}/connectors/devserver.d.ts +0 -0
  474. /package/dist/{base-assets → factory-assets}/connectors/devserver.js.map +0 -0
  475. /package/dist/{base-assets → factory-assets}/connectors/flow/adapter.js.map +0 -0
  476. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/engine.d.ts +0 -0
  477. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-manifest.d.ts +0 -0
  478. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/index.d.ts +0 -0
  479. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/loader.d.ts +0 -0
  480. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/types.d.ts +0 -0
  481. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.d.ts +0 -0
  482. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.js.map +0 -0
  483. /package/dist/{base-assets → factory-assets}/connectors/flow/index.d.ts +0 -0
  484. /package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js.map +0 -0
  485. /package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.js.map +0 -0
  486. /package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.js.map +0 -0
  487. /package/dist/{base-assets → factory-assets}/connectors/flow.d.ts +0 -0
  488. /package/dist/{base-assets → factory-assets}/connectors/flow.js.map +0 -0
  489. /package/dist/{base-assets → factory-assets}/connectors/git.d.ts +0 -0
  490. /package/dist/{base-assets → factory-assets}/connectors/git.js.map +0 -0
  491. /package/dist/{base-assets → factory-assets}/connectors/gmail.d.ts +0 -0
  492. /package/dist/{base-assets → factory-assets}/connectors/gmail.js.map +0 -0
  493. /package/dist/{base-assets → factory-assets}/connectors/googledrive.d.ts +0 -0
  494. /package/dist/{base-assets → factory-assets}/connectors/googledrive.js.map +0 -0
  495. /package/dist/{base-assets → factory-assets}/connectors/local.d.ts +0 -0
  496. /package/dist/{base-assets → factory-assets}/connectors/local.js.map +0 -0
  497. /package/dist/{base-assets → factory-assets}/connectors/mattermost.d.ts +0 -0
  498. /package/dist/{base-assets → factory-assets}/connectors/mattermost.js.map +0 -0
  499. /package/dist/{base-assets → factory-assets}/connectors/memory.d.ts +0 -0
  500. /package/dist/{base-assets → factory-assets}/connectors/memory.js.map +0 -0
  501. /package/dist/{base-assets → factory-assets}/connectors/minio.d.ts +0 -0
  502. /package/dist/{base-assets → factory-assets}/connectors/minio.js.map +0 -0
  503. /package/dist/{base-assets → factory-assets}/connectors/postgres.d.ts +0 -0
  504. /package/dist/{base-assets → factory-assets}/connectors/postgres.js.map +0 -0
  505. /package/dist/{base-assets → factory-assets}/connectors/s3.d.ts +0 -0
  506. /package/dist/{base-assets → factory-assets}/connectors/s3.js.map +0 -0
  507. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.d.ts +0 -0
  508. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.js.map +0 -0
  509. /package/dist/{base-assets → factory-assets}/connectors/sqlite.d.ts +0 -0
  510. /package/dist/{base-assets → factory-assets}/connectors/sqlite.js.map +0 -0
  511. /package/dist/{base-assets → factory-assets}/connectors/static-server.d.ts +0 -0
  512. /package/dist/{base-assets → factory-assets}/connectors/static-server.js.map +0 -0
  513. /package/dist/{base-assets → factory-assets}/connectors/tunnel.d.ts +0 -0
  514. /package/dist/{base-assets → factory-assets}/connectors/tunnel.js.map +0 -0
  515. /package/dist/{base-assets → factory-assets}/connectors/webdav.d.ts +0 -0
  516. /package/dist/{base-assets → factory-assets}/connectors/webdav.js.map +0 -0
  517. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.d.ts +0 -0
  518. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.js.map +0 -0
  519. /package/dist/{base-assets → factory-assets}/connectors/xstate.d.ts +0 -0
  520. /package/dist/{base-assets → factory-assets}/connectors/xstate.js.map +0 -0
package/dist/cli/index.js CHANGED
@@ -1,62 +1,63 @@
1
1
  #!/usr/bin/env node
2
- import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-46COM7M5.js';
2
+ import { AI_RESOURCES, aiResourceRoots } from '../chunk-4SQ6Y6U7.js';
3
+ import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-7OBGSR7O.js';
3
4
  import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-WSZAFRQL.js';
4
- import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-AFLH7B64.js';
5
- import { AI_RESOURCES } from '../chunk-2M3XTMOL.js';
6
- import { LocalSecretsProvider } from '../chunk-JDX54X4Y.js';
7
- import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-2F3RUZXC.js';
5
+ import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-XGLGS5B4.js';
6
+ import { LocalSecretsProvider } from '../chunk-7GWYRVAX.js';
7
+ import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-RTAIGPTF.js';
8
8
  import '../chunk-R7FOF242.js';
9
- import '../chunk-LJ52ZKIU.js';
9
+ import '../chunk-JIQLLZ65.js';
10
10
  import '../chunk-OKRUTSG7.js';
11
- import { runFlow, resumeFlow } from '../chunk-OYRW5RCM.js';
12
- import '../chunk-GCJXPUHG.js';
13
- import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-IPUYL6TD.js';
14
- import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-JQBHCJ6N.js';
15
- import { buildClaudePluginFiles } from '../chunk-J2TITSXF.js';
11
+ import { runFlow, resumeFlow } from '../chunk-QHXS3YDV.js';
12
+ import '../chunk-ZONCCO5N.js';
13
+ import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-TV72ZJYN.js';
14
+ import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-WD4LP66U.js';
15
+ import { buildClaudePluginFiles } from '../chunk-BQRRBGDE.js';
16
16
  import '../chunk-X5YPJV4N.js';
17
+ import '../chunk-TDSRLMDB.js';
17
18
  import '../chunk-O7SG5PC2.js';
18
19
  import '../chunk-7QBNJTTQ.js';
19
20
  import '../chunk-GTS2FODO.js';
20
21
  import '../chunk-WQ7DE5UC.js';
21
22
  import '../chunk-32NA4TVC.js';
22
23
  import '../chunk-W3UDISS2.js';
23
- import '../chunk-TDSRLMDB.js';
24
- import '../chunk-M5TE6YI5.js';
25
- import '../chunk-DQWREFRQ.js';
26
- import '../chunk-KOVLSBXK.js';
24
+ import '../chunk-23M4XZQW.js';
25
+ import '../chunk-BMQKMOQY.js';
26
+ import '../chunk-PAYAFNXG.js';
27
27
  import '../chunk-RRVQAE5D.js';
28
- import '../chunk-6VTG73UY.js';
28
+ import '../chunk-45H3UO2R.js';
29
29
  import '../chunk-LV2HPH3C.js';
30
- import '../chunk-HIIARTRZ.js';
31
- import '../chunk-ODPII24X.js';
30
+ import '../chunk-YDTW4GT6.js';
31
+ import '../chunk-ZYDE52WE.js';
32
32
  import '../chunk-QMONOHXT.js';
33
- import '../chunk-QAVZOJCV.js';
33
+ import '../chunk-OVRSNIKJ.js';
34
34
  import '../chunk-6E6PKKAD.js';
35
- import { loadAllFlows } from '../chunk-ICS76R4T.js';
36
- import '../chunk-GZWJGNNN.js';
37
- import '../chunk-FVTV7M76.js';
38
- import { AssetManager } from '../chunk-N6TA6RSH.js';
39
- import '../chunk-2RFOFHSM.js';
40
- import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-Z3M5K67G.js';
35
+ import { loadFlow, loadAllFlows } from '../chunk-W7W66MDZ.js';
36
+ import '../chunk-DEYYRFQU.js';
37
+ import '../chunk-IFGTRL2I.js';
38
+ import { AssetManager } from '../chunk-PY7AQRGH.js';
39
+ import '../chunk-BKF3UFF4.js';
40
+ import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-KL2MQ6WI.js';
41
41
  import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
42
- import '../chunk-KLNL7QHN.js';
43
- import '../chunk-5ESCS2OS.js';
44
- import { resolveSkWorkspaceConfig, resolveAgentDir, decodeSkaileYaml, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-542K7SR6.js';
45
- import { parseFrontmatter } from '../chunk-DH4N5AW4.js';
46
- import { ASSET_KINDS, assetRefToStr } from '../chunk-YX3UWPJ5.js';
42
+ import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
43
+ import '../chunk-C32BRO2W.js';
44
+ import { resolveAgentDir, resolveSkWorkspaceConfig, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-Z5DI7PDG.js';
45
+ import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest } from '../chunk-IERB3UXJ.js';
46
+ import { parseFrontmatter } from '../chunk-2FS4FPZ7.js';
47
+ import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-IEJ5IOC3.js';
47
48
  import '../chunk-JKNWJ64A.js';
48
49
  import { SUPPORTED_DRIVER_TARGETS } from '../chunk-O4JH3KUE.js';
49
50
  import { openSqlite } from '../chunk-24UIWON4.js';
50
51
  import '../chunk-KTBKW2FI.js';
51
52
  import '../chunk-UQ6LFBPZ.js';
52
- import '../chunk-6FNCZYJY.js';
53
- import '../chunk-NELZIQ2E.js';
53
+ import '../chunk-MBOR7D65.js';
54
+ import '../chunk-QDJKE557.js';
54
55
  import '../chunk-CGYEHQOX.js';
55
56
  import '../chunk-NSBPE2FW.js';
56
- import * as fs10 from 'fs';
57
- import fs10__default, { readFileSync, existsSync, writeFileSync, readdirSync, rmSync, statSync } from 'fs';
58
- import * as path14 from 'path';
59
- import path14__default, { resolve, join } from 'path';
57
+ import * as fs11 from 'fs';
58
+ import fs11__default, { readFileSync, existsSync, writeFileSync, readdirSync, rmSync, statSync } from 'fs';
59
+ import * as path15 from 'path';
60
+ import path15__default, { resolve, join } from 'path';
60
61
  import { fileURLToPath } from 'url';
61
62
  import { Help, Command, Option } from 'commander';
62
63
  import * as p5 from '@clack/prompts';
@@ -65,7 +66,7 @@ import * as readline from 'readline';
65
66
  import { createInterface } from 'readline';
66
67
  import { execSync, spawnSync } from 'child_process';
67
68
  import { homedir } from 'os';
68
- import fs5 from 'fs/promises';
69
+ import fs6 from 'fs/promises';
69
70
  import { parse as parse$1, stringify } from 'smol-toml';
70
71
  import { createTRPCUntypedClient, httpLink, httpSubscriptionLink } from '@trpc/client';
71
72
  import { parse } from 'yaml';
@@ -78,7 +79,7 @@ function makeAssetCommand() {
78
79
  logErr(`Invalid --mode "${opts.mode}". Expected: copy | move | link.`);
79
80
  process.exit(1);
80
81
  }
81
- if (!fs10.existsSync(srcPath)) {
82
+ if (!fs11.existsSync(srcPath)) {
82
83
  logErr(`Source path does not exist: ${srcPath}`);
83
84
  process.exit(1);
84
85
  }
@@ -105,23 +106,23 @@ function makeAssetCommand() {
105
106
  );
106
107
  process.exit(1);
107
108
  }
108
- const basename2 = path14.basename(srcPath);
109
- const destDir = target.structure === "domain" && opts.domain ? path14.join(target.path, opts.domain) : target.path;
110
- fs10.mkdirSync(destDir, { recursive: true });
111
- const destPath = path14.join(destDir, basename2);
112
- if (fs10.existsSync(destPath)) {
109
+ const basename2 = path15.basename(srcPath);
110
+ const destDir = target.structure === "domain" && opts.domain ? path15.join(target.path, opts.domain) : target.path;
111
+ fs11.mkdirSync(destDir, { recursive: true });
112
+ const destPath = path15.join(destDir, basename2);
113
+ if (fs11.existsSync(destPath)) {
113
114
  logErr(`Destination already exists: ${destPath}`);
114
115
  process.exit(1);
115
116
  }
116
117
  switch (opts.mode) {
117
118
  case "copy":
118
- fs10.cpSync(srcPath, destPath, { recursive: true });
119
+ fs11.cpSync(srcPath, destPath, { recursive: true });
119
120
  break;
120
121
  case "move":
121
- fs10.renameSync(srcPath, destPath);
122
+ fs11.renameSync(srcPath, destPath);
122
123
  break;
123
124
  case "link":
124
- fs10.symlinkSync(path14.resolve(srcPath), destPath);
125
+ fs11.symlinkSync(path15.resolve(srcPath), destPath);
125
126
  break;
126
127
  }
127
128
  if (target.backend === "git" && opts.commit) {
@@ -169,17 +170,17 @@ function makeAssetCommand() {
169
170
  }
170
171
  const manifestPath = def.manifest.path;
171
172
  const candidateSubpath = typeof manifestPath === "string" && manifestPath.length > 0 ? manifestPath : def.name;
172
- const srcPath = path14.join(lib.path, candidateSubpath);
173
- if (!fs10.existsSync(srcPath)) {
173
+ const srcPath = path15.join(lib.path, candidateSubpath);
174
+ if (!fs11.existsSync(srcPath)) {
174
175
  logErr(`Asset path not found: ${srcPath}`);
175
176
  process.exit(1);
176
177
  }
177
- const destPath = path14.join(target, candidateSubpath);
178
- fs10.mkdirSync(path14.dirname(destPath), { recursive: true });
178
+ const destPath = path15.join(target, candidateSubpath);
179
+ fs11.mkdirSync(path15.dirname(destPath), { recursive: true });
179
180
  if (opts.mode === "copy") {
180
- fs10.cpSync(srcPath, destPath, { recursive: true });
181
+ fs11.cpSync(srcPath, destPath, { recursive: true });
181
182
  } else {
182
- fs10.symlinkSync(path14.resolve(srcPath), destPath);
183
+ fs11.symlinkSync(path15.resolve(srcPath), destPath);
183
184
  }
184
185
  logOk(`Installed ${ref} \u2192 ${destPath} (${opts.mode})`);
185
186
  } finally {
@@ -273,7 +274,7 @@ function makeSearchCommand() {
273
274
  const showLocal = !opts.store;
274
275
  const showStore = !opts.local;
275
276
  if (showLocal) {
276
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
277
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
277
278
  const entries = am2.search(query, kind);
278
279
  if (entries.length === 0) {
279
280
  if (!showStore) {
@@ -310,7 +311,7 @@ function makeSearchCommand() {
310
311
  }
311
312
  if (showStore) {
312
313
  try {
313
- const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-AEI6Y3KD.js');
314
+ const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-CENBEASX.js');
314
315
  const config = getStoreConfig2();
315
316
  const params = {};
316
317
  if (query) params.q = query;
@@ -339,7 +340,7 @@ function makeSearchCommand() {
339
340
  function makeAddCommand() {
340
341
  return new Command("add").description("Add to skaile.yaml + deploy").argument("<ref>", "Asset reference (kind:name[@repo])").option("--project-dir <path>", "Project directory", process.cwd()).option("--global", "Deploy to global dir (~/.claude)").option("--target <agent>", "Driver target", "claude-code").action(async (ref, opts) => {
341
342
  const am2 = new AssetManager({
342
- projectDir: path14__default.resolve(opts.projectDir),
343
+ projectDir: path15__default.resolve(opts.projectDir),
343
344
  global: opts.global,
344
345
  driverTarget: opts.target
345
346
  });
@@ -360,7 +361,7 @@ function makeAddCommand() {
360
361
  function makeRemoveCommand() {
361
362
  return new Command("remove").description("Remove from skaile.yaml + undeploy").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).option("--global", "Remove from global dir").option("--target <agent>", "Driver target", "claude-code").action((ref, opts) => {
362
363
  const am2 = new AssetManager({
363
- projectDir: path14__default.resolve(opts.projectDir),
364
+ projectDir: path15__default.resolve(opts.projectDir),
364
365
  global: opts.global,
365
366
  driverTarget: opts.target
366
367
  });
@@ -374,7 +375,7 @@ function makeListCommand() {
374
375
  new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
375
376
  ).action((kind, opts) => {
376
377
  const am2 = new AssetManager({
377
- projectDir: path14__default.resolve(opts.projectDir),
378
+ projectDir: path15__default.resolve(opts.projectDir),
378
379
  global: opts.global,
379
380
  driverTarget: opts.target
380
381
  });
@@ -398,7 +399,7 @@ function makeListCommand() {
398
399
  }
399
400
  function makeInfoCommand() {
400
401
  return new Command("info").description("Show asset metadata, deps, deploy status").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
401
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
402
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
402
403
  const entry = am2.info(ref);
403
404
  if (!entry) {
404
405
  logErr(
@@ -431,7 +432,7 @@ function makeCreateCommand() {
431
432
  new Option("-k, --kind <kind>", "Asset kind").default("skill").choices([...ASSET_KINDS])
432
433
  ).option("-d, --dir <dir>", "Target directory (default: cwd)").action((name, opts) => {
433
434
  const am2 = new AssetManager({ projectDir: process.cwd() });
434
- const destDir = opts.dir ? path14__default.resolve(opts.dir) : process.cwd();
435
+ const destDir = opts.dir ? path15__default.resolve(opts.dir) : process.cwd();
435
436
  const result = am2.create(name, opts.kind, destDir);
436
437
  if (result.ok) logOk(`Created ${kindColor(opts.kind)}: ${pc5.dim(result.path)}`);
437
438
  else {
@@ -442,7 +443,7 @@ function makeCreateCommand() {
442
443
  }
443
444
  function makeDoctorCommand() {
444
445
  return new Command("doctor").description("Scan for missing dependency chains").argument("[name]", "Check a specific asset (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((name, opts) => {
445
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
446
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
446
447
  const issues = am2.doctor();
447
448
  if (issues.length === 0) {
448
449
  logOk("No missing dependencies.");
@@ -468,11 +469,11 @@ function makeCatalogCommand() {
468
469
  const catalog = new Command("catalog").description("Catalog source health and configuration");
469
470
  catalog.command("test").description("Probe the configured catalog source and report status").option("--project-dir <path>", "Project directory (for project-level config overlay)").option("--url <url>", "Override the catalog URL for this probe").option("--force", "Probe the network even in air-gapped mode (cache_ttl: 0)").action(async (opts) => {
470
471
  const { resolveConfig, isLocalCatalogUrl, trpcGetUrl } = await import('../library/index.js');
471
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : void 0;
472
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
472
473
  const cfg = resolveConfig({ projectDir });
473
474
  const baseUrl = opts.url ?? cfg.catalog.url;
474
475
  if (isLocalCatalogUrl(baseUrl)) {
475
- const { resolveCatalogSource } = await import('../open-library-67FSSQWE.js');
476
+ const { resolveCatalogSource } = await import('../open-library-WYASW4BH.js');
476
477
  let resolved;
477
478
  try {
478
479
  resolved = await resolveCatalogSource({ projectDir: opts.projectDir });
@@ -561,7 +562,7 @@ function makeCatalogCommand() {
561
562
  });
562
563
  catalog.command("info").description("Print the resolved catalog configuration (url, framing, cacheTtlMs)").option("--project-dir <path>", "Project directory (for project-level config overlay)").action(async (opts) => {
563
564
  const { resolveConfig } = await import('../library/index.js');
564
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : void 0;
565
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
565
566
  const cfg = resolveConfig({ projectDir });
566
567
  console.log(`url: ${cfg.catalog.url}`);
567
568
  console.log(`framing: ${cfg.catalog.framing}`);
@@ -613,23 +614,48 @@ complete -F _${bin}_completion ${bin}`,
613
614
  end
614
615
  complete -c ${bin} -f -a '(__${bin}_complete)'`
615
616
  };
617
+ function discoverFlows() {
618
+ const byId = /* @__PURE__ */ new Map();
619
+ for (const root of aiResourceRoots()) {
620
+ for (const flow of loadAllFlows(root)) {
621
+ if (!byId.has(flow.id)) byId.set(flow.id, flow);
622
+ }
623
+ }
624
+ return [...byId.values()];
625
+ }
626
+ function findFlowFile(flowId, priorityRoots = []) {
627
+ for (const root of [...priorityRoots, ...aiResourceRoots()]) {
628
+ for (const { dir } of assetSearchDirs(root, "flows")) {
629
+ for (const ext of [".flow.yaml", ".flow.json", ".json"]) {
630
+ const candidate = path15__default.join(dir, `${flowId}${ext}`);
631
+ if (fs11__default.existsSync(candidate)) return candidate;
632
+ }
633
+ }
634
+ }
635
+ return void 0;
636
+ }
616
637
  function findSkills(domain) {
617
- const skills = [];
618
- if (!fs10__default.existsSync(AI_RESOURCES)) return skills;
619
- const domains = fs10__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory()).filter((d) => true);
620
- for (const d of domains) {
621
- const skillsDir = path14__default.join(AI_RESOURCES, d.name, "skills");
622
- if (!fs10__default.existsSync(skillsDir)) continue;
623
- walkSkills(skillsDir, d.name, skills);
638
+ const found = [];
639
+ for (const root of aiResourceRoots()) {
640
+ for (const { dir, domain: dirDomain } of assetSearchDirs(root, "skills")) {
641
+ if (fs11__default.existsSync(dir)) walkSkills(dir, dirDomain, found);
642
+ }
624
643
  }
625
- return skills;
644
+ const seen = /* @__PURE__ */ new Set();
645
+ const deduped = [];
646
+ for (const s of found) {
647
+ if (seen.has(s.name)) continue;
648
+ seen.add(s.name);
649
+ deduped.push(s);
650
+ }
651
+ return deduped;
626
652
  }
627
653
  function walkSkills(dir, domain, out) {
628
- for (const entry of fs10__default.readdirSync(dir, { withFileTypes: true })) {
629
- const full = path14__default.join(dir, entry.name);
654
+ for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
655
+ const full = path15__default.join(dir, entry.name);
630
656
  if (entry.isDirectory()) {
631
- const skillMd = path14__default.join(full, "SKILL.md");
632
- if (fs10__default.existsSync(skillMd)) {
657
+ const skillMd = path15__default.join(full, "SKILL.md");
658
+ if (fs11__default.existsSync(skillMd)) {
633
659
  out.push({ name: entry.name, path: full, skillPath: skillMd, domain });
634
660
  } else {
635
661
  walkSkills(full, domain, out);
@@ -643,21 +669,24 @@ function resolveSkillNames() {
643
669
  return findSkills().map((s) => s.name);
644
670
  }
645
671
  function resolveDomains() {
646
- if (!fs10__default.existsSync(AI_RESOURCES)) return [];
647
- return fs10__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
672
+ const domains = /* @__PURE__ */ new Set();
673
+ for (const root of aiResourceRoots()) {
674
+ for (const d of detectDomains(root)) domains.add(d.id);
675
+ }
676
+ return [...domains];
648
677
  }
649
678
  function resolveFlowIds() {
650
679
  try {
651
- return loadAllFlows(AI_RESOURCES).map((f) => f.id);
680
+ return discoverFlows().map((f) => f.id);
652
681
  } catch {
653
682
  return [];
654
683
  }
655
684
  }
656
685
  function resolveSessionIds(projectDir) {
657
- const sessionsDir = path14__default.join(projectDir, ".skaile", "sessions");
658
- if (!fs10__default.existsSync(sessionsDir)) return [];
686
+ const sessionsDir = path15__default.join(projectDir, ".skaile", "sessions");
687
+ if (!fs11__default.existsSync(sessionsDir)) return [];
659
688
  try {
660
- return fs10__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
689
+ return fs11__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
661
690
  } catch {
662
691
  return [];
663
692
  }
@@ -712,73 +741,74 @@ function resolveDynamic(words, cword) {
712
741
  }
713
742
  var PERSONAL_KEYS = /* @__PURE__ */ new Set(["driver", "model", "provider"]);
714
743
  var API_KEY_PREFIX = "apiKey.";
715
- function makeConfigCommand() {
716
- const cmd = new Command("config").description("Manage personal config (.skaile/settings.json)");
717
- cmd.command("show").description("Show effective config with sources").option("--project-dir <path>", "Project directory").action(async (opts) => {
718
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : process.cwd();
719
- const config = await resolveSettings(projectDir);
720
- const wsDefaults = {};
721
- try {
722
- const ws = resolveSkWorkspaceConfig(projectDir);
723
- const p7 = ws.agent_config?.default ?? {};
724
- if (p7.driver) wsDefaults.driver = p7.driver;
725
- if (p7.provider) wsDefaults.provider = p7.provider;
726
- if (p7.model) wsDefaults.model = p7.model;
727
- if (p7.skills_dir) wsDefaults.skills_dir = p7.skills_dir;
728
- if (p7.agents_dir) wsDefaults.agents_dir = p7.agents_dir;
729
- if (p7.prompts_dir) wsDefaults.prompts_dir = p7.prompts_dir;
730
- } catch {
744
+ async function showConfig(opts) {
745
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
746
+ const config = await resolveSettings(projectDir);
747
+ const wsDefaults = {};
748
+ try {
749
+ const ws = resolveSkWorkspaceConfig(projectDir);
750
+ const p7 = ws.agent_config?.default ?? {};
751
+ if (p7.driver) wsDefaults.driver = p7.driver;
752
+ if (p7.provider) wsDefaults.provider = p7.provider;
753
+ if (p7.model) wsDefaults.model = p7.model;
754
+ if (p7.skills_dir) wsDefaults.skills_dir = p7.skills_dir;
755
+ if (p7.agents_dir) wsDefaults.agents_dir = p7.agents_dir;
756
+ if (p7.prompts_dir) wsDefaults.prompts_dir = p7.prompts_dir;
757
+ } catch {
758
+ }
759
+ console.log();
760
+ console.log(S.heading(" Effective Config"));
761
+ console.log(` ${S.rule(40)}`);
762
+ for (const key of ["driver", "provider", "model"]) {
763
+ const value = config[key];
764
+ if (value !== void 0) {
765
+ console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
731
766
  }
767
+ }
768
+ if (Object.keys(wsDefaults).length > 0) {
732
769
  console.log();
733
- console.log(S.heading(" Effective Config"));
770
+ console.log(` ${S.heading("Workspace Defaults")} ${S.dim("(skaile.yaml)")}`);
734
771
  console.log(` ${S.rule(40)}`);
735
- for (const key of ["driver", "provider", "model"]) {
736
- const value = config[key];
737
- if (value !== void 0) {
738
- console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
739
- }
740
- }
741
- if (Object.keys(wsDefaults).length > 0) {
742
- console.log();
743
- console.log(` ${S.heading("Workspace Defaults")} ${S.dim("(skaile.yaml)")}`);
744
- console.log(` ${S.rule(40)}`);
745
- for (const [key, value] of Object.entries(wsDefaults)) {
746
- console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
747
- }
772
+ for (const [key, value] of Object.entries(wsDefaults)) {
773
+ console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
748
774
  }
749
- if (config.apiKeys && Object.keys(config.apiKeys).length > 0) {
750
- console.log();
751
- console.log(` ${S.heading("API Keys")}`);
752
- console.log(` ${S.rule(40)}`);
753
- for (const [provider, key] of Object.entries(config.apiKeys)) {
754
- const fromEnv = !!process.env[`${provider.toUpperCase()}_API_KEY`];
755
- if (key) {
756
- console.log(
757
- ` ${S.label(`${provider}:`.padEnd(16))} ****${key.slice(-4)}` + (fromEnv ? ` ${S.dim("[env]")}` : "")
758
- );
759
- }
775
+ }
776
+ if (config.apiKeys && Object.keys(config.apiKeys).length > 0) {
777
+ console.log();
778
+ console.log(` ${S.heading("API Keys")}`);
779
+ console.log(` ${S.rule(40)}`);
780
+ for (const [provider, key] of Object.entries(config.apiKeys)) {
781
+ const fromEnv = !!process.env[`${provider.toUpperCase()}_API_KEY`];
782
+ if (key) {
783
+ console.log(
784
+ ` ${S.label(`${provider}:`.padEnd(16))} ****${key.slice(-4)}` + (fromEnv ? ` ${S.dim("[env]")}` : "")
785
+ );
760
786
  }
761
787
  }
762
- const fw = config.driver ?? "omp";
763
- const paths = DRIVER_DEFAULTS[fw] ?? DRIVER_DEFAULTS.omp;
764
- if (paths) {
765
- console.log();
766
- console.log(` ${S.heading("Resolved Paths")} ${S.dim(`(${fw})`)}`);
767
- console.log(` ${S.rule(40)}`);
768
- console.log(` ${S.label("skills:".padEnd(16))} ${config.skillsDir ?? paths.skillsDir}`);
769
- console.log(` ${S.label("agents:".padEnd(16))} ${config.agentsDir ?? paths.agentsDir}`);
770
- console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
771
- }
788
+ }
789
+ const fw = config.driver ?? "omp";
790
+ const paths = DRIVER_DEFAULTS[fw] ?? DRIVER_DEFAULTS.omp;
791
+ if (paths) {
772
792
  console.log();
773
- });
793
+ console.log(` ${S.heading("Resolved Paths")} ${S.dim(`(${fw})`)}`);
794
+ console.log(` ${S.rule(40)}`);
795
+ console.log(` ${S.label("skills:".padEnd(16))} ${config.skillsDir ?? paths.skillsDir}`);
796
+ console.log(` ${S.label("agents:".padEnd(16))} ${config.agentsDir ?? paths.agentsDir}`);
797
+ console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
798
+ }
799
+ console.log();
800
+ }
801
+ function makeConfigCommand() {
802
+ const cmd = new Command("config").description("Manage personal config (.skaile/settings.json)");
803
+ cmd.command("show").description("Show effective config with sources").option("--project-dir <path>", "Project directory").action((opts) => showConfig(opts));
774
804
  cmd.command("get <key>").description("Get an effective config value").option("--project-dir <path>", "Project directory").action(async (key, opts) => {
775
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : process.cwd();
805
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
776
806
  const config = await resolveSettings(projectDir);
777
807
  const value = config[key];
778
808
  console.log(value ?? S.dim("(not set)"));
779
809
  });
780
810
  cmd.command("set <key> <value>").description("Set a personal config value (driver, model, provider, apiKey.<provider>)").option("--project-dir <path>", "Project directory").option("--global", "Write to ~/.skaile/settings.json instead of project-local").action(async (key, value, opts) => {
781
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : process.cwd();
811
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
782
812
  const isApiKey = key.startsWith(API_KEY_PREFIX);
783
813
  if (!PERSONAL_KEYS.has(key) && !isApiKey) {
784
814
  logErr(
@@ -802,9 +832,7 @@ function makeConfigCommand() {
802
832
  }
803
833
  console.log(S.dim(` \u2192 ${filePath}`));
804
834
  });
805
- cmd.action(() => {
806
- cmd.commands.find((c) => c.name() === "show").parse(process.argv);
807
- });
835
+ cmd.action(() => showConfig({}));
808
836
  return cmd;
809
837
  }
810
838
  function parseShorthand(input) {
@@ -954,6 +982,22 @@ function makeConnectCommand() {
954
982
  await client.disconnect();
955
983
  });
956
984
  }
985
+ function parsePositiveIntOption(value) {
986
+ const n = Number.parseInt(value, 10);
987
+ if (!Number.isFinite(n) || n <= 0) {
988
+ throw new Error(`--limit must be a positive integer (got ${value})`);
989
+ }
990
+ return n;
991
+ }
992
+ function scanFactoryConnectors(scanDirectory, roots) {
993
+ const byName = /* @__PURE__ */ new Map();
994
+ for (const dir of roots) {
995
+ for (const e of scanDirectory(dir, "factory-assets")) {
996
+ if (e.kind === "connector" && !byName.has(e.name)) byName.set(e.name, e);
997
+ }
998
+ }
999
+ return [...byName.values()];
1000
+ }
957
1001
  async function connectConnectors(projectDir) {
958
1002
  const res = await import('../connectors/index.js');
959
1003
  res.registerBuiltinConnectors();
@@ -1056,11 +1100,8 @@ async function promptField(field) {
1056
1100
  function makeConnectorCommand() {
1057
1101
  const cmd = new Command("connector").description("Operate on connectors in a workspace");
1058
1102
  cmd.command("catalog").description("List all available connector drivers and their dependencies").action(async () => {
1059
- const { scanDirectory, resolveBaseAssetsRoot } = await import('../core/index.js');
1060
- const baseAssetsDir = resolveBaseAssetsRoot();
1061
- const entries = scanDirectory(baseAssetsDir, "base-assets").filter(
1062
- (e) => e.kind === "connector"
1063
- );
1103
+ const { scanDirectory, factoryAssetRoots } = await import('../core/index.js');
1104
+ const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
1064
1105
  if (entries.length === 0) {
1065
1106
  console.log("No connector descriptors found.");
1066
1107
  return;
@@ -1084,17 +1125,14 @@ function makeConnectorCommand() {
1084
1125
  cmd.command("add <driver>").option("--id <id>", "Connector instance ID (defaults to driver name)").option("--access <level>", "Access level: read-only | read-write", "read-only").option("--no-install", "Skip npm dependency installation").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Add a connector to skaile.yaml and install its npm deps").action(
1085
1126
  async (driver, opts) => {
1086
1127
  const { installNpmPackages } = await import('../connectors/index.js');
1087
- const { scanDirectory, resolveBaseAssetsRoot, WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
1088
- const projectDir = path14__default.resolve(opts.projectDir);
1089
- const yamlPath = path14__default.join(projectDir, "skaile.yaml");
1128
+ const { scanDirectory, factoryAssetRoots, WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
1129
+ const projectDir = path15__default.resolve(opts.projectDir);
1130
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
1090
1131
  if (!existsSync(yamlPath)) {
1091
1132
  logErr("No skaile.yaml found in current directory. Run 'skaile init' first.");
1092
1133
  process.exit(1);
1093
1134
  }
1094
- const baseAssetsDir = resolveBaseAssetsRoot();
1095
- const entries = scanDirectory(baseAssetsDir, "base-assets").filter(
1096
- (e) => e.kind === "connector"
1097
- );
1135
+ const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
1098
1136
  const entry = entries.find((e) => e.name === driver);
1099
1137
  if (!entry) {
1100
1138
  logErr(
@@ -1149,8 +1187,8 @@ ${installResult.output}`);
1149
1187
  );
1150
1188
  cmd.command("remove <id>").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Remove a connector from skaile.yaml by its instance ID").action(async (id, opts) => {
1151
1189
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
1152
- const projectDir = path14__default.resolve(opts.projectDir);
1153
- const yamlPath = path14__default.join(projectDir, "skaile.yaml");
1190
+ const projectDir = path15__default.resolve(opts.projectDir);
1191
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
1154
1192
  if (!existsSync(yamlPath)) {
1155
1193
  logErr("No skaile.yaml found in current directory.");
1156
1194
  process.exit(1);
@@ -1167,7 +1205,7 @@ ${installResult.output}`);
1167
1205
  cmd.command("status [id]").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Connect and report health status for one or all connectors").action(async (id, opts) => {
1168
1206
  const res = await import('../connectors/index.js');
1169
1207
  res.registerBuiltinConnectors();
1170
- const projectDir = path14__default.resolve(opts.projectDir);
1208
+ const projectDir = path15__default.resolve(opts.projectDir);
1171
1209
  const declarations = res.loadConnectorDeclarations(projectDir);
1172
1210
  if (declarations.length === 0) {
1173
1211
  console.log("No connectors configured in skaile.yaml.");
@@ -1191,7 +1229,7 @@ ${installResult.output}`);
1191
1229
  await manager.disconnectAll();
1192
1230
  });
1193
1231
  cmd.command("list").description("List all configured connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (opts) => {
1194
- const projectDir = path14__default.resolve(opts.projectDir);
1232
+ const projectDir = path15__default.resolve(opts.projectDir);
1195
1233
  const manager = await connectConnectors(projectDir);
1196
1234
  try {
1197
1235
  console.log(JSON.stringify(manager.listConnectors(), null, 2));
@@ -1200,7 +1238,7 @@ ${installResult.output}`);
1200
1238
  }
1201
1239
  });
1202
1240
  cmd.command("sync [id]").description("Re-sync a filesystem-face connector or all of them (git pull, S3 refresh, etc.)").option("--all", "Sync all connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, opts) => {
1203
- const projectDir = path14__default.resolve(opts.projectDir);
1241
+ const projectDir = path15__default.resolve(opts.projectDir);
1204
1242
  const manager = await connectConnectors(projectDir);
1205
1243
  try {
1206
1244
  if (opts.all) {
@@ -1224,7 +1262,7 @@ ${installResult.output}`);
1224
1262
  }
1225
1263
  });
1226
1264
  cmd.command("ops <id>").description("List available operations for a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, opts) => {
1227
- const projectDir = path14__default.resolve(opts.projectDir);
1265
+ const projectDir = path15__default.resolve(opts.projectDir);
1228
1266
  const manager = await connectConnectors(projectDir);
1229
1267
  try {
1230
1268
  if (!manager.has(id)) {
@@ -1239,7 +1277,7 @@ ${installResult.output}`);
1239
1277
  }
1240
1278
  });
1241
1279
  cmd.command("read <id> <resource-path>").description("Read content from a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, opts) => {
1242
- const projectDir = path14__default.resolve(opts.projectDir);
1280
+ const projectDir = path15__default.resolve(opts.projectDir);
1243
1281
  const manager = await connectConnectors(projectDir);
1244
1282
  try {
1245
1283
  const content = await manager.read(id, resourcePath);
@@ -1249,7 +1287,7 @@ ${installResult.output}`);
1249
1287
  }
1250
1288
  });
1251
1289
  cmd.command("write <id> <resource-path> <content>").description("Write content to a connector at a path").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, content, opts) => {
1252
- const projectDir = path14__default.resolve(opts.projectDir);
1290
+ const projectDir = path15__default.resolve(opts.projectDir);
1253
1291
  const manager = await connectConnectors(projectDir);
1254
1292
  try {
1255
1293
  await manager.write(id, resourcePath, { data: content });
@@ -1258,8 +1296,8 @@ ${installResult.output}`);
1258
1296
  await manager.disconnectAll();
1259
1297
  }
1260
1298
  });
1261
- cmd.command("entries <id> [resource-path]").description("List entries in a connector (files, keys, rows, etc)").option("--project-dir <path>", "Workspace directory", process.cwd()).option("--recursive", "Include nested entries").option("--limit <n>", "Maximum entries to return", parseInt).action(async (id, resourcePath, opts) => {
1262
- const projectDir = path14__default.resolve(opts.projectDir);
1299
+ cmd.command("entries <id> [resource-path]").description("List entries in a connector (files, keys, rows, etc)").option("--project-dir <path>", "Workspace directory", process.cwd()).option("--recursive", "Include nested entries").option("--limit <n>", "Maximum entries to return", parsePositiveIntOption).action(async (id, resourcePath, opts) => {
1300
+ const projectDir = path15__default.resolve(opts.projectDir);
1263
1301
  const manager = await connectConnectors(projectDir);
1264
1302
  try {
1265
1303
  const entries = await manager.list(id, resourcePath, {
@@ -1272,7 +1310,7 @@ ${installResult.output}`);
1272
1310
  }
1273
1311
  });
1274
1312
  cmd.command("search <id> <query>").description("Search within a connector for matching content").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, query, opts) => {
1275
- const projectDir = path14__default.resolve(opts.projectDir);
1313
+ const projectDir = path15__default.resolve(opts.projectDir);
1276
1314
  const manager = await connectConnectors(projectDir);
1277
1315
  try {
1278
1316
  const results = await manager.search(id, query);
@@ -1282,7 +1320,7 @@ ${installResult.output}`);
1282
1320
  }
1283
1321
  });
1284
1322
  cmd.command("delete <id> <resource-path>").description("Delete an entry from a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, opts) => {
1285
- const projectDir = path14__default.resolve(opts.projectDir);
1323
+ const projectDir = path15__default.resolve(opts.projectDir);
1286
1324
  const manager = await connectConnectors(projectDir);
1287
1325
  try {
1288
1326
  const ok = await manager.delete(id, resourcePath);
@@ -1292,7 +1330,7 @@ ${installResult.output}`);
1292
1330
  }
1293
1331
  });
1294
1332
  cmd.command("run <id> <op> [args...]").description("Run a custom adapter operation (e.g. git log, sqlite query)").option("--project-dir <path>", "Workspace directory", process.cwd()).allowUnknownOption().action(async (id, op, args, opts) => {
1295
- const projectDir = path14__default.resolve(opts.projectDir);
1333
+ const projectDir = path15__default.resolve(opts.projectDir);
1296
1334
  const manager = await connectConnectors(projectDir);
1297
1335
  try {
1298
1336
  if (!manager.has(id)) {
@@ -1401,7 +1439,7 @@ function envRecord() {
1401
1439
  async function buildDeployContext(projectDir) {
1402
1440
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1403
1441
  const config = resolveSkWorkspaceConfig2(projectDir);
1404
- const workspaceId = config.name ?? path14__default.basename(projectDir);
1442
+ const workspaceId = config.name ?? path15__default.basename(projectDir);
1405
1443
  let log;
1406
1444
  try {
1407
1445
  const { createLogger } = await import('../core/logging.js');
@@ -1433,13 +1471,13 @@ async function ensureTargetsRegistered(projectDir) {
1433
1471
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1434
1472
  const config = resolveSkWorkspaceConfig2(projectDir);
1435
1473
  if (config.plugins && config.plugins.length > 0) {
1436
- const { ensurePluginsLoaded } = await import('../plugin-store-IZ5SCRAV.js');
1474
+ const { ensurePluginsLoaded } = await import('../plugin-store-O5VR45CA.js');
1437
1475
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
1438
1476
  for (const f of result.failed) logWarn(f.error);
1439
1477
  }
1440
1478
  }
1441
1479
  async function runUp(opts) {
1442
- const projectDir = path14__default.resolve(opts.projectDir);
1480
+ const projectDir = path15__default.resolve(opts.projectDir);
1443
1481
  await ensureTargetsRegistered(projectDir);
1444
1482
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1445
1483
  const { resolveDeployTarget, pluginRegistry } = await import('../plugin-registry/index.js');
@@ -1507,7 +1545,7 @@ async function restoreFromHandle(projectDir) {
1507
1545
  return { target, handle, ctx };
1508
1546
  }
1509
1547
  async function runDown(opts) {
1510
- const projectDir = path14__default.resolve(opts.projectDir);
1548
+ const projectDir = path15__default.resolve(opts.projectDir);
1511
1549
  const restored = await restoreFromHandle(projectDir);
1512
1550
  if (!restored) return;
1513
1551
  await restored.handle.stop();
@@ -1516,7 +1554,7 @@ async function runDown(opts) {
1516
1554
  logOk(`Stopped ${S.cmd(restored.target.id)} and cleared the handle.`);
1517
1555
  }
1518
1556
  async function runStatus(opts) {
1519
- const projectDir = path14__default.resolve(opts.projectDir);
1557
+ const projectDir = path15__default.resolve(opts.projectDir);
1520
1558
  const restored = await restoreFromHandle(projectDir);
1521
1559
  if (!restored) return;
1522
1560
  const health = await restored.handle.health();
@@ -1530,7 +1568,7 @@ async function runStatus(opts) {
1530
1568
  console.log();
1531
1569
  }
1532
1570
  async function runLogs(opts) {
1533
- const projectDir = path14__default.resolve(opts.projectDir);
1571
+ const projectDir = path15__default.resolve(opts.projectDir);
1534
1572
  const restored = await restoreFromHandle(projectDir);
1535
1573
  if (!restored) return;
1536
1574
  if (!restored.handle.logs) {
@@ -1554,7 +1592,7 @@ function makeDeployCommand() {
1554
1592
  }
1555
1593
  function makeDiffCommand() {
1556
1594
  return new Command("diff").description("Show changes between deployed and source versions").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
1557
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
1595
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
1558
1596
  const result = am2.diff(ref);
1559
1597
  if (result === null) {
1560
1598
  logInfo("No differences (or asset not found).");
@@ -1566,7 +1604,7 @@ function makeDiffCommand() {
1566
1604
  function makeFlowCommand() {
1567
1605
  const cmd = new Command("flow").description("Manage flows");
1568
1606
  cmd.command("list").description("List available flows").action(async () => {
1569
- const flows = loadAllFlows(AI_RESOURCES);
1607
+ const flows = discoverFlows();
1570
1608
  if (flows.length === 0) {
1571
1609
  logInfo("No flows found.");
1572
1610
  return;
@@ -1581,7 +1619,7 @@ function makeFlowCommand() {
1581
1619
  console.log();
1582
1620
  });
1583
1621
  cmd.command("show <id>").description("Show flow details and node graph").action(async (id) => {
1584
- const flows = loadAllFlows(AI_RESOURCES);
1622
+ const flows = discoverFlows();
1585
1623
  const flow = flows.find((f) => f.id === id);
1586
1624
  if (!flow) {
1587
1625
  logErr(`Flow not found: ${id}`);
@@ -1607,7 +1645,7 @@ function makeFlowCommand() {
1607
1645
  function makeHistoryCommand() {
1608
1646
  const cmd = new Command("history").description("Show recent add/remove/update actions");
1609
1647
  cmd.argument("[limit]", "Number of entries to show", "20").option("--project-dir <path>", "Project directory", process.cwd()).action((limitStr, opts) => {
1610
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
1648
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
1611
1649
  const limit = parseInt(limitStr, 10) || 20;
1612
1650
  const entries = am2.history(limit);
1613
1651
  if (entries.length === 0) {
@@ -1627,7 +1665,7 @@ function makeHistoryCommand() {
1627
1665
  console.log();
1628
1666
  });
1629
1667
  cmd.command("clear").description("Clear action history").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
1630
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
1668
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
1631
1669
  am2.clearHistory();
1632
1670
  logOk("History cleared.");
1633
1671
  });
@@ -1695,12 +1733,12 @@ function makeLibraryCommand() {
1695
1733
  cmd.command("init <name>").description("Create a new local library at ~/.skaile/libraries/<name>").option("--git <url>", "Initialize as a git library tracking <url>").option("--owner", "Mark as owner (default for local)").option("--contributor", "Mark as contributor").option("--reader", "Mark as reader").action(
1696
1734
  async (name, opts) => {
1697
1735
  const libDir = resolveLibraryDir();
1698
- const libPath = path14.join(libDir, name);
1736
+ const libPath = path15.join(libDir, name);
1699
1737
  const ownership = opts.contributor ? "contributor" : opts.reader ? "reader" : "owner";
1700
1738
  const { manager, close } = await openLibraryManager();
1701
1739
  try {
1702
1740
  if (opts.git) {
1703
- fs10.mkdirSync(libPath, { recursive: true });
1741
+ fs11.mkdirSync(libPath, { recursive: true });
1704
1742
  await manager.addLibrary({
1705
1743
  name,
1706
1744
  path: libPath,
@@ -1709,7 +1747,7 @@ function makeLibraryCommand() {
1709
1747
  ownership
1710
1748
  });
1711
1749
  } else {
1712
- fs10.mkdirSync(libPath, { recursive: true });
1750
+ fs11.mkdirSync(libPath, { recursive: true });
1713
1751
  await manager.addLibrary({
1714
1752
  name,
1715
1753
  path: libPath,
@@ -1768,7 +1806,7 @@ function makeLibraryCommand() {
1768
1806
  target = def;
1769
1807
  }
1770
1808
  const am2 = new AssetManager({ projectDir: process.cwd() });
1771
- const destDir = opts.dir ? path14.join(target.path, opts.dir) : target.path;
1809
+ const destDir = opts.dir ? path15.join(target.path, opts.dir) : target.path;
1772
1810
  const res = am2.create(name, opts.kind ?? kind, destDir);
1773
1811
  if (res.ok) {
1774
1812
  logOk(`Created ${opts.kind ?? kind}: ${pc5.dim(res.path)}`);
@@ -1794,13 +1832,13 @@ function makeLibraryCommand() {
1794
1832
  const { manager, close } = await openLibraryManager();
1795
1833
  try {
1796
1834
  const lib = await manager.requireLibrary(oldName);
1797
- const parent = path14.dirname(lib.path);
1798
- const newPath = path14.join(parent, newName);
1799
- if (fs10.existsSync(newPath)) {
1835
+ const parent = path15.dirname(lib.path);
1836
+ const newPath = path15.join(parent, newName);
1837
+ if (fs11.existsSync(newPath)) {
1800
1838
  logErr(`Target directory already exists: ${newPath}`);
1801
1839
  process.exit(1);
1802
1840
  }
1803
- fs10.renameSync(lib.path, newPath);
1841
+ fs11.renameSync(lib.path, newPath);
1804
1842
  await manager.updateLibrary(lib.id, { name: newName, path: newPath });
1805
1843
  logOk(`Renamed ${oldName} \u2192 ${newName}`);
1806
1844
  } finally {
@@ -1986,9 +2024,9 @@ async function printOverallStatus(projectDir, asJson) {
1986
2024
  } catch {
1987
2025
  secretsStrategy = "unavailable";
1988
2026
  }
1989
- const resolvedProjectDir = path14.resolve(projectDir);
1990
- const hasWorkspaceConfig = existsSync(path14.join(resolvedProjectDir, "skaile.yaml"));
1991
- const hasLockFile = existsSync(path14.join(resolvedProjectDir, "skaile.lock.yaml"));
2027
+ const resolvedProjectDir = path15.resolve(projectDir);
2028
+ const hasWorkspaceConfig = existsSync(path15.join(resolvedProjectDir, "skaile.yaml"));
2029
+ const hasLockFile = existsSync(path15.join(resolvedProjectDir, "skaile.lock.yaml"));
1992
2030
  let subscriptions = [];
1993
2031
  if (hasWorkspaceConfig) {
1994
2032
  try {
@@ -2292,7 +2330,7 @@ function actOnHeader(row, action3) {
2292
2330
  return false;
2293
2331
  }
2294
2332
  async function loadAssets() {
2295
- const { gatherAssetFeeds } = await import('../asset-feeds-WKIKSZ6Z.js');
2333
+ const { gatherAssetFeeds } = await import('../asset-feeds-WMVTI7KW.js');
2296
2334
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
2297
2335
  if (notes.length > 0) {
2298
2336
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
@@ -2347,12 +2385,12 @@ async function loadAssets() {
2347
2385
  async function loadSourcesAndLibraries() {
2348
2386
  try {
2349
2387
  const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir: skaileHomeDir2 }] = await Promise.all([
2350
- import('../open-library-67FSSQWE.js'),
2388
+ import('../open-library-WYASW4BH.js'),
2351
2389
  import('../library/index.js')
2352
2390
  ]);
2353
2391
  const { manager, library, close } = await openLibraryManager2();
2354
2392
  try {
2355
- const sourcesDir2 = path14__default.join(skaileHomeDir2(), "sources");
2393
+ const sourcesDir2 = path15__default.join(skaileHomeDir2(), "sources");
2356
2394
  const isSourceRow = (l) => l.path.startsWith(sourcesDir2);
2357
2395
  const libs = await manager.listLibraries();
2358
2396
  const defs = await library.listAssetDefs();
@@ -2854,13 +2892,13 @@ async function run(projectDir) {
2854
2892
  }
2855
2893
  function makeManageCommand() {
2856
2894
  return new Command("manage").description("Interactive TUI for managing assets, sources, and libraries").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
2857
- await run(path14__default.resolve(opts.projectDir));
2895
+ await run(path15__default.resolve(opts.projectDir));
2858
2896
  });
2859
2897
  }
2860
2898
  function makeMcpServerCommand() {
2861
2899
  return new Command("mcp-server").description("Start skaile workspace MCP server (stdio transport)").option("--project-dir <path>", "Project directory (default: cwd)", process.cwd()).action(async (opts) => {
2862
- const path34 = await import('path');
2863
- const projectDir = path34.default.resolve(opts.projectDir);
2900
+ const path35 = await import('path');
2901
+ const projectDir = path35.default.resolve(opts.projectDir);
2864
2902
  const { LogStore, StdoutSink, registerLogStore } = await import('../core/logging.js');
2865
2903
  registerLogStore(
2866
2904
  new LogStore({
@@ -2897,8 +2935,8 @@ function makeNpxCommand() {
2897
2935
  skills.command("add <url>").description(
2898
2936
  "Clone a repo, register it in the project's skaile.yaml sources[], and install a skill from it"
2899
2937
  ).requiredOption("--skill <name>", "Skill name to install from the repo").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").option("--global", "Deploy globally").action(async (url, opts) => {
2900
- const projectDir = path14__default.resolve(opts.projectDir);
2901
- const projYaml = path14__default.join(projectDir, "skaile.yaml");
2938
+ const projectDir = path15__default.resolve(opts.projectDir);
2939
+ const projYaml = path15__default.join(projectDir, "skaile.yaml");
2902
2940
  if (!existsSync(projYaml)) {
2903
2941
  logErr(`No skaile.yaml in ${projectDir} \u2014 run \`skaile init\` first.`);
2904
2942
  process.exit(1);
@@ -2911,7 +2949,7 @@ function makeNpxCommand() {
2911
2949
  }
2912
2950
  const spinner5 = p5.spinner();
2913
2951
  const slug = sourceSlug(url);
2914
- const clonePath = path14__default.join(homedir(), ".skaile", "sources", slug);
2952
+ const clonePath = path15__default.join(homedir(), ".skaile", "sources", slug);
2915
2953
  spinner5.start(`Cloning ${url}`);
2916
2954
  try {
2917
2955
  if (!existsSync(clonePath)) {
@@ -2960,12 +2998,12 @@ function makeNpxCommand() {
2960
2998
  return npx;
2961
2999
  }
2962
3000
  function resolvePublisher(clonePath, url) {
2963
- const yamlPath = path14__default.join(clonePath, "skaile.yaml");
2964
- if (existsSync(yamlPath)) {
3001
+ const manifestPath = path15__default.join(clonePath, SKAILE_MANIFEST_FILENAME);
3002
+ if (existsSync(manifestPath)) {
2965
3003
  try {
2966
- const { config } = decodeSkaileYaml(readFileSync(yamlPath, "utf8"));
2967
- if (typeof config.publisher === "string" && config.publisher.length > 0) {
2968
- return config.publisher;
3004
+ const { manifest } = decodeSkaileManifest(readFileSync(manifestPath, "utf8"));
3005
+ if (typeof manifest.publisher === "string" && manifest.publisher.length > 0) {
3006
+ return manifest.publisher;
2969
3007
  }
2970
3008
  } catch {
2971
3009
  }
@@ -2973,12 +3011,12 @@ function resolvePublisher(clonePath, url) {
2973
3011
  return url.match(/github\.com[/:]([^/]+)\/[^/]+/)?.[1];
2974
3012
  }
2975
3013
  function resolveSkillName(clonePath, requested) {
2976
- const skillsDir = path14__default.join(clonePath, "skills");
2977
- if (existsSync(path14__default.join(skillsDir, requested, "SKILL.md"))) return requested;
3014
+ const skillsDir = path15__default.join(clonePath, "skills");
3015
+ if (existsSync(path15__default.join(skillsDir, requested, "SKILL.md"))) return requested;
2978
3016
  if (!existsSync(skillsDir)) return requested;
2979
3017
  for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
2980
3018
  if (!entry.isDirectory()) continue;
2981
- const md = path14__default.join(skillsDir, entry.name, "SKILL.md");
3019
+ const md = path15__default.join(skillsDir, entry.name, "SKILL.md");
2982
3020
  if (!existsSync(md)) continue;
2983
3021
  try {
2984
3022
  const { data } = parseFrontmatter(readFileSync(md, "utf8"));
@@ -2998,12 +3036,12 @@ var MCP_SERVER_ENTRY = {
2998
3036
  env: {}
2999
3037
  };
3000
3038
  function pluginDir(projectDir) {
3001
- return path14__default.join(projectDir, ".claude", "plugins", "skaile");
3039
+ return path15__default.join(projectDir, ".claude", "plugins", "skaile");
3002
3040
  }
3003
3041
  async function readJsonStrict(p7) {
3004
3042
  let raw;
3005
3043
  try {
3006
- raw = await fs5.readFile(p7, "utf-8");
3044
+ raw = await fs6.readFile(p7, "utf-8");
3007
3045
  } catch {
3008
3046
  return null;
3009
3047
  }
@@ -3016,32 +3054,32 @@ async function readJsonStrict(p7) {
3016
3054
  }
3017
3055
  }
3018
3056
  async function writeJson(p7, value) {
3019
- await fs5.mkdir(path14__default.dirname(p7), { recursive: true });
3020
- await fs5.writeFile(p7, `${JSON.stringify(value, null, 2)}
3057
+ await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
3058
+ await fs6.writeFile(p7, `${JSON.stringify(value, null, 2)}
3021
3059
  `);
3022
3060
  }
3023
3061
  async function copyDir(src, dest) {
3024
- await fs5.mkdir(dest, { recursive: true });
3025
- const entries = await fs5.readdir(src, { withFileTypes: true });
3062
+ await fs6.mkdir(dest, { recursive: true });
3063
+ const entries = await fs6.readdir(src, { withFileTypes: true });
3026
3064
  for (const entry of entries) {
3027
- const srcPath = path14__default.join(src, entry.name);
3028
- const destPath = path14__default.join(dest, entry.name);
3065
+ const srcPath = path15__default.join(src, entry.name);
3066
+ const destPath = path15__default.join(dest, entry.name);
3029
3067
  if (entry.isDirectory()) await copyDir(srcPath, destPath);
3030
- else await fs5.copyFile(srcPath, destPath);
3068
+ else await fs6.copyFile(srcPath, destPath);
3031
3069
  }
3032
3070
  }
3033
3071
  async function install(projectDir, opts) {
3034
3072
  return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);
3035
3073
  }
3036
3074
  async function installMcp(projectDir) {
3037
- const mcpPath = path14__default.join(projectDir, ".claude", "mcp.json");
3075
+ const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
3038
3076
  const existing = await readJsonStrict(mcpPath) ?? {};
3039
3077
  const mcpServers = { ...existing.mcpServers ?? {} };
3040
3078
  const previous = mcpServers[SKAILE_MCP_NAME];
3041
3079
  const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);
3042
3080
  let warning;
3043
3081
  if (previous && !matches) {
3044
- warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path14__default.relative(projectDir, mcpPath)}`;
3082
+ warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path15__default.relative(projectDir, mcpPath)}`;
3045
3083
  }
3046
3084
  mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;
3047
3085
  await writeJson(mcpPath, { ...existing, mcpServers });
@@ -3050,15 +3088,15 @@ async function installMcp(projectDir) {
3050
3088
  async function installFullPlugin(projectDir) {
3051
3089
  const dir = pluginDir(projectDir);
3052
3090
  for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {
3053
- const dest = path14__default.join(dir, rel);
3054
- await fs5.mkdir(path14__default.dirname(dest), { recursive: true });
3055
- await fs5.writeFile(dest, content);
3091
+ const dest = path15__default.join(dir, rel);
3092
+ await fs6.mkdir(path15__default.dirname(dest), { recursive: true });
3093
+ await fs6.writeFile(dest, content);
3056
3094
  }
3057
- const projectSkillsDir = path14__default.join(projectDir, ".skaile", "skills");
3095
+ const projectSkillsDir = path15__default.join(projectDir, ".skaile", "skills");
3058
3096
  if (existsSync(projectSkillsDir)) {
3059
- await copyDir(projectSkillsDir, path14__default.join(dir, "skills"));
3097
+ await copyDir(projectSkillsDir, path15__default.join(dir, "skills"));
3060
3098
  }
3061
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3099
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3062
3100
  const settings = await readJsonStrict(settingsPath) ?? {};
3063
3101
  const plugins = settings.plugins ?? [];
3064
3102
  if (!plugins.includes(dir)) plugins.push(dir);
@@ -3066,8 +3104,8 @@ async function installFullPlugin(projectDir) {
3066
3104
  return { changed: true, method: "plugin" };
3067
3105
  }
3068
3106
  async function uninstall(projectDir) {
3069
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3070
- const mcpPath = path14__default.join(projectDir, ".claude", "mcp.json");
3107
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3108
+ const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
3071
3109
  const dir = pluginDir(projectDir);
3072
3110
  let changed = false;
3073
3111
  const settings = await readJsonStrict(settingsPath);
@@ -3081,7 +3119,7 @@ async function uninstall(projectDir) {
3081
3119
  }
3082
3120
  }
3083
3121
  if (existsSync(dir)) {
3084
- await fs5.rm(dir, { recursive: true, force: true });
3122
+ await fs6.rm(dir, { recursive: true, force: true });
3085
3123
  changed = true;
3086
3124
  }
3087
3125
  const mcp = await readJsonStrict(mcpPath);
@@ -3091,7 +3129,7 @@ async function uninstall(projectDir) {
3091
3129
  const updated = { ...mcp, mcpServers: rest };
3092
3130
  if (Object.keys(rest).length === 0) delete updated.mcpServers;
3093
3131
  if (Object.keys(updated).length === 0) {
3094
- await fs5.unlink(mcpPath);
3132
+ await fs6.unlink(mcpPath);
3095
3133
  } else {
3096
3134
  await writeJson(mcpPath, updated);
3097
3135
  }
@@ -3101,12 +3139,12 @@ async function uninstall(projectDir) {
3101
3139
  async function detectInstall(projectDir) {
3102
3140
  const dir = pluginDir(projectDir);
3103
3141
  const settings = await readJsonStrict(
3104
- path14__default.join(projectDir, ".claude", "settings.json")
3142
+ path15__default.join(projectDir, ".claude", "settings.json")
3105
3143
  );
3106
- if (existsSync(path14__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
3144
+ if (existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
3107
3145
  return { method: "plugin", pluginPath: dir };
3108
3146
  }
3109
- const mcp = await readJsonStrict(path14__default.join(projectDir, ".claude", "mcp.json"));
3147
+ const mcp = await readJsonStrict(path15__default.join(projectDir, ".claude", "mcp.json"));
3110
3148
  if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {
3111
3149
  return { method: "mcp" };
3112
3150
  }
@@ -3115,7 +3153,7 @@ async function detectInstall(projectDir) {
3115
3153
  async function enable(projectDir) {
3116
3154
  const detected = await detectInstall(projectDir);
3117
3155
  if (!detected) throw new Error("plugin not installed for claude-code");
3118
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3156
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3119
3157
  const settings = await readJsonStrict(settingsPath) ?? {};
3120
3158
  if (detected.method === "plugin") {
3121
3159
  const disabled2 = settings.disabledPlugins ?? [];
@@ -3137,7 +3175,7 @@ async function enable(projectDir) {
3137
3175
  async function disable(projectDir) {
3138
3176
  const detected = await detectInstall(projectDir);
3139
3177
  if (!detected) throw new Error("plugin not installed for claude-code");
3140
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3178
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3141
3179
  const settings = await readJsonStrict(settingsPath) ?? {};
3142
3180
  if (detected.method === "plugin") {
3143
3181
  const list2 = settings.disabledPlugins ?? [];
@@ -3157,12 +3195,12 @@ async function disable(projectDir) {
3157
3195
  return { changed: true };
3158
3196
  }
3159
3197
  async function status(projectDir) {
3160
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3161
- const mcpPath = path14__default.join(projectDir, ".claude", "mcp.json");
3198
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3199
+ const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
3162
3200
  const dir = pluginDir(projectDir);
3163
3201
  const settings = await readJsonStrict(settingsPath);
3164
3202
  const mcp = await readJsonStrict(mcpPath);
3165
- const pluginInstalled = !!(existsSync(path14__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
3203
+ const pluginInstalled = !!(existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
3166
3204
  const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);
3167
3205
  if (!pluginInstalled && !mcpInstalled) {
3168
3206
  return {
@@ -3180,7 +3218,7 @@ async function status(projectDir) {
3180
3218
  installed: "yes",
3181
3219
  enabled: disabled2 ? "no" : "yes",
3182
3220
  method: "plugin",
3183
- location: path14__default.relative(projectDir, dir)
3221
+ location: path15__default.relative(projectDir, dir)
3184
3222
  };
3185
3223
  }
3186
3224
  const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;
@@ -3189,7 +3227,7 @@ async function status(projectDir) {
3189
3227
  installed: "yes",
3190
3228
  enabled: disabled ? "no" : "yes",
3191
3229
  method: "mcp",
3192
- location: path14__default.relative(projectDir, mcpPath)
3230
+ location: path15__default.relative(projectDir, mcpPath)
3193
3231
  };
3194
3232
  }
3195
3233
  var SKAILE_MCP_NAME2 = "skaile-workspace";
@@ -3203,7 +3241,7 @@ function buildEntry(projectDir) {
3203
3241
  async function readConfig(p7) {
3204
3242
  let raw;
3205
3243
  try {
3206
- raw = await fs5.readFile(p7, "utf-8");
3244
+ raw = await fs6.readFile(p7, "utf-8");
3207
3245
  } catch {
3208
3246
  return null;
3209
3247
  }
@@ -3216,16 +3254,16 @@ async function readConfig(p7) {
3216
3254
  }
3217
3255
  }
3218
3256
  async function writeConfig(p7, value) {
3219
- await fs5.mkdir(path14__default.dirname(p7), { recursive: true });
3257
+ await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
3220
3258
  const cleaned = {};
3221
3259
  for (const [k, v] of Object.entries(value)) {
3222
3260
  if (v === void 0) continue;
3223
3261
  cleaned[k] = v;
3224
3262
  }
3225
- await fs5.writeFile(p7, stringify(cleaned));
3263
+ await fs6.writeFile(p7, stringify(cleaned));
3226
3264
  }
3227
3265
  function configPath(projectDir) {
3228
- return path14__default.join(projectDir, ".codex", "config.toml");
3266
+ return path15__default.join(projectDir, ".codex", "config.toml");
3229
3267
  }
3230
3268
  async function install2(projectDir) {
3231
3269
  const p7 = configPath(projectDir);
@@ -3236,7 +3274,7 @@ async function install2(projectDir) {
3236
3274
  const matches = previous && JSON.stringify(previous) === JSON.stringify(next);
3237
3275
  let warning;
3238
3276
  if (previous && !matches) {
3239
- warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path14__default.relative(projectDir, p7)}`;
3277
+ warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path15__default.relative(projectDir, p7)}`;
3240
3278
  }
3241
3279
  if (matches) return { changed: false, method: "toml" };
3242
3280
  servers[SKAILE_MCP_NAME2] = next;
@@ -3253,7 +3291,7 @@ async function uninstall2(projectDir) {
3253
3291
  const updated = { ...cfg, mcp_servers: rest };
3254
3292
  if (Object.keys(rest).length === 0) delete updated.mcp_servers;
3255
3293
  if (Object.keys(updated).length === 0) {
3256
- await fs5.unlink(p7);
3294
+ await fs6.unlink(p7);
3257
3295
  } else {
3258
3296
  await writeConfig(p7, updated);
3259
3297
  }
@@ -3277,43 +3315,43 @@ async function status2(projectDir) {
3277
3315
  installed: "yes",
3278
3316
  enabled: "n/a",
3279
3317
  method: "mcp",
3280
- location: path14__default.relative(projectDir, p7)
3318
+ location: path15__default.relative(projectDir, p7)
3281
3319
  };
3282
3320
  }
3283
3321
  async function install3(projectDir) {
3284
- const extDir = path14__default.join(projectDir, ".omp", "extensions");
3285
- const extPath = path14__default.join(extDir, "skaile.ts");
3286
- await fs5.mkdir(extDir, { recursive: true });
3322
+ const extDir = path15__default.join(projectDir, ".omp", "extensions");
3323
+ const extPath = path15__default.join(extDir, "skaile.ts");
3324
+ await fs6.mkdir(extDir, { recursive: true });
3287
3325
  const { WorkspacePlugin } = await import('../workspace-plugin/index.js');
3288
3326
  const plugin = new WorkspacePlugin({ projectDir });
3289
3327
  const nextSrc = await plugin.buildOmpExtensionSource();
3290
3328
  let prevSrc = null;
3291
3329
  try {
3292
- prevSrc = await fs5.readFile(extPath, "utf-8");
3330
+ prevSrc = await fs6.readFile(extPath, "utf-8");
3293
3331
  } catch {
3294
3332
  }
3295
3333
  if (prevSrc === nextSrc) return { changed: false, method: "generated" };
3296
- await fs5.writeFile(extPath, nextSrc);
3334
+ await fs6.writeFile(extPath, nextSrc);
3297
3335
  return { changed: true, method: "generated" };
3298
3336
  }
3299
3337
  async function uninstall3(projectDir) {
3300
- const extPath = path14__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3338
+ const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3301
3339
  try {
3302
- await fs5.unlink(extPath);
3340
+ await fs6.unlink(extPath);
3303
3341
  return { changed: true };
3304
3342
  } catch {
3305
3343
  return { changed: false };
3306
3344
  }
3307
3345
  }
3308
3346
  async function status3(projectDir) {
3309
- const extPath = path14__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3347
+ const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3310
3348
  if (existsSync(extPath)) {
3311
3349
  return {
3312
3350
  backend: "omp",
3313
3351
  installed: "yes",
3314
3352
  enabled: "n/a",
3315
3353
  method: "extension",
3316
- location: path14__default.relative(projectDir, extPath)
3354
+ location: path15__default.relative(projectDir, extPath)
3317
3355
  };
3318
3356
  }
3319
3357
  return {
@@ -3334,7 +3372,7 @@ function resolveDriver(driver) {
3334
3372
  throw new Error(`unknown driver: ${driver} (expected: claude-code | omp | codex | all)`);
3335
3373
  }
3336
3374
  async function runInstall(opts) {
3337
- const projectDir = path14__default.resolve(opts.projectDir);
3375
+ const projectDir = path15__default.resolve(opts.projectDir);
3338
3376
  const targets = resolveDriver(opts.driver);
3339
3377
  let exitCode = 0;
3340
3378
  if (targets.includes("claude-code")) {
@@ -3389,7 +3427,7 @@ async function runInstall(opts) {
3389
3427
  return exitCode;
3390
3428
  }
3391
3429
  async function runUninstall(opts) {
3392
- const projectDir = path14__default.resolve(opts.projectDir);
3430
+ const projectDir = path15__default.resolve(opts.projectDir);
3393
3431
  const targets = resolveDriver(opts.driver);
3394
3432
  let exitCode = 0;
3395
3433
  if (targets.includes("claude-code")) {
@@ -3426,7 +3464,7 @@ async function runUninstall(opts) {
3426
3464
  return exitCode;
3427
3465
  }
3428
3466
  async function runToggle(opts, action3) {
3429
- const projectDir = path14__default.resolve(opts.projectDir);
3467
+ const projectDir = path15__default.resolve(opts.projectDir);
3430
3468
  const requestedAll = opts.driver === "all";
3431
3469
  const targets = resolveDriver(opts.driver);
3432
3470
  if (!requestedAll) {
@@ -3461,7 +3499,7 @@ async function runToggle(opts, action3) {
3461
3499
  return exitCode;
3462
3500
  }
3463
3501
  async function runStatus2(opts) {
3464
- const projectDir = path14__default.resolve(opts.projectDir);
3502
+ const projectDir = path15__default.resolve(opts.projectDir);
3465
3503
  const targets = resolveDriver(opts.driver);
3466
3504
  const rows = [];
3467
3505
  let exitCode = 0;
@@ -3532,7 +3570,7 @@ async function runHook(event) {
3532
3570
  await plugin.shutdown();
3533
3571
  return;
3534
3572
  }
3535
- const store = new PluginStore(path14__default.join(projectDir, ".skaile", "plugin-state.json"));
3573
+ const store = new PluginStore(path15__default.join(projectDir, ".skaile", "plugin-state.json"));
3536
3574
  await store.load();
3537
3575
  const status4 = store.get("connector:status");
3538
3576
  if (status4 && typeof status4 === "object" && Object.keys(status4).length > 0) {
@@ -3597,7 +3635,7 @@ function makeOutdatedCommand() {
3597
3635
  new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
3598
3636
  ).action((name, opts) => {
3599
3637
  const am2 = new AssetManager({
3600
- projectDir: path14__default.resolve(opts.projectDir),
3638
+ projectDir: path15__default.resolve(opts.projectDir),
3601
3639
  driverTarget: opts.target
3602
3640
  });
3603
3641
  const entries = am2.outdated();
@@ -3626,7 +3664,7 @@ function makeOutdatedCommand() {
3626
3664
  function makePatchCommand() {
3627
3665
  const cmd = new Command("patch").description("Patch workflow for skill improvement");
3628
3666
  cmd.command("extract <ref>").alias("start").description("Extract asset for local editing").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
3629
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
3667
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3630
3668
  try {
3631
3669
  const dest = am2.patch(ref);
3632
3670
  logOk(`Extracted to ${S.dim(dest)}`);
@@ -3637,7 +3675,7 @@ function makePatchCommand() {
3637
3675
  }
3638
3676
  });
3639
3677
  cmd.command("commit <ref>").description("Generate .patch file from edits").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
3640
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
3678
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3641
3679
  try {
3642
3680
  const patchFile = am2.patchCommit(ref);
3643
3681
  logOk(`Patch saved to ${S.dim(patchFile)}`);
@@ -3648,7 +3686,7 @@ function makePatchCommand() {
3648
3686
  }
3649
3687
  });
3650
3688
  cmd.command("submit <ref>").description("Apply patch to repo clone and prepare for PR").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
3651
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
3689
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3652
3690
  try {
3653
3691
  am2.patchSubmit(ref);
3654
3692
  logOk("Patch applied to repo clone and committed.");
@@ -3661,7 +3699,7 @@ function makePatchCommand() {
3661
3699
  }
3662
3700
  });
3663
3701
  cmd.command("remove <ref>").description("Remove local patch after upstream merge").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
3664
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
3702
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3665
3703
  am2.patchRemove(ref);
3666
3704
  logOk(`Patch removed for ${ref}`);
3667
3705
  });
@@ -3679,7 +3717,7 @@ function action2(fn) {
3679
3717
  };
3680
3718
  }
3681
3719
  async function reconcileAndReport(projectDir, plugins) {
3682
- const { reconcilePlugins } = await import('../plugin-store-IZ5SCRAV.js');
3720
+ const { reconcilePlugins } = await import('../plugin-store-O5VR45CA.js');
3683
3721
  if (plugins.length === 0) {
3684
3722
  logInfo("No plugins declared \u2014 nothing to reconcile.");
3685
3723
  return;
@@ -3693,10 +3731,10 @@ async function reconcileAndReport(projectDir, plugins) {
3693
3731
  }
3694
3732
  }
3695
3733
  async function runInstall2(spec, opts) {
3696
- const projectDir = path14__default.resolve(opts.projectDir);
3734
+ const projectDir = path15__default.resolve(opts.projectDir);
3697
3735
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3698
- const { specName } = await import('../plugin-store-IZ5SCRAV.js');
3699
- const yamlPath = path14__default.join(projectDir, "skaile.yaml");
3736
+ const { specName } = await import('../plugin-store-O5VR45CA.js');
3737
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
3700
3738
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3701
3739
  const replaced = editor.addPlugin(spec, specName);
3702
3740
  editor.save();
@@ -3705,10 +3743,10 @@ async function runInstall2(spec, opts) {
3705
3743
  await reconcileAndReport(projectDir, editor.getPlugins());
3706
3744
  }
3707
3745
  async function runRemove(name, opts) {
3708
- const projectDir = path14__default.resolve(opts.projectDir);
3746
+ const projectDir = path15__default.resolve(opts.projectDir);
3709
3747
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3710
- const { specName } = await import('../plugin-store-IZ5SCRAV.js');
3711
- const yamlPath = path14__default.join(projectDir, "skaile.yaml");
3748
+ const { specName } = await import('../plugin-store-O5VR45CA.js');
3749
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
3712
3750
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3713
3751
  const removed = editor.removePlugin(name, specName);
3714
3752
  if (!removed) {
@@ -3720,7 +3758,7 @@ async function runRemove(name, opts) {
3720
3758
  await reconcileAndReport(projectDir, editor.getPlugins());
3721
3759
  }
3722
3760
  async function runList(opts) {
3723
- const projectDir = path14__default.resolve(opts.projectDir);
3761
+ const projectDir = path15__default.resolve(opts.projectDir);
3724
3762
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
3725
3763
  const config = resolveSkWorkspaceConfig2(projectDir);
3726
3764
  const declared = config.plugins ?? [];
@@ -3735,7 +3773,7 @@ async function runList(opts) {
3735
3773
  const registry = createPluginRegistry();
3736
3774
  if (declared.length > 0) {
3737
3775
  try {
3738
- const { loadPlugins } = await import('../plugin-store-IZ5SCRAV.js');
3776
+ const { loadPlugins } = await import('../plugin-store-O5VR45CA.js');
3739
3777
  const result = await loadPlugins(projectDir, declared, registry);
3740
3778
  for (const f of result.failed) logWarn(f.error);
3741
3779
  } catch (err) {
@@ -3774,7 +3812,7 @@ function makePresetCommand() {
3774
3812
  cmd.command("init [name]").description("Scaffold a new .preset.yaml file").option("--dir <path>", "Output directory", process.cwd()).action(async (name, opts) => {
3775
3813
  const presetName = name ?? "my-preset";
3776
3814
  const filename = `${presetName}.preset.yaml`;
3777
- const outPath = path14__default.join(path14__default.resolve(opts.dir), filename);
3815
+ const outPath = path15__default.join(path15__default.resolve(opts.dir), filename);
3778
3816
  if (existsSync(outPath)) {
3779
3817
  logErr(`File already exists: ${outPath}`);
3780
3818
  logInfo("Choose a different name or remove the existing file.");
@@ -3788,7 +3826,7 @@ function makePresetCommand() {
3788
3826
  logInfo(` skaile preset validate ${filename}`);
3789
3827
  });
3790
3828
  cmd.command("validate <path>").description("Validate a preset YAML file (schema + cycles + nesting depth)").action(async (filePath) => {
3791
- const resolved = path14__default.resolve(filePath);
3829
+ const resolved = path15__default.resolve(filePath);
3792
3830
  if (!existsSync(resolved)) {
3793
3831
  logErr(`File not found: ${resolved}`);
3794
3832
  process.exit(1);
@@ -3814,7 +3852,7 @@ function makePresetCommand() {
3814
3852
  logInfo(`Nested preset refs: ${nestedRefs.length} (depth validated at apply-time)`);
3815
3853
  }
3816
3854
  const { detectCycles } = await import('../discovery/index.js');
3817
- const presetRef = path14__default.basename(resolved, ".preset.yaml");
3855
+ const presetRef = path15__default.basename(resolved, ".preset.yaml");
3818
3856
  const edges = [];
3819
3857
  for (const item of preset.items) {
3820
3858
  if (item.ref) {
@@ -3899,20 +3937,30 @@ items:
3899
3937
  # credential_ref: "\${SECRET:EXAMPLE_KEY}" # for secret placeholders
3900
3938
  `;
3901
3939
  }
3902
- var ASSET_REF_RE = /^@?([^/@\s]+)\/([^/@\s]+)@([^/@\s]+)$/;
3940
+ var REF_HINT = "kind:@<publisher>/<name>#<version> (e.g. skill:@skaile/use-exa#1.0.0)";
3941
+ function isValidAssetRef(ref) {
3942
+ try {
3943
+ parseAssetRef(ref);
3944
+ return true;
3945
+ } catch {
3946
+ return false;
3947
+ }
3948
+ }
3903
3949
  function supportsInstallManifest(source) {
3904
3950
  return typeof source?.getInstallManifest === "function";
3905
3951
  }
3906
3952
  async function runPointerOnlyInstall(ref, deps) {
3907
- const m = ref.match(ASSET_REF_RE);
3908
- if (!m) {
3953
+ let requested;
3954
+ try {
3955
+ requested = parseAssetRef(ref);
3956
+ } catch (e) {
3909
3957
  throw new Error(
3910
- `malformed asset ref '${ref}' \u2014 expected <publisher>/<name>@<version> (e.g. skaile/use-exa@1.0.0)`
3958
+ `malformed asset ref '${ref}' \u2014 expected ${REF_HINT}: ${e instanceof Error ? e.message : String(e)}`
3911
3959
  );
3912
3960
  }
3913
3961
  const manifest = await deps.catalog.getInstallManifest(ref);
3914
- const normalizeRef = (r) => r.replace(/^@/, "");
3915
- if (normalizeRef(manifest.ref) !== normalizeRef(ref)) {
3962
+ const got = parseAssetRef(manifest.ref);
3963
+ if (got.kind !== requested.kind || got.publisher !== requested.publisher || got.name !== requested.name || got.pin !== requested.pin) {
3916
3964
  throw new Error(
3917
3965
  `catalog identity mismatch: requested '${ref}' but the catalog returned a manifest for '${manifest.ref}'`
3918
3966
  );
@@ -3926,20 +3974,18 @@ async function runPointerOnlyInstall(ref, deps) {
3926
3974
  }
3927
3975
  function makeInstallCommand() {
3928
3976
  return new Command("install").description(
3929
- "Install dependencies from skaile.yaml, or a single asset by ref (<publisher>/<name>@<version>)"
3930
- ).argument("[ref]", "Asset ref to install from the Catalog (<publisher>/<name>@<version>)").option("--locked", "Install from lock file (CI mode \u2014 fails on drift)").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (ref, opts) => {
3977
+ `Install dependencies from skaile.yaml, or a single asset by ref (${REF_HINT})`
3978
+ ).argument("[ref]", `Asset ref to install from the Catalog (${REF_HINT})`).option("--locked", "Install from lock file (CI mode \u2014 fails on drift)").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (ref, opts) => {
3931
3979
  if (ref !== void 0) {
3932
- if (!ASSET_REF_RE.test(ref)) {
3933
- logErr(
3934
- `malformed asset ref '${ref}' \u2014 expected <publisher>/<name>@<version> (e.g. skaile/use-exa@1.0.0)`
3935
- );
3980
+ if (!isValidAssetRef(ref)) {
3981
+ logErr(`malformed asset ref '${ref}' \u2014 expected ${REF_HINT}`);
3936
3982
  process.exit(1);
3937
3983
  }
3938
3984
  const spinner6 = p5.spinner();
3939
3985
  spinner6.start(`Installing ${ref}`);
3940
3986
  try {
3941
- const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-67FSSQWE.js');
3942
- const catalog = await openCatalogSource2({ projectDir: path14__default.resolve(opts.projectDir) });
3987
+ const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-WYASW4BH.js');
3988
+ const catalog = await openCatalogSource2({ projectDir: path15__default.resolve(opts.projectDir) });
3943
3989
  if (!supportsInstallManifest(catalog)) {
3944
3990
  throw new Error(
3945
3991
  "pointer-only install (skaile install <ref>) requires a tRPC-framed Catalog. The configured catalog uses REST framing, which does not serve install manifests. Set catalog.url to https://skaile.store, or catalog.framing: trpc, in ~/.skaile/config.yaml."
@@ -3968,9 +4014,9 @@ function makeInstallCommand() {
3968
4014
  }
3969
4015
  return;
3970
4016
  }
3971
- const projectDir = path14__default.resolve(opts.projectDir);
4017
+ const projectDir = path15__default.resolve(opts.projectDir);
3972
4018
  try {
3973
- const { ensureSourcesCloned } = await import('../ensure-sources-OJUBGX6Z.js');
4019
+ const { ensureSourcesCloned } = await import('../ensure-sources-CVULUVH4.js');
3974
4020
  const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
3975
4021
  if (hydrate.cloned.length > 0) {
3976
4022
  logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
@@ -4016,7 +4062,7 @@ function makeInstallCommand() {
4016
4062
  }
4017
4063
  function makeCheckCommand() {
4018
4064
  return new Command("check").description("Check for unmet requirements").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
4019
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
4065
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
4020
4066
  const issues = am2.doctor();
4021
4067
  if (issues.length === 0) {
4022
4068
  logOk("All dependencies satisfied.");
@@ -4033,10 +4079,10 @@ function makeCheckCommand() {
4033
4079
  function makeCleanCommand() {
4034
4080
  return new Command("clean").description("Remove all skaile-managed assets from the workspace").option("--all", "Full reset: also remove history, patches, repos, and lock file").option("--dry-run", "Show what would be removed without doing it").option("-y, --yes", "Skip confirmation prompt").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (opts) => {
4035
4081
  const am2 = new AssetManager({
4036
- projectDir: path14__default.resolve(opts.projectDir),
4082
+ projectDir: path15__default.resolve(opts.projectDir),
4037
4083
  driverTarget: opts.target
4038
4084
  });
4039
- const lock = readLock(path14__default.resolve(opts.projectDir, "skaile.lock.yaml"));
4085
+ const lock = readLock(path15__default.resolve(opts.projectDir, "skaile.lock.yaml"));
4040
4086
  if (!lock || Object.keys(lock.assets).length === 0) {
4041
4087
  logInfo("Nothing to clean (no skaile-managed assets found).");
4042
4088
  return;
@@ -4089,14 +4135,14 @@ function makeCleanCommand() {
4089
4135
  }
4090
4136
  function makeRebuildCommand() {
4091
4137
  return new Command("rebuild").description("Re-snapshot inline-snapshot composition items and bump prompt version").argument("[agent]", "Agent name or path (defaults to current project agent)").option("--project-dir <dir>", "Project directory", process.cwd()).action(async (agentArg, opts) => {
4092
- const projectDir = path14__default.resolve(opts.projectDir);
4138
+ const projectDir = path15__default.resolve(opts.projectDir);
4093
4139
  let agentDir;
4094
4140
  if (agentArg) {
4095
4141
  if (agentArg.includes("/") || agentArg.includes("\\")) {
4096
- agentDir = path14__default.resolve(projectDir, agentArg);
4142
+ agentDir = path15__default.resolve(projectDir, agentArg);
4097
4143
  } else {
4098
4144
  const resolved = resolveAgentDir(projectDir);
4099
- agentDir = resolved ?? path14__default.resolve(projectDir, agentArg);
4145
+ agentDir = resolved ?? path15__default.resolve(projectDir, agentArg);
4100
4146
  }
4101
4147
  } else {
4102
4148
  const resolved = resolveAgentDir(projectDir);
@@ -4174,19 +4220,19 @@ function makeFlowEventHandler() {
4174
4220
  }
4175
4221
  function makeRunCommand() {
4176
4222
  const cmd = new Command("run").description("Start a flow or run a single-shot text prompt").argument("[flow-id-or-text...]", "Flow ID or text prompt").option("--project-dir <path>", "Project directory", process.cwd()).option("--driver <name>", "Driver backend (claude-sdk, codex, omp)").option("--provider <name>", "LLM provider").option("--model <name>", "Model override").option("--label <label>", "Human-readable session label").option("--dry-run", "Print plan without executing").option("--skill <name>", "Skill name (for single-shot mode)").action(async (positional, opts) => {
4177
- const projectDir = path14__default.resolve(opts.projectDir);
4223
+ const projectDir = path15__default.resolve(opts.projectDir);
4178
4224
  const cliDriver = opts.driver;
4179
4225
  const dryRun = opts.dryRun ?? false;
4180
4226
  let flowId = positional[0];
4181
4227
  if (!flowId) {
4182
- const flows2 = loadAllFlows(AI_RESOURCES);
4183
- if (flows2.length === 0) {
4228
+ const flows = discoverFlows();
4229
+ if (flows.length === 0) {
4184
4230
  logErr("No flows available.");
4185
4231
  process.exit(1);
4186
4232
  }
4187
4233
  const selected = await p5.select({
4188
4234
  message: "Select a flow to run",
4189
- options: flows2.map((f) => ({
4235
+ options: flows.map((f) => ({
4190
4236
  value: f.id,
4191
4237
  label: f.name,
4192
4238
  hint: f.description
@@ -4206,13 +4252,25 @@ function makeRunCommand() {
4206
4252
  const driver = config.driver ?? "omp";
4207
4253
  const model = config.model;
4208
4254
  const provider = config.provider;
4209
- const flows = loadAllFlows(AI_RESOURCES);
4210
- const flow = flows.find((f) => f.id === flowId);
4211
- if (!flow) {
4255
+ const priorityRoots = [];
4256
+ let dir = projectDir;
4257
+ for (let i = 0; i < 6; i++) {
4258
+ const candidate = path15__default.join(dir, "ai-assets");
4259
+ if (fs11__default.existsSync(candidate)) {
4260
+ priorityRoots.push(candidate);
4261
+ break;
4262
+ }
4263
+ dir = path15__default.dirname(dir);
4264
+ }
4265
+ const flowPath = findFlowFile(flowId, priorityRoots);
4266
+ if (!flowPath) {
4212
4267
  const textPrompt = positional.join(" ");
4213
4268
  if (!textPrompt.trim()) {
4214
4269
  logErr(`Flow not found: ${flowId}`);
4215
- console.log(` ${S.dim("Available:")} ${flows.map((f) => S.cmd(f.id)).join(", ")}`);
4270
+ const available = discoverFlows().map((f) => f.id);
4271
+ if (available.length > 0) {
4272
+ console.log(` ${S.dim("Available:")} ${available.map((id) => S.cmd(id)).join(", ")}`);
4273
+ }
4216
4274
  process.exit(1);
4217
4275
  }
4218
4276
  await runAgentChat({
@@ -4225,43 +4283,13 @@ function makeRunCommand() {
4225
4283
  });
4226
4284
  return;
4227
4285
  }
4228
- let flowPath;
4229
- let dir = projectDir;
4230
- for (let i = 0; i < 6; i++) {
4231
- const candidate = path14__default.join(dir, "ai-assets");
4232
- if (fs10__default.existsSync(candidate)) {
4233
- for (const domain of fs10__default.readdirSync(candidate)) {
4234
- const p_ = path14__default.join(candidate, domain, "flows", `${flowId}.flow.yaml`);
4235
- if (fs10__default.existsSync(p_)) {
4236
- flowPath = p_;
4237
- break;
4238
- }
4239
- const legacy = path14__default.join(candidate, domain, "flows", `${flowId}.json`);
4240
- if (fs10__default.existsSync(legacy)) {
4241
- flowPath = legacy;
4242
- break;
4243
- }
4244
- }
4245
- break;
4246
- }
4247
- dir = path14__default.dirname(dir);
4248
- }
4249
- if (!flowPath) {
4250
- for (const domain of fs10__default.readdirSync(AI_RESOURCES)) {
4251
- const p_ = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.flow.yaml`);
4252
- if (fs10__default.existsSync(p_)) {
4253
- flowPath = p_;
4254
- break;
4255
- }
4256
- const legacy = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.json`);
4257
- if (fs10__default.existsSync(legacy)) {
4258
- flowPath = legacy;
4259
- break;
4260
- }
4261
- }
4262
- }
4263
- if (!flowPath) {
4264
- logErr(`Could not locate flow file for: ${flowId}`);
4286
+ let flow;
4287
+ try {
4288
+ flow = loadFlow(flowPath);
4289
+ } catch (err) {
4290
+ logErr(
4291
+ `Failed to load flow "${flowId}": ${err instanceof Error ? err.message : String(err)}`
4292
+ );
4265
4293
  process.exit(1);
4266
4294
  }
4267
4295
  console.log();
@@ -4287,7 +4315,7 @@ function makeRunCommand() {
4287
4315
  }
4288
4316
  function makeResumeCommand() {
4289
4317
  const cmd = new Command("resume").description("Resume current session").option("--project-dir <path>", "Project directory", process.cwd()).option("--session <run-id>", "Target session by runId").option("--dry-run", "Print plan without executing").action(async (opts) => {
4290
- const projectDir = path14__default.resolve(opts.projectDir);
4318
+ const projectDir = path15__default.resolve(opts.projectDir);
4291
4319
  const sessionId = opts.session;
4292
4320
  const dryRun = opts.dryRun ?? false;
4293
4321
  const session = sessionId ? await loadSessionById(projectDir, sessionId) : await loadSession(projectDir);
@@ -4314,7 +4342,7 @@ function makeResumeCommand() {
4314
4342
  }
4315
4343
  function makeStatusCommand() {
4316
4344
  return new Command("status").description("Show current session state").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
4317
- const projectDir = path14__default.resolve(opts.projectDir);
4345
+ const projectDir = path15__default.resolve(opts.projectDir);
4318
4346
  const session = await loadSession(projectDir);
4319
4347
  if (!session) {
4320
4348
  logInfo("No active session.");
@@ -4339,7 +4367,7 @@ function makeStatusCommand() {
4339
4367
  }
4340
4368
  function makeClearCommand() {
4341
4369
  return new Command("clear").description("Unset current session pointer").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
4342
- const projectDir = path14__default.resolve(opts.projectDir);
4370
+ const projectDir = path15__default.resolve(opts.projectDir);
4343
4371
  await clearSession(projectDir);
4344
4372
  logOk("Session cleared.");
4345
4373
  });
@@ -4349,7 +4377,7 @@ function makeReplCommand() {
4349
4377
  const { findWorkspaceRoot: findWorkspaceRoot2 } = await import('../core/index.js');
4350
4378
  const { startRepl } = await import('../tui/index.js');
4351
4379
  const os = await import('os');
4352
- const userCwd = path14__default.resolve(opts.projectDir ?? process.cwd());
4380
+ const userCwd = path15__default.resolve(opts.projectDir ?? process.cwd());
4353
4381
  const workspaceRoot = findWorkspaceRoot2(userCwd);
4354
4382
  let projectDir;
4355
4383
  let agentCwd;
@@ -4371,13 +4399,13 @@ function makeReplCommand() {
4371
4399
  p5.cancel("Cancelled.");
4372
4400
  process.exit(0);
4373
4401
  }
4374
- const tmpDir = fs10__default.mkdtempSync(path14__default.join(os.tmpdir(), "skaile-repl-"));
4402
+ const tmpDir = fs11__default.mkdtempSync(path15__default.join(os.tmpdir(), "skaile-repl-"));
4375
4403
  projectDir = tmpDir;
4376
4404
  agentCwd = userCwd;
4377
4405
  logOk(`Temporary workspace: ${S.cmd(tmpDir)}`);
4378
4406
  if (!driverOverride) {
4379
- const claudeDir = path14__default.join(os.homedir(), ".claude");
4380
- if (fs10__default.existsSync(claudeDir)) {
4407
+ const claudeDir = path15__default.join(os.homedir(), ".claude");
4408
+ if (fs11__default.existsSync(claudeDir)) {
4381
4409
  driverOverride = "claude-sdk";
4382
4410
  logInfo(`Detected ${S.cmd("~/.claude")} \u2192 using ${S.cmd("claude-sdk")} backend`);
4383
4411
  } else {
@@ -4428,7 +4456,7 @@ async function ensurePluginsLoadedForServe(projectDir) {
4428
4456
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
4429
4457
  const config = resolveSkWorkspaceConfig2(projectDir);
4430
4458
  if (!config.plugins || config.plugins.length === 0) return;
4431
- const { ensurePluginsLoaded } = await import('../plugin-store-IZ5SCRAV.js');
4459
+ const { ensurePluginsLoaded } = await import('../plugin-store-O5VR45CA.js');
4432
4460
  const { pluginRegistry } = await import('../plugin-registry/index.js');
4433
4461
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
4434
4462
  if (result.loaded.length > 0) {
@@ -4449,7 +4477,7 @@ async function runCompileTest(opts) {
4449
4477
  const { unlinkSync, existsSync: existsSync12 } = await import('fs');
4450
4478
  const { spawn } = await import('child_process');
4451
4479
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
4452
- const { MONOREPO_ROOT } = await import('../paths-FKKGS6BA.js');
4480
+ const { MONOREPO_ROOT } = await import('../paths-BMW6JYW6.js');
4453
4481
  if (MONOREPO_ROOT === null) {
4454
4482
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
4455
4483
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -4919,7 +4947,7 @@ function resolveMode(opts) {
4919
4947
  if (opts.forceLocal && opts.forceRemote) {
4920
4948
  throw new Error("Cannot use both --local and --remote");
4921
4949
  }
4922
- const startDir = path14__default.resolve(opts.projectDir ?? process.cwd());
4950
+ const startDir = path15__default.resolve(opts.projectDir ?? process.cwd());
4923
4951
  const localDb = findLogsDb(startDir);
4924
4952
  if (opts.forceLocal) {
4925
4953
  if (!localDb) {
@@ -4952,14 +4980,14 @@ function resolveMode(opts) {
4952
4980
  function findLogsDb(startDir) {
4953
4981
  let dir = startDir;
4954
4982
  for (let i = 0; i < MAX_WALK_LEVELS; i++) {
4955
- const candidate = path14__default.join(dir, ".skaile", "logs.db");
4983
+ const candidate = path15__default.join(dir, ".skaile", "logs.db");
4956
4984
  if (existsSync(candidate)) {
4957
4985
  try {
4958
4986
  if (statSync(candidate).isFile()) return candidate;
4959
4987
  } catch {
4960
4988
  }
4961
4989
  }
4962
- const parent = path14__default.dirname(dir);
4990
+ const parent = path15__default.dirname(dir);
4963
4991
  if (parent === dir) return void 0;
4964
4992
  dir = parent;
4965
4993
  }
@@ -4985,7 +5013,7 @@ function readApiToken() {
4985
5013
  }
4986
5014
  function readGlobalSettings() {
4987
5015
  try {
4988
- const settingsPath = path14__default.join(homedir(), ".skaile", "settings.json");
5016
+ const settingsPath = path15__default.join(homedir(), ".skaile", "settings.json");
4989
5017
  if (!existsSync(settingsPath)) return {};
4990
5018
  return JSON.parse(readFileSync(settingsPath, "utf8"));
4991
5019
  } catch {
@@ -5133,7 +5161,7 @@ function parsePositiveInt(value, flag) {
5133
5161
  function makeSessionCommand() {
5134
5162
  const cmd = new Command("session").description("Manage sessions");
5135
5163
  cmd.command("list").description("List all sessions for a project").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
5136
- const projectDir = path14__default.resolve(opts.projectDir);
5164
+ const projectDir = path15__default.resolve(opts.projectDir);
5137
5165
  const sessions = await listSessions(projectDir);
5138
5166
  const current = await loadSession(projectDir);
5139
5167
  if (sessions.length === 0) {
@@ -5161,7 +5189,7 @@ function makeSessionCommand() {
5161
5189
  console.log();
5162
5190
  });
5163
5191
  cmd.command("show <run-id>").description("Show a specific session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
5164
- const projectDir = path14__default.resolve(opts.projectDir);
5192
+ const projectDir = path15__default.resolve(opts.projectDir);
5165
5193
  const session = await loadSessionById(projectDir, runId);
5166
5194
  if (!session) {
5167
5195
  logErr(`Session not found: ${runId}`);
@@ -5170,12 +5198,12 @@ function makeSessionCommand() {
5170
5198
  console.log(JSON.stringify(session, null, 2));
5171
5199
  });
5172
5200
  cmd.command("switch <run-id>").description("Switch the current session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
5173
- const projectDir = path14__default.resolve(opts.projectDir);
5201
+ const projectDir = path15__default.resolve(opts.projectDir);
5174
5202
  await setCurrentSession(projectDir, runId);
5175
5203
  logOk(`Switched to session: ${S.dim(runId.slice(0, 8))}`);
5176
5204
  });
5177
5205
  cmd.command("delete <run-id>").description("Delete a session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
5178
- const projectDir = path14__default.resolve(opts.projectDir);
5206
+ const projectDir = path15__default.resolve(opts.projectDir);
5179
5207
  await deleteSession(projectDir, runId);
5180
5208
  logOk(`Deleted session: ${S.dim(runId.slice(0, 8))}`);
5181
5209
  });
@@ -5224,12 +5252,12 @@ function showOverview(am2) {
5224
5252
  }
5225
5253
  function showAsset(am2, kind, name) {
5226
5254
  const entry = am2.info(`${kind}:${name}`);
5227
- if (entry?.source && fs10__default.existsSync(entry.source)) {
5255
+ if (entry?.source && fs11__default.existsSync(entry.source)) {
5228
5256
  console.log();
5229
5257
  console.log(` ${kindColor(entry.kind)} ${S.heading(entry.name)}`);
5230
5258
  console.log(` ${S.rule(40)}`);
5231
5259
  console.log();
5232
- console.log(fs10__default.readFileSync(entry.source, "utf-8"));
5260
+ console.log(fs11__default.readFileSync(entry.source, "utf-8"));
5233
5261
  return;
5234
5262
  }
5235
5263
  logErr(`Asset not found: ${kind}:${name}`);
@@ -5238,7 +5266,7 @@ function showAsset(am2, kind, name) {
5238
5266
  function makeShowCommand() {
5239
5267
  return new Command("show").description("Show deployed assets overview, or print asset content").argument("[kind]", "Asset kind (skill, agent, prompt, flow, bundle, contract)").argument("[name]", "Asset name").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action((kind, name, opts) => {
5240
5268
  const am2 = new AssetManager({
5241
- projectDir: path14__default.resolve(opts.projectDir),
5269
+ projectDir: path15__default.resolve(opts.projectDir),
5242
5270
  driverTarget: opts.target
5243
5271
  });
5244
5272
  if (!kind) {
@@ -5276,10 +5304,10 @@ function addSourceManifestCommands(src) {
5276
5304
 
5277
5305
  // cli/src/commands/source.ts
5278
5306
  function sourcesDir() {
5279
- return path14.join(skaileHomeDir(), "sources");
5307
+ return path15.join(skaileHomeDir(), "sources");
5280
5308
  }
5281
5309
  function sourceClonePath(name) {
5282
- return path14.join(sourcesDir(), name);
5310
+ return path15.join(sourcesDir(), name);
5283
5311
  }
5284
5312
  function deriveSlug(url) {
5285
5313
  return url.replace(/\.git$/, "").split(/[/:]/).pop() ?? "source";
@@ -5300,7 +5328,7 @@ function requireProjectYamlPath() {
5300
5328
  );
5301
5329
  process.exit(1);
5302
5330
  }
5303
- return path14.join(root, workspaceConfigFilename());
5331
+ return path15.join(root, workspaceConfigFilename());
5304
5332
  }
5305
5333
  function readProjectSources(yamlPath) {
5306
5334
  if (!existsSync(yamlPath)) return [];
@@ -5398,7 +5426,7 @@ function makeSourceCommand() {
5398
5426
  const result = await refreshManifestCache(entry, opts.dev);
5399
5427
  logOk(`Indexed ${result.assetsUpdated} of ${result.assetsFound} asset(s) from "${slug}".`);
5400
5428
  for (const err of result.errors) logWarn(err);
5401
- logOk(`Source "${slug}" registered in ${path14.relative(process.cwd(), yamlPath)}.`);
5429
+ logOk(`Source "${slug}" registered in ${path15.relative(process.cwd(), yamlPath)}.`);
5402
5430
  }
5403
5431
  );
5404
5432
  cmd.command("list").description("List sources registered in this project's skaile.yaml").option("--json", "Output as JSON").action(async (opts) => {
@@ -5665,7 +5693,7 @@ function printTree(node, prefix = "", isLast = true) {
5665
5693
  }
5666
5694
  function makeTreeCommand() {
5667
5695
  return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
5668
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
5696
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
5669
5697
  const root = am2.tree();
5670
5698
  if (root.children.length === 0) {
5671
5699
  logInfo("No dependencies in lock file. Run `skaile install` first.");
@@ -5683,7 +5711,7 @@ function makeUpdateCommand() {
5683
5711
  try {
5684
5712
  const catalogSpinner = p5.spinner();
5685
5713
  catalogSpinner.start("Refreshing catalog cache");
5686
- const remote = await openCatalogSource({ projectDir: path14__default.resolve(opts.projectDir) });
5714
+ const remote = await openCatalogSource({ projectDir: path15__default.resolve(opts.projectDir) });
5687
5715
  const result2 = await remote.refresh();
5688
5716
  catalogSpinner.stop(
5689
5717
  `Catalog refreshed: ${S.heading(String(result2.assetsCached))} assets cached`
@@ -5695,7 +5723,7 @@ function makeUpdateCommand() {
5695
5723
  }
5696
5724
  }
5697
5725
  if (opts.catalogOnly) return;
5698
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
5726
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
5699
5727
  const spinner5 = p5.spinner();
5700
5728
  spinner5.start("Re-deploying assets");
5701
5729
  const result = await am2.install();
@@ -5729,12 +5757,12 @@ function findManifestCandidates(rootPath) {
5729
5757
  function walk(dir) {
5730
5758
  let entries;
5731
5759
  try {
5732
- entries = fs10__default.readdirSync(dir, { withFileTypes: true });
5760
+ entries = fs11__default.readdirSync(dir, { withFileTypes: true });
5733
5761
  } catch {
5734
5762
  return;
5735
5763
  }
5736
5764
  for (const entry of entries) {
5737
- const fullPath = path14__default.join(dir, entry.name);
5765
+ const fullPath = path15__default.join(dir, entry.name);
5738
5766
  if (entry.isDirectory()) {
5739
5767
  if (!SKIP_DIRS.has(entry.name)) walk(fullPath);
5740
5768
  } else if (entry.isFile()) {
@@ -5755,9 +5783,28 @@ function parseMdFrontmatter(content) {
5755
5783
  if (!fmMatch) return null;
5756
5784
  return parse(fmMatch[1]);
5757
5785
  }
5786
+ function checkManifestIdentity(kind, parsed) {
5787
+ if (parsed === null || typeof parsed !== "object") return null;
5788
+ const obj = parsed;
5789
+ const identity = kind === "flow" ? obj.id : obj.name;
5790
+ if (typeof identity !== "string" || identity.length === 0) return null;
5791
+ const publisher = typeof obj.publisher === "string" ? obj.publisher : void 0;
5792
+ if (publisher !== void 0) {
5793
+ try {
5794
+ parseAssetRef(`${kind}:@${publisher}/${identity}`);
5795
+ return null;
5796
+ } catch (e) {
5797
+ return e instanceof Error ? e.message : String(e);
5798
+ }
5799
+ }
5800
+ if (!isValidAssetName(identity)) {
5801
+ return `invalid asset ${kind === "flow" ? "id" : "name"} "${identity}" \u2014 ${ASSET_NAME_HINT}`;
5802
+ }
5803
+ return null;
5804
+ }
5758
5805
  function validateManifests(rootPath) {
5759
- const absRoot = path14__default.resolve(rootPath);
5760
- if (!fs10__default.existsSync(absRoot)) {
5806
+ const absRoot = path15__default.resolve(rootPath);
5807
+ if (!fs11__default.existsSync(absRoot)) {
5761
5808
  logErr(`Path does not exist: ${absRoot}`);
5762
5809
  return { total: 0, errors: 1, warnings: 0 };
5763
5810
  }
@@ -5766,7 +5813,7 @@ function validateManifests(rootPath) {
5766
5813
  let errors = 0;
5767
5814
  let warnings = 0;
5768
5815
  for (const c of candidates) {
5769
- const content = fs10__default.readFileSync(c.filePath, "utf-8");
5816
+ const content = fs11__default.readFileSync(c.filePath, "utf-8");
5770
5817
  let parsed;
5771
5818
  if (c.filePath.endsWith(".md")) {
5772
5819
  parsed = parseMdFrontmatter(content);
@@ -5777,14 +5824,19 @@ function validateManifests(rootPath) {
5777
5824
  try {
5778
5825
  parsed = c.filePath.endsWith(".json") ? JSON.parse(content) : parse(content);
5779
5826
  } catch (e) {
5780
- const relPath2 = path14__default.relative(absRoot, c.filePath);
5827
+ const relPath2 = path15__default.relative(absRoot, c.filePath);
5781
5828
  logErr(`${relPath2} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
5782
5829
  errors++;
5783
5830
  continue;
5784
5831
  }
5785
5832
  }
5833
+ const relPath = path15__default.relative(absRoot, c.filePath);
5834
+ const identityError = checkManifestIdentity(c.kind, parsed);
5835
+ if (identityError) {
5836
+ logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
5837
+ errors++;
5838
+ }
5786
5839
  const provider = registry.getProvider(c.kind);
5787
- const relPath = path14__default.relative(absRoot, c.filePath);
5788
5840
  if (!provider) {
5789
5841
  logWarn(`${relPath} [${c.kind}] \u2014 kind "${c.kind}" is not registered, skipping validation`);
5790
5842
  warnings++;
@@ -5800,27 +5852,106 @@ function validateManifests(rootPath) {
5800
5852
  }
5801
5853
  return { total: candidates.length, errors, warnings };
5802
5854
  }
5855
+ function findWorkspaceManifests(rootPath) {
5856
+ const out = [];
5857
+ function walk(dir) {
5858
+ let entries;
5859
+ try {
5860
+ entries = fs11__default.readdirSync(dir, { withFileTypes: true });
5861
+ } catch {
5862
+ return;
5863
+ }
5864
+ for (const entry of entries) {
5865
+ const full = path15__default.join(dir, entry.name);
5866
+ if (entry.isDirectory()) {
5867
+ if (!SKIP_DIRS.has(entry.name)) walk(full);
5868
+ } else if (entry.isFile() && /(^|\.)skaile\.yaml$/.test(entry.name)) {
5869
+ out.push(full);
5870
+ }
5871
+ }
5872
+ }
5873
+ walk(rootPath);
5874
+ return out;
5875
+ }
5876
+ function validateWorkspaceManifests(rootPath) {
5877
+ const absRoot = path15__default.resolve(rootPath);
5878
+ const files = findWorkspaceManifests(absRoot);
5879
+ let errors = 0;
5880
+ for (const file of files) {
5881
+ const relPath = path15__default.relative(absRoot, file);
5882
+ let parsed;
5883
+ try {
5884
+ parsed = parse(fs11__default.readFileSync(file, "utf-8")) ?? {};
5885
+ } catch (e) {
5886
+ logErr(`${relPath} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
5887
+ errors++;
5888
+ continue;
5889
+ }
5890
+ const refFields = [];
5891
+ if (Array.isArray(parsed.dependencies)) {
5892
+ for (const d of parsed.dependencies) {
5893
+ if (typeof d === "string") refFields.push(["dependencies", d]);
5894
+ }
5895
+ }
5896
+ if (Array.isArray(parsed.overrides)) {
5897
+ for (const o of parsed.overrides) {
5898
+ const ref = o?.ref;
5899
+ if (typeof ref === "string") refFields.push(["overrides.ref", ref]);
5900
+ }
5901
+ }
5902
+ for (const [field, ref] of refFields) {
5903
+ try {
5904
+ parseAssetRef(ref);
5905
+ } catch (e) {
5906
+ logErr(`${relPath} [${field}] \u2014 ${e instanceof Error ? e.message : String(e)}`);
5907
+ errors++;
5908
+ }
5909
+ }
5910
+ if (Array.isArray(parsed.assets)) {
5911
+ const topPublisher = typeof parsed.publisher === "string" ? parsed.publisher : void 0;
5912
+ for (const a of parsed.assets) {
5913
+ const asset = a;
5914
+ const name = asset?.name;
5915
+ const kind = typeof asset?.kind === "string" ? asset.kind : "skill";
5916
+ if (typeof name !== "string" || name.length === 0) continue;
5917
+ const publisher = typeof asset?.publisher === "string" ? asset.publisher : topPublisher;
5918
+ if (publisher !== void 0) {
5919
+ try {
5920
+ parseAssetRef(`${kind}:@${publisher}/${name}`);
5921
+ } catch (e) {
5922
+ logErr(`${relPath} [assets] \u2014 ${e instanceof Error ? e.message : String(e)}`);
5923
+ errors++;
5924
+ }
5925
+ } else if (!isValidAssetName(name)) {
5926
+ logErr(`${relPath} [assets] \u2014 invalid asset name "${name}" \u2014 ${ASSET_NAME_HINT}`);
5927
+ errors++;
5928
+ }
5929
+ }
5930
+ }
5931
+ }
5932
+ return { total: files.length, errors };
5933
+ }
5803
5934
  var EXCLUDED_DOMAINS = /* @__PURE__ */ new Set(["skaileup-shared", "external", "docs"]);
5804
5935
  function collectAssetVersions() {
5805
5936
  const assets = [];
5806
- if (!fs10__default.existsSync(AI_RESOURCES)) return assets;
5807
- const domains = fs10__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory() && !EXCLUDED_DOMAINS.has(d.name));
5937
+ if (!fs11__default.existsSync(AI_RESOURCES)) return assets;
5938
+ const domains = fs11__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory() && !EXCLUDED_DOMAINS.has(d.name));
5808
5939
  for (const d of domains) {
5809
- const domainDir = path14__default.join(AI_RESOURCES, d.name);
5810
- const skillsDir = path14__default.join(domainDir, "skills");
5811
- if (fs10__default.existsSync(skillsDir)) {
5940
+ const domainDir = path15__default.join(AI_RESOURCES, d.name);
5941
+ const skillsDir = path15__default.join(domainDir, "skills");
5942
+ if (fs11__default.existsSync(skillsDir)) {
5812
5943
  collectSkillVersions(skillsDir, d.name, assets);
5813
5944
  }
5814
- const agentsDir = path14__default.join(domainDir, "agents");
5815
- if (fs10__default.existsSync(agentsDir)) {
5945
+ const agentsDir = path15__default.join(domainDir, "agents");
5946
+ if (fs11__default.existsSync(agentsDir)) {
5816
5947
  collectAgentVersions(agentsDir, d.name, assets);
5817
5948
  }
5818
- const flowsDir = path14__default.join(domainDir, "flows");
5819
- if (fs10__default.existsSync(flowsDir)) {
5820
- for (const f of fs10__default.readdirSync(flowsDir)) {
5949
+ const flowsDir = path15__default.join(domainDir, "flows");
5950
+ if (fs11__default.existsSync(flowsDir)) {
5951
+ for (const f of fs11__default.readdirSync(flowsDir)) {
5821
5952
  if (!f.endsWith(".flow.yaml")) continue;
5822
- const fp = path14__default.join(flowsDir, f);
5823
- const content = fs10__default.readFileSync(fp, "utf-8");
5953
+ const fp = path15__default.join(flowsDir, f);
5954
+ const content = fs11__default.readFileSync(fp, "utf-8");
5824
5955
  const parsed = parse(content);
5825
5956
  assets.push({
5826
5957
  kind: "flow",
@@ -5831,12 +5962,12 @@ function collectAssetVersions() {
5831
5962
  });
5832
5963
  }
5833
5964
  }
5834
- const promptsDir = path14__default.join(domainDir, "prompts");
5835
- if (fs10__default.existsSync(promptsDir)) {
5836
- for (const f of fs10__default.readdirSync(promptsDir)) {
5965
+ const promptsDir = path15__default.join(domainDir, "prompts");
5966
+ if (fs11__default.existsSync(promptsDir)) {
5967
+ for (const f of fs11__default.readdirSync(promptsDir)) {
5837
5968
  if (!f.endsWith(".prompt.md")) continue;
5838
- const fp = path14__default.join(promptsDir, f);
5839
- const content = fs10__default.readFileSync(fp, "utf-8");
5969
+ const fp = path15__default.join(promptsDir, f);
5970
+ const content = fs11__default.readFileSync(fp, "utf-8");
5840
5971
  const fm = parseSkillFrontmatter(content);
5841
5972
  assets.push({
5842
5973
  kind: "prompt",
@@ -5851,12 +5982,12 @@ function collectAssetVersions() {
5851
5982
  return assets;
5852
5983
  }
5853
5984
  function collectSkillVersions(dir, domain, out) {
5854
- for (const entry of fs10__default.readdirSync(dir, { withFileTypes: true })) {
5985
+ for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
5855
5986
  if (!entry.isDirectory()) continue;
5856
- const full = path14__default.join(dir, entry.name);
5857
- const skillMd = path14__default.join(full, "SKILL.md");
5858
- if (fs10__default.existsSync(skillMd)) {
5859
- const content = fs10__default.readFileSync(skillMd, "utf-8");
5987
+ const full = path15__default.join(dir, entry.name);
5988
+ const skillMd = path15__default.join(full, "SKILL.md");
5989
+ if (fs11__default.existsSync(skillMd)) {
5990
+ const content = fs11__default.readFileSync(skillMd, "utf-8");
5860
5991
  const fm = parseSkillFrontmatter(content);
5861
5992
  out.push({
5862
5993
  kind: "skill",
@@ -5871,11 +6002,11 @@ function collectSkillVersions(dir, domain, out) {
5871
6002
  }
5872
6003
  }
5873
6004
  function collectAgentVersions(dir, domain, out) {
5874
- for (const entry of fs10__default.readdirSync(dir, { withFileTypes: true })) {
6005
+ for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
5875
6006
  if (!entry.isDirectory()) continue;
5876
- const agentYaml = path14__default.join(dir, entry.name, "agent.yaml");
5877
- if (!fs10__default.existsSync(agentYaml)) continue;
5878
- const content = fs10__default.readFileSync(agentYaml, "utf-8");
6007
+ const agentYaml = path15__default.join(dir, entry.name, "agent.yaml");
6008
+ if (!fs11__default.existsSync(agentYaml)) continue;
6009
+ const content = fs11__default.readFileSync(agentYaml, "utf-8");
5879
6010
  const parsed = parse(content);
5880
6011
  out.push({
5881
6012
  kind: "agent",
@@ -5904,15 +6035,17 @@ function makeValidateCommand() {
5904
6035
  "Validate asset manifests, versions, and changelogs"
5905
6036
  );
5906
6037
  cmd.argument("[path]", "Path to asset repo or directory to validate", ".").action((targetPath) => {
5907
- const absPath = path14__default.resolve(targetPath);
6038
+ const absPath = path15__default.resolve(targetPath);
5908
6039
  logInfo(`Validating manifests in ${absPath}`);
5909
6040
  const { total, errors } = validateManifests(absPath);
6041
+ const ws = validateWorkspaceManifests(absPath);
6042
+ const totalErrors = errors + ws.errors;
5910
6043
  console.log();
5911
- logInfo(`Scanned ${total} manifest files`);
5912
- if (errors === 0) {
6044
+ logInfo(`Scanned ${total} asset manifest(s) and ${ws.total} skaile.yaml file(s)`);
6045
+ if (totalErrors === 0) {
5913
6046
  logOk("All manifests valid");
5914
6047
  } else {
5915
- logErr(`${errors} validation error(s)`);
6048
+ logErr(`${totalErrors} validation error(s)`);
5916
6049
  process.exit(1);
5917
6050
  }
5918
6051
  });
@@ -5925,7 +6058,7 @@ function makeValidateCommand() {
5925
6058
  encoding: "utf-8"
5926
6059
  });
5927
6060
  const changedFiles = new Set(
5928
- diffOutput.trim().split("\n").filter(Boolean).map((f) => path14__default.resolve(AI_RESOURCES, f))
6061
+ diffOutput.trim().split("\n").filter(Boolean).map((f) => path15__default.resolve(AI_RESOURCES, f))
5929
6062
  );
5930
6063
  assets = assets.filter((a) => changedFiles.has(a.filePath));
5931
6064
  } catch {
@@ -5947,7 +6080,7 @@ function makeValidateCommand() {
5947
6080
  if (opts.changedOnly) {
5948
6081
  for (const a of assets) {
5949
6082
  if (!a.version) continue;
5950
- const relPath = path14__default.relative(AI_RESOURCES, a.filePath);
6083
+ const relPath = path15__default.relative(AI_RESOURCES, a.filePath);
5951
6084
  try {
5952
6085
  const headContent = execSync(`git show HEAD:${relPath}`, {
5953
6086
  cwd: AI_RESOURCES,
@@ -5970,7 +6103,7 @@ function makeValidateCommand() {
5970
6103
  skillVersionMap.set(a.name, a.version);
5971
6104
  }
5972
6105
  for (const f of flows) {
5973
- const content = fs10__default.readFileSync(f.filePath, "utf-8");
6106
+ const content = fs11__default.readFileSync(f.filePath, "utf-8");
5974
6107
  const parsed = parse(content);
5975
6108
  const nodes = (parsed?.nodes ?? []).filter((n) => n.type === "skill" && n.data?.version).map((n) => ({
5976
6109
  nodeId: n.id,
@@ -6027,7 +6160,7 @@ function makeValidateCommand() {
6027
6160
  let errors = 0;
6028
6161
  for (const domain of modifiedDomains) {
6029
6162
  const changelogModified = modifiedFiles.some(
6030
- (f) => f === `${domain}/CHANGELOG.md` || f === path14__default.join(domain, "CHANGELOG.md")
6163
+ (f) => f === `${domain}/CHANGELOG.md` || f === path15__default.join(domain, "CHANGELOG.md")
6031
6164
  );
6032
6165
  if (changelogModified) {
6033
6166
  logOk(`${domain}/CHANGELOG.md updated`);
@@ -6109,7 +6242,7 @@ function makeVerifyCommand() {
6109
6242
  }
6110
6243
  function makeWhyCommand() {
6111
6244
  return new Command("why").description("Show why an asset is installed (dependency chain)").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
6112
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
6245
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
6113
6246
  const chain = am2.why(ref);
6114
6247
  if (chain.length === 0) {
6115
6248
  logErr(`${ref} not found in lock file. Run \`skaile install\` first.`);
@@ -6130,7 +6263,7 @@ function makeWhyCommand() {
6130
6263
  var _defaultFormatHelp = Help.prototype.formatHelp;
6131
6264
  var pkg = JSON.parse(
6132
6265
  readFileSync(
6133
- path14__default.resolve(path14__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
6266
+ path15__default.resolve(path15__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
6134
6267
  "utf-8"
6135
6268
  )
6136
6269
  );
@@ -6198,6 +6331,7 @@ Execution:
6198
6331
  clear Unset current session
6199
6332
 
6200
6333
  Validation:
6334
+ validate [path] Check manifest schemas + canonical asset names/refs
6201
6335
  validate versions Check asset version fields and flow pins
6202
6336
  validate changelog Check changelogs for modified domains
6203
6337
 
@@ -6241,6 +6375,11 @@ Advanced:
6241
6375
  `;
6242
6376
  }
6243
6377
  });
6378
+ var BACKEND_DEFAULTS = {
6379
+ "claude-code": { driver: "claude-sdk", provider: "anthropic", model: "claude-sonnet-4-6" },
6380
+ omp: { driver: "omp" },
6381
+ codex: { driver: "codex", provider: "openai" }
6382
+ };
6244
6383
  program.command("init [project-dir]").description("Initialize a project directory (defaults to current directory)").option("--backend <name>", "Coding-agent backend (claude-code | omp | codex)", "claude-code").option("--no-git", "Skip git init and .gitignore").action(async (projectDir, opts) => {
6245
6384
  const { execSync: execSync3 } = await import('child_process');
6246
6385
  const { existsSync: existsSync12, mkdirSync: mkdirSync3, readFileSync: readFileSync6, writeFileSync: writeFileSync2 } = await import('fs');
@@ -6254,25 +6393,26 @@ program.command("init [project-dir]").description("Initialize a project director
6254
6393
  process.exitCode = 1;
6255
6394
  return;
6256
6395
  }
6257
- const resolved = path14__default.resolve(projectDir ?? ".");
6258
- const projectName = path14__default.basename(resolved);
6396
+ const resolved = path15__default.resolve(projectDir ?? ".");
6397
+ const projectName = path15__default.basename(resolved);
6259
6398
  const created = [];
6260
6399
  if (!existsSync12(resolved)) {
6261
6400
  mkdirSync3(resolved, { recursive: true });
6262
6401
  created.push(".");
6263
6402
  }
6264
- const skaileDir = path14__default.join(resolved, ".skaile");
6403
+ const skaileDir = path15__default.join(resolved, ".skaile");
6265
6404
  if (!existsSync12(skaileDir)) {
6266
- mkdirSync3(path14__default.join(skaileDir, "sessions"), { recursive: true });
6405
+ mkdirSync3(path15__default.join(skaileDir, "sessions"), { recursive: true });
6267
6406
  created.push(".skaile/");
6268
6407
  }
6269
- const settingsPath = path14__default.join(skaileDir, "settings.json");
6408
+ const settingsPath = path15__default.join(skaileDir, "settings.json");
6270
6409
  if (!existsSync12(settingsPath)) {
6271
6410
  writeFileSync2(settingsPath, "{}\n");
6272
6411
  created.push(".skaile/settings.json");
6273
6412
  }
6274
- const wsConfigPath = path14__default.join(resolved, "skaile.yaml");
6413
+ const wsConfigPath = path15__default.join(resolved, "skaile.yaml");
6275
6414
  if (!existsSync12(wsConfigPath)) {
6415
+ const backendDefaults = BACKEND_DEFAULTS[backend];
6276
6416
  writeFileSync2(
6277
6417
  wsConfigPath,
6278
6418
  stringify({
@@ -6281,9 +6421,10 @@ program.command("init [project-dir]").description("Initialize a project director
6281
6421
  "agent-config": {
6282
6422
  default: {
6283
6423
  agent: backend,
6284
- provider: "anthropic",
6285
- model: "claude-sonnet-4-6",
6286
- driver: "claude-sdk",
6424
+ // provider/model are omitted for backends that don't fix them (omp, codex).
6425
+ ...backendDefaults.provider ? { provider: backendDefaults.provider } : {},
6426
+ ...backendDefaults.model ? { model: backendDefaults.model } : {},
6427
+ driver: backendDefaults.driver,
6287
6428
  max_turns: 200
6288
6429
  }
6289
6430
  }
@@ -6292,14 +6433,14 @@ program.command("init [project-dir]").description("Initialize a project director
6292
6433
  created.push("skaile.yaml");
6293
6434
  }
6294
6435
  for (const dir of new Set(Object.values(DRIVER_TARGETS[backend].local))) {
6295
- const full = path14__default.join(resolved, dir);
6436
+ const full = path15__default.join(resolved, dir);
6296
6437
  if (!existsSync12(full)) {
6297
6438
  mkdirSync3(full, { recursive: true });
6298
6439
  created.push(`${dir}/`);
6299
6440
  }
6300
6441
  }
6301
6442
  if (opts.git) {
6302
- const gitignorePath = path14__default.join(resolved, ".gitignore");
6443
+ const gitignorePath = path15__default.join(resolved, ".gitignore");
6303
6444
  const entries = ["node_modules/", ".skaile/sessions/", "*.log", ".env", ".env.local"];
6304
6445
  const existing = existsSync12(gitignorePath) ? readFileSync6(gitignorePath, "utf-8") : "";
6305
6446
  const have = new Set(existing.split("\n").map((l) => l.trim()));
@@ -6310,7 +6451,7 @@ program.command("init [project-dir]").description("Initialize a project director
6310
6451
  `);
6311
6452
  if (!existing) created.push(".gitignore");
6312
6453
  }
6313
- if (!existsSync12(path14__default.join(resolved, ".git"))) {
6454
+ if (!existsSync12(path15__default.join(resolved, ".git"))) {
6314
6455
  try {
6315
6456
  execSync3("git init", { cwd: resolved, stdio: "pipe" });
6316
6457
  created.push(".git/");
@@ -6321,10 +6462,10 @@ program.command("init [project-dir]").description("Initialize a project director
6321
6462
  }
6322
6463
  }
6323
6464
  try {
6324
- const fs11 = await import('fs');
6465
+ const fs12 = await import('fs');
6325
6466
  const { userConfigPath, saveConfig, getConfigDefaults } = await import('../library/index.js');
6326
6467
  const userCfgPath = userConfigPath();
6327
- if (!fs11.existsSync(userCfgPath)) {
6468
+ if (!fs12.existsSync(userCfgPath)) {
6328
6469
  const defaults = getConfigDefaults();
6329
6470
  saveConfig(userCfgPath, {
6330
6471
  catalog: { url: defaults.catalog.url, cache_ttl: defaults.catalog.cache_ttl }
@@ -6337,7 +6478,7 @@ program.command("init [project-dir]").description("Initialize a project director
6337
6478
  );
6338
6479
  }
6339
6480
  try {
6340
- const { ensureSourcesCloned } = await import('../ensure-sources-OJUBGX6Z.js');
6481
+ const { ensureSourcesCloned } = await import('../ensure-sources-CVULUVH4.js');
6341
6482
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
6342
6483
  for (const n of hydrate.cloned) created.push(`~/.skaile/sources/${n}/`);
6343
6484
  if (hydrate.failed.length > 0) {
@@ -6351,7 +6492,7 @@ program.command("init [project-dir]").description("Initialize a project director
6351
6492
  logOk(`Initialized project at ${S.heading(resolved)}`);
6352
6493
  console.log();
6353
6494
  console.log(S.heading(" Next steps:"));
6354
- const isCurrentDir = resolved === path14__default.resolve(".");
6495
+ const isCurrentDir = resolved === path15__default.resolve(".");
6355
6496
  let step = 1;
6356
6497
  if (!isCurrentDir) {
6357
6498
  console.log(` ${S.dim(`${step}.`)} ${S.cmd(`cd ${projectDir}`)}`);
@@ -6363,7 +6504,7 @@ program.command("init [project-dir]").description("Initialize a project director
6363
6504
  console.log();
6364
6505
  });
6365
6506
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
6366
- const { cmdSetup } = await import('../setup-J7CYEQOF.js');
6507
+ const { cmdSetup } = await import('../setup-YNLFR5GB.js');
6367
6508
  await cmdSetup([], { projectDir: process.cwd() });
6368
6509
  });
6369
6510
  program.addCommand(makeInstallCommand());