@skaile/workspaces 0.25.0 → 0.27.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 (562) hide show
  1. package/CHANGELOG.md +271 -0
  2. package/README.md +2 -2
  3. package/dist/{asset-feeds-77KLWCBP.js → asset-feeds-DGZO27M7.js} +20 -12
  4. package/dist/asset-feeds-DGZO27M7.js.map +1 -0
  5. package/dist/asset-manager/index.js +12 -11
  6. package/dist/asset-manager/installer.js +11 -10
  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/continue.d.ts +2 -0
  16. package/dist/bridge/drivers/continue.js +103 -0
  17. package/dist/bridge/drivers/continue.js.map +1 -0
  18. package/dist/bridge/drivers/echo.js +1 -1
  19. package/dist/bridge/drivers/gemini.d.ts +2 -0
  20. package/dist/bridge/drivers/gemini.js +10 -0
  21. package/dist/bridge/drivers/gemini.js.map +1 -0
  22. package/dist/bridge/drivers/goose.d.ts +2 -0
  23. package/dist/bridge/drivers/goose.js +88 -0
  24. package/dist/bridge/drivers/goose.js.map +1 -0
  25. package/dist/bridge/drivers/omp.js +64 -50
  26. package/dist/bridge/drivers/omp.js.map +1 -1
  27. package/dist/bridge/drivers/opencode.d.ts +2 -0
  28. package/dist/bridge/drivers/opencode.js +99 -0
  29. package/dist/bridge/drivers/opencode.js.map +1 -0
  30. package/dist/bridge/drivers/qwen.d.ts +2 -0
  31. package/dist/bridge/drivers/qwen.js +57 -0
  32. package/dist/bridge/drivers/qwen.js.map +1 -0
  33. package/dist/bridge/index.js +4 -4
  34. package/dist/bridge/src/drivers/_subprocess-cli.d.ts +136 -0
  35. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -0
  36. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  37. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  38. package/dist/bridge/src/drivers/continue.d.ts +43 -0
  39. package/dist/bridge/src/drivers/continue.d.ts.map +1 -0
  40. package/dist/bridge/src/drivers/gemini.d.ts +55 -0
  41. package/dist/bridge/src/drivers/gemini.d.ts.map +1 -0
  42. package/dist/bridge/src/drivers/goose.d.ts +42 -0
  43. package/dist/bridge/src/drivers/goose.d.ts.map +1 -0
  44. package/dist/bridge/src/drivers/omp.d.ts +20 -4
  45. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  46. package/dist/bridge/src/drivers/opencode.d.ts +43 -0
  47. package/dist/bridge/src/drivers/opencode.d.ts.map +1 -0
  48. package/dist/bridge/src/drivers/qwen.d.ts +39 -0
  49. package/dist/bridge/src/drivers/qwen.d.ts.map +1 -0
  50. package/dist/bridge/src/error-classifier.d.ts +17 -0
  51. package/dist/bridge/src/error-classifier.d.ts.map +1 -1
  52. package/dist/bridge/src/models.d.ts +1 -1
  53. package/dist/bridge/src/models.d.ts.map +1 -1
  54. package/dist/bridge/src/provider-endpoints.d.ts +16 -0
  55. package/dist/bridge/src/provider-endpoints.d.ts.map +1 -0
  56. package/dist/bridge/src/registry.d.ts.map +1 -1
  57. package/dist/bridge/src/validation.d.ts +1 -1
  58. package/dist/bridge/src/validation.d.ts.map +1 -1
  59. package/dist/{chunk-GL45UNVS.js → chunk-2FS4FPZ7.js} +3 -3
  60. package/dist/{chunk-GL45UNVS.js.map → chunk-2FS4FPZ7.js.map} +1 -1
  61. package/dist/{chunk-4FJE6BI6.js → chunk-2NOE4AGD.js} +3 -3
  62. package/dist/{chunk-4FJE6BI6.js.map → chunk-2NOE4AGD.js.map} +1 -1
  63. package/dist/{chunk-3QTZWPGH.js → chunk-3QQSSRYN.js} +168 -90
  64. package/dist/chunk-3QQSSRYN.js.map +1 -0
  65. package/dist/{chunk-4FADEVBN.js → chunk-3ZER5DST.js} +6 -6
  66. package/dist/chunk-3ZER5DST.js.map +1 -0
  67. package/dist/chunk-5RBPPBEK.js +110 -0
  68. package/dist/chunk-5RBPPBEK.js.map +1 -0
  69. package/dist/chunk-5V5KZQIC.js +445 -0
  70. package/dist/chunk-5V5KZQIC.js.map +1 -0
  71. package/dist/{chunk-LSGAYQ2E.js → chunk-5YO3H5Q4.js} +3 -3
  72. package/dist/{chunk-LSGAYQ2E.js.map → chunk-5YO3H5Q4.js.map} +1 -1
  73. package/dist/{chunk-JDX54X4Y.js → chunk-7GWYRVAX.js} +12 -9
  74. package/dist/chunk-7GWYRVAX.js.map +1 -0
  75. package/dist/{chunk-B4ZXBH57.js → chunk-A4ASAIKK.js} +59 -13
  76. package/dist/chunk-A4ASAIKK.js.map +1 -0
  77. package/dist/{chunk-M5TE6YI5.js → chunk-AKSR434V.js} +10 -52
  78. package/dist/chunk-AKSR434V.js.map +1 -0
  79. package/dist/{chunk-KOVLSBXK.js → chunk-BMQKMOQY.js} +81 -79
  80. package/dist/chunk-BMQKMOQY.js.map +1 -0
  81. package/dist/{chunk-FJFHJBGS.js → chunk-BUL5H6J7.js} +9 -9
  82. package/dist/chunk-BUL5H6J7.js.map +1 -0
  83. package/dist/{chunk-GZWJGNNN.js → chunk-DEYYRFQU.js} +3 -3
  84. package/dist/chunk-DEYYRFQU.js.map +1 -0
  85. package/dist/{chunk-SETTLPBD.js → chunk-DGM74UP4.js} +3 -3
  86. package/dist/{chunk-SETTLPBD.js.map → chunk-DGM74UP4.js.map} +1 -1
  87. package/dist/{chunk-UD4ZLXGS.js → chunk-FWHOU3CX.js} +67 -35
  88. package/dist/chunk-FWHOU3CX.js.map +1 -0
  89. package/dist/{chunk-WSZAFRQL.js → chunk-GYPA2Q7F.js} +6 -5
  90. package/dist/chunk-GYPA2Q7F.js.map +1 -0
  91. package/dist/{chunk-WIAHJOMG.js → chunk-IEJ5IOC3.js} +10 -2
  92. package/dist/chunk-IEJ5IOC3.js.map +1 -0
  93. package/dist/chunk-IERB3UXJ.js +215 -0
  94. package/dist/chunk-IERB3UXJ.js.map +1 -0
  95. package/dist/{chunk-FVTV7M76.js → chunk-IFGTRL2I.js} +3 -3
  96. package/dist/chunk-IFGTRL2I.js.map +1 -0
  97. package/dist/{chunk-KT3CK26V.js → chunk-JIQLLZ65.js} +203 -39
  98. package/dist/chunk-JIQLLZ65.js.map +1 -0
  99. package/dist/{chunk-XVL22AWE.js → chunk-M4KLIEIJ.js} +114 -63
  100. package/dist/chunk-M4KLIEIJ.js.map +1 -0
  101. package/dist/{chunk-6FNCZYJY.js → chunk-MBOR7D65.js} +3 -3
  102. package/dist/{chunk-6FNCZYJY.js.map → chunk-MBOR7D65.js.map} +1 -1
  103. package/dist/{chunk-BJWUSHC4.js → chunk-MZDXEFXF.js} +30 -20
  104. package/dist/chunk-MZDXEFXF.js.map +1 -0
  105. package/dist/{chunk-QAVZOJCV.js → chunk-OVRSNIKJ.js} +2 -2
  106. package/dist/chunk-OVRSNIKJ.js.map +1 -0
  107. package/dist/{chunk-DQWREFRQ.js → chunk-PAYAFNXG.js} +22 -3
  108. package/dist/chunk-PAYAFNXG.js.map +1 -0
  109. package/dist/{chunk-D3VO6WNC.js → chunk-PRLD7EXG.js} +3 -3
  110. package/dist/chunk-PRLD7EXG.js.map +1 -0
  111. package/dist/{chunk-NELZIQ2E.js → chunk-QDJKE557.js} +20 -3
  112. package/dist/chunk-QDJKE557.js.map +1 -0
  113. package/dist/{chunk-QXC62DOF.js → chunk-SF4GWVR5.js} +21 -9
  114. package/dist/chunk-SF4GWVR5.js.map +1 -0
  115. package/dist/{chunk-IPUYL6TD.js → chunk-TV72ZJYN.js} +8 -5
  116. package/dist/{chunk-IPUYL6TD.js.map → chunk-TV72ZJYN.js.map} +1 -1
  117. package/dist/{chunk-4QVFQEY2.js → chunk-UAW7VRAL.js} +2 -2
  118. package/dist/{chunk-4QVFQEY2.js.map → chunk-UAW7VRAL.js.map} +1 -1
  119. package/dist/chunk-UBCZVONU.js +28 -0
  120. package/dist/chunk-UBCZVONU.js.map +1 -0
  121. package/dist/{chunk-2XY6732A.js → chunk-UIZKIUC6.js} +6 -6
  122. package/dist/chunk-UIZKIUC6.js.map +1 -0
  123. package/dist/{chunk-ICS76R4T.js → chunk-W7W66MDZ.js} +10 -8
  124. package/dist/chunk-W7W66MDZ.js.map +1 -0
  125. package/dist/{chunk-DCAWIRD6.js → chunk-WRRYESHC.js} +152 -187
  126. package/dist/chunk-WRRYESHC.js.map +1 -0
  127. package/dist/{chunk-XMP6XTMF.js → chunk-XHBPQ7QP.js} +450 -207
  128. package/dist/chunk-XHBPQ7QP.js.map +1 -0
  129. package/dist/chunk-Z3XXKR5E.js +88 -0
  130. package/dist/chunk-Z3XXKR5E.js.map +1 -0
  131. package/dist/{chunk-KLNL7QHN.js → chunk-ZAP2BDHG.js} +30 -5
  132. package/dist/chunk-ZAP2BDHG.js.map +1 -0
  133. package/dist/{chunk-6VTG73UY.js → chunk-ZEKWHJBB.js} +52 -2
  134. package/dist/chunk-ZEKWHJBB.js.map +1 -0
  135. package/dist/{chunk-GCJXPUHG.js → chunk-ZONCCO5N.js} +9 -4
  136. package/dist/chunk-ZONCCO5N.js.map +1 -0
  137. package/dist/cli/index.js +618 -482
  138. package/dist/cli/index.js.map +1 -1
  139. package/dist/cli/src/asset-feeds.d.ts +14 -1
  140. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  141. package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
  142. package/dist/cli/src/commands/config.d.ts.map +1 -1
  143. package/dist/cli/src/commands/connector.d.ts +7 -0
  144. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  145. package/dist/cli/src/commands/flow.d.ts +3 -2
  146. package/dist/cli/src/commands/flow.d.ts.map +1 -1
  147. package/dist/cli/src/commands/manage.d.ts +46 -23
  148. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  149. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  150. package/dist/cli/src/commands/run.d.ts.map +1 -1
  151. package/dist/cli/src/flow-discovery.d.ts +24 -0
  152. package/dist/cli/src/flow-discovery.d.ts.map +1 -0
  153. package/dist/cli/src/helpers.d.ts +10 -1
  154. package/dist/cli/src/helpers.d.ts.map +1 -1
  155. package/dist/cli/src/open-registry.d.ts +2 -2
  156. package/dist/cli/src/paths.d.ts +26 -9
  157. package/dist/cli/src/paths.d.ts.map +1 -1
  158. package/dist/cli/src/skill-walker.d.ts +9 -5
  159. package/dist/cli/src/skill-walker.d.ts.map +1 -1
  160. package/dist/connectors/config.js +9 -8
  161. package/dist/connectors/index.js +14 -13
  162. package/dist/connectors/rclone-config.js +1 -1
  163. package/dist/connectors/src/connector-manager.d.ts +24 -2
  164. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  165. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  166. package/dist/connectors/src/connector-registry.d.ts +3 -3
  167. package/dist/connectors/src/credential-helper-script.d.ts.map +1 -1
  168. package/dist/connectors/src/index.d.ts +4 -2
  169. package/dist/connectors/src/index.d.ts.map +1 -1
  170. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  171. package/dist/connectors/src/mount-placeholder.d.ts +68 -0
  172. package/dist/connectors/src/mount-placeholder.d.ts.map +1 -0
  173. package/dist/connectors/src/rclone-config/googledrive.d.ts +1 -1
  174. package/dist/core/discovery.js +1 -1
  175. package/dist/core/index.js +8 -7
  176. package/dist/core/manifest.js +2 -2
  177. package/dist/core/models.js +1 -1
  178. package/dist/core/publish-manifest.d.ts +2 -0
  179. package/dist/core/publish-manifest.js +5 -0
  180. package/dist/core/publish-manifest.js.map +1 -0
  181. package/dist/core/runtime-assets.js +5 -4
  182. package/dist/core/src/discovery.d.ts +27 -0
  183. package/dist/core/src/discovery.d.ts.map +1 -1
  184. package/dist/core/src/index.d.ts +8 -5
  185. package/dist/core/src/index.d.ts.map +1 -1
  186. package/dist/core/src/lock.d.ts.map +1 -1
  187. package/dist/core/src/manifest-yaml-editor.d.ts +62 -0
  188. package/dist/core/src/manifest-yaml-editor.d.ts.map +1 -0
  189. package/dist/core/src/models.d.ts +6 -0
  190. package/dist/core/src/models.d.ts.map +1 -1
  191. package/dist/core/src/publish-manifest.d.ts +160 -0
  192. package/dist/core/src/publish-manifest.d.ts.map +1 -0
  193. package/dist/core/src/repo-manager.d.ts +9 -1
  194. package/dist/core/src/repo-manager.d.ts.map +1 -1
  195. package/dist/core/src/runtime-assets.d.ts +80 -29
  196. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  197. package/dist/core/src/walker.d.ts +19 -6
  198. package/dist/core/src/walker.d.ts.map +1 -1
  199. package/dist/core/src/workspace-config.d.ts +19 -37
  200. package/dist/core/src/workspace-config.d.ts.map +1 -1
  201. package/dist/core/src/workspace-yaml-editor.d.ts +1 -15
  202. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  203. package/dist/core/workspace-config.js +4 -3
  204. package/dist/deploy/index.js +51 -80
  205. package/dist/deploy/index.js.map +1 -1
  206. package/dist/deploy/src/targets/container-runtime.d.ts +1 -1
  207. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  208. package/dist/deploy/src/targets/local.d.ts.map +1 -1
  209. package/dist/deploy/src/targets/nix.d.ts.map +1 -1
  210. package/dist/deploy/src/targets/process-handle.d.ts +7 -5
  211. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -1
  212. package/dist/discovery/index.js +5 -4
  213. package/dist/discovery/src/discover-manifest.d.ts +3 -2
  214. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  215. package/dist/discovery/src/discover.d.ts +2 -2
  216. package/dist/discovery/src/discover.d.ts.map +1 -1
  217. package/dist/discovery/src/index.d.ts +1 -1
  218. package/dist/discovery/src/index.d.ts.map +1 -1
  219. package/dist/discovery/src/source-config.d.ts +53 -12
  220. package/dist/discovery/src/source-config.d.ts.map +1 -1
  221. package/dist/discovery/src/tree-entries.d.ts +2 -2
  222. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  223. package/dist/{ensure-sources-7MOOKY3K.js → ensure-sources-KQQEUDKM.js} +15 -13
  224. package/dist/ensure-sources-KQQEUDKM.js.map +1 -0
  225. package/dist/factory-assets/.skaile-source.yaml +6 -0
  226. package/dist/factory-assets/README.md +36 -0
  227. package/dist/factory-assets/bundles/workspaces-authoring/workspaces-authoring.bundle.yaml +9 -0
  228. package/dist/factory-assets/connectors/deploy/CONNECTOR.md +41 -0
  229. package/dist/{base-assets → factory-assets}/connectors/deploy/adapter.d.ts +2 -2
  230. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -0
  231. package/dist/factory-assets/connectors/deploy.js +22 -0
  232. package/dist/factory-assets/connectors/devserver/CONNECTOR.md +44 -0
  233. package/dist/{base-assets → factory-assets}/connectors/devserver/adapter.d.ts +2 -2
  234. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -0
  235. package/dist/factory-assets/connectors/devserver.js +22 -0
  236. package/dist/factory-assets/connectors/flow/CONNECTOR.md +47 -0
  237. package/dist/{base-assets → factory-assets}/connectors/flow/adapter.d.ts +2 -2
  238. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -0
  239. package/dist/factory-assets/connectors/flow/adapter.js +22 -0
  240. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -0
  241. package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
  242. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -0
  243. package/dist/factory-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -0
  244. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -0
  245. package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -0
  246. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -0
  247. package/dist/factory-assets/connectors/flow/engine.js +15 -0
  248. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -0
  249. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.d.ts +5 -5
  250. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -0
  251. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js +1 -1
  252. package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.d.ts +8 -8
  253. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -0
  254. package/dist/factory-assets/connectors/flow/run-flow.js +25 -0
  255. package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.d.ts +2 -2
  256. package/dist/factory-assets/connectors/flow/stimulus-driver.d.ts.map +1 -0
  257. package/dist/factory-assets/connectors/flow/stimulus-driver.js +4 -0
  258. package/dist/factory-assets/connectors/flow.js +22 -0
  259. package/dist/factory-assets/connectors/git/CONNECTOR.md +145 -0
  260. package/dist/{base-assets → factory-assets}/connectors/git/driver.d.ts +2 -2
  261. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -0
  262. package/dist/factory-assets/connectors/git.js +22 -0
  263. package/dist/factory-assets/connectors/gmail/CONNECTOR.md +50 -0
  264. package/dist/{base-assets → factory-assets}/connectors/gmail/adapter.d.ts +2 -2
  265. package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -0
  266. package/dist/factory-assets/connectors/gmail.js +22 -0
  267. package/dist/factory-assets/connectors/googledrive/CONNECTOR.md +150 -0
  268. package/dist/{base-assets → factory-assets}/connectors/googledrive/driver.d.ts +2 -2
  269. package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -0
  270. package/dist/factory-assets/connectors/googledrive.js +22 -0
  271. package/dist/factory-assets/connectors/local/CONNECTOR.md +40 -0
  272. package/dist/{base-assets → factory-assets}/connectors/local/driver.d.ts +2 -2
  273. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -0
  274. package/dist/factory-assets/connectors/local.js +22 -0
  275. package/dist/factory-assets/connectors/mattermost/CONNECTOR.md +65 -0
  276. package/dist/{base-assets → factory-assets}/connectors/mattermost/adapter.d.ts +2 -2
  277. package/dist/factory-assets/connectors/mattermost/adapter.d.ts.map +1 -0
  278. package/dist/factory-assets/connectors/mattermost.js +22 -0
  279. package/dist/factory-assets/connectors/memory/CONNECTOR.md +40 -0
  280. package/dist/{base-assets → factory-assets}/connectors/memory/adapter.d.ts +2 -2
  281. package/dist/factory-assets/connectors/memory/adapter.d.ts.map +1 -0
  282. package/dist/factory-assets/connectors/memory.js +22 -0
  283. package/dist/factory-assets/connectors/minio/CONNECTOR.md +68 -0
  284. package/dist/{base-assets → factory-assets}/connectors/minio/adapter.d.ts +2 -2
  285. package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -0
  286. package/dist/factory-assets/connectors/minio.js +22 -0
  287. package/dist/factory-assets/connectors/postgres/CONNECTOR.md +46 -0
  288. package/dist/{base-assets → factory-assets}/connectors/postgres/adapter.d.ts +2 -2
  289. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -0
  290. package/dist/factory-assets/connectors/postgres.js +22 -0
  291. package/dist/factory-assets/connectors/s3/CONNECTOR.md +76 -0
  292. package/dist/{base-assets → factory-assets}/connectors/s3/driver.d.ts +2 -2
  293. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -0
  294. package/dist/factory-assets/connectors/s3.js +22 -0
  295. package/dist/factory-assets/connectors/sharepoint/CONNECTOR.md +181 -0
  296. package/dist/{base-assets → factory-assets}/connectors/sharepoint/driver.d.ts +2 -2
  297. package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -0
  298. package/dist/factory-assets/connectors/sharepoint.js +22 -0
  299. package/dist/factory-assets/connectors/sqlite/CONNECTOR.md +44 -0
  300. package/dist/{base-assets → factory-assets}/connectors/sqlite/adapter.d.ts +2 -2
  301. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -0
  302. package/dist/factory-assets/connectors/sqlite.js +22 -0
  303. package/dist/factory-assets/connectors/static-server/CONNECTOR.md +41 -0
  304. package/dist/{base-assets → factory-assets}/connectors/static-server/adapter.d.ts +2 -2
  305. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -0
  306. package/dist/factory-assets/connectors/static-server.js +22 -0
  307. package/dist/factory-assets/connectors/tunnel/CONNECTOR.md +40 -0
  308. package/dist/{base-assets → factory-assets}/connectors/tunnel/adapter.d.ts +2 -2
  309. package/dist/factory-assets/connectors/tunnel/adapter.d.ts.map +1 -0
  310. package/dist/factory-assets/connectors/tunnel.js +22 -0
  311. package/dist/factory-assets/connectors/webdav/CONNECTOR.md +139 -0
  312. package/dist/{base-assets → factory-assets}/connectors/webdav/driver.d.ts +2 -2
  313. package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -0
  314. package/dist/factory-assets/connectors/webdav.js +22 -0
  315. package/dist/factory-assets/connectors/xstate/CONNECTOR.md +57 -0
  316. package/dist/{base-assets → factory-assets}/connectors/xstate/adapter.d.ts +2 -2
  317. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -0
  318. package/dist/factory-assets/connectors/xstate-store/CONNECTOR.md +48 -0
  319. package/dist/{base-assets → factory-assets}/connectors/xstate-store/adapter.d.ts +2 -2
  320. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -0
  321. package/dist/factory-assets/connectors/xstate-store.js +22 -0
  322. package/dist/factory-assets/connectors/xstate.js +22 -0
  323. package/dist/{base-assets → factory-assets}/index.d.ts +1 -1
  324. package/dist/factory-assets/index.d.ts.map +1 -0
  325. package/dist/{base-assets → factory-assets}/index.js +1 -1
  326. package/dist/factory-assets/index.js.map +1 -0
  327. package/dist/factory-assets/skaile.manifest.yaml +25 -0
  328. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +176 -0
  329. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +243 -0
  330. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +197 -0
  331. package/dist/factory-assets/skills/manifest-compliance/SKILL.md +140 -0
  332. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +239 -0
  333. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +168 -0
  334. package/dist/{flows-DYFTPCPM.js → flows-L3GHQD7F.js} +4 -4
  335. package/dist/{flows-DYFTPCPM.js.map → flows-L3GHQD7F.js.map} +1 -1
  336. package/dist/helpers-F4NZ66VD.js +4 -0
  337. package/dist/{helpers-LTN3HMD3.js.map → helpers-F4NZ66VD.js.map} +1 -1
  338. package/dist/library/index.js +12 -10
  339. package/dist/library/install.d.ts +2 -0
  340. package/dist/library/install.js +16 -0
  341. package/dist/library/install.js.map +1 -0
  342. package/dist/library/src/install/index.d.ts +3 -0
  343. package/dist/library/src/install/index.d.ts.map +1 -0
  344. package/dist/library/src/library.d.ts +2 -0
  345. package/dist/library/src/library.d.ts.map +1 -1
  346. package/dist/library/src/local/library.d.ts +2 -0
  347. package/dist/library/src/local/library.d.ts.map +1 -1
  348. package/dist/library/src/local/local-catalog-source.d.ts +2 -1
  349. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  350. package/dist/library/src/local/sidecar-paths.d.ts +4 -4
  351. package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
  352. package/dist/library/src/local/store-paths.d.ts +4 -3
  353. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  354. package/dist/library/src/pin-resolver.d.ts.map +1 -1
  355. package/dist/library/src/preset/apply.d.ts.map +1 -1
  356. package/dist/library/src/preset/placeholders.d.ts.map +1 -1
  357. package/dist/library/src/remote/remote-catalog-source.d.ts +7 -0
  358. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  359. package/dist/library/src/remote/rest-catalog-source.d.ts +7 -0
  360. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  361. package/dist/library/src/sync/manifest-writeback.d.ts +1 -1
  362. package/dist/library/src/sync/manifest-writeback.d.ts.map +1 -1
  363. package/dist/open-library-I7YTADMD.js +23 -0
  364. package/dist/{open-library-GW7DWWNZ.js.map → open-library-I7YTADMD.js.map} +1 -1
  365. package/dist/paths-CE66L3AL.js +15 -0
  366. package/dist/{paths-FKKGS6BA.js.map → paths-CE66L3AL.js.map} +1 -1
  367. package/dist/{plugin-store-R32NH7JE.js → plugin-store-GL5VKYUA.js} +10 -9
  368. package/dist/plugin-store-GL5VKYUA.js.map +1 -0
  369. package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
  370. package/dist/plugins/src/catalog-source.d.ts +13 -0
  371. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  372. package/dist/resolver/index.js +1 -1
  373. package/dist/resolver/src/parser.d.ts.map +1 -1
  374. package/dist/runner/index.js +20 -19
  375. package/dist/runner/src/capability-registry.d.ts +1 -1
  376. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  377. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  378. package/dist/runner/src/resources.d.ts +1 -1
  379. package/dist/runner/src/serve.d.ts.map +1 -1
  380. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  381. package/dist/sdk/asset-manager.js +12 -11
  382. package/dist/sdk/bridge.js +4 -4
  383. package/dist/sdk/core.js +8 -7
  384. package/dist/sdk/flow.js +12 -1
  385. package/dist/sdk/index.js +23 -22
  386. package/dist/sdk/index.js.map +1 -1
  387. package/dist/sdk/resolver.js +1 -1
  388. package/dist/sdk/runner.js +20 -19
  389. package/dist/sdk/session.js +1 -1
  390. package/dist/sdk/src/flow/index.d.ts +1 -1
  391. package/dist/sdk/src/flow/index.d.ts.map +1 -1
  392. package/dist/sdk/src/workspace.d.ts +3 -2
  393. package/dist/sdk/src/workspace.d.ts.map +1 -1
  394. package/dist/sdk/telemetry.js +1 -1
  395. package/dist/secrets/index.js +1 -1
  396. package/dist/secrets/src/providers/env.d.ts.map +1 -1
  397. package/dist/secrets/src/providers/local.d.ts.map +1 -1
  398. package/dist/session/index.js +1 -1
  399. package/dist/session/src/mentions.d.ts.map +1 -1
  400. package/dist/{setup-SRPBQOHY.js → setup-4YMN2BDU.js} +14 -13
  401. package/dist/setup-4YMN2BDU.js.map +1 -0
  402. package/dist/skills-6HJ3WINN.js +7 -0
  403. package/dist/{skills-CRL3VJNN.js.map → skills-6HJ3WINN.js.map} +1 -1
  404. package/dist/store-client-BCP5LCAZ.js +15 -0
  405. package/dist/{store-client-INZD2RYD.js.map → store-client-BCP5LCAZ.js.map} +1 -1
  406. package/dist/telemetry/index.js +1 -1
  407. package/dist/telemetry/src/config.d.ts +0 -16
  408. package/dist/telemetry/src/config.d.ts.map +1 -1
  409. package/dist/tui/index.js +20 -19
  410. package/dist/tui/index.js.map +1 -1
  411. package/dist/types/manifests.js +1 -1
  412. package/dist/types/src/flow.d.ts +2 -2
  413. package/dist/types/src/manifests/index.d.ts +1 -1
  414. package/dist/types/src/manifests/skill.d.ts +21 -0
  415. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  416. package/dist/workspace-plugin/adapters/mcp.js +4 -4
  417. package/dist/workspace-plugin/adapters/omp.js +7 -7
  418. package/dist/workspace-plugin/index.js +1 -1
  419. package/dist/workspace-plugin/src/tools/flows.d.ts.map +1 -1
  420. package/package.json +194 -151
  421. package/dist/asset-feeds-77KLWCBP.js.map +0 -1
  422. package/dist/base-assets/connectors/deploy/adapter.d.ts.map +0 -1
  423. package/dist/base-assets/connectors/deploy.js +0 -21
  424. package/dist/base-assets/connectors/devserver/adapter.d.ts.map +0 -1
  425. package/dist/base-assets/connectors/devserver.js +0 -21
  426. package/dist/base-assets/connectors/flow/adapter.d.ts.map +0 -1
  427. package/dist/base-assets/connectors/flow/adapter.js +0 -21
  428. package/dist/base-assets/connectors/flow/engine/engine.d.ts.map +0 -1
  429. package/dist/base-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +0 -1
  430. package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +0 -1
  431. package/dist/base-assets/connectors/flow/engine/index.d.ts.map +0 -1
  432. package/dist/base-assets/connectors/flow/engine/loader.d.ts.map +0 -1
  433. package/dist/base-assets/connectors/flow/engine/types.d.ts.map +0 -1
  434. package/dist/base-assets/connectors/flow/engine.js +0 -4
  435. package/dist/base-assets/connectors/flow/index.d.ts.map +0 -1
  436. package/dist/base-assets/connectors/flow/prompt-fragments.d.ts.map +0 -1
  437. package/dist/base-assets/connectors/flow/run-flow.d.ts.map +0 -1
  438. package/dist/base-assets/connectors/flow/run-flow.js +0 -24
  439. package/dist/base-assets/connectors/flow/stimulus-driver.d.ts.map +0 -1
  440. package/dist/base-assets/connectors/flow/stimulus-driver.js +0 -4
  441. package/dist/base-assets/connectors/flow.js +0 -21
  442. package/dist/base-assets/connectors/git/driver.d.ts.map +0 -1
  443. package/dist/base-assets/connectors/git.js +0 -21
  444. package/dist/base-assets/connectors/gmail/adapter.d.ts.map +0 -1
  445. package/dist/base-assets/connectors/gmail.js +0 -21
  446. package/dist/base-assets/connectors/googledrive/driver.d.ts.map +0 -1
  447. package/dist/base-assets/connectors/googledrive.js +0 -21
  448. package/dist/base-assets/connectors/local/driver.d.ts.map +0 -1
  449. package/dist/base-assets/connectors/local.js +0 -21
  450. package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +0 -1
  451. package/dist/base-assets/connectors/mattermost.js +0 -21
  452. package/dist/base-assets/connectors/memory/adapter.d.ts.map +0 -1
  453. package/dist/base-assets/connectors/memory.js +0 -21
  454. package/dist/base-assets/connectors/minio/adapter.d.ts.map +0 -1
  455. package/dist/base-assets/connectors/minio.js +0 -21
  456. package/dist/base-assets/connectors/postgres/adapter.d.ts.map +0 -1
  457. package/dist/base-assets/connectors/postgres.js +0 -21
  458. package/dist/base-assets/connectors/s3/driver.d.ts.map +0 -1
  459. package/dist/base-assets/connectors/s3.js +0 -21
  460. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +0 -1
  461. package/dist/base-assets/connectors/sharepoint.js +0 -21
  462. package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +0 -1
  463. package/dist/base-assets/connectors/sqlite.js +0 -21
  464. package/dist/base-assets/connectors/static-server/adapter.d.ts.map +0 -1
  465. package/dist/base-assets/connectors/static-server.js +0 -21
  466. package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +0 -1
  467. package/dist/base-assets/connectors/tunnel.js +0 -21
  468. package/dist/base-assets/connectors/webdav/driver.d.ts.map +0 -1
  469. package/dist/base-assets/connectors/webdav.js +0 -21
  470. package/dist/base-assets/connectors/xstate/adapter.d.ts.map +0 -1
  471. package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +0 -1
  472. package/dist/base-assets/connectors/xstate-store.js +0 -21
  473. package/dist/base-assets/connectors/xstate.js +0 -21
  474. package/dist/base-assets/index.d.ts.map +0 -1
  475. package/dist/base-assets/index.js.map +0 -1
  476. package/dist/chunk-2M3XTMOL.js +0 -23
  477. package/dist/chunk-2M3XTMOL.js.map +0 -1
  478. package/dist/chunk-2XY6732A.js.map +0 -1
  479. package/dist/chunk-3QTZWPGH.js.map +0 -1
  480. package/dist/chunk-4FADEVBN.js.map +0 -1
  481. package/dist/chunk-6VTG73UY.js.map +0 -1
  482. package/dist/chunk-B4ZXBH57.js.map +0 -1
  483. package/dist/chunk-BJWUSHC4.js.map +0 -1
  484. package/dist/chunk-D3VO6WNC.js.map +0 -1
  485. package/dist/chunk-DCAWIRD6.js.map +0 -1
  486. package/dist/chunk-DQWREFRQ.js.map +0 -1
  487. package/dist/chunk-FJFHJBGS.js.map +0 -1
  488. package/dist/chunk-FVTV7M76.js.map +0 -1
  489. package/dist/chunk-GCJXPUHG.js.map +0 -1
  490. package/dist/chunk-GZWJGNNN.js.map +0 -1
  491. package/dist/chunk-ICS76R4T.js.map +0 -1
  492. package/dist/chunk-JDX54X4Y.js.map +0 -1
  493. package/dist/chunk-KLNL7QHN.js.map +0 -1
  494. package/dist/chunk-KOVLSBXK.js.map +0 -1
  495. package/dist/chunk-KT3CK26V.js.map +0 -1
  496. package/dist/chunk-M5TE6YI5.js.map +0 -1
  497. package/dist/chunk-NELZIQ2E.js.map +0 -1
  498. package/dist/chunk-QAVZOJCV.js.map +0 -1
  499. package/dist/chunk-QXC62DOF.js.map +0 -1
  500. package/dist/chunk-UD4ZLXGS.js.map +0 -1
  501. package/dist/chunk-WIAHJOMG.js.map +0 -1
  502. package/dist/chunk-WSZAFRQL.js.map +0 -1
  503. package/dist/chunk-XMP6XTMF.js.map +0 -1
  504. package/dist/chunk-XVL22AWE.js.map +0 -1
  505. package/dist/ensure-sources-7MOOKY3K.js.map +0 -1
  506. package/dist/helpers-LTN3HMD3.js +0 -4
  507. package/dist/open-library-GW7DWWNZ.js +0 -21
  508. package/dist/paths-FKKGS6BA.js +0 -4
  509. package/dist/plugin-store-R32NH7JE.js.map +0 -1
  510. package/dist/setup-SRPBQOHY.js.map +0 -1
  511. package/dist/skills-CRL3VJNN.js +0 -7
  512. package/dist/store-client-INZD2RYD.js +0 -14
  513. /package/dist/{base-assets → factory-assets}/connectors/deploy.d.ts +0 -0
  514. /package/dist/{base-assets → factory-assets}/connectors/deploy.js.map +0 -0
  515. /package/dist/{base-assets → factory-assets}/connectors/devserver.d.ts +0 -0
  516. /package/dist/{base-assets → factory-assets}/connectors/devserver.js.map +0 -0
  517. /package/dist/{base-assets → factory-assets}/connectors/flow/adapter.js.map +0 -0
  518. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/engine.d.ts +0 -0
  519. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-manifest.d.ts +0 -0
  520. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/index.d.ts +0 -0
  521. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/loader.d.ts +0 -0
  522. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/types.d.ts +0 -0
  523. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.d.ts +0 -0
  524. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.js.map +0 -0
  525. /package/dist/{base-assets → factory-assets}/connectors/flow/index.d.ts +0 -0
  526. /package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js.map +0 -0
  527. /package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.js.map +0 -0
  528. /package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.js.map +0 -0
  529. /package/dist/{base-assets → factory-assets}/connectors/flow.d.ts +0 -0
  530. /package/dist/{base-assets → factory-assets}/connectors/flow.js.map +0 -0
  531. /package/dist/{base-assets → factory-assets}/connectors/git.d.ts +0 -0
  532. /package/dist/{base-assets → factory-assets}/connectors/git.js.map +0 -0
  533. /package/dist/{base-assets → factory-assets}/connectors/gmail.d.ts +0 -0
  534. /package/dist/{base-assets → factory-assets}/connectors/gmail.js.map +0 -0
  535. /package/dist/{base-assets → factory-assets}/connectors/googledrive.d.ts +0 -0
  536. /package/dist/{base-assets → factory-assets}/connectors/googledrive.js.map +0 -0
  537. /package/dist/{base-assets → factory-assets}/connectors/local.d.ts +0 -0
  538. /package/dist/{base-assets → factory-assets}/connectors/local.js.map +0 -0
  539. /package/dist/{base-assets → factory-assets}/connectors/mattermost.d.ts +0 -0
  540. /package/dist/{base-assets → factory-assets}/connectors/mattermost.js.map +0 -0
  541. /package/dist/{base-assets → factory-assets}/connectors/memory.d.ts +0 -0
  542. /package/dist/{base-assets → factory-assets}/connectors/memory.js.map +0 -0
  543. /package/dist/{base-assets → factory-assets}/connectors/minio.d.ts +0 -0
  544. /package/dist/{base-assets → factory-assets}/connectors/minio.js.map +0 -0
  545. /package/dist/{base-assets → factory-assets}/connectors/postgres.d.ts +0 -0
  546. /package/dist/{base-assets → factory-assets}/connectors/postgres.js.map +0 -0
  547. /package/dist/{base-assets → factory-assets}/connectors/s3.d.ts +0 -0
  548. /package/dist/{base-assets → factory-assets}/connectors/s3.js.map +0 -0
  549. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.d.ts +0 -0
  550. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.js.map +0 -0
  551. /package/dist/{base-assets → factory-assets}/connectors/sqlite.d.ts +0 -0
  552. /package/dist/{base-assets → factory-assets}/connectors/sqlite.js.map +0 -0
  553. /package/dist/{base-assets → factory-assets}/connectors/static-server.d.ts +0 -0
  554. /package/dist/{base-assets → factory-assets}/connectors/static-server.js.map +0 -0
  555. /package/dist/{base-assets → factory-assets}/connectors/tunnel.d.ts +0 -0
  556. /package/dist/{base-assets → factory-assets}/connectors/tunnel.js.map +0 -0
  557. /package/dist/{base-assets → factory-assets}/connectors/webdav.d.ts +0 -0
  558. /package/dist/{base-assets → factory-assets}/connectors/webdav.js.map +0 -0
  559. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.d.ts +0 -0
  560. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.js.map +0 -0
  561. /package/dist/{base-assets → factory-assets}/connectors/xstate.d.ts +0 -0
  562. /package/dist/{base-assets → factory-assets}/connectors/xstate.js.map +0 -0
package/dist/cli/index.js CHANGED
@@ -1,18 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-4FADEVBN.js';
3
- import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-WSZAFRQL.js';
4
- import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-4FJE6BI6.js';
5
- import { AI_RESOURCES } from '../chunk-2M3XTMOL.js';
6
- import { LocalSecretsProvider } from '../chunk-JDX54X4Y.js';
7
- import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-DCAWIRD6.js';
2
+ import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-3ZER5DST.js';
3
+ import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-GYPA2Q7F.js';
4
+ import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-2NOE4AGD.js';
5
+ import { AI_RESOURCES, aiResourceRoots } from '../chunk-UBCZVONU.js';
6
+ import { LocalSecretsProvider } from '../chunk-7GWYRVAX.js';
7
+ import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-WRRYESHC.js';
8
+ import '../chunk-JIQLLZ65.js';
9
+ import '../chunk-Z3XXKR5E.js';
8
10
  import '../chunk-R7FOF242.js';
9
- import '../chunk-KT3CK26V.js';
10
11
  import '../chunk-OKRUTSG7.js';
11
- import { runFlow, resumeFlow } from '../chunk-FJFHJBGS.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-BJWUSHC4.js';
15
- import { buildClaudePluginFiles } from '../chunk-4QVFQEY2.js';
12
+ import { runFlow, resumeFlow } from '../chunk-BUL5H6J7.js';
13
+ import '../chunk-ZONCCO5N.js';
14
+ import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-TV72ZJYN.js';
15
+ import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-MZDXEFXF.js';
16
+ import { buildClaudePluginFiles } from '../chunk-UAW7VRAL.js';
16
17
  import '../chunk-X5YPJV4N.js';
17
18
  import '../chunk-O7SG5PC2.js';
18
19
  import '../chunk-7QBNJTTQ.js';
@@ -21,42 +22,43 @@ import '../chunk-WQ7DE5UC.js';
21
22
  import '../chunk-32NA4TVC.js';
22
23
  import '../chunk-W3UDISS2.js';
23
24
  import '../chunk-TDSRLMDB.js';
24
- import '../chunk-M5TE6YI5.js';
25
- import '../chunk-DQWREFRQ.js';
26
- import '../chunk-KOVLSBXK.js';
25
+ import '../chunk-AKSR434V.js';
27
26
  import '../chunk-RRVQAE5D.js';
28
- import '../chunk-6VTG73UY.js';
27
+ import '../chunk-BMQKMOQY.js';
28
+ import '../chunk-PAYAFNXG.js';
29
+ import '../chunk-ZEKWHJBB.js';
29
30
  import '../chunk-LV2HPH3C.js';
30
- import '../chunk-XMP6XTMF.js';
31
- import '../chunk-SETTLPBD.js';
31
+ import '../chunk-XHBPQ7QP.js';
32
+ import '../chunk-OVRSNIKJ.js';
33
+ import '../chunk-DGM74UP4.js';
32
34
  import '../chunk-QMONOHXT.js';
33
- import '../chunk-QAVZOJCV.js';
34
35
  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-B4ZXBH57.js';
39
- import '../chunk-QXC62DOF.js';
40
- import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-XVL22AWE.js';
41
- import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
42
- import '../chunk-KLNL7QHN.js';
43
- import '../chunk-UD4ZLXGS.js';
44
- import { resolveSkWorkspaceConfig, resolveAgentDir, decodeSkaileYaml, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-3QTZWPGH.js';
45
- import { parseFrontmatter } from '../chunk-GL45UNVS.js';
46
- import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-WIAHJOMG.js';
36
+ import { loadFlow, loadAllFlows } from '../chunk-W7W66MDZ.js';
37
+ import '../chunk-DEYYRFQU.js';
38
+ import '../chunk-IFGTRL2I.js';
39
+ import { AssetManager } from '../chunk-A4ASAIKK.js';
40
+ import '../chunk-SF4GWVR5.js';
41
+ import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-M4KLIEIJ.js';
42
+ import '../chunk-FWHOU3CX.js';
43
+ import { resolveAgentDir, resolveSkWorkspaceConfig, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-3QQSSRYN.js';
44
+ import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest } from '../chunk-IERB3UXJ.js';
45
+ import { parseFrontmatter } from '../chunk-2FS4FPZ7.js';
46
+ import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-IEJ5IOC3.js';
47
47
  import '../chunk-JKNWJ64A.js';
48
48
  import { SUPPORTED_DRIVER_TARGETS } from '../chunk-O4JH3KUE.js';
49
+ import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
50
+ import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
49
51
  import { openSqlite } from '../chunk-24UIWON4.js';
50
52
  import '../chunk-KTBKW2FI.js';
51
53
  import '../chunk-UQ6LFBPZ.js';
52
- import '../chunk-6FNCZYJY.js';
53
- import '../chunk-NELZIQ2E.js';
54
+ import '../chunk-MBOR7D65.js';
55
+ import '../chunk-QDJKE557.js';
54
56
  import '../chunk-CGYEHQOX.js';
55
57
  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';
58
+ import * as fs11 from 'fs';
59
+ import fs11__default, { readFileSync, existsSync, writeFileSync, readdirSync, rmSync, statSync } from 'fs';
60
+ import * as path15 from 'path';
61
+ import path15__default, { resolve, join } from 'path';
60
62
  import { fileURLToPath } from 'url';
61
63
  import { Help, Command, Option } from 'commander';
62
64
  import * as p5 from '@clack/prompts';
@@ -65,7 +67,7 @@ import * as readline from 'readline';
65
67
  import { createInterface } from 'readline';
66
68
  import { execSync, spawnSync } from 'child_process';
67
69
  import { homedir } from 'os';
68
- import fs5 from 'fs/promises';
70
+ import fs6 from 'fs/promises';
69
71
  import { parse as parse$1, stringify } from 'smol-toml';
70
72
  import { createTRPCUntypedClient, httpLink, httpSubscriptionLink } from '@trpc/client';
71
73
  import { parse } from 'yaml';
@@ -78,7 +80,7 @@ function makeAssetCommand() {
78
80
  logErr(`Invalid --mode "${opts.mode}". Expected: copy | move | link.`);
79
81
  process.exit(1);
80
82
  }
81
- if (!fs10.existsSync(srcPath)) {
83
+ if (!fs11.existsSync(srcPath)) {
82
84
  logErr(`Source path does not exist: ${srcPath}`);
83
85
  process.exit(1);
84
86
  }
@@ -105,23 +107,23 @@ function makeAssetCommand() {
105
107
  );
106
108
  process.exit(1);
107
109
  }
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)) {
110
+ const basename2 = path15.basename(srcPath);
111
+ const destDir = target.structure === "domain" && opts.domain ? path15.join(target.path, opts.domain) : target.path;
112
+ fs11.mkdirSync(destDir, { recursive: true });
113
+ const destPath = path15.join(destDir, basename2);
114
+ if (fs11.existsSync(destPath)) {
113
115
  logErr(`Destination already exists: ${destPath}`);
114
116
  process.exit(1);
115
117
  }
116
118
  switch (opts.mode) {
117
119
  case "copy":
118
- fs10.cpSync(srcPath, destPath, { recursive: true });
120
+ fs11.cpSync(srcPath, destPath, { recursive: true });
119
121
  break;
120
122
  case "move":
121
- fs10.renameSync(srcPath, destPath);
123
+ fs11.renameSync(srcPath, destPath);
122
124
  break;
123
125
  case "link":
124
- fs10.symlinkSync(path14.resolve(srcPath), destPath);
126
+ fs11.symlinkSync(path15.resolve(srcPath), destPath);
125
127
  break;
126
128
  }
127
129
  if (target.backend === "git" && opts.commit) {
@@ -169,17 +171,17 @@ function makeAssetCommand() {
169
171
  }
170
172
  const manifestPath = def.manifest.path;
171
173
  const candidateSubpath = typeof manifestPath === "string" && manifestPath.length > 0 ? manifestPath : def.name;
172
- const srcPath = path14.join(lib.path, candidateSubpath);
173
- if (!fs10.existsSync(srcPath)) {
174
+ const srcPath = path15.join(lib.path, candidateSubpath);
175
+ if (!fs11.existsSync(srcPath)) {
174
176
  logErr(`Asset path not found: ${srcPath}`);
175
177
  process.exit(1);
176
178
  }
177
- const destPath = path14.join(target, candidateSubpath);
178
- fs10.mkdirSync(path14.dirname(destPath), { recursive: true });
179
+ const destPath = path15.join(target, candidateSubpath);
180
+ fs11.mkdirSync(path15.dirname(destPath), { recursive: true });
179
181
  if (opts.mode === "copy") {
180
- fs10.cpSync(srcPath, destPath, { recursive: true });
182
+ fs11.cpSync(srcPath, destPath, { recursive: true });
181
183
  } else {
182
- fs10.symlinkSync(path14.resolve(srcPath), destPath);
184
+ fs11.symlinkSync(path15.resolve(srcPath), destPath);
183
185
  }
184
186
  logOk(`Installed ${ref} \u2192 ${destPath} (${opts.mode})`);
185
187
  } finally {
@@ -273,7 +275,7 @@ function makeSearchCommand() {
273
275
  const showLocal = !opts.store;
274
276
  const showStore = !opts.local;
275
277
  if (showLocal) {
276
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
278
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
277
279
  const entries = am2.search(query, kind);
278
280
  if (entries.length === 0) {
279
281
  if (!showStore) {
@@ -310,7 +312,7 @@ function makeSearchCommand() {
310
312
  }
311
313
  if (showStore) {
312
314
  try {
313
- const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-INZD2RYD.js');
315
+ const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-BCP5LCAZ.js');
314
316
  const config = getStoreConfig2();
315
317
  const params = {};
316
318
  if (query) params.q = query;
@@ -339,7 +341,7 @@ function makeSearchCommand() {
339
341
  function makeAddCommand() {
340
342
  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
343
  const am2 = new AssetManager({
342
- projectDir: path14__default.resolve(opts.projectDir),
344
+ projectDir: path15__default.resolve(opts.projectDir),
343
345
  global: opts.global,
344
346
  driverTarget: opts.target
345
347
  });
@@ -360,7 +362,7 @@ function makeAddCommand() {
360
362
  function makeRemoveCommand() {
361
363
  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
364
  const am2 = new AssetManager({
363
- projectDir: path14__default.resolve(opts.projectDir),
365
+ projectDir: path15__default.resolve(opts.projectDir),
364
366
  global: opts.global,
365
367
  driverTarget: opts.target
366
368
  });
@@ -374,7 +376,7 @@ function makeListCommand() {
374
376
  new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
375
377
  ).action((kind, opts) => {
376
378
  const am2 = new AssetManager({
377
- projectDir: path14__default.resolve(opts.projectDir),
379
+ projectDir: path15__default.resolve(opts.projectDir),
378
380
  global: opts.global,
379
381
  driverTarget: opts.target
380
382
  });
@@ -398,7 +400,7 @@ function makeListCommand() {
398
400
  }
399
401
  function makeInfoCommand() {
400
402
  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) });
403
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
402
404
  const entry = am2.info(ref);
403
405
  if (!entry) {
404
406
  logErr(
@@ -431,7 +433,7 @@ function makeCreateCommand() {
431
433
  new Option("-k, --kind <kind>", "Asset kind").default("skill").choices([...ASSET_KINDS])
432
434
  ).option("-d, --dir <dir>", "Target directory (default: cwd)").action((name, opts) => {
433
435
  const am2 = new AssetManager({ projectDir: process.cwd() });
434
- const destDir = opts.dir ? path14__default.resolve(opts.dir) : process.cwd();
436
+ const destDir = opts.dir ? path15__default.resolve(opts.dir) : process.cwd();
435
437
  const result = am2.create(name, opts.kind, destDir);
436
438
  if (result.ok) logOk(`Created ${kindColor(opts.kind)}: ${pc5.dim(result.path)}`);
437
439
  else {
@@ -442,7 +444,7 @@ function makeCreateCommand() {
442
444
  }
443
445
  function makeDoctorCommand() {
444
446
  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) });
447
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
446
448
  const issues = am2.doctor();
447
449
  if (issues.length === 0) {
448
450
  logOk("No missing dependencies.");
@@ -468,11 +470,11 @@ function makeCatalogCommand() {
468
470
  const catalog = new Command("catalog").description("Catalog source health and configuration");
469
471
  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
472
  const { resolveConfig, isLocalCatalogUrl, trpcGetUrl } = await import('../library/index.js');
471
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : void 0;
473
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
472
474
  const cfg = resolveConfig({ projectDir });
473
475
  const baseUrl = opts.url ?? cfg.catalog.url;
474
476
  if (isLocalCatalogUrl(baseUrl)) {
475
- const { resolveCatalogSource } = await import('../open-library-GW7DWWNZ.js');
477
+ const { resolveCatalogSource } = await import('../open-library-I7YTADMD.js');
476
478
  let resolved;
477
479
  try {
478
480
  resolved = await resolveCatalogSource({ projectDir: opts.projectDir });
@@ -561,7 +563,7 @@ function makeCatalogCommand() {
561
563
  });
562
564
  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
565
  const { resolveConfig } = await import('../library/index.js');
564
- const projectDir = opts.projectDir ? path14__default.resolve(opts.projectDir) : void 0;
566
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
565
567
  const cfg = resolveConfig({ projectDir });
566
568
  console.log(`url: ${cfg.catalog.url}`);
567
569
  console.log(`framing: ${cfg.catalog.framing}`);
@@ -613,23 +615,48 @@ complete -F _${bin}_completion ${bin}`,
613
615
  end
614
616
  complete -c ${bin} -f -a '(__${bin}_complete)'`
615
617
  };
618
+ function discoverFlows() {
619
+ const byId = /* @__PURE__ */ new Map();
620
+ for (const root of aiResourceRoots()) {
621
+ for (const flow of loadAllFlows(root)) {
622
+ if (!byId.has(flow.id)) byId.set(flow.id, flow);
623
+ }
624
+ }
625
+ return [...byId.values()];
626
+ }
627
+ function findFlowFile(flowId, priorityRoots = []) {
628
+ for (const root of [...priorityRoots, ...aiResourceRoots()]) {
629
+ for (const { dir } of assetSearchDirs(root, "flows")) {
630
+ for (const ext of [".flow.yaml", ".flow.json", ".json"]) {
631
+ const candidate = path15__default.join(dir, `${flowId}${ext}`);
632
+ if (fs11__default.existsSync(candidate)) return candidate;
633
+ }
634
+ }
635
+ }
636
+ return void 0;
637
+ }
616
638
  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);
639
+ const found = [];
640
+ for (const root of aiResourceRoots()) {
641
+ for (const { dir, domain: dirDomain } of assetSearchDirs(root, "skills")) {
642
+ if (fs11__default.existsSync(dir)) walkSkills(dir, dirDomain, found);
643
+ }
644
+ }
645
+ const seen = /* @__PURE__ */ new Set();
646
+ const deduped = [];
647
+ for (const s of found) {
648
+ if (seen.has(s.name)) continue;
649
+ seen.add(s.name);
650
+ deduped.push(s);
624
651
  }
625
- return skills;
652
+ return deduped;
626
653
  }
627
654
  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);
655
+ for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
656
+ const full = path15__default.join(dir, entry.name);
630
657
  if (entry.isDirectory()) {
631
- const skillMd = path14__default.join(full, "SKILL.md");
632
- if (fs10__default.existsSync(skillMd)) {
658
+ const skillMd = path15__default.join(full, "SKILL.md");
659
+ if (fs11__default.existsSync(skillMd)) {
633
660
  out.push({ name: entry.name, path: full, skillPath: skillMd, domain });
634
661
  } else {
635
662
  walkSkills(full, domain, out);
@@ -643,21 +670,24 @@ function resolveSkillNames() {
643
670
  return findSkills().map((s) => s.name);
644
671
  }
645
672
  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);
673
+ const domains = /* @__PURE__ */ new Set();
674
+ for (const root of aiResourceRoots()) {
675
+ for (const d of detectDomains(root)) domains.add(d.id);
676
+ }
677
+ return [...domains];
648
678
  }
649
679
  function resolveFlowIds() {
650
680
  try {
651
- return loadAllFlows(AI_RESOURCES).map((f) => f.id);
681
+ return discoverFlows().map((f) => f.id);
652
682
  } catch {
653
683
  return [];
654
684
  }
655
685
  }
656
686
  function resolveSessionIds(projectDir) {
657
- const sessionsDir = path14__default.join(projectDir, ".skaile", "sessions");
658
- if (!fs10__default.existsSync(sessionsDir)) return [];
687
+ const sessionsDir = path15__default.join(projectDir, ".skaile", "sessions");
688
+ if (!fs11__default.existsSync(sessionsDir)) return [];
659
689
  try {
660
- return fs10__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
690
+ return fs11__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
661
691
  } catch {
662
692
  return [];
663
693
  }
@@ -712,73 +742,74 @@ function resolveDynamic(words, cword) {
712
742
  }
713
743
  var PERSONAL_KEYS = /* @__PURE__ */ new Set(["driver", "model", "provider"]);
714
744
  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 {
745
+ async function showConfig(opts) {
746
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
747
+ const config = await resolveSettings(projectDir);
748
+ const wsDefaults = {};
749
+ try {
750
+ const ws = resolveSkWorkspaceConfig(projectDir);
751
+ const p7 = ws.agent_config?.default ?? {};
752
+ if (p7.driver) wsDefaults.driver = p7.driver;
753
+ if (p7.provider) wsDefaults.provider = p7.provider;
754
+ if (p7.model) wsDefaults.model = p7.model;
755
+ if (p7.skills_dir) wsDefaults.skills_dir = p7.skills_dir;
756
+ if (p7.agents_dir) wsDefaults.agents_dir = p7.agents_dir;
757
+ if (p7.prompts_dir) wsDefaults.prompts_dir = p7.prompts_dir;
758
+ } catch {
759
+ }
760
+ console.log();
761
+ console.log(S.heading(" Effective Config"));
762
+ console.log(` ${S.rule(40)}`);
763
+ for (const key of ["driver", "provider", "model"]) {
764
+ const value = config[key];
765
+ if (value !== void 0) {
766
+ console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
731
767
  }
768
+ }
769
+ if (Object.keys(wsDefaults).length > 0) {
732
770
  console.log();
733
- console.log(S.heading(" Effective Config"));
771
+ console.log(` ${S.heading("Workspace Defaults")} ${S.dim("(skaile.yaml)")}`);
734
772
  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
- }
773
+ for (const [key, value] of Object.entries(wsDefaults)) {
774
+ console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
748
775
  }
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
- }
776
+ }
777
+ if (config.apiKeys && Object.keys(config.apiKeys).length > 0) {
778
+ console.log();
779
+ console.log(` ${S.heading("API Keys")}`);
780
+ console.log(` ${S.rule(40)}`);
781
+ for (const [provider, key] of Object.entries(config.apiKeys)) {
782
+ const fromEnv = !!process.env[`${provider.toUpperCase()}_API_KEY`];
783
+ if (key) {
784
+ console.log(
785
+ ` ${S.label(`${provider}:`.padEnd(16))} ****${key.slice(-4)}` + (fromEnv ? ` ${S.dim("[env]")}` : "")
786
+ );
760
787
  }
761
788
  }
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
- }
789
+ }
790
+ const fw = config.driver ?? "omp";
791
+ const paths = DRIVER_DEFAULTS[fw] ?? DRIVER_DEFAULTS.omp;
792
+ if (paths) {
772
793
  console.log();
773
- });
794
+ console.log(` ${S.heading("Resolved Paths")} ${S.dim(`(${fw})`)}`);
795
+ console.log(` ${S.rule(40)}`);
796
+ console.log(` ${S.label("skills:".padEnd(16))} ${config.skillsDir ?? paths.skillsDir}`);
797
+ console.log(` ${S.label("agents:".padEnd(16))} ${config.agentsDir ?? paths.agentsDir}`);
798
+ console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
799
+ }
800
+ console.log();
801
+ }
802
+ function makeConfigCommand() {
803
+ const cmd = new Command("config").description("Manage personal config (.skaile/settings.json)");
804
+ cmd.command("show").description("Show effective config with sources").option("--project-dir <path>", "Project directory").action((opts) => showConfig(opts));
774
805
  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();
806
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
776
807
  const config = await resolveSettings(projectDir);
777
808
  const value = config[key];
778
809
  console.log(value ?? S.dim("(not set)"));
779
810
  });
780
811
  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();
812
+ const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
782
813
  const isApiKey = key.startsWith(API_KEY_PREFIX);
783
814
  if (!PERSONAL_KEYS.has(key) && !isApiKey) {
784
815
  logErr(
@@ -802,9 +833,7 @@ function makeConfigCommand() {
802
833
  }
803
834
  console.log(S.dim(` \u2192 ${filePath}`));
804
835
  });
805
- cmd.action(() => {
806
- cmd.commands.find((c) => c.name() === "show").parse(process.argv);
807
- });
836
+ cmd.action(() => showConfig({}));
808
837
  return cmd;
809
838
  }
810
839
  function parseShorthand(input) {
@@ -954,6 +983,22 @@ function makeConnectCommand() {
954
983
  await client.disconnect();
955
984
  });
956
985
  }
986
+ function parsePositiveIntOption(value) {
987
+ const n = Number.parseInt(value, 10);
988
+ if (!Number.isFinite(n) || n <= 0) {
989
+ throw new Error(`--limit must be a positive integer (got ${value})`);
990
+ }
991
+ return n;
992
+ }
993
+ function scanFactoryConnectors(scanDirectory, roots) {
994
+ const byName = /* @__PURE__ */ new Map();
995
+ for (const dir of roots) {
996
+ for (const e of scanDirectory(dir, "factory-assets")) {
997
+ if (e.kind === "connector" && !byName.has(e.name)) byName.set(e.name, e);
998
+ }
999
+ }
1000
+ return [...byName.values()];
1001
+ }
957
1002
  async function connectConnectors(projectDir) {
958
1003
  const res = await import('../connectors/index.js');
959
1004
  res.registerBuiltinConnectors();
@@ -1056,11 +1101,8 @@ async function promptField(field) {
1056
1101
  function makeConnectorCommand() {
1057
1102
  const cmd = new Command("connector").description("Operate on connectors in a workspace");
1058
1103
  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
- );
1104
+ const { scanDirectory, factoryAssetRoots } = await import('../core/index.js');
1105
+ const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
1064
1106
  if (entries.length === 0) {
1065
1107
  console.log("No connector descriptors found.");
1066
1108
  return;
@@ -1084,17 +1126,14 @@ function makeConnectorCommand() {
1084
1126
  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
1127
  async (driver, opts) => {
1086
1128
  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");
1129
+ const { scanDirectory, factoryAssetRoots, WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
1130
+ const projectDir = path15__default.resolve(opts.projectDir);
1131
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
1090
1132
  if (!existsSync(yamlPath)) {
1091
1133
  logErr("No skaile.yaml found in current directory. Run 'skaile init' first.");
1092
1134
  process.exit(1);
1093
1135
  }
1094
- const baseAssetsDir = resolveBaseAssetsRoot();
1095
- const entries = scanDirectory(baseAssetsDir, "base-assets").filter(
1096
- (e) => e.kind === "connector"
1097
- );
1136
+ const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
1098
1137
  const entry = entries.find((e) => e.name === driver);
1099
1138
  if (!entry) {
1100
1139
  logErr(
@@ -1149,8 +1188,8 @@ ${installResult.output}`);
1149
1188
  );
1150
1189
  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
1190
  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");
1191
+ const projectDir = path15__default.resolve(opts.projectDir);
1192
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
1154
1193
  if (!existsSync(yamlPath)) {
1155
1194
  logErr("No skaile.yaml found in current directory.");
1156
1195
  process.exit(1);
@@ -1167,7 +1206,7 @@ ${installResult.output}`);
1167
1206
  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
1207
  const res = await import('../connectors/index.js');
1169
1208
  res.registerBuiltinConnectors();
1170
- const projectDir = path14__default.resolve(opts.projectDir);
1209
+ const projectDir = path15__default.resolve(opts.projectDir);
1171
1210
  const declarations = res.loadConnectorDeclarations(projectDir);
1172
1211
  if (declarations.length === 0) {
1173
1212
  console.log("No connectors configured in skaile.yaml.");
@@ -1191,7 +1230,7 @@ ${installResult.output}`);
1191
1230
  await manager.disconnectAll();
1192
1231
  });
1193
1232
  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);
1233
+ const projectDir = path15__default.resolve(opts.projectDir);
1195
1234
  const manager = await connectConnectors(projectDir);
1196
1235
  try {
1197
1236
  console.log(JSON.stringify(manager.listConnectors(), null, 2));
@@ -1200,7 +1239,7 @@ ${installResult.output}`);
1200
1239
  }
1201
1240
  });
1202
1241
  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);
1242
+ const projectDir = path15__default.resolve(opts.projectDir);
1204
1243
  const manager = await connectConnectors(projectDir);
1205
1244
  try {
1206
1245
  if (opts.all) {
@@ -1224,7 +1263,7 @@ ${installResult.output}`);
1224
1263
  }
1225
1264
  });
1226
1265
  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);
1266
+ const projectDir = path15__default.resolve(opts.projectDir);
1228
1267
  const manager = await connectConnectors(projectDir);
1229
1268
  try {
1230
1269
  if (!manager.has(id)) {
@@ -1239,7 +1278,7 @@ ${installResult.output}`);
1239
1278
  }
1240
1279
  });
1241
1280
  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);
1281
+ const projectDir = path15__default.resolve(opts.projectDir);
1243
1282
  const manager = await connectConnectors(projectDir);
1244
1283
  try {
1245
1284
  const content = await manager.read(id, resourcePath);
@@ -1249,7 +1288,7 @@ ${installResult.output}`);
1249
1288
  }
1250
1289
  });
1251
1290
  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);
1291
+ const projectDir = path15__default.resolve(opts.projectDir);
1253
1292
  const manager = await connectConnectors(projectDir);
1254
1293
  try {
1255
1294
  await manager.write(id, resourcePath, { data: content });
@@ -1258,8 +1297,8 @@ ${installResult.output}`);
1258
1297
  await manager.disconnectAll();
1259
1298
  }
1260
1299
  });
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);
1300
+ 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) => {
1301
+ const projectDir = path15__default.resolve(opts.projectDir);
1263
1302
  const manager = await connectConnectors(projectDir);
1264
1303
  try {
1265
1304
  const entries = await manager.list(id, resourcePath, {
@@ -1272,7 +1311,7 @@ ${installResult.output}`);
1272
1311
  }
1273
1312
  });
1274
1313
  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);
1314
+ const projectDir = path15__default.resolve(opts.projectDir);
1276
1315
  const manager = await connectConnectors(projectDir);
1277
1316
  try {
1278
1317
  const results = await manager.search(id, query);
@@ -1282,7 +1321,7 @@ ${installResult.output}`);
1282
1321
  }
1283
1322
  });
1284
1323
  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);
1324
+ const projectDir = path15__default.resolve(opts.projectDir);
1286
1325
  const manager = await connectConnectors(projectDir);
1287
1326
  try {
1288
1327
  const ok = await manager.delete(id, resourcePath);
@@ -1292,7 +1331,7 @@ ${installResult.output}`);
1292
1331
  }
1293
1332
  });
1294
1333
  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);
1334
+ const projectDir = path15__default.resolve(opts.projectDir);
1296
1335
  const manager = await connectConnectors(projectDir);
1297
1336
  try {
1298
1337
  if (!manager.has(id)) {
@@ -1401,7 +1440,7 @@ function envRecord() {
1401
1440
  async function buildDeployContext(projectDir) {
1402
1441
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1403
1442
  const config = resolveSkWorkspaceConfig2(projectDir);
1404
- const workspaceId = config.name ?? path14__default.basename(projectDir);
1443
+ const workspaceId = config.name ?? path15__default.basename(projectDir);
1405
1444
  let log;
1406
1445
  try {
1407
1446
  const { createLogger } = await import('../core/logging.js');
@@ -1433,13 +1472,13 @@ async function ensureTargetsRegistered(projectDir) {
1433
1472
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1434
1473
  const config = resolveSkWorkspaceConfig2(projectDir);
1435
1474
  if (config.plugins && config.plugins.length > 0) {
1436
- const { ensurePluginsLoaded } = await import('../plugin-store-R32NH7JE.js');
1475
+ const { ensurePluginsLoaded } = await import('../plugin-store-GL5VKYUA.js');
1437
1476
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
1438
1477
  for (const f of result.failed) logWarn(f.error);
1439
1478
  }
1440
1479
  }
1441
1480
  async function runUp(opts) {
1442
- const projectDir = path14__default.resolve(opts.projectDir);
1481
+ const projectDir = path15__default.resolve(opts.projectDir);
1443
1482
  await ensureTargetsRegistered(projectDir);
1444
1483
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1445
1484
  const { resolveDeployTarget, pluginRegistry } = await import('../plugin-registry/index.js');
@@ -1507,7 +1546,7 @@ async function restoreFromHandle(projectDir) {
1507
1546
  return { target, handle, ctx };
1508
1547
  }
1509
1548
  async function runDown(opts) {
1510
- const projectDir = path14__default.resolve(opts.projectDir);
1549
+ const projectDir = path15__default.resolve(opts.projectDir);
1511
1550
  const restored = await restoreFromHandle(projectDir);
1512
1551
  if (!restored) return;
1513
1552
  await restored.handle.stop();
@@ -1516,7 +1555,7 @@ async function runDown(opts) {
1516
1555
  logOk(`Stopped ${S.cmd(restored.target.id)} and cleared the handle.`);
1517
1556
  }
1518
1557
  async function runStatus(opts) {
1519
- const projectDir = path14__default.resolve(opts.projectDir);
1558
+ const projectDir = path15__default.resolve(opts.projectDir);
1520
1559
  const restored = await restoreFromHandle(projectDir);
1521
1560
  if (!restored) return;
1522
1561
  const health = await restored.handle.health();
@@ -1530,7 +1569,7 @@ async function runStatus(opts) {
1530
1569
  console.log();
1531
1570
  }
1532
1571
  async function runLogs(opts) {
1533
- const projectDir = path14__default.resolve(opts.projectDir);
1572
+ const projectDir = path15__default.resolve(opts.projectDir);
1534
1573
  const restored = await restoreFromHandle(projectDir);
1535
1574
  if (!restored) return;
1536
1575
  if (!restored.handle.logs) {
@@ -1554,7 +1593,7 @@ function makeDeployCommand() {
1554
1593
  }
1555
1594
  function makeDiffCommand() {
1556
1595
  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) });
1596
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
1558
1597
  const result = am2.diff(ref);
1559
1598
  if (result === null) {
1560
1599
  logInfo("No differences (or asset not found).");
@@ -1566,7 +1605,7 @@ function makeDiffCommand() {
1566
1605
  function makeFlowCommand() {
1567
1606
  const cmd = new Command("flow").description("Manage flows");
1568
1607
  cmd.command("list").description("List available flows").action(async () => {
1569
- const flows = loadAllFlows(AI_RESOURCES);
1608
+ const flows = discoverFlows();
1570
1609
  if (flows.length === 0) {
1571
1610
  logInfo("No flows found.");
1572
1611
  return;
@@ -1581,7 +1620,7 @@ function makeFlowCommand() {
1581
1620
  console.log();
1582
1621
  });
1583
1622
  cmd.command("show <id>").description("Show flow details and node graph").action(async (id) => {
1584
- const flows = loadAllFlows(AI_RESOURCES);
1623
+ const flows = discoverFlows();
1585
1624
  const flow = flows.find((f) => f.id === id);
1586
1625
  if (!flow) {
1587
1626
  logErr(`Flow not found: ${id}`);
@@ -1607,7 +1646,7 @@ function makeFlowCommand() {
1607
1646
  function makeHistoryCommand() {
1608
1647
  const cmd = new Command("history").description("Show recent add/remove/update actions");
1609
1648
  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) });
1649
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
1611
1650
  const limit = parseInt(limitStr, 10) || 20;
1612
1651
  const entries = am2.history(limit);
1613
1652
  if (entries.length === 0) {
@@ -1627,7 +1666,7 @@ function makeHistoryCommand() {
1627
1666
  console.log();
1628
1667
  });
1629
1668
  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) });
1669
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
1631
1670
  am2.clearHistory();
1632
1671
  logOk("History cleared.");
1633
1672
  });
@@ -1695,12 +1734,12 @@ function makeLibraryCommand() {
1695
1734
  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
1735
  async (name, opts) => {
1697
1736
  const libDir = resolveLibraryDir();
1698
- const libPath = path14.join(libDir, name);
1737
+ const libPath = path15.join(libDir, name);
1699
1738
  const ownership = opts.contributor ? "contributor" : opts.reader ? "reader" : "owner";
1700
1739
  const { manager, close } = await openLibraryManager();
1701
1740
  try {
1702
1741
  if (opts.git) {
1703
- fs10.mkdirSync(libPath, { recursive: true });
1742
+ fs11.mkdirSync(libPath, { recursive: true });
1704
1743
  await manager.addLibrary({
1705
1744
  name,
1706
1745
  path: libPath,
@@ -1709,7 +1748,7 @@ function makeLibraryCommand() {
1709
1748
  ownership
1710
1749
  });
1711
1750
  } else {
1712
- fs10.mkdirSync(libPath, { recursive: true });
1751
+ fs11.mkdirSync(libPath, { recursive: true });
1713
1752
  await manager.addLibrary({
1714
1753
  name,
1715
1754
  path: libPath,
@@ -1768,7 +1807,7 @@ function makeLibraryCommand() {
1768
1807
  target = def;
1769
1808
  }
1770
1809
  const am2 = new AssetManager({ projectDir: process.cwd() });
1771
- const destDir = opts.dir ? path14.join(target.path, opts.dir) : target.path;
1810
+ const destDir = opts.dir ? path15.join(target.path, opts.dir) : target.path;
1772
1811
  const res = am2.create(name, opts.kind ?? kind, destDir);
1773
1812
  if (res.ok) {
1774
1813
  logOk(`Created ${opts.kind ?? kind}: ${pc5.dim(res.path)}`);
@@ -1794,13 +1833,13 @@ function makeLibraryCommand() {
1794
1833
  const { manager, close } = await openLibraryManager();
1795
1834
  try {
1796
1835
  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)) {
1836
+ const parent = path15.dirname(lib.path);
1837
+ const newPath = path15.join(parent, newName);
1838
+ if (fs11.existsSync(newPath)) {
1800
1839
  logErr(`Target directory already exists: ${newPath}`);
1801
1840
  process.exit(1);
1802
1841
  }
1803
- fs10.renameSync(lib.path, newPath);
1842
+ fs11.renameSync(lib.path, newPath);
1804
1843
  await manager.updateLibrary(lib.id, { name: newName, path: newPath });
1805
1844
  logOk(`Renamed ${oldName} \u2192 ${newName}`);
1806
1845
  } finally {
@@ -1986,9 +2025,9 @@ async function printOverallStatus(projectDir, asJson) {
1986
2025
  } catch {
1987
2026
  secretsStrategy = "unavailable";
1988
2027
  }
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"));
2028
+ const resolvedProjectDir = path15.resolve(projectDir);
2029
+ const hasWorkspaceConfig = existsSync(path15.join(resolvedProjectDir, "skaile.yaml"));
2030
+ const hasLockFile = existsSync(path15.join(resolvedProjectDir, "skaile.lock.yaml"));
1992
2031
  let subscriptions = [];
1993
2032
  if (hasWorkspaceConfig) {
1994
2033
  try {
@@ -2193,6 +2232,14 @@ function makeLogsCommand() {
2193
2232
  }
2194
2233
  );
2195
2234
  }
2235
+ var ORIGIN_META = {
2236
+ library: { icon: "\u{1F4DA}", label: "Library" },
2237
+ source: { icon: "\u{1F517}", label: "Sources" },
2238
+ store: { icon: "\u{1F4E6}", label: "Store" }
2239
+ };
2240
+ var ORIGIN_ORDER = ["library", "source", "store"];
2241
+ var srcKey = (origin, publisher) => `${origin}:${publisher}`;
2242
+ var repoKey = (origin, publisher, repo) => `${origin}:${publisher}:${repo}`;
2196
2243
  var am;
2197
2244
  var state = {
2198
2245
  tab: "assets",
@@ -2203,39 +2250,61 @@ var state = {
2203
2250
  visibleRows: [],
2204
2251
  pendingAdds: /* @__PURE__ */ new Set(),
2205
2252
  pendingRemoves: /* @__PURE__ */ new Set(),
2253
+ collapsedOrigins: /* @__PURE__ */ new Set(),
2206
2254
  collapsedSources: /* @__PURE__ */ new Set(),
2207
2255
  collapsedRepos: /* @__PURE__ */ new Set(),
2256
+ seenOrigins: /* @__PURE__ */ new Set(),
2257
+ originFilter: null,
2208
2258
  message: "",
2209
2259
  cols: 80,
2210
2260
  awaitingExitConfirm: false
2211
2261
  };
2212
- function buildVisibleRows(rows, collapsedSources, collapsedRepos) {
2262
+ function buildVisibleRows(rows, collapsedOrigins, collapsedSources, collapsedRepos, originFilter = null) {
2213
2263
  return rows.filter((row) => {
2264
+ const origin = rowOrigin(row);
2265
+ if (originFilter && origin !== originFilter) return false;
2266
+ if (row.type === "origin-header") return true;
2267
+ if (collapsedOrigins.has(origin)) return false;
2214
2268
  if (row.type === "publisher-header") return true;
2215
2269
  if (row.type === "repo-header") {
2216
- return !collapsedSources.has(row.source);
2270
+ return !collapsedSources.has(srcKey(origin, row.source));
2217
2271
  }
2218
- const publisher = row.entry?.publisher || "other";
2219
- if (collapsedSources.has(publisher)) return false;
2220
- const repo = row.entry?.repo || "";
2221
- return repo === "" || !collapsedRepos.has(`${publisher}:${repo}`);
2272
+ const publisher = rowPublisher(row);
2273
+ if (collapsedSources.has(srcKey(origin, publisher))) return false;
2274
+ const repo = rowRepo(row);
2275
+ return repo === "" || !collapsedRepos.has(repoKey(origin, publisher, repo));
2222
2276
  });
2223
2277
  }
2224
- function repoAssetRefs(rows, publisher, repo) {
2225
- return rows.filter((r) => isAsset(r) && inRepo(r, publisher, repo)).map((r) => assetRefOf(r)).filter((ref) => ref !== null);
2278
+ function originAssetRefs(rows, origin) {
2279
+ return refsOf(rows.filter((r) => isAsset(r) && rowOrigin(r) === origin));
2280
+ }
2281
+ function repoAssetRefs(rows, origin, publisher, repo) {
2282
+ return refsOf(rows.filter((r) => isAsset(r) && inRepo(r, origin, publisher, repo)));
2226
2283
  }
2227
- function sourceAssetRefs(rows, source) {
2228
- return rows.filter((r) => isAsset(r) && inSource(r, source)).map((r) => assetRefOf(r)).filter((ref) => ref !== null);
2284
+ function sourceAssetRefs(rows, origin, source) {
2285
+ return refsOf(rows.filter((r) => isAsset(r) && inSource(r, origin, source)));
2229
2286
  }
2230
2287
  function isAsset(r) {
2231
2288
  return r.type === "asset";
2232
2289
  }
2233
- function inSource(r, source) {
2234
- return (r.entry?.publisher || "other") === source;
2290
+ function rowOrigin(r) {
2291
+ return r.origin ?? "source";
2292
+ }
2293
+ function rowPublisher(r) {
2294
+ return r.entry?.publisher || "other";
2295
+ }
2296
+ function rowRepo(r) {
2297
+ return r.entry?.repo || "";
2298
+ }
2299
+ function refsOf(rows) {
2300
+ return rows.map((r) => assetRefOf(r)).filter((ref) => ref !== null);
2301
+ }
2302
+ function inSource(r, origin, source) {
2303
+ return rowOrigin(r) === origin && rowPublisher(r) === source;
2235
2304
  }
2236
- function inRepo(r, publisher, repo) {
2237
- if (!inSource(r, publisher)) return false;
2238
- return (r.entry?.repo || "") === repo;
2305
+ function inRepo(r, origin, publisher, repo) {
2306
+ if (!inSource(r, origin, publisher)) return false;
2307
+ return rowRepo(r) === repo;
2239
2308
  }
2240
2309
  function assetRefOf(r) {
2241
2310
  if (!isAsset(r) || !r.entry?.publisher) return null;
@@ -2281,62 +2350,84 @@ function bulkSelection(refs, action3) {
2281
2350
  for (const ref of refs) setSelection(ref, action3);
2282
2351
  }
2283
2352
  function actOnHeader(row, action3) {
2353
+ if (row.type === "origin-header") {
2354
+ bulkSelection(originAssetRefs(state.assetRows, rowOrigin(row)), action3);
2355
+ return true;
2356
+ }
2284
2357
  if (row.type === "publisher-header") {
2285
- bulkSelection(sourceAssetRefs(state.assetRows, row.source), action3);
2358
+ bulkSelection(sourceAssetRefs(state.assetRows, rowOrigin(row), row.source), action3);
2286
2359
  return true;
2287
2360
  }
2288
2361
  if (row.type === "repo-header") {
2289
- bulkSelection(repoAssetRefs(state.assetRows, row.source, row.repo), action3);
2362
+ bulkSelection(repoAssetRefs(state.assetRows, rowOrigin(row), row.source, row.repo), action3);
2290
2363
  return true;
2291
2364
  }
2292
2365
  return false;
2293
2366
  }
2294
2367
  async function loadAssets() {
2295
- const { gatherAssetFeeds } = await import('../asset-feeds-77KLWCBP.js');
2368
+ const { gatherAssetFeeds } = await import('../asset-feeds-DGZO27M7.js');
2296
2369
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
2297
2370
  if (notes.length > 0) {
2298
2371
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
2299
2372
  }
2300
2373
  const installed = new Set(am.listDeployed().map((e) => `${e.kind}:${e.name}`));
2301
- const byPublisher = /* @__PURE__ */ new Map();
2302
- for (const e of entries) {
2303
- const publisher = e.publisher || "other";
2304
- const repo = e.repo || "";
2374
+ const byOrigin = /* @__PURE__ */ new Map();
2375
+ for (const { origin, entry } of entries) {
2376
+ const publisher = entry.publisher || "other";
2377
+ const repo = entry.repo || "";
2378
+ if (!byOrigin.has(origin)) byOrigin.set(origin, /* @__PURE__ */ new Map());
2379
+ const byPublisher = byOrigin.get(origin);
2305
2380
  if (!byPublisher.has(publisher)) byPublisher.set(publisher, /* @__PURE__ */ new Map());
2306
2381
  const byRepo = byPublisher.get(publisher);
2307
2382
  if (!byRepo.has(repo)) byRepo.set(repo, []);
2308
- byRepo.get(repo).push(e);
2383
+ byRepo.get(repo).push(entry);
2309
2384
  }
2310
2385
  const rows = [];
2311
- for (const [publisher, byRepo] of [...byPublisher.entries()].sort(
2312
- (a, b) => a[0].localeCompare(b[0])
2313
- )) {
2314
- rows.push({ type: "publisher-header", source: publisher });
2315
- const pushAssets = (items) => {
2316
- items.sort(
2317
- (a, b) => a.kind !== b.kind ? a.kind.localeCompare(b.kind) : a.name.localeCompare(b.name)
2318
- );
2319
- for (const entry of items) {
2320
- const ref = `${entry.kind}:${entry.name}`;
2321
- rows.push({ type: "asset", entry, installed: installed.has(ref) });
2386
+ for (const origin of ORIGIN_ORDER) {
2387
+ const byPublisher = byOrigin.get(origin);
2388
+ if (!byPublisher || byPublisher.size === 0) continue;
2389
+ rows.push({ type: "origin-header", origin });
2390
+ for (const [publisher, byRepo] of [...byPublisher.entries()].sort(
2391
+ (a, b) => a[0].localeCompare(b[0])
2392
+ )) {
2393
+ rows.push({ type: "publisher-header", origin, source: publisher });
2394
+ const pushAssets = (items) => {
2395
+ items.sort(
2396
+ (a, b) => a.kind !== b.kind ? a.kind.localeCompare(b.kind) : a.name.localeCompare(b.name)
2397
+ );
2398
+ for (const entry of items) {
2399
+ const ref = `${entry.kind}:${entry.name}`;
2400
+ rows.push({ type: "asset", origin, entry, installed: installed.has(ref) });
2401
+ }
2402
+ };
2403
+ const noRepo = byRepo.get("");
2404
+ if (noRepo) pushAssets(noRepo);
2405
+ for (const [repo, items] of [...byRepo.entries()].filter(([r]) => r !== "").sort((a, b) => a[0].localeCompare(b[0]))) {
2406
+ rows.push({ type: "repo-header", origin, source: publisher, repo });
2407
+ pushAssets(items);
2322
2408
  }
2323
- };
2324
- const noRepo = byRepo.get("");
2325
- if (noRepo) pushAssets(noRepo);
2326
- for (const [repo, items] of [...byRepo.entries()].filter(([r]) => r !== "").sort((a, b) => a[0].localeCompare(b[0]))) {
2327
- rows.push({ type: "repo-header", source: publisher, repo });
2328
- pushAssets(items);
2329
2409
  }
2330
2410
  }
2331
2411
  state.assetRows = rows;
2412
+ const presentOrigins = new Set(rows.filter((r) => r.type === "origin-header").map(rowOrigin));
2413
+ for (const o of presentOrigins) {
2414
+ if (!state.seenOrigins.has(o)) {
2415
+ if (o === "store") state.collapsedOrigins.add(o);
2416
+ state.seenOrigins.add(o);
2417
+ }
2418
+ }
2419
+ for (const o of state.collapsedOrigins) {
2420
+ if (!presentOrigins.has(o)) state.collapsedOrigins.delete(o);
2421
+ }
2422
+ if (state.originFilter && !presentOrigins.has(state.originFilter)) state.originFilter = null;
2332
2423
  const newSources = new Set(
2333
- rows.filter((r) => r.type === "publisher-header").map((r) => r.source)
2424
+ rows.filter((r) => r.type === "publisher-header").map((r) => srcKey(rowOrigin(r), r.source))
2334
2425
  );
2335
2426
  for (const s of state.collapsedSources) {
2336
2427
  if (!newSources.has(s)) state.collapsedSources.delete(s);
2337
2428
  }
2338
2429
  const newRepoKeys = new Set(
2339
- rows.filter((r) => r.type === "repo-header").map((r) => `${r.source}:${r.repo}`)
2430
+ rows.filter((r) => r.type === "repo-header").map((r) => repoKey(rowOrigin(r), r.source, r.repo))
2340
2431
  );
2341
2432
  for (const d of state.collapsedRepos) {
2342
2433
  if (!newRepoKeys.has(d)) state.collapsedRepos.delete(d);
@@ -2347,12 +2438,12 @@ async function loadAssets() {
2347
2438
  async function loadSourcesAndLibraries() {
2348
2439
  try {
2349
2440
  const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir: skaileHomeDir2 }] = await Promise.all([
2350
- import('../open-library-GW7DWWNZ.js'),
2441
+ import('../open-library-I7YTADMD.js'),
2351
2442
  import('../library/index.js')
2352
2443
  ]);
2353
2444
  const { manager, library, close } = await openLibraryManager2();
2354
2445
  try {
2355
- const sourcesDir2 = path14__default.join(skaileHomeDir2(), "sources");
2446
+ const sourcesDir2 = path15__default.join(skaileHomeDir2(), "sources");
2356
2447
  const isSourceRow = (l) => l.path.startsWith(sourcesDir2);
2357
2448
  const libs = await manager.listLibraries();
2358
2449
  const defs = await library.listAssetDefs();
@@ -2385,8 +2476,10 @@ async function loadSourcesAndLibraries() {
2385
2476
  function rebuildVisible() {
2386
2477
  state.visibleRows = buildVisibleRows(
2387
2478
  state.assetRows,
2479
+ state.collapsedOrigins,
2388
2480
  state.collapsedSources,
2389
- state.collapsedRepos
2481
+ state.collapsedRepos,
2482
+ state.originFilter
2390
2483
  );
2391
2484
  clampCursor();
2392
2485
  }
@@ -2410,7 +2503,7 @@ var TABS = {
2410
2503
  rowCount: () => state.visibleRows.length,
2411
2504
  selectableCount: () => state.assetRows.filter(isAsset).length,
2412
2505
  renderRow: (i, sel) => renderAssetRow(state.visibleRows[i], sel),
2413
- footer: " \u2191\u2193/jk navigate \u2190/\u2192 collapse/expand [space/+/-] select [a/\u21B5] apply [i] info Tab switch [q/esc] quit"
2506
+ footer: " \u2191\u2193/jk nav \u2190/\u2192 collapse/expand [space/+/-] select [a/\u21B5] apply [i] info [1]lib [2]src [3]store [0]all Tab switch [q] quit"
2414
2507
  },
2415
2508
  sources: {
2416
2509
  label: "Sources",
@@ -2494,24 +2587,38 @@ function renderHeaderLine(opts) {
2494
2587
  return opts.selected ? pc5.bgWhite(pc5.black(`${line} `.padEnd(state.cols))) : line;
2495
2588
  }
2496
2589
  function renderAssetRow(row, selected) {
2497
- if (row.type === "publisher-header") {
2590
+ if (row.type === "origin-header") {
2591
+ const origin = rowOrigin(row);
2592
+ const meta = ORIGIN_META[origin];
2498
2593
  return renderHeaderLine({
2499
2594
  indent: " ",
2500
- collapsed: state.collapsedSources.has(row.source),
2501
- match: (r) => isAsset(r) && inSource(r, row.source),
2502
- refs: sourceAssetRefs(state.assetRows, row.source),
2595
+ collapsed: state.collapsedOrigins.has(origin),
2596
+ match: (r) => isAsset(r) && rowOrigin(r) === origin,
2597
+ refs: originAssetRefs(state.assetRows, origin),
2598
+ label: `${meta.icon} ${pc5.bold(pc5.cyan(meta.label))}`,
2599
+ selected
2600
+ });
2601
+ }
2602
+ if (row.type === "publisher-header") {
2603
+ const origin = rowOrigin(row);
2604
+ return renderHeaderLine({
2605
+ indent: " ".repeat(3),
2606
+ collapsed: state.collapsedSources.has(srcKey(origin, row.source)),
2607
+ match: (r) => isAsset(r) && inSource(r, origin, row.source),
2608
+ refs: sourceAssetRefs(state.assetRows, origin, row.source),
2503
2609
  label: pc5.bold(pc5.cyan(row.source)),
2504
2610
  selected
2505
2611
  });
2506
2612
  }
2507
2613
  if (row.type === "repo-header") {
2614
+ const origin = rowOrigin(row);
2508
2615
  const slug = row.repo;
2509
2616
  const bare = slug.includes("/") ? slug.slice(slug.indexOf("/") + 1) : slug;
2510
2617
  return renderHeaderLine({
2511
- indent: " ".repeat(3),
2512
- collapsed: state.collapsedRepos.has(`${row.source}:${slug}`),
2513
- match: (r) => isAsset(r) && inRepo(r, row.source, slug),
2514
- refs: repoAssetRefs(state.assetRows, row.source, slug),
2618
+ indent: " ".repeat(5),
2619
+ collapsed: state.collapsedRepos.has(repoKey(origin, row.source, slug)),
2620
+ match: (r) => isAsset(r) && inRepo(r, origin, row.source, slug),
2621
+ refs: repoAssetRefs(state.assetRows, origin, row.source, slug),
2515
2622
  label: pc5.bold(bare),
2516
2623
  selected
2517
2624
  });
@@ -2523,12 +2630,12 @@ function renderAssetRow(row, selected) {
2523
2630
  else if (state.pendingRemoves.has(ref)) status4 = pc5.red("- ");
2524
2631
  else if (row.installed) status4 = pc5.green("\u2713 ");
2525
2632
  else status4 = pc5.dim("\xB7 ");
2526
- const kind = kindColorPad(e.kind, 8);
2633
+ const kind = kindColorPad(e.kind);
2527
2634
  const name = fitWidth(e.name, 30);
2528
2635
  const badge = e.category ? `${pc5.dim("[")}${pc5.cyan(e.category)}${pc5.dim("]")} ` : "";
2529
2636
  const badgeWidth = e.category ? e.category.length + 3 : 0;
2530
- const desc = e.description?.slice(0, Math.max(0, state.cols - 52 - badgeWidth)) ?? "";
2531
- const indent = " ".repeat(e.repo ? 5 : 3);
2637
+ const desc = e.description?.slice(0, Math.max(0, state.cols - 56 - badgeWidth)) ?? "";
2638
+ const indent = " ".repeat(e.repo ? 7 : 5);
2532
2639
  const line = `${indent}${status4} ${kind} ${name} ${badge}${pc5.dim(desc)}`;
2533
2640
  return selected ? pc5.inverse(line.padEnd(state.cols)) : line;
2534
2641
  }
@@ -2549,7 +2656,8 @@ function render() {
2549
2656
  const overhead = 5 + pendingLines + msgLines;
2550
2657
  const maxRows = Math.max(5, (process.stdout.rows || 30) - overhead);
2551
2658
  console.log();
2552
- console.log(` ${pc5.bold("skaile manage")} ${renderTabs()}`);
2659
+ const filterTag = state.tab === "assets" && state.originFilter ? ` ${pc5.bgYellow(pc5.black(` filter: ${ORIGIN_META[state.originFilter].label} `))} ${pc5.dim("[0] clear")}` : "";
2660
+ console.log(` ${pc5.bold("skaile manage")} ${renderTabs()}${filterTag}`);
2553
2661
  console.log(` ${S.rule(state.cols - 4)}`);
2554
2662
  const spec = TABS[state.tab];
2555
2663
  const total = spec.rowCount();
@@ -2642,9 +2750,10 @@ async function showInfo() {
2642
2750
  console.log();
2643
2751
  console.log(` ${kindColor(e.kind)} ${pc5.bold(e.name)}`);
2644
2752
  console.log(` ${S.rule(50)}`);
2753
+ console.log(` origin: ${pc5.dim(ORIGIN_META[rowOrigin(row)].label)}`);
2645
2754
  if (e.version) console.log(` version: ${e.version}`);
2646
2755
  if (e.description) console.log(` description: ${e.description}`);
2647
- if (e.publisher) console.log(` source: ${pc5.dim(e.publisher)}`);
2756
+ if (e.publisher) console.log(` publisher: ${pc5.dim(e.publisher)}`);
2648
2757
  console.log(` manifest: ${pc5.dim(e.source)}`);
2649
2758
  console.log(` installed: ${row.installed ? pc5.green("yes") : pc5.red("no")}`);
2650
2759
  if (e.requires.length) {
@@ -2665,14 +2774,31 @@ async function showInfo() {
2665
2774
  process.stdin.once("data", onData);
2666
2775
  });
2667
2776
  }
2777
+ function setOriginFilter(origin) {
2778
+ if (origin === null || state.originFilter === origin) {
2779
+ state.originFilter = null;
2780
+ } else if (state.seenOrigins.has(origin)) {
2781
+ state.originFilter = origin;
2782
+ state.collapsedOrigins.delete(origin);
2783
+ } else {
2784
+ state.message = pc5.dim(`No ${ORIGIN_META[origin].label} assets to show.`);
2785
+ return;
2786
+ }
2787
+ state.cursor = 0;
2788
+ rebuildVisible();
2789
+ }
2668
2790
  function expandUnderCursor() {
2669
2791
  const row = state.visibleRows[state.cursor];
2670
2792
  if (!row) return;
2671
- if (row.type === "publisher-header" && state.collapsedSources.has(row.source)) {
2672
- state.collapsedSources.delete(row.source);
2793
+ const origin = rowOrigin(row);
2794
+ if (row.type === "origin-header" && state.collapsedOrigins.has(origin)) {
2795
+ state.collapsedOrigins.delete(origin);
2796
+ rebuildVisible();
2797
+ } else if (row.type === "publisher-header" && state.collapsedSources.has(srcKey(origin, row.source))) {
2798
+ state.collapsedSources.delete(srcKey(origin, row.source));
2673
2799
  rebuildVisible();
2674
2800
  } else if (row.type === "repo-header") {
2675
- const dk = `${row.source}:${row.repo}`;
2801
+ const dk = repoKey(origin, row.source, row.repo);
2676
2802
  if (state.collapsedRepos.has(dk)) {
2677
2803
  state.collapsedRepos.delete(dk);
2678
2804
  rebuildVisible();
@@ -2682,15 +2808,31 @@ function expandUnderCursor() {
2682
2808
  function collapseOrJumpUnderCursor() {
2683
2809
  const row = state.visibleRows[state.cursor];
2684
2810
  if (!row) return;
2811
+ const origin = rowOrigin(row);
2812
+ if (row.type === "origin-header") {
2813
+ if (!state.collapsedOrigins.has(origin)) {
2814
+ state.collapsedOrigins.add(origin);
2815
+ rebuildVisible();
2816
+ }
2817
+ return;
2818
+ }
2685
2819
  if (row.type === "publisher-header") {
2686
- if (!state.collapsedSources.has(row.source)) {
2687
- state.collapsedSources.add(row.source);
2820
+ const sk = srcKey(origin, row.source);
2821
+ if (!state.collapsedSources.has(sk)) {
2822
+ state.collapsedSources.add(sk);
2688
2823
  rebuildVisible();
2824
+ } else {
2825
+ const idx2 = findLastIndex(
2826
+ state.visibleRows,
2827
+ state.cursor,
2828
+ (r) => r.type === "origin-header"
2829
+ );
2830
+ if (idx2 >= 0) state.cursor = idx2;
2689
2831
  }
2690
2832
  return;
2691
2833
  }
2692
2834
  if (row.type === "repo-header") {
2693
- const dk = `${row.source}:${row.repo}`;
2835
+ const dk = repoKey(origin, row.source, row.repo);
2694
2836
  if (!state.collapsedRepos.has(dk)) {
2695
2837
  state.collapsedRepos.add(dk);
2696
2838
  rebuildVisible();
@@ -2707,7 +2849,7 @@ function collapseOrJumpUnderCursor() {
2707
2849
  const idx = findLastIndex(
2708
2850
  state.visibleRows,
2709
2851
  state.cursor,
2710
- (r) => r.type === "repo-header" || r.type === "publisher-header"
2852
+ (r) => r.type === "repo-header" || r.type === "publisher-header" || r.type === "origin-header"
2711
2853
  );
2712
2854
  if (idx >= 0) state.cursor = idx;
2713
2855
  }
@@ -2808,7 +2950,12 @@ var KEYMAP = [
2808
2950
  // Enter — apply on assets tab
2809
2951
  { keys: ["\r", "\n"], when: TAB_ASSETS, run: applyChanges },
2810
2952
  // Info — assets only
2811
- { keys: ["i"], when: TAB_ASSETS, run: showInfo }
2953
+ { keys: ["i"], when: TAB_ASSETS, run: showInfo },
2954
+ // Origin filter — assets only. 1/2/3 isolate one origin, 0 clears.
2955
+ { keys: ["1"], when: TAB_ASSETS, run: () => setOriginFilter("library") },
2956
+ { keys: ["2"], when: TAB_ASSETS, run: () => setOriginFilter("source") },
2957
+ { keys: ["3"], when: TAB_ASSETS, run: () => setOriginFilter("store") },
2958
+ { keys: ["0"], when: TAB_ASSETS, run: () => setOriginFilter(null) }
2812
2959
  ];
2813
2960
  async function dispatchKey(key) {
2814
2961
  for (const b of KEYMAP) {
@@ -2854,13 +3001,13 @@ async function run(projectDir) {
2854
3001
  }
2855
3002
  function makeManageCommand() {
2856
3003
  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));
3004
+ await run(path15__default.resolve(opts.projectDir));
2858
3005
  });
2859
3006
  }
2860
3007
  function makeMcpServerCommand() {
2861
3008
  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);
3009
+ const path35 = await import('path');
3010
+ const projectDir = path35.default.resolve(opts.projectDir);
2864
3011
  const { LogStore, StdoutSink, registerLogStore } = await import('../core/logging.js');
2865
3012
  registerLogStore(
2866
3013
  new LogStore({
@@ -2897,8 +3044,8 @@ function makeNpxCommand() {
2897
3044
  skills.command("add <url>").description(
2898
3045
  "Clone a repo, register it in the project's skaile.yaml sources[], and install a skill from it"
2899
3046
  ).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");
3047
+ const projectDir = path15__default.resolve(opts.projectDir);
3048
+ const projYaml = path15__default.join(projectDir, "skaile.yaml");
2902
3049
  if (!existsSync(projYaml)) {
2903
3050
  logErr(`No skaile.yaml in ${projectDir} \u2014 run \`skaile init\` first.`);
2904
3051
  process.exit(1);
@@ -2911,7 +3058,7 @@ function makeNpxCommand() {
2911
3058
  }
2912
3059
  const spinner5 = p5.spinner();
2913
3060
  const slug = sourceSlug(url);
2914
- const clonePath = path14__default.join(homedir(), ".skaile", "sources", slug);
3061
+ const clonePath = path15__default.join(homedir(), ".skaile", "sources", slug);
2915
3062
  spinner5.start(`Cloning ${url}`);
2916
3063
  try {
2917
3064
  if (!existsSync(clonePath)) {
@@ -2960,12 +3107,12 @@ function makeNpxCommand() {
2960
3107
  return npx;
2961
3108
  }
2962
3109
  function resolvePublisher(clonePath, url) {
2963
- const yamlPath = path14__default.join(clonePath, "skaile.yaml");
2964
- if (existsSync(yamlPath)) {
3110
+ const manifestPath = path15__default.join(clonePath, SKAILE_MANIFEST_FILENAME);
3111
+ if (existsSync(manifestPath)) {
2965
3112
  try {
2966
- const { config } = decodeSkaileYaml(readFileSync(yamlPath, "utf8"));
2967
- if (typeof config.publisher === "string" && config.publisher.length > 0) {
2968
- return config.publisher;
3113
+ const { manifest } = decodeSkaileManifest(readFileSync(manifestPath, "utf8"));
3114
+ if (typeof manifest.publisher === "string" && manifest.publisher.length > 0) {
3115
+ return manifest.publisher;
2969
3116
  }
2970
3117
  } catch {
2971
3118
  }
@@ -2973,12 +3120,12 @@ function resolvePublisher(clonePath, url) {
2973
3120
  return url.match(/github\.com[/:]([^/]+)\/[^/]+/)?.[1];
2974
3121
  }
2975
3122
  function resolveSkillName(clonePath, requested) {
2976
- const skillsDir = path14__default.join(clonePath, "skills");
2977
- if (existsSync(path14__default.join(skillsDir, requested, "SKILL.md"))) return requested;
3123
+ const skillsDir = path15__default.join(clonePath, "skills");
3124
+ if (existsSync(path15__default.join(skillsDir, requested, "SKILL.md"))) return requested;
2978
3125
  if (!existsSync(skillsDir)) return requested;
2979
3126
  for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
2980
3127
  if (!entry.isDirectory()) continue;
2981
- const md = path14__default.join(skillsDir, entry.name, "SKILL.md");
3128
+ const md = path15__default.join(skillsDir, entry.name, "SKILL.md");
2982
3129
  if (!existsSync(md)) continue;
2983
3130
  try {
2984
3131
  const { data } = parseFrontmatter(readFileSync(md, "utf8"));
@@ -2998,12 +3145,12 @@ var MCP_SERVER_ENTRY = {
2998
3145
  env: {}
2999
3146
  };
3000
3147
  function pluginDir(projectDir) {
3001
- return path14__default.join(projectDir, ".claude", "plugins", "skaile");
3148
+ return path15__default.join(projectDir, ".claude", "plugins", "skaile");
3002
3149
  }
3003
3150
  async function readJsonStrict(p7) {
3004
3151
  let raw;
3005
3152
  try {
3006
- raw = await fs5.readFile(p7, "utf-8");
3153
+ raw = await fs6.readFile(p7, "utf-8");
3007
3154
  } catch {
3008
3155
  return null;
3009
3156
  }
@@ -3016,32 +3163,32 @@ async function readJsonStrict(p7) {
3016
3163
  }
3017
3164
  }
3018
3165
  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)}
3166
+ await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
3167
+ await fs6.writeFile(p7, `${JSON.stringify(value, null, 2)}
3021
3168
  `);
3022
3169
  }
3023
3170
  async function copyDir(src, dest) {
3024
- await fs5.mkdir(dest, { recursive: true });
3025
- const entries = await fs5.readdir(src, { withFileTypes: true });
3171
+ await fs6.mkdir(dest, { recursive: true });
3172
+ const entries = await fs6.readdir(src, { withFileTypes: true });
3026
3173
  for (const entry of entries) {
3027
- const srcPath = path14__default.join(src, entry.name);
3028
- const destPath = path14__default.join(dest, entry.name);
3174
+ const srcPath = path15__default.join(src, entry.name);
3175
+ const destPath = path15__default.join(dest, entry.name);
3029
3176
  if (entry.isDirectory()) await copyDir(srcPath, destPath);
3030
- else await fs5.copyFile(srcPath, destPath);
3177
+ else await fs6.copyFile(srcPath, destPath);
3031
3178
  }
3032
3179
  }
3033
3180
  async function install(projectDir, opts) {
3034
3181
  return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);
3035
3182
  }
3036
3183
  async function installMcp(projectDir) {
3037
- const mcpPath = path14__default.join(projectDir, ".claude", "mcp.json");
3184
+ const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
3038
3185
  const existing = await readJsonStrict(mcpPath) ?? {};
3039
3186
  const mcpServers = { ...existing.mcpServers ?? {} };
3040
3187
  const previous = mcpServers[SKAILE_MCP_NAME];
3041
3188
  const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);
3042
3189
  let warning;
3043
3190
  if (previous && !matches) {
3044
- warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path14__default.relative(projectDir, mcpPath)}`;
3191
+ warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path15__default.relative(projectDir, mcpPath)}`;
3045
3192
  }
3046
3193
  mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;
3047
3194
  await writeJson(mcpPath, { ...existing, mcpServers });
@@ -3050,15 +3197,15 @@ async function installMcp(projectDir) {
3050
3197
  async function installFullPlugin(projectDir) {
3051
3198
  const dir = pluginDir(projectDir);
3052
3199
  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);
3200
+ const dest = path15__default.join(dir, rel);
3201
+ await fs6.mkdir(path15__default.dirname(dest), { recursive: true });
3202
+ await fs6.writeFile(dest, content);
3056
3203
  }
3057
- const projectSkillsDir = path14__default.join(projectDir, ".skaile", "skills");
3204
+ const projectSkillsDir = path15__default.join(projectDir, ".skaile", "skills");
3058
3205
  if (existsSync(projectSkillsDir)) {
3059
- await copyDir(projectSkillsDir, path14__default.join(dir, "skills"));
3206
+ await copyDir(projectSkillsDir, path15__default.join(dir, "skills"));
3060
3207
  }
3061
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3208
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3062
3209
  const settings = await readJsonStrict(settingsPath) ?? {};
3063
3210
  const plugins = settings.plugins ?? [];
3064
3211
  if (!plugins.includes(dir)) plugins.push(dir);
@@ -3066,8 +3213,8 @@ async function installFullPlugin(projectDir) {
3066
3213
  return { changed: true, method: "plugin" };
3067
3214
  }
3068
3215
  async function uninstall(projectDir) {
3069
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3070
- const mcpPath = path14__default.join(projectDir, ".claude", "mcp.json");
3216
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3217
+ const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
3071
3218
  const dir = pluginDir(projectDir);
3072
3219
  let changed = false;
3073
3220
  const settings = await readJsonStrict(settingsPath);
@@ -3081,7 +3228,7 @@ async function uninstall(projectDir) {
3081
3228
  }
3082
3229
  }
3083
3230
  if (existsSync(dir)) {
3084
- await fs5.rm(dir, { recursive: true, force: true });
3231
+ await fs6.rm(dir, { recursive: true, force: true });
3085
3232
  changed = true;
3086
3233
  }
3087
3234
  const mcp = await readJsonStrict(mcpPath);
@@ -3091,7 +3238,7 @@ async function uninstall(projectDir) {
3091
3238
  const updated = { ...mcp, mcpServers: rest };
3092
3239
  if (Object.keys(rest).length === 0) delete updated.mcpServers;
3093
3240
  if (Object.keys(updated).length === 0) {
3094
- await fs5.unlink(mcpPath);
3241
+ await fs6.unlink(mcpPath);
3095
3242
  } else {
3096
3243
  await writeJson(mcpPath, updated);
3097
3244
  }
@@ -3101,12 +3248,12 @@ async function uninstall(projectDir) {
3101
3248
  async function detectInstall(projectDir) {
3102
3249
  const dir = pluginDir(projectDir);
3103
3250
  const settings = await readJsonStrict(
3104
- path14__default.join(projectDir, ".claude", "settings.json")
3251
+ path15__default.join(projectDir, ".claude", "settings.json")
3105
3252
  );
3106
- if (existsSync(path14__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
3253
+ if (existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
3107
3254
  return { method: "plugin", pluginPath: dir };
3108
3255
  }
3109
- const mcp = await readJsonStrict(path14__default.join(projectDir, ".claude", "mcp.json"));
3256
+ const mcp = await readJsonStrict(path15__default.join(projectDir, ".claude", "mcp.json"));
3110
3257
  if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {
3111
3258
  return { method: "mcp" };
3112
3259
  }
@@ -3115,7 +3262,7 @@ async function detectInstall(projectDir) {
3115
3262
  async function enable(projectDir) {
3116
3263
  const detected = await detectInstall(projectDir);
3117
3264
  if (!detected) throw new Error("plugin not installed for claude-code");
3118
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3265
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3119
3266
  const settings = await readJsonStrict(settingsPath) ?? {};
3120
3267
  if (detected.method === "plugin") {
3121
3268
  const disabled2 = settings.disabledPlugins ?? [];
@@ -3137,7 +3284,7 @@ async function enable(projectDir) {
3137
3284
  async function disable(projectDir) {
3138
3285
  const detected = await detectInstall(projectDir);
3139
3286
  if (!detected) throw new Error("plugin not installed for claude-code");
3140
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3287
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3141
3288
  const settings = await readJsonStrict(settingsPath) ?? {};
3142
3289
  if (detected.method === "plugin") {
3143
3290
  const list2 = settings.disabledPlugins ?? [];
@@ -3157,12 +3304,12 @@ async function disable(projectDir) {
3157
3304
  return { changed: true };
3158
3305
  }
3159
3306
  async function status(projectDir) {
3160
- const settingsPath = path14__default.join(projectDir, ".claude", "settings.json");
3161
- const mcpPath = path14__default.join(projectDir, ".claude", "mcp.json");
3307
+ const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
3308
+ const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
3162
3309
  const dir = pluginDir(projectDir);
3163
3310
  const settings = await readJsonStrict(settingsPath);
3164
3311
  const mcp = await readJsonStrict(mcpPath);
3165
- const pluginInstalled = !!(existsSync(path14__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
3312
+ const pluginInstalled = !!(existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
3166
3313
  const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);
3167
3314
  if (!pluginInstalled && !mcpInstalled) {
3168
3315
  return {
@@ -3180,7 +3327,7 @@ async function status(projectDir) {
3180
3327
  installed: "yes",
3181
3328
  enabled: disabled2 ? "no" : "yes",
3182
3329
  method: "plugin",
3183
- location: path14__default.relative(projectDir, dir)
3330
+ location: path15__default.relative(projectDir, dir)
3184
3331
  };
3185
3332
  }
3186
3333
  const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;
@@ -3189,7 +3336,7 @@ async function status(projectDir) {
3189
3336
  installed: "yes",
3190
3337
  enabled: disabled ? "no" : "yes",
3191
3338
  method: "mcp",
3192
- location: path14__default.relative(projectDir, mcpPath)
3339
+ location: path15__default.relative(projectDir, mcpPath)
3193
3340
  };
3194
3341
  }
3195
3342
  var SKAILE_MCP_NAME2 = "skaile-workspace";
@@ -3203,7 +3350,7 @@ function buildEntry(projectDir) {
3203
3350
  async function readConfig(p7) {
3204
3351
  let raw;
3205
3352
  try {
3206
- raw = await fs5.readFile(p7, "utf-8");
3353
+ raw = await fs6.readFile(p7, "utf-8");
3207
3354
  } catch {
3208
3355
  return null;
3209
3356
  }
@@ -3216,16 +3363,16 @@ async function readConfig(p7) {
3216
3363
  }
3217
3364
  }
3218
3365
  async function writeConfig(p7, value) {
3219
- await fs5.mkdir(path14__default.dirname(p7), { recursive: true });
3366
+ await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
3220
3367
  const cleaned = {};
3221
3368
  for (const [k, v] of Object.entries(value)) {
3222
3369
  if (v === void 0) continue;
3223
3370
  cleaned[k] = v;
3224
3371
  }
3225
- await fs5.writeFile(p7, stringify(cleaned));
3372
+ await fs6.writeFile(p7, stringify(cleaned));
3226
3373
  }
3227
3374
  function configPath(projectDir) {
3228
- return path14__default.join(projectDir, ".codex", "config.toml");
3375
+ return path15__default.join(projectDir, ".codex", "config.toml");
3229
3376
  }
3230
3377
  async function install2(projectDir) {
3231
3378
  const p7 = configPath(projectDir);
@@ -3236,7 +3383,7 @@ async function install2(projectDir) {
3236
3383
  const matches = previous && JSON.stringify(previous) === JSON.stringify(next);
3237
3384
  let warning;
3238
3385
  if (previous && !matches) {
3239
- warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path14__default.relative(projectDir, p7)}`;
3386
+ warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path15__default.relative(projectDir, p7)}`;
3240
3387
  }
3241
3388
  if (matches) return { changed: false, method: "toml" };
3242
3389
  servers[SKAILE_MCP_NAME2] = next;
@@ -3253,7 +3400,7 @@ async function uninstall2(projectDir) {
3253
3400
  const updated = { ...cfg, mcp_servers: rest };
3254
3401
  if (Object.keys(rest).length === 0) delete updated.mcp_servers;
3255
3402
  if (Object.keys(updated).length === 0) {
3256
- await fs5.unlink(p7);
3403
+ await fs6.unlink(p7);
3257
3404
  } else {
3258
3405
  await writeConfig(p7, updated);
3259
3406
  }
@@ -3277,43 +3424,43 @@ async function status2(projectDir) {
3277
3424
  installed: "yes",
3278
3425
  enabled: "n/a",
3279
3426
  method: "mcp",
3280
- location: path14__default.relative(projectDir, p7)
3427
+ location: path15__default.relative(projectDir, p7)
3281
3428
  };
3282
3429
  }
3283
3430
  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 });
3431
+ const extDir = path15__default.join(projectDir, ".omp", "extensions");
3432
+ const extPath = path15__default.join(extDir, "skaile.ts");
3433
+ await fs6.mkdir(extDir, { recursive: true });
3287
3434
  const { WorkspacePlugin } = await import('../workspace-plugin/index.js');
3288
3435
  const plugin = new WorkspacePlugin({ projectDir });
3289
3436
  const nextSrc = await plugin.buildOmpExtensionSource();
3290
3437
  let prevSrc = null;
3291
3438
  try {
3292
- prevSrc = await fs5.readFile(extPath, "utf-8");
3439
+ prevSrc = await fs6.readFile(extPath, "utf-8");
3293
3440
  } catch {
3294
3441
  }
3295
3442
  if (prevSrc === nextSrc) return { changed: false, method: "generated" };
3296
- await fs5.writeFile(extPath, nextSrc);
3443
+ await fs6.writeFile(extPath, nextSrc);
3297
3444
  return { changed: true, method: "generated" };
3298
3445
  }
3299
3446
  async function uninstall3(projectDir) {
3300
- const extPath = path14__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3447
+ const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3301
3448
  try {
3302
- await fs5.unlink(extPath);
3449
+ await fs6.unlink(extPath);
3303
3450
  return { changed: true };
3304
3451
  } catch {
3305
3452
  return { changed: false };
3306
3453
  }
3307
3454
  }
3308
3455
  async function status3(projectDir) {
3309
- const extPath = path14__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3456
+ const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
3310
3457
  if (existsSync(extPath)) {
3311
3458
  return {
3312
3459
  backend: "omp",
3313
3460
  installed: "yes",
3314
3461
  enabled: "n/a",
3315
3462
  method: "extension",
3316
- location: path14__default.relative(projectDir, extPath)
3463
+ location: path15__default.relative(projectDir, extPath)
3317
3464
  };
3318
3465
  }
3319
3466
  return {
@@ -3334,7 +3481,7 @@ function resolveDriver(driver) {
3334
3481
  throw new Error(`unknown driver: ${driver} (expected: claude-code | omp | codex | all)`);
3335
3482
  }
3336
3483
  async function runInstall(opts) {
3337
- const projectDir = path14__default.resolve(opts.projectDir);
3484
+ const projectDir = path15__default.resolve(opts.projectDir);
3338
3485
  const targets = resolveDriver(opts.driver);
3339
3486
  let exitCode = 0;
3340
3487
  if (targets.includes("claude-code")) {
@@ -3389,7 +3536,7 @@ async function runInstall(opts) {
3389
3536
  return exitCode;
3390
3537
  }
3391
3538
  async function runUninstall(opts) {
3392
- const projectDir = path14__default.resolve(opts.projectDir);
3539
+ const projectDir = path15__default.resolve(opts.projectDir);
3393
3540
  const targets = resolveDriver(opts.driver);
3394
3541
  let exitCode = 0;
3395
3542
  if (targets.includes("claude-code")) {
@@ -3426,7 +3573,7 @@ async function runUninstall(opts) {
3426
3573
  return exitCode;
3427
3574
  }
3428
3575
  async function runToggle(opts, action3) {
3429
- const projectDir = path14__default.resolve(opts.projectDir);
3576
+ const projectDir = path15__default.resolve(opts.projectDir);
3430
3577
  const requestedAll = opts.driver === "all";
3431
3578
  const targets = resolveDriver(opts.driver);
3432
3579
  if (!requestedAll) {
@@ -3461,7 +3608,7 @@ async function runToggle(opts, action3) {
3461
3608
  return exitCode;
3462
3609
  }
3463
3610
  async function runStatus2(opts) {
3464
- const projectDir = path14__default.resolve(opts.projectDir);
3611
+ const projectDir = path15__default.resolve(opts.projectDir);
3465
3612
  const targets = resolveDriver(opts.driver);
3466
3613
  const rows = [];
3467
3614
  let exitCode = 0;
@@ -3532,7 +3679,7 @@ async function runHook(event) {
3532
3679
  await plugin.shutdown();
3533
3680
  return;
3534
3681
  }
3535
- const store = new PluginStore(path14__default.join(projectDir, ".skaile", "plugin-state.json"));
3682
+ const store = new PluginStore(path15__default.join(projectDir, ".skaile", "plugin-state.json"));
3536
3683
  await store.load();
3537
3684
  const status4 = store.get("connector:status");
3538
3685
  if (status4 && typeof status4 === "object" && Object.keys(status4).length > 0) {
@@ -3597,7 +3744,7 @@ function makeOutdatedCommand() {
3597
3744
  new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
3598
3745
  ).action((name, opts) => {
3599
3746
  const am2 = new AssetManager({
3600
- projectDir: path14__default.resolve(opts.projectDir),
3747
+ projectDir: path15__default.resolve(opts.projectDir),
3601
3748
  driverTarget: opts.target
3602
3749
  });
3603
3750
  const entries = am2.outdated();
@@ -3626,7 +3773,7 @@ function makeOutdatedCommand() {
3626
3773
  function makePatchCommand() {
3627
3774
  const cmd = new Command("patch").description("Patch workflow for skill improvement");
3628
3775
  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) });
3776
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3630
3777
  try {
3631
3778
  const dest = am2.patch(ref);
3632
3779
  logOk(`Extracted to ${S.dim(dest)}`);
@@ -3637,7 +3784,7 @@ function makePatchCommand() {
3637
3784
  }
3638
3785
  });
3639
3786
  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) });
3787
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3641
3788
  try {
3642
3789
  const patchFile = am2.patchCommit(ref);
3643
3790
  logOk(`Patch saved to ${S.dim(patchFile)}`);
@@ -3648,7 +3795,7 @@ function makePatchCommand() {
3648
3795
  }
3649
3796
  });
3650
3797
  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) });
3798
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3652
3799
  try {
3653
3800
  am2.patchSubmit(ref);
3654
3801
  logOk("Patch applied to repo clone and committed.");
@@ -3661,7 +3808,7 @@ function makePatchCommand() {
3661
3808
  }
3662
3809
  });
3663
3810
  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) });
3811
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
3665
3812
  am2.patchRemove(ref);
3666
3813
  logOk(`Patch removed for ${ref}`);
3667
3814
  });
@@ -3679,7 +3826,7 @@ function action2(fn) {
3679
3826
  };
3680
3827
  }
3681
3828
  async function reconcileAndReport(projectDir, plugins) {
3682
- const { reconcilePlugins } = await import('../plugin-store-R32NH7JE.js');
3829
+ const { reconcilePlugins } = await import('../plugin-store-GL5VKYUA.js');
3683
3830
  if (plugins.length === 0) {
3684
3831
  logInfo("No plugins declared \u2014 nothing to reconcile.");
3685
3832
  return;
@@ -3693,10 +3840,10 @@ async function reconcileAndReport(projectDir, plugins) {
3693
3840
  }
3694
3841
  }
3695
3842
  async function runInstall2(spec, opts) {
3696
- const projectDir = path14__default.resolve(opts.projectDir);
3843
+ const projectDir = path15__default.resolve(opts.projectDir);
3697
3844
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3698
- const { specName } = await import('../plugin-store-R32NH7JE.js');
3699
- const yamlPath = path14__default.join(projectDir, "skaile.yaml");
3845
+ const { specName } = await import('../plugin-store-GL5VKYUA.js');
3846
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
3700
3847
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3701
3848
  const replaced = editor.addPlugin(spec, specName);
3702
3849
  editor.save();
@@ -3705,10 +3852,10 @@ async function runInstall2(spec, opts) {
3705
3852
  await reconcileAndReport(projectDir, editor.getPlugins());
3706
3853
  }
3707
3854
  async function runRemove(name, opts) {
3708
- const projectDir = path14__default.resolve(opts.projectDir);
3855
+ const projectDir = path15__default.resolve(opts.projectDir);
3709
3856
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3710
- const { specName } = await import('../plugin-store-R32NH7JE.js');
3711
- const yamlPath = path14__default.join(projectDir, "skaile.yaml");
3857
+ const { specName } = await import('../plugin-store-GL5VKYUA.js');
3858
+ const yamlPath = path15__default.join(projectDir, "skaile.yaml");
3712
3859
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3713
3860
  const removed = editor.removePlugin(name, specName);
3714
3861
  if (!removed) {
@@ -3720,7 +3867,7 @@ async function runRemove(name, opts) {
3720
3867
  await reconcileAndReport(projectDir, editor.getPlugins());
3721
3868
  }
3722
3869
  async function runList(opts) {
3723
- const projectDir = path14__default.resolve(opts.projectDir);
3870
+ const projectDir = path15__default.resolve(opts.projectDir);
3724
3871
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
3725
3872
  const config = resolveSkWorkspaceConfig2(projectDir);
3726
3873
  const declared = config.plugins ?? [];
@@ -3735,7 +3882,7 @@ async function runList(opts) {
3735
3882
  const registry = createPluginRegistry();
3736
3883
  if (declared.length > 0) {
3737
3884
  try {
3738
- const { loadPlugins } = await import('../plugin-store-R32NH7JE.js');
3885
+ const { loadPlugins } = await import('../plugin-store-GL5VKYUA.js');
3739
3886
  const result = await loadPlugins(projectDir, declared, registry);
3740
3887
  for (const f of result.failed) logWarn(f.error);
3741
3888
  } catch (err) {
@@ -3774,7 +3921,7 @@ function makePresetCommand() {
3774
3921
  cmd.command("init [name]").description("Scaffold a new .preset.yaml file").option("--dir <path>", "Output directory", process.cwd()).action(async (name, opts) => {
3775
3922
  const presetName = name ?? "my-preset";
3776
3923
  const filename = `${presetName}.preset.yaml`;
3777
- const outPath = path14__default.join(path14__default.resolve(opts.dir), filename);
3924
+ const outPath = path15__default.join(path15__default.resolve(opts.dir), filename);
3778
3925
  if (existsSync(outPath)) {
3779
3926
  logErr(`File already exists: ${outPath}`);
3780
3927
  logInfo("Choose a different name or remove the existing file.");
@@ -3788,7 +3935,7 @@ function makePresetCommand() {
3788
3935
  logInfo(` skaile preset validate ${filename}`);
3789
3936
  });
3790
3937
  cmd.command("validate <path>").description("Validate a preset YAML file (schema + cycles + nesting depth)").action(async (filePath) => {
3791
- const resolved = path14__default.resolve(filePath);
3938
+ const resolved = path15__default.resolve(filePath);
3792
3939
  if (!existsSync(resolved)) {
3793
3940
  logErr(`File not found: ${resolved}`);
3794
3941
  process.exit(1);
@@ -3814,7 +3961,7 @@ function makePresetCommand() {
3814
3961
  logInfo(`Nested preset refs: ${nestedRefs.length} (depth validated at apply-time)`);
3815
3962
  }
3816
3963
  const { detectCycles } = await import('../discovery/index.js');
3817
- const presetRef = path14__default.basename(resolved, ".preset.yaml");
3964
+ const presetRef = path15__default.basename(resolved, ".preset.yaml");
3818
3965
  const edges = [];
3819
3966
  for (const item of preset.items) {
3820
3967
  if (item.ref) {
@@ -3946,8 +4093,8 @@ function makeInstallCommand() {
3946
4093
  const spinner6 = p5.spinner();
3947
4094
  spinner6.start(`Installing ${ref}`);
3948
4095
  try {
3949
- const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-GW7DWWNZ.js');
3950
- const catalog = await openCatalogSource2({ projectDir: path14__default.resolve(opts.projectDir) });
4096
+ const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-I7YTADMD.js');
4097
+ const catalog = await openCatalogSource2({ projectDir: path15__default.resolve(opts.projectDir) });
3951
4098
  if (!supportsInstallManifest(catalog)) {
3952
4099
  throw new Error(
3953
4100
  "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."
@@ -3976,9 +4123,9 @@ function makeInstallCommand() {
3976
4123
  }
3977
4124
  return;
3978
4125
  }
3979
- const projectDir = path14__default.resolve(opts.projectDir);
4126
+ const projectDir = path15__default.resolve(opts.projectDir);
3980
4127
  try {
3981
- const { ensureSourcesCloned } = await import('../ensure-sources-7MOOKY3K.js');
4128
+ const { ensureSourcesCloned } = await import('../ensure-sources-KQQEUDKM.js');
3982
4129
  const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
3983
4130
  if (hydrate.cloned.length > 0) {
3984
4131
  logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
@@ -4024,7 +4171,7 @@ function makeInstallCommand() {
4024
4171
  }
4025
4172
  function makeCheckCommand() {
4026
4173
  return new Command("check").description("Check for unmet requirements").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
4027
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
4174
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
4028
4175
  const issues = am2.doctor();
4029
4176
  if (issues.length === 0) {
4030
4177
  logOk("All dependencies satisfied.");
@@ -4041,10 +4188,10 @@ function makeCheckCommand() {
4041
4188
  function makeCleanCommand() {
4042
4189
  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) => {
4043
4190
  const am2 = new AssetManager({
4044
- projectDir: path14__default.resolve(opts.projectDir),
4191
+ projectDir: path15__default.resolve(opts.projectDir),
4045
4192
  driverTarget: opts.target
4046
4193
  });
4047
- const lock = readLock(path14__default.resolve(opts.projectDir, "skaile.lock.yaml"));
4194
+ const lock = readLock(path15__default.resolve(opts.projectDir, "skaile.lock.yaml"));
4048
4195
  if (!lock || Object.keys(lock.assets).length === 0) {
4049
4196
  logInfo("Nothing to clean (no skaile-managed assets found).");
4050
4197
  return;
@@ -4097,14 +4244,14 @@ function makeCleanCommand() {
4097
4244
  }
4098
4245
  function makeRebuildCommand() {
4099
4246
  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) => {
4100
- const projectDir = path14__default.resolve(opts.projectDir);
4247
+ const projectDir = path15__default.resolve(opts.projectDir);
4101
4248
  let agentDir;
4102
4249
  if (agentArg) {
4103
4250
  if (agentArg.includes("/") || agentArg.includes("\\")) {
4104
- agentDir = path14__default.resolve(projectDir, agentArg);
4251
+ agentDir = path15__default.resolve(projectDir, agentArg);
4105
4252
  } else {
4106
4253
  const resolved = resolveAgentDir(projectDir);
4107
- agentDir = resolved ?? path14__default.resolve(projectDir, agentArg);
4254
+ agentDir = resolved ?? path15__default.resolve(projectDir, agentArg);
4108
4255
  }
4109
4256
  } else {
4110
4257
  const resolved = resolveAgentDir(projectDir);
@@ -4182,19 +4329,19 @@ function makeFlowEventHandler() {
4182
4329
  }
4183
4330
  function makeRunCommand() {
4184
4331
  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) => {
4185
- const projectDir = path14__default.resolve(opts.projectDir);
4332
+ const projectDir = path15__default.resolve(opts.projectDir);
4186
4333
  const cliDriver = opts.driver;
4187
4334
  const dryRun = opts.dryRun ?? false;
4188
4335
  let flowId = positional[0];
4189
4336
  if (!flowId) {
4190
- const flows2 = loadAllFlows(AI_RESOURCES);
4191
- if (flows2.length === 0) {
4337
+ const flows = discoverFlows();
4338
+ if (flows.length === 0) {
4192
4339
  logErr("No flows available.");
4193
4340
  process.exit(1);
4194
4341
  }
4195
4342
  const selected = await p5.select({
4196
4343
  message: "Select a flow to run",
4197
- options: flows2.map((f) => ({
4344
+ options: flows.map((f) => ({
4198
4345
  value: f.id,
4199
4346
  label: f.name,
4200
4347
  hint: f.description
@@ -4214,13 +4361,25 @@ function makeRunCommand() {
4214
4361
  const driver = config.driver ?? "omp";
4215
4362
  const model = config.model;
4216
4363
  const provider = config.provider;
4217
- const flows = loadAllFlows(AI_RESOURCES);
4218
- const flow = flows.find((f) => f.id === flowId);
4219
- if (!flow) {
4364
+ const priorityRoots = [];
4365
+ let dir = projectDir;
4366
+ for (let i = 0; i < 6; i++) {
4367
+ const candidate = path15__default.join(dir, "ai-assets");
4368
+ if (fs11__default.existsSync(candidate)) {
4369
+ priorityRoots.push(candidate);
4370
+ break;
4371
+ }
4372
+ dir = path15__default.dirname(dir);
4373
+ }
4374
+ const flowPath = findFlowFile(flowId, priorityRoots);
4375
+ if (!flowPath) {
4220
4376
  const textPrompt = positional.join(" ");
4221
4377
  if (!textPrompt.trim()) {
4222
4378
  logErr(`Flow not found: ${flowId}`);
4223
- console.log(` ${S.dim("Available:")} ${flows.map((f) => S.cmd(f.id)).join(", ")}`);
4379
+ const available = discoverFlows().map((f) => f.id);
4380
+ if (available.length > 0) {
4381
+ console.log(` ${S.dim("Available:")} ${available.map((id) => S.cmd(id)).join(", ")}`);
4382
+ }
4224
4383
  process.exit(1);
4225
4384
  }
4226
4385
  await runAgentChat({
@@ -4233,43 +4392,13 @@ function makeRunCommand() {
4233
4392
  });
4234
4393
  return;
4235
4394
  }
4236
- let flowPath;
4237
- let dir = projectDir;
4238
- for (let i = 0; i < 6; i++) {
4239
- const candidate = path14__default.join(dir, "ai-assets");
4240
- if (fs10__default.existsSync(candidate)) {
4241
- for (const domain of fs10__default.readdirSync(candidate)) {
4242
- const p_ = path14__default.join(candidate, domain, "flows", `${flowId}.flow.yaml`);
4243
- if (fs10__default.existsSync(p_)) {
4244
- flowPath = p_;
4245
- break;
4246
- }
4247
- const legacy = path14__default.join(candidate, domain, "flows", `${flowId}.json`);
4248
- if (fs10__default.existsSync(legacy)) {
4249
- flowPath = legacy;
4250
- break;
4251
- }
4252
- }
4253
- break;
4254
- }
4255
- dir = path14__default.dirname(dir);
4256
- }
4257
- if (!flowPath) {
4258
- for (const domain of fs10__default.readdirSync(AI_RESOURCES)) {
4259
- const p_ = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.flow.yaml`);
4260
- if (fs10__default.existsSync(p_)) {
4261
- flowPath = p_;
4262
- break;
4263
- }
4264
- const legacy = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.json`);
4265
- if (fs10__default.existsSync(legacy)) {
4266
- flowPath = legacy;
4267
- break;
4268
- }
4269
- }
4270
- }
4271
- if (!flowPath) {
4272
- logErr(`Could not locate flow file for: ${flowId}`);
4395
+ let flow;
4396
+ try {
4397
+ flow = loadFlow(flowPath);
4398
+ } catch (err) {
4399
+ logErr(
4400
+ `Failed to load flow "${flowId}": ${err instanceof Error ? err.message : String(err)}`
4401
+ );
4273
4402
  process.exit(1);
4274
4403
  }
4275
4404
  console.log();
@@ -4295,7 +4424,7 @@ function makeRunCommand() {
4295
4424
  }
4296
4425
  function makeResumeCommand() {
4297
4426
  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) => {
4298
- const projectDir = path14__default.resolve(opts.projectDir);
4427
+ const projectDir = path15__default.resolve(opts.projectDir);
4299
4428
  const sessionId = opts.session;
4300
4429
  const dryRun = opts.dryRun ?? false;
4301
4430
  const session = sessionId ? await loadSessionById(projectDir, sessionId) : await loadSession(projectDir);
@@ -4322,7 +4451,7 @@ function makeResumeCommand() {
4322
4451
  }
4323
4452
  function makeStatusCommand() {
4324
4453
  return new Command("status").description("Show current session state").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
4325
- const projectDir = path14__default.resolve(opts.projectDir);
4454
+ const projectDir = path15__default.resolve(opts.projectDir);
4326
4455
  const session = await loadSession(projectDir);
4327
4456
  if (!session) {
4328
4457
  logInfo("No active session.");
@@ -4347,7 +4476,7 @@ function makeStatusCommand() {
4347
4476
  }
4348
4477
  function makeClearCommand() {
4349
4478
  return new Command("clear").description("Unset current session pointer").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
4350
- const projectDir = path14__default.resolve(opts.projectDir);
4479
+ const projectDir = path15__default.resolve(opts.projectDir);
4351
4480
  await clearSession(projectDir);
4352
4481
  logOk("Session cleared.");
4353
4482
  });
@@ -4357,7 +4486,7 @@ function makeReplCommand() {
4357
4486
  const { findWorkspaceRoot: findWorkspaceRoot2 } = await import('../core/index.js');
4358
4487
  const { startRepl } = await import('../tui/index.js');
4359
4488
  const os = await import('os');
4360
- const userCwd = path14__default.resolve(opts.projectDir ?? process.cwd());
4489
+ const userCwd = path15__default.resolve(opts.projectDir ?? process.cwd());
4361
4490
  const workspaceRoot = findWorkspaceRoot2(userCwd);
4362
4491
  let projectDir;
4363
4492
  let agentCwd;
@@ -4379,13 +4508,13 @@ function makeReplCommand() {
4379
4508
  p5.cancel("Cancelled.");
4380
4509
  process.exit(0);
4381
4510
  }
4382
- const tmpDir = fs10__default.mkdtempSync(path14__default.join(os.tmpdir(), "skaile-repl-"));
4511
+ const tmpDir = fs11__default.mkdtempSync(path15__default.join(os.tmpdir(), "skaile-repl-"));
4383
4512
  projectDir = tmpDir;
4384
4513
  agentCwd = userCwd;
4385
4514
  logOk(`Temporary workspace: ${S.cmd(tmpDir)}`);
4386
4515
  if (!driverOverride) {
4387
- const claudeDir = path14__default.join(os.homedir(), ".claude");
4388
- if (fs10__default.existsSync(claudeDir)) {
4516
+ const claudeDir = path15__default.join(os.homedir(), ".claude");
4517
+ if (fs11__default.existsSync(claudeDir)) {
4389
4518
  driverOverride = "claude-sdk";
4390
4519
  logInfo(`Detected ${S.cmd("~/.claude")} \u2192 using ${S.cmd("claude-sdk")} backend`);
4391
4520
  } else {
@@ -4431,12 +4560,12 @@ function makeServeCommand() {
4431
4560
  );
4432
4561
  }
4433
4562
  async function ensurePluginsLoadedForServe(projectDir) {
4434
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-LTN3HMD3.js');
4563
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-F4NZ66VD.js');
4435
4564
  try {
4436
4565
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
4437
4566
  const config = resolveSkWorkspaceConfig2(projectDir);
4438
4567
  if (!config.plugins || config.plugins.length === 0) return;
4439
- const { ensurePluginsLoaded } = await import('../plugin-store-R32NH7JE.js');
4568
+ const { ensurePluginsLoaded } = await import('../plugin-store-GL5VKYUA.js');
4440
4569
  const { pluginRegistry } = await import('../plugin-registry/index.js');
4441
4570
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
4442
4571
  if (result.loaded.length > 0) {
@@ -4450,14 +4579,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
4450
4579
  }
4451
4580
  }
4452
4581
  async function runCompileTest(opts) {
4453
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-LTN3HMD3.js');
4582
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-F4NZ66VD.js');
4454
4583
  const { tmpdir } = await import('os');
4455
4584
  const { dirname: dirname3, join: join5, resolve: resolve4 } = await import('path');
4456
4585
  const { fileURLToPath: fileURLToPath2 } = await import('url');
4457
4586
  const { unlinkSync, existsSync: existsSync12 } = await import('fs');
4458
4587
  const { spawn } = await import('child_process');
4459
4588
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
4460
- const { MONOREPO_ROOT } = await import('../paths-FKKGS6BA.js');
4589
+ const { MONOREPO_ROOT } = await import('../paths-CE66L3AL.js');
4461
4590
  if (MONOREPO_ROOT === null) {
4462
4591
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
4463
4592
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -4927,7 +5056,7 @@ function resolveMode(opts) {
4927
5056
  if (opts.forceLocal && opts.forceRemote) {
4928
5057
  throw new Error("Cannot use both --local and --remote");
4929
5058
  }
4930
- const startDir = path14__default.resolve(opts.projectDir ?? process.cwd());
5059
+ const startDir = path15__default.resolve(opts.projectDir ?? process.cwd());
4931
5060
  const localDb = findLogsDb(startDir);
4932
5061
  if (opts.forceLocal) {
4933
5062
  if (!localDb) {
@@ -4960,14 +5089,14 @@ function resolveMode(opts) {
4960
5089
  function findLogsDb(startDir) {
4961
5090
  let dir = startDir;
4962
5091
  for (let i = 0; i < MAX_WALK_LEVELS; i++) {
4963
- const candidate = path14__default.join(dir, ".skaile", "logs.db");
5092
+ const candidate = path15__default.join(dir, ".skaile", "logs.db");
4964
5093
  if (existsSync(candidate)) {
4965
5094
  try {
4966
5095
  if (statSync(candidate).isFile()) return candidate;
4967
5096
  } catch {
4968
5097
  }
4969
5098
  }
4970
- const parent = path14__default.dirname(dir);
5099
+ const parent = path15__default.dirname(dir);
4971
5100
  if (parent === dir) return void 0;
4972
5101
  dir = parent;
4973
5102
  }
@@ -4993,7 +5122,7 @@ function readApiToken() {
4993
5122
  }
4994
5123
  function readGlobalSettings() {
4995
5124
  try {
4996
- const settingsPath = path14__default.join(homedir(), ".skaile", "settings.json");
5125
+ const settingsPath = path15__default.join(homedir(), ".skaile", "settings.json");
4997
5126
  if (!existsSync(settingsPath)) return {};
4998
5127
  return JSON.parse(readFileSync(settingsPath, "utf8"));
4999
5128
  } catch {
@@ -5141,7 +5270,7 @@ function parsePositiveInt(value, flag) {
5141
5270
  function makeSessionCommand() {
5142
5271
  const cmd = new Command("session").description("Manage sessions");
5143
5272
  cmd.command("list").description("List all sessions for a project").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
5144
- const projectDir = path14__default.resolve(opts.projectDir);
5273
+ const projectDir = path15__default.resolve(opts.projectDir);
5145
5274
  const sessions = await listSessions(projectDir);
5146
5275
  const current = await loadSession(projectDir);
5147
5276
  if (sessions.length === 0) {
@@ -5169,7 +5298,7 @@ function makeSessionCommand() {
5169
5298
  console.log();
5170
5299
  });
5171
5300
  cmd.command("show <run-id>").description("Show a specific session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
5172
- const projectDir = path14__default.resolve(opts.projectDir);
5301
+ const projectDir = path15__default.resolve(opts.projectDir);
5173
5302
  const session = await loadSessionById(projectDir, runId);
5174
5303
  if (!session) {
5175
5304
  logErr(`Session not found: ${runId}`);
@@ -5178,12 +5307,12 @@ function makeSessionCommand() {
5178
5307
  console.log(JSON.stringify(session, null, 2));
5179
5308
  });
5180
5309
  cmd.command("switch <run-id>").description("Switch the current session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
5181
- const projectDir = path14__default.resolve(opts.projectDir);
5310
+ const projectDir = path15__default.resolve(opts.projectDir);
5182
5311
  await setCurrentSession(projectDir, runId);
5183
5312
  logOk(`Switched to session: ${S.dim(runId.slice(0, 8))}`);
5184
5313
  });
5185
5314
  cmd.command("delete <run-id>").description("Delete a session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
5186
- const projectDir = path14__default.resolve(opts.projectDir);
5315
+ const projectDir = path15__default.resolve(opts.projectDir);
5187
5316
  await deleteSession(projectDir, runId);
5188
5317
  logOk(`Deleted session: ${S.dim(runId.slice(0, 8))}`);
5189
5318
  });
@@ -5232,12 +5361,12 @@ function showOverview(am2) {
5232
5361
  }
5233
5362
  function showAsset(am2, kind, name) {
5234
5363
  const entry = am2.info(`${kind}:${name}`);
5235
- if (entry?.source && fs10__default.existsSync(entry.source)) {
5364
+ if (entry?.source && fs11__default.existsSync(entry.source)) {
5236
5365
  console.log();
5237
5366
  console.log(` ${kindColor(entry.kind)} ${S.heading(entry.name)}`);
5238
5367
  console.log(` ${S.rule(40)}`);
5239
5368
  console.log();
5240
- console.log(fs10__default.readFileSync(entry.source, "utf-8"));
5369
+ console.log(fs11__default.readFileSync(entry.source, "utf-8"));
5241
5370
  return;
5242
5371
  }
5243
5372
  logErr(`Asset not found: ${kind}:${name}`);
@@ -5246,7 +5375,7 @@ function showAsset(am2, kind, name) {
5246
5375
  function makeShowCommand() {
5247
5376
  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) => {
5248
5377
  const am2 = new AssetManager({
5249
- projectDir: path14__default.resolve(opts.projectDir),
5378
+ projectDir: path15__default.resolve(opts.projectDir),
5250
5379
  driverTarget: opts.target
5251
5380
  });
5252
5381
  if (!kind) {
@@ -5284,10 +5413,10 @@ function addSourceManifestCommands(src) {
5284
5413
 
5285
5414
  // cli/src/commands/source.ts
5286
5415
  function sourcesDir() {
5287
- return path14.join(skaileHomeDir(), "sources");
5416
+ return path15.join(skaileHomeDir(), "sources");
5288
5417
  }
5289
5418
  function sourceClonePath(name) {
5290
- return path14.join(sourcesDir(), name);
5419
+ return path15.join(sourcesDir(), name);
5291
5420
  }
5292
5421
  function deriveSlug(url) {
5293
5422
  return url.replace(/\.git$/, "").split(/[/:]/).pop() ?? "source";
@@ -5308,7 +5437,7 @@ function requireProjectYamlPath() {
5308
5437
  );
5309
5438
  process.exit(1);
5310
5439
  }
5311
- return path14.join(root, workspaceConfigFilename());
5440
+ return path15.join(root, workspaceConfigFilename());
5312
5441
  }
5313
5442
  function readProjectSources(yamlPath) {
5314
5443
  if (!existsSync(yamlPath)) return [];
@@ -5406,7 +5535,7 @@ function makeSourceCommand() {
5406
5535
  const result = await refreshManifestCache(entry, opts.dev);
5407
5536
  logOk(`Indexed ${result.assetsUpdated} of ${result.assetsFound} asset(s) from "${slug}".`);
5408
5537
  for (const err of result.errors) logWarn(err);
5409
- logOk(`Source "${slug}" registered in ${path14.relative(process.cwd(), yamlPath)}.`);
5538
+ logOk(`Source "${slug}" registered in ${path15.relative(process.cwd(), yamlPath)}.`);
5410
5539
  }
5411
5540
  );
5412
5541
  cmd.command("list").description("List sources registered in this project's skaile.yaml").option("--json", "Output as JSON").action(async (opts) => {
@@ -5673,7 +5802,7 @@ function printTree(node, prefix = "", isLast = true) {
5673
5802
  }
5674
5803
  function makeTreeCommand() {
5675
5804
  return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
5676
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
5805
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
5677
5806
  const root = am2.tree();
5678
5807
  if (root.children.length === 0) {
5679
5808
  logInfo("No dependencies in lock file. Run `skaile install` first.");
@@ -5691,7 +5820,7 @@ function makeUpdateCommand() {
5691
5820
  try {
5692
5821
  const catalogSpinner = p5.spinner();
5693
5822
  catalogSpinner.start("Refreshing catalog cache");
5694
- const remote = await openCatalogSource({ projectDir: path14__default.resolve(opts.projectDir) });
5823
+ const remote = await openCatalogSource({ projectDir: path15__default.resolve(opts.projectDir) });
5695
5824
  const result2 = await remote.refresh();
5696
5825
  catalogSpinner.stop(
5697
5826
  `Catalog refreshed: ${S.heading(String(result2.assetsCached))} assets cached`
@@ -5703,7 +5832,7 @@ function makeUpdateCommand() {
5703
5832
  }
5704
5833
  }
5705
5834
  if (opts.catalogOnly) return;
5706
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
5835
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
5707
5836
  const spinner5 = p5.spinner();
5708
5837
  spinner5.start("Re-deploying assets");
5709
5838
  const result = await am2.install();
@@ -5737,12 +5866,12 @@ function findManifestCandidates(rootPath) {
5737
5866
  function walk(dir) {
5738
5867
  let entries;
5739
5868
  try {
5740
- entries = fs10__default.readdirSync(dir, { withFileTypes: true });
5869
+ entries = fs11__default.readdirSync(dir, { withFileTypes: true });
5741
5870
  } catch {
5742
5871
  return;
5743
5872
  }
5744
5873
  for (const entry of entries) {
5745
- const fullPath = path14__default.join(dir, entry.name);
5874
+ const fullPath = path15__default.join(dir, entry.name);
5746
5875
  if (entry.isDirectory()) {
5747
5876
  if (!SKIP_DIRS.has(entry.name)) walk(fullPath);
5748
5877
  } else if (entry.isFile()) {
@@ -5783,8 +5912,8 @@ function checkManifestIdentity(kind, parsed) {
5783
5912
  return null;
5784
5913
  }
5785
5914
  function validateManifests(rootPath) {
5786
- const absRoot = path14__default.resolve(rootPath);
5787
- if (!fs10__default.existsSync(absRoot)) {
5915
+ const absRoot = path15__default.resolve(rootPath);
5916
+ if (!fs11__default.existsSync(absRoot)) {
5788
5917
  logErr(`Path does not exist: ${absRoot}`);
5789
5918
  return { total: 0, errors: 1, warnings: 0 };
5790
5919
  }
@@ -5793,7 +5922,7 @@ function validateManifests(rootPath) {
5793
5922
  let errors = 0;
5794
5923
  let warnings = 0;
5795
5924
  for (const c of candidates) {
5796
- const content = fs10__default.readFileSync(c.filePath, "utf-8");
5925
+ const content = fs11__default.readFileSync(c.filePath, "utf-8");
5797
5926
  let parsed;
5798
5927
  if (c.filePath.endsWith(".md")) {
5799
5928
  parsed = parseMdFrontmatter(content);
@@ -5804,13 +5933,13 @@ function validateManifests(rootPath) {
5804
5933
  try {
5805
5934
  parsed = c.filePath.endsWith(".json") ? JSON.parse(content) : parse(content);
5806
5935
  } catch (e) {
5807
- const relPath2 = path14__default.relative(absRoot, c.filePath);
5936
+ const relPath2 = path15__default.relative(absRoot, c.filePath);
5808
5937
  logErr(`${relPath2} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
5809
5938
  errors++;
5810
5939
  continue;
5811
5940
  }
5812
5941
  }
5813
- const relPath = path14__default.relative(absRoot, c.filePath);
5942
+ const relPath = path15__default.relative(absRoot, c.filePath);
5814
5943
  const identityError = checkManifestIdentity(c.kind, parsed);
5815
5944
  if (identityError) {
5816
5945
  logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
@@ -5837,12 +5966,12 @@ function findWorkspaceManifests(rootPath) {
5837
5966
  function walk(dir) {
5838
5967
  let entries;
5839
5968
  try {
5840
- entries = fs10__default.readdirSync(dir, { withFileTypes: true });
5969
+ entries = fs11__default.readdirSync(dir, { withFileTypes: true });
5841
5970
  } catch {
5842
5971
  return;
5843
5972
  }
5844
5973
  for (const entry of entries) {
5845
- const full = path14__default.join(dir, entry.name);
5974
+ const full = path15__default.join(dir, entry.name);
5846
5975
  if (entry.isDirectory()) {
5847
5976
  if (!SKIP_DIRS.has(entry.name)) walk(full);
5848
5977
  } else if (entry.isFile() && /(^|\.)skaile\.yaml$/.test(entry.name)) {
@@ -5854,14 +5983,14 @@ function findWorkspaceManifests(rootPath) {
5854
5983
  return out;
5855
5984
  }
5856
5985
  function validateWorkspaceManifests(rootPath) {
5857
- const absRoot = path14__default.resolve(rootPath);
5986
+ const absRoot = path15__default.resolve(rootPath);
5858
5987
  const files = findWorkspaceManifests(absRoot);
5859
5988
  let errors = 0;
5860
5989
  for (const file of files) {
5861
- const relPath = path14__default.relative(absRoot, file);
5990
+ const relPath = path15__default.relative(absRoot, file);
5862
5991
  let parsed;
5863
5992
  try {
5864
- parsed = parse(fs10__default.readFileSync(file, "utf-8")) ?? {};
5993
+ parsed = parse(fs11__default.readFileSync(file, "utf-8")) ?? {};
5865
5994
  } catch (e) {
5866
5995
  logErr(`${relPath} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
5867
5996
  errors++;
@@ -5914,24 +6043,24 @@ function validateWorkspaceManifests(rootPath) {
5914
6043
  var EXCLUDED_DOMAINS = /* @__PURE__ */ new Set(["skaileup-shared", "external", "docs"]);
5915
6044
  function collectAssetVersions() {
5916
6045
  const assets = [];
5917
- if (!fs10__default.existsSync(AI_RESOURCES)) return assets;
5918
- const domains = fs10__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory() && !EXCLUDED_DOMAINS.has(d.name));
6046
+ if (!fs11__default.existsSync(AI_RESOURCES)) return assets;
6047
+ const domains = fs11__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory() && !EXCLUDED_DOMAINS.has(d.name));
5919
6048
  for (const d of domains) {
5920
- const domainDir = path14__default.join(AI_RESOURCES, d.name);
5921
- const skillsDir = path14__default.join(domainDir, "skills");
5922
- if (fs10__default.existsSync(skillsDir)) {
6049
+ const domainDir = path15__default.join(AI_RESOURCES, d.name);
6050
+ const skillsDir = path15__default.join(domainDir, "skills");
6051
+ if (fs11__default.existsSync(skillsDir)) {
5923
6052
  collectSkillVersions(skillsDir, d.name, assets);
5924
6053
  }
5925
- const agentsDir = path14__default.join(domainDir, "agents");
5926
- if (fs10__default.existsSync(agentsDir)) {
6054
+ const agentsDir = path15__default.join(domainDir, "agents");
6055
+ if (fs11__default.existsSync(agentsDir)) {
5927
6056
  collectAgentVersions(agentsDir, d.name, assets);
5928
6057
  }
5929
- const flowsDir = path14__default.join(domainDir, "flows");
5930
- if (fs10__default.existsSync(flowsDir)) {
5931
- for (const f of fs10__default.readdirSync(flowsDir)) {
6058
+ const flowsDir = path15__default.join(domainDir, "flows");
6059
+ if (fs11__default.existsSync(flowsDir)) {
6060
+ for (const f of fs11__default.readdirSync(flowsDir)) {
5932
6061
  if (!f.endsWith(".flow.yaml")) continue;
5933
- const fp = path14__default.join(flowsDir, f);
5934
- const content = fs10__default.readFileSync(fp, "utf-8");
6062
+ const fp = path15__default.join(flowsDir, f);
6063
+ const content = fs11__default.readFileSync(fp, "utf-8");
5935
6064
  const parsed = parse(content);
5936
6065
  assets.push({
5937
6066
  kind: "flow",
@@ -5942,12 +6071,12 @@ function collectAssetVersions() {
5942
6071
  });
5943
6072
  }
5944
6073
  }
5945
- const promptsDir = path14__default.join(domainDir, "prompts");
5946
- if (fs10__default.existsSync(promptsDir)) {
5947
- for (const f of fs10__default.readdirSync(promptsDir)) {
6074
+ const promptsDir = path15__default.join(domainDir, "prompts");
6075
+ if (fs11__default.existsSync(promptsDir)) {
6076
+ for (const f of fs11__default.readdirSync(promptsDir)) {
5948
6077
  if (!f.endsWith(".prompt.md")) continue;
5949
- const fp = path14__default.join(promptsDir, f);
5950
- const content = fs10__default.readFileSync(fp, "utf-8");
6078
+ const fp = path15__default.join(promptsDir, f);
6079
+ const content = fs11__default.readFileSync(fp, "utf-8");
5951
6080
  const fm = parseSkillFrontmatter(content);
5952
6081
  assets.push({
5953
6082
  kind: "prompt",
@@ -5962,12 +6091,12 @@ function collectAssetVersions() {
5962
6091
  return assets;
5963
6092
  }
5964
6093
  function collectSkillVersions(dir, domain, out) {
5965
- for (const entry of fs10__default.readdirSync(dir, { withFileTypes: true })) {
6094
+ for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
5966
6095
  if (!entry.isDirectory()) continue;
5967
- const full = path14__default.join(dir, entry.name);
5968
- const skillMd = path14__default.join(full, "SKILL.md");
5969
- if (fs10__default.existsSync(skillMd)) {
5970
- const content = fs10__default.readFileSync(skillMd, "utf-8");
6096
+ const full = path15__default.join(dir, entry.name);
6097
+ const skillMd = path15__default.join(full, "SKILL.md");
6098
+ if (fs11__default.existsSync(skillMd)) {
6099
+ const content = fs11__default.readFileSync(skillMd, "utf-8");
5971
6100
  const fm = parseSkillFrontmatter(content);
5972
6101
  out.push({
5973
6102
  kind: "skill",
@@ -5982,11 +6111,11 @@ function collectSkillVersions(dir, domain, out) {
5982
6111
  }
5983
6112
  }
5984
6113
  function collectAgentVersions(dir, domain, out) {
5985
- for (const entry of fs10__default.readdirSync(dir, { withFileTypes: true })) {
6114
+ for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
5986
6115
  if (!entry.isDirectory()) continue;
5987
- const agentYaml = path14__default.join(dir, entry.name, "agent.yaml");
5988
- if (!fs10__default.existsSync(agentYaml)) continue;
5989
- const content = fs10__default.readFileSync(agentYaml, "utf-8");
6116
+ const agentYaml = path15__default.join(dir, entry.name, "agent.yaml");
6117
+ if (!fs11__default.existsSync(agentYaml)) continue;
6118
+ const content = fs11__default.readFileSync(agentYaml, "utf-8");
5990
6119
  const parsed = parse(content);
5991
6120
  out.push({
5992
6121
  kind: "agent",
@@ -6015,7 +6144,7 @@ function makeValidateCommand() {
6015
6144
  "Validate asset manifests, versions, and changelogs"
6016
6145
  );
6017
6146
  cmd.argument("[path]", "Path to asset repo or directory to validate", ".").action((targetPath) => {
6018
- const absPath = path14__default.resolve(targetPath);
6147
+ const absPath = path15__default.resolve(targetPath);
6019
6148
  logInfo(`Validating manifests in ${absPath}`);
6020
6149
  const { total, errors } = validateManifests(absPath);
6021
6150
  const ws = validateWorkspaceManifests(absPath);
@@ -6038,7 +6167,7 @@ function makeValidateCommand() {
6038
6167
  encoding: "utf-8"
6039
6168
  });
6040
6169
  const changedFiles = new Set(
6041
- diffOutput.trim().split("\n").filter(Boolean).map((f) => path14__default.resolve(AI_RESOURCES, f))
6170
+ diffOutput.trim().split("\n").filter(Boolean).map((f) => path15__default.resolve(AI_RESOURCES, f))
6042
6171
  );
6043
6172
  assets = assets.filter((a) => changedFiles.has(a.filePath));
6044
6173
  } catch {
@@ -6060,7 +6189,7 @@ function makeValidateCommand() {
6060
6189
  if (opts.changedOnly) {
6061
6190
  for (const a of assets) {
6062
6191
  if (!a.version) continue;
6063
- const relPath = path14__default.relative(AI_RESOURCES, a.filePath);
6192
+ const relPath = path15__default.relative(AI_RESOURCES, a.filePath);
6064
6193
  try {
6065
6194
  const headContent = execSync(`git show HEAD:${relPath}`, {
6066
6195
  cwd: AI_RESOURCES,
@@ -6083,7 +6212,7 @@ function makeValidateCommand() {
6083
6212
  skillVersionMap.set(a.name, a.version);
6084
6213
  }
6085
6214
  for (const f of flows) {
6086
- const content = fs10__default.readFileSync(f.filePath, "utf-8");
6215
+ const content = fs11__default.readFileSync(f.filePath, "utf-8");
6087
6216
  const parsed = parse(content);
6088
6217
  const nodes = (parsed?.nodes ?? []).filter((n) => n.type === "skill" && n.data?.version).map((n) => ({
6089
6218
  nodeId: n.id,
@@ -6140,7 +6269,7 @@ function makeValidateCommand() {
6140
6269
  let errors = 0;
6141
6270
  for (const domain of modifiedDomains) {
6142
6271
  const changelogModified = modifiedFiles.some(
6143
- (f) => f === `${domain}/CHANGELOG.md` || f === path14__default.join(domain, "CHANGELOG.md")
6272
+ (f) => f === `${domain}/CHANGELOG.md` || f === path15__default.join(domain, "CHANGELOG.md")
6144
6273
  );
6145
6274
  if (changelogModified) {
6146
6275
  logOk(`${domain}/CHANGELOG.md updated`);
@@ -6222,7 +6351,7 @@ function makeVerifyCommand() {
6222
6351
  }
6223
6352
  function makeWhyCommand() {
6224
6353
  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) => {
6225
- const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
6354
+ const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
6226
6355
  const chain = am2.why(ref);
6227
6356
  if (chain.length === 0) {
6228
6357
  logErr(`${ref} not found in lock file. Run \`skaile install\` first.`);
@@ -6243,7 +6372,7 @@ function makeWhyCommand() {
6243
6372
  var _defaultFormatHelp = Help.prototype.formatHelp;
6244
6373
  var pkg = JSON.parse(
6245
6374
  readFileSync(
6246
- path14__default.resolve(path14__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
6375
+ path15__default.resolve(path15__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
6247
6376
  "utf-8"
6248
6377
  )
6249
6378
  );
@@ -6355,6 +6484,11 @@ Advanced:
6355
6484
  `;
6356
6485
  }
6357
6486
  });
6487
+ var BACKEND_DEFAULTS = {
6488
+ "claude-code": { driver: "claude-sdk", provider: "anthropic", model: "claude-sonnet-4-6" },
6489
+ omp: { driver: "omp" },
6490
+ codex: { driver: "codex", provider: "openai" }
6491
+ };
6358
6492
  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) => {
6359
6493
  const { execSync: execSync3 } = await import('child_process');
6360
6494
  const { existsSync: existsSync12, mkdirSync: mkdirSync3, readFileSync: readFileSync6, writeFileSync: writeFileSync2 } = await import('fs');
@@ -6368,25 +6502,26 @@ program.command("init [project-dir]").description("Initialize a project director
6368
6502
  process.exitCode = 1;
6369
6503
  return;
6370
6504
  }
6371
- const resolved = path14__default.resolve(projectDir ?? ".");
6372
- const projectName = path14__default.basename(resolved);
6505
+ const resolved = path15__default.resolve(projectDir ?? ".");
6506
+ const projectName = path15__default.basename(resolved);
6373
6507
  const created = [];
6374
6508
  if (!existsSync12(resolved)) {
6375
6509
  mkdirSync3(resolved, { recursive: true });
6376
6510
  created.push(".");
6377
6511
  }
6378
- const skaileDir = path14__default.join(resolved, ".skaile");
6512
+ const skaileDir = path15__default.join(resolved, ".skaile");
6379
6513
  if (!existsSync12(skaileDir)) {
6380
- mkdirSync3(path14__default.join(skaileDir, "sessions"), { recursive: true });
6514
+ mkdirSync3(path15__default.join(skaileDir, "sessions"), { recursive: true });
6381
6515
  created.push(".skaile/");
6382
6516
  }
6383
- const settingsPath = path14__default.join(skaileDir, "settings.json");
6517
+ const settingsPath = path15__default.join(skaileDir, "settings.json");
6384
6518
  if (!existsSync12(settingsPath)) {
6385
6519
  writeFileSync2(settingsPath, "{}\n");
6386
6520
  created.push(".skaile/settings.json");
6387
6521
  }
6388
- const wsConfigPath = path14__default.join(resolved, "skaile.yaml");
6522
+ const wsConfigPath = path15__default.join(resolved, "skaile.yaml");
6389
6523
  if (!existsSync12(wsConfigPath)) {
6524
+ const backendDefaults = BACKEND_DEFAULTS[backend];
6390
6525
  writeFileSync2(
6391
6526
  wsConfigPath,
6392
6527
  stringify({
@@ -6395,9 +6530,10 @@ program.command("init [project-dir]").description("Initialize a project director
6395
6530
  "agent-config": {
6396
6531
  default: {
6397
6532
  agent: backend,
6398
- provider: "anthropic",
6399
- model: "claude-sonnet-4-6",
6400
- driver: "claude-sdk",
6533
+ // provider/model are omitted for backends that don't fix them (omp, codex).
6534
+ ...backendDefaults.provider ? { provider: backendDefaults.provider } : {},
6535
+ ...backendDefaults.model ? { model: backendDefaults.model } : {},
6536
+ driver: backendDefaults.driver,
6401
6537
  max_turns: 200
6402
6538
  }
6403
6539
  }
@@ -6406,14 +6542,14 @@ program.command("init [project-dir]").description("Initialize a project director
6406
6542
  created.push("skaile.yaml");
6407
6543
  }
6408
6544
  for (const dir of new Set(Object.values(DRIVER_TARGETS[backend].local))) {
6409
- const full = path14__default.join(resolved, dir);
6545
+ const full = path15__default.join(resolved, dir);
6410
6546
  if (!existsSync12(full)) {
6411
6547
  mkdirSync3(full, { recursive: true });
6412
6548
  created.push(`${dir}/`);
6413
6549
  }
6414
6550
  }
6415
6551
  if (opts.git) {
6416
- const gitignorePath = path14__default.join(resolved, ".gitignore");
6552
+ const gitignorePath = path15__default.join(resolved, ".gitignore");
6417
6553
  const entries = ["node_modules/", ".skaile/sessions/", "*.log", ".env", ".env.local"];
6418
6554
  const existing = existsSync12(gitignorePath) ? readFileSync6(gitignorePath, "utf-8") : "";
6419
6555
  const have = new Set(existing.split("\n").map((l) => l.trim()));
@@ -6424,7 +6560,7 @@ program.command("init [project-dir]").description("Initialize a project director
6424
6560
  `);
6425
6561
  if (!existing) created.push(".gitignore");
6426
6562
  }
6427
- if (!existsSync12(path14__default.join(resolved, ".git"))) {
6563
+ if (!existsSync12(path15__default.join(resolved, ".git"))) {
6428
6564
  try {
6429
6565
  execSync3("git init", { cwd: resolved, stdio: "pipe" });
6430
6566
  created.push(".git/");
@@ -6435,10 +6571,10 @@ program.command("init [project-dir]").description("Initialize a project director
6435
6571
  }
6436
6572
  }
6437
6573
  try {
6438
- const fs11 = await import('fs');
6574
+ const fs12 = await import('fs');
6439
6575
  const { userConfigPath, saveConfig, getConfigDefaults } = await import('../library/index.js');
6440
6576
  const userCfgPath = userConfigPath();
6441
- if (!fs11.existsSync(userCfgPath)) {
6577
+ if (!fs12.existsSync(userCfgPath)) {
6442
6578
  const defaults = getConfigDefaults();
6443
6579
  saveConfig(userCfgPath, {
6444
6580
  catalog: { url: defaults.catalog.url, cache_ttl: defaults.catalog.cache_ttl }
@@ -6451,7 +6587,7 @@ program.command("init [project-dir]").description("Initialize a project director
6451
6587
  );
6452
6588
  }
6453
6589
  try {
6454
- const { ensureSourcesCloned } = await import('../ensure-sources-7MOOKY3K.js');
6590
+ const { ensureSourcesCloned } = await import('../ensure-sources-KQQEUDKM.js');
6455
6591
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
6456
6592
  for (const n of hydrate.cloned) created.push(`~/.skaile/sources/${n}/`);
6457
6593
  if (hydrate.failed.length > 0) {
@@ -6465,7 +6601,7 @@ program.command("init [project-dir]").description("Initialize a project director
6465
6601
  logOk(`Initialized project at ${S.heading(resolved)}`);
6466
6602
  console.log();
6467
6603
  console.log(S.heading(" Next steps:"));
6468
- const isCurrentDir = resolved === path14__default.resolve(".");
6604
+ const isCurrentDir = resolved === path15__default.resolve(".");
6469
6605
  let step = 1;
6470
6606
  if (!isCurrentDir) {
6471
6607
  console.log(` ${S.dim(`${step}.`)} ${S.cmd(`cd ${projectDir}`)}`);
@@ -6477,7 +6613,7 @@ program.command("init [project-dir]").description("Initialize a project director
6477
6613
  console.log();
6478
6614
  });
6479
6615
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
6480
- const { cmdSetup } = await import('../setup-SRPBQOHY.js');
6616
+ const { cmdSetup } = await import('../setup-4YMN2BDU.js');
6481
6617
  await cmdSetup([], { projectDir: process.cwd() });
6482
6618
  });
6483
6619
  program.addCommand(makeInstallCommand());