@skaile/workspaces 6.5.0 → 6.7.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 (392) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/ai-sdk.js +12 -19
  3. package/dist/ai-sdk.js.map +1 -1
  4. package/dist/app-sdk/index.js +1 -1
  5. package/dist/{asset-feeds-4I6Z4OI3.js → asset-feeds-4A7PJ4OB.js} +20 -20
  6. package/dist/{asset-feeds-4I6Z4OI3.js.map → asset-feeds-4A7PJ4OB.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +7 -7
  8. package/dist/asset-manager/index.js +12 -12
  9. package/dist/asset-manager/installer.js +8 -8
  10. package/dist/asset-manager/renderers.js +7 -7
  11. package/dist/asset-manager/src/index.d.ts +89 -15
  12. package/dist/asset-manager/src/index.d.ts.map +1 -1
  13. package/dist/asset-manager/src/install-agent.d.ts +22 -1
  14. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  15. package/dist/asset-manager/src/install-instances.d.ts +30 -1
  16. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  17. package/dist/asset-manager/src/installer.d.ts +12 -0
  18. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  19. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  20. package/dist/bridge/harnesses/claude-sdk.js +23 -17
  21. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  22. package/dist/bridge/harnesses/codex.js +12 -11
  23. package/dist/bridge/harnesses/codex.js.map +1 -1
  24. package/dist/bridge/harnesses/continue.js +13 -11
  25. package/dist/bridge/harnesses/continue.js.map +1 -1
  26. package/dist/bridge/harnesses/echo.js +6 -5
  27. package/dist/bridge/harnesses/echo.js.map +1 -1
  28. package/dist/bridge/harnesses/gemini.js +9 -7
  29. package/dist/bridge/harnesses/goose.js +13 -11
  30. package/dist/bridge/harnesses/goose.js.map +1 -1
  31. package/dist/bridge/harnesses/omp.js +10 -8
  32. package/dist/bridge/harnesses/omp.js.map +1 -1
  33. package/dist/bridge/harnesses/opencode.js +13 -11
  34. package/dist/bridge/harnesses/opencode.js.map +1 -1
  35. package/dist/bridge/harnesses/qwen.js +10 -8
  36. package/dist/bridge/harnesses/qwen.js.map +1 -1
  37. package/dist/bridge/index.js +19 -17
  38. package/dist/bridge/src/ai-sdk.d.ts.map +1 -1
  39. package/dist/bridge/src/claude-sdk-surface.d.ts +2 -1
  40. package/dist/bridge/src/claude-sdk-surface.d.ts.map +1 -1
  41. package/dist/bridge/src/harness-binaries.d.ts +21 -0
  42. package/dist/bridge/src/harness-binaries.d.ts.map +1 -0
  43. package/dist/bridge/src/harness-model-check.d.ts +22 -6
  44. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  45. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  46. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
  47. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
  48. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
  49. package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -1
  50. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  51. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
  52. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
  53. package/dist/bridge/src/index.d.ts +2 -1
  54. package/dist/bridge/src/index.d.ts.map +1 -1
  55. package/dist/{chunk-UZET67SO.js → chunk-237BMOZW.js} +4 -4
  56. package/dist/{chunk-UZET67SO.js.map → chunk-237BMOZW.js.map} +1 -1
  57. package/dist/{chunk-J5JWLKLB.js → chunk-37AYPPOO.js} +41 -19
  58. package/dist/chunk-37AYPPOO.js.map +1 -0
  59. package/dist/{chunk-3KSLUVKB.js → chunk-37X4A6VZ.js} +7 -7
  60. package/dist/{chunk-3KSLUVKB.js.map → chunk-37X4A6VZ.js.map} +1 -1
  61. package/dist/{chunk-EO7KGX6P.js → chunk-3HSLJAMJ.js} +4 -4
  62. package/dist/{chunk-EO7KGX6P.js.map → chunk-3HSLJAMJ.js.map} +1 -1
  63. package/dist/{chunk-AFTZNR2W.js → chunk-3W6XZQ2Y.js} +3 -3
  64. package/dist/{chunk-AFTZNR2W.js.map → chunk-3W6XZQ2Y.js.map} +1 -1
  65. package/dist/{chunk-SZTHSPRC.js → chunk-4C2E5QUP.js} +4 -3
  66. package/dist/chunk-4C2E5QUP.js.map +1 -0
  67. package/dist/{chunk-T7HGEMNB.js → chunk-4CD2R4MJ.js} +5 -4
  68. package/dist/chunk-4CD2R4MJ.js.map +1 -0
  69. package/dist/{chunk-TNQLDEM6.js → chunk-6RPS7JEH.js} +302 -54
  70. package/dist/chunk-6RPS7JEH.js.map +1 -0
  71. package/dist/{chunk-NSIOBKDX.js → chunk-6UP2EDFN.js} +4 -313
  72. package/dist/chunk-6UP2EDFN.js.map +1 -0
  73. package/dist/{chunk-KUADKMNX.js → chunk-72TLO2AG.js} +4 -4
  74. package/dist/{chunk-KUADKMNX.js.map → chunk-72TLO2AG.js.map} +1 -1
  75. package/dist/{chunk-HPA3RP5E.js → chunk-AO57IFME.js} +3 -3
  76. package/dist/{chunk-HPA3RP5E.js.map → chunk-AO57IFME.js.map} +1 -1
  77. package/dist/{chunk-G5SYFFMD.js → chunk-ASBZOTEO.js} +2 -2
  78. package/dist/{chunk-G5SYFFMD.js.map → chunk-ASBZOTEO.js.map} +1 -1
  79. package/dist/{chunk-YBEJCQE5.js → chunk-BB5EJLKZ.js} +3 -3
  80. package/dist/{chunk-YBEJCQE5.js.map → chunk-BB5EJLKZ.js.map} +1 -1
  81. package/dist/{chunk-LE6QS4PG.js → chunk-BKLDBUQA.js} +3 -3
  82. package/dist/{chunk-LE6QS4PG.js.map → chunk-BKLDBUQA.js.map} +1 -1
  83. package/dist/{chunk-HTGTNN2B.js → chunk-CMXDFTA2.js} +3 -3
  84. package/dist/{chunk-HTGTNN2B.js.map → chunk-CMXDFTA2.js.map} +1 -1
  85. package/dist/{chunk-J6YPKMMY.js → chunk-CTRTFMCX.js} +6 -6
  86. package/dist/{chunk-J6YPKMMY.js.map → chunk-CTRTFMCX.js.map} +1 -1
  87. package/dist/{chunk-ETF6Q3R3.js → chunk-DFP476EU.js} +8 -4
  88. package/dist/chunk-DFP476EU.js.map +1 -0
  89. package/dist/{chunk-TGUMN5G7.js → chunk-G44FFUMA.js} +13 -11
  90. package/dist/chunk-G44FFUMA.js.map +1 -0
  91. package/dist/{chunk-G4NCSYWR.js → chunk-G7NMF5WQ.js} +4 -4
  92. package/dist/{chunk-G4NCSYWR.js.map → chunk-G7NMF5WQ.js.map} +1 -1
  93. package/dist/{chunk-KA2GLAPS.js → chunk-GAIMSCZ7.js} +10 -8
  94. package/dist/chunk-GAIMSCZ7.js.map +1 -0
  95. package/dist/{chunk-AVFRFGM2.js → chunk-GNUA7XT2.js} +3 -2
  96. package/dist/chunk-GNUA7XT2.js.map +1 -0
  97. package/dist/{chunk-6Y3SC7O4.js → chunk-GTAHU4N4.js} +4 -4
  98. package/dist/{chunk-6Y3SC7O4.js.map → chunk-GTAHU4N4.js.map} +1 -1
  99. package/dist/{chunk-7H4GTP7V.js → chunk-HLAEYFUN.js} +3 -3
  100. package/dist/{chunk-7H4GTP7V.js.map → chunk-HLAEYFUN.js.map} +1 -1
  101. package/dist/{chunk-B436SG5P.js → chunk-HMVAGPYR.js} +48 -12
  102. package/dist/chunk-HMVAGPYR.js.map +1 -0
  103. package/dist/{chunk-EN5REMWV.js → chunk-HPXONAI2.js} +7 -5
  104. package/dist/chunk-HPXONAI2.js.map +1 -0
  105. package/dist/{chunk-KYNCY3F3.js → chunk-HQAPUPBE.js} +3 -3
  106. package/dist/{chunk-KYNCY3F3.js.map → chunk-HQAPUPBE.js.map} +1 -1
  107. package/dist/{chunk-USVUS4DJ.js → chunk-IRK3LNG3.js} +7 -7
  108. package/dist/{chunk-USVUS4DJ.js.map → chunk-IRK3LNG3.js.map} +1 -1
  109. package/dist/{chunk-7EMS2GZO.js → chunk-J7VEQORJ.js} +70 -17
  110. package/dist/chunk-J7VEQORJ.js.map +1 -0
  111. package/dist/{chunk-2HS357RA.js → chunk-KO3VSZQP.js} +48 -19
  112. package/dist/chunk-KO3VSZQP.js.map +1 -0
  113. package/dist/{chunk-KSH5CFQS.js → chunk-KORDNXKA.js} +3 -3
  114. package/dist/{chunk-KSH5CFQS.js.map → chunk-KORDNXKA.js.map} +1 -1
  115. package/dist/{chunk-Z2X7UZEZ.js → chunk-L3JQJ6D5.js} +6 -6
  116. package/dist/{chunk-Z2X7UZEZ.js.map → chunk-L3JQJ6D5.js.map} +1 -1
  117. package/dist/{chunk-OBZ5WQ32.js → chunk-L7QOZG5V.js} +3 -3
  118. package/dist/{chunk-OBZ5WQ32.js.map → chunk-L7QOZG5V.js.map} +1 -1
  119. package/dist/{chunk-B4BLJUYN.js → chunk-LX4TTTRR.js} +79 -36
  120. package/dist/chunk-LX4TTTRR.js.map +1 -0
  121. package/dist/{chunk-KSUT5KAE.js → chunk-LZPJOF7Y.js} +3 -3
  122. package/dist/{chunk-KSUT5KAE.js.map → chunk-LZPJOF7Y.js.map} +1 -1
  123. package/dist/{chunk-OLHHN3NO.js → chunk-N6ZGB5ES.js} +4 -3
  124. package/dist/chunk-N6ZGB5ES.js.map +1 -0
  125. package/dist/{chunk-2M3VLKT2.js → chunk-NURTGAWM.js} +3 -3
  126. package/dist/{chunk-2M3VLKT2.js.map → chunk-NURTGAWM.js.map} +1 -1
  127. package/dist/{chunk-22ZX33H6.js → chunk-O5Y7VMVQ.js} +16 -15
  128. package/dist/chunk-O5Y7VMVQ.js.map +1 -0
  129. package/dist/{chunk-IWKKTCXY.js → chunk-O7ADRMCR.js} +67 -16
  130. package/dist/chunk-O7ADRMCR.js.map +1 -0
  131. package/dist/{chunk-SRTWKZP2.js → chunk-OGTQUEAO.js} +21 -14
  132. package/dist/chunk-OGTQUEAO.js.map +1 -0
  133. package/dist/{chunk-U6KRTCNA.js → chunk-OSABUEWA.js} +3 -3
  134. package/dist/{chunk-U6KRTCNA.js.map → chunk-OSABUEWA.js.map} +1 -1
  135. package/dist/{chunk-E6UWI3TP.js → chunk-PLLZSKOO.js} +3 -3
  136. package/dist/{chunk-E6UWI3TP.js.map → chunk-PLLZSKOO.js.map} +1 -1
  137. package/dist/{chunk-W5KCAWGN.js → chunk-PTJTOPE5.js} +3 -3
  138. package/dist/{chunk-W5KCAWGN.js.map → chunk-PTJTOPE5.js.map} +1 -1
  139. package/dist/{chunk-TROEC2Z2.js → chunk-Q2NYTMT6.js} +18 -17
  140. package/dist/chunk-Q2NYTMT6.js.map +1 -0
  141. package/dist/{chunk-23SG4JRV.js → chunk-QC5BYUED.js} +52 -16
  142. package/dist/chunk-QC5BYUED.js.map +1 -0
  143. package/dist/{chunk-WFLQMAR5.js → chunk-QCR5AE5E.js} +5 -5
  144. package/dist/{chunk-WFLQMAR5.js.map → chunk-QCR5AE5E.js.map} +1 -1
  145. package/dist/{chunk-THX5EE3K.js → chunk-QW5B3TEO.js} +10 -4
  146. package/dist/chunk-QW5B3TEO.js.map +1 -0
  147. package/dist/{chunk-TDPQOR3C.js → chunk-RAHAZ7LP.js} +2 -2
  148. package/dist/{chunk-TDPQOR3C.js.map → chunk-RAHAZ7LP.js.map} +1 -1
  149. package/dist/{chunk-ZUU2PLA3.js → chunk-SBNUXJ6E.js} +3 -3
  150. package/dist/{chunk-ZUU2PLA3.js.map → chunk-SBNUXJ6E.js.map} +1 -1
  151. package/dist/{chunk-DKXNKFKP.js → chunk-SGI5MRKP.js} +75 -3
  152. package/dist/chunk-SGI5MRKP.js.map +1 -0
  153. package/dist/{chunk-UMLCKKIA.js → chunk-TMJBEGS4.js} +36 -7
  154. package/dist/chunk-TMJBEGS4.js.map +1 -0
  155. package/dist/{chunk-K4DHYTUM.js → chunk-TXX3OUYI.js} +3 -3
  156. package/dist/{chunk-K4DHYTUM.js.map → chunk-TXX3OUYI.js.map} +1 -1
  157. package/dist/{chunk-SN663FCA.js → chunk-U52FYGK5.js} +5 -5
  158. package/dist/{chunk-SN663FCA.js.map → chunk-U52FYGK5.js.map} +1 -1
  159. package/dist/{chunk-S7DVT2BV.js → chunk-UCB7FK25.js} +10 -8
  160. package/dist/chunk-UCB7FK25.js.map +1 -0
  161. package/dist/{chunk-3DA74PLW.js → chunk-USSP43U3.js} +3 -3
  162. package/dist/{chunk-3DA74PLW.js.map → chunk-USSP43U3.js.map} +1 -1
  163. package/dist/{chunk-X44XKBZX.js → chunk-WFK4MUBL.js} +21 -7
  164. package/dist/chunk-WFK4MUBL.js.map +1 -0
  165. package/dist/{chunk-YRC2EFOU.js → chunk-WIYVR24B.js} +4 -4
  166. package/dist/{chunk-YRC2EFOU.js.map → chunk-WIYVR24B.js.map} +1 -1
  167. package/dist/{chunk-6EKQENAP.js → chunk-WKENHNDM.js} +6 -6
  168. package/dist/{chunk-6EKQENAP.js.map → chunk-WKENHNDM.js.map} +1 -1
  169. package/dist/chunk-WWSRIT3J.js +59 -0
  170. package/dist/chunk-WWSRIT3J.js.map +1 -0
  171. package/dist/chunk-XON6ODIC.js +315 -0
  172. package/dist/chunk-XON6ODIC.js.map +1 -0
  173. package/dist/{chunk-2IAWVUW3.js → chunk-ZBA4P5TD.js} +4 -4
  174. package/dist/{chunk-2IAWVUW3.js.map → chunk-ZBA4P5TD.js.map} +1 -1
  175. package/dist/{chunk-IS3NIZBX.js → chunk-ZDTDS62B.js} +596 -127
  176. package/dist/chunk-ZDTDS62B.js.map +1 -0
  177. package/dist/{chunk-DNXPXJ3X.js → chunk-ZM4SDVUV.js} +79 -20
  178. package/dist/chunk-ZM4SDVUV.js.map +1 -0
  179. package/dist/{claude-code-JY6CYEG7.js → claude-code-BLFRZU2X.js} +5 -5
  180. package/dist/{claude-code-JY6CYEG7.js.map → claude-code-BLFRZU2X.js.map} +1 -1
  181. package/dist/cli/index.js +481 -205
  182. package/dist/cli/index.js.map +1 -1
  183. package/dist/cli/src/agent-pins.d.ts +9 -3
  184. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  185. package/dist/cli/src/commands/asset-cmd.d.ts +1 -1
  186. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  187. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  188. package/dist/cli/src/commands/catalog.d.ts +2 -0
  189. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  190. package/dist/cli/src/commands/config.d.ts.map +1 -1
  191. package/dist/cli/src/commands/harness-preflight.d.ts +38 -0
  192. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -0
  193. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  194. package/dist/cli/src/commands/library-index.d.ts +16 -0
  195. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  196. package/dist/cli/src/commands/migrate-assets.d.ts +5 -0
  197. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  198. package/dist/cli/src/commands/migrate-harness.d.ts +15 -7
  199. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  200. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  201. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  202. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  203. package/dist/cli/src/commands/project.d.ts +14 -0
  204. package/dist/cli/src/commands/project.d.ts.map +1 -1
  205. package/dist/cli/src/commands/run.d.ts.map +1 -1
  206. package/dist/cli/src/commands/serve-preflight.d.ts +6 -5
  207. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  208. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  209. package/dist/cli/src/commands/session.d.ts.map +1 -1
  210. package/dist/cli/src/commands/source.d.ts +11 -0
  211. package/dist/cli/src/commands/source.d.ts.map +1 -1
  212. package/dist/cli/src/commands/update.d.ts.map +1 -1
  213. package/dist/cli/src/commands/validate-instances.d.ts +6 -0
  214. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  215. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  216. package/dist/cli/src/commands/why.d.ts.map +1 -1
  217. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  218. package/dist/cli/src/session-hint.d.ts +7 -0
  219. package/dist/cli/src/session-hint.d.ts.map +1 -0
  220. package/dist/connectors/config.js +4 -4
  221. package/dist/connectors/index.js +23 -21
  222. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  223. package/dist/connectors/src/managed-gitconfig.d.ts +6 -4
  224. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  225. package/dist/connectors/src/mount-ledger.d.ts.map +1 -1
  226. package/dist/{connectors-VLFOQNS6.js → connectors-OJJU4LSN.js} +26 -24
  227. package/dist/{connectors-VLFOQNS6.js.map → connectors-OJJU4LSN.js.map} +1 -1
  228. package/dist/connectors-shared/index.js +2 -2
  229. package/dist/core/index.js +6 -6
  230. package/dist/core/logging.js +1 -1
  231. package/dist/core/manifest.js +1 -1
  232. package/dist/core/publish-manifest.js +2 -2
  233. package/dist/core/runtime-assets.js +4 -4
  234. package/dist/core/src/agent-instances.d.ts +11 -0
  235. package/dist/core/src/agent-instances.d.ts.map +1 -1
  236. package/dist/core/src/index.d.ts +3 -2
  237. package/dist/core/src/index.d.ts.map +1 -1
  238. package/dist/core/src/logging/index.d.ts +1 -0
  239. package/dist/core/src/logging/index.d.ts.map +1 -1
  240. package/dist/core/src/logging/log-safe-text.d.ts +20 -0
  241. package/dist/core/src/logging/log-safe-text.d.ts.map +1 -0
  242. package/dist/core/src/manifest.d.ts.map +1 -1
  243. package/dist/core/src/publish-manifest.d.ts +20 -6
  244. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  245. package/dist/core/src/repo-manager.d.ts +9 -0
  246. package/dist/core/src/repo-manager.d.ts.map +1 -1
  247. package/dist/core/src/run-state-ignore.d.ts +17 -0
  248. package/dist/core/src/run-state-ignore.d.ts.map +1 -0
  249. package/dist/core/src/workspace-config.d.ts +6 -0
  250. package/dist/core/src/workspace-config.d.ts.map +1 -1
  251. package/dist/core/workspace-config.js +3 -3
  252. package/dist/deploy/index.js +6 -6
  253. package/dist/discovery/index.js +3 -3
  254. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  255. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  256. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  257. package/dist/{ensure-sources-6O54DUQB.js → ensure-sources-F6VQDCWY.js} +28 -26
  258. package/dist/ensure-sources-F6VQDCWY.js.map +1 -0
  259. package/dist/factory-assets/connectors/box.js +23 -21
  260. package/dist/factory-assets/connectors/deploy.js +23 -21
  261. package/dist/factory-assets/connectors/devserver.js +23 -21
  262. package/dist/factory-assets/connectors/flow/adapter.js +23 -21
  263. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts +2 -0
  264. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts.map +1 -1
  265. package/dist/factory-assets/connectors/flow/engine.js +7 -7
  266. package/dist/factory-assets/connectors/flow/run-flow.js +25 -23
  267. package/dist/factory-assets/connectors/flow.js +23 -21
  268. package/dist/factory-assets/connectors/git/CONNECTOR.md +4 -1
  269. package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
  270. package/dist/factory-assets/connectors/git.js +23 -21
  271. package/dist/factory-assets/connectors/gmail.js +23 -21
  272. package/dist/factory-assets/connectors/googledrive.js +23 -21
  273. package/dist/factory-assets/connectors/local.js +23 -21
  274. package/dist/factory-assets/connectors/mattermost.js +23 -21
  275. package/dist/factory-assets/connectors/memory.js +23 -21
  276. package/dist/factory-assets/connectors/minio.js +23 -21
  277. package/dist/factory-assets/connectors/postgres.js +23 -21
  278. package/dist/factory-assets/connectors/s3.js +23 -21
  279. package/dist/factory-assets/connectors/sharepoint.js +23 -21
  280. package/dist/factory-assets/connectors/sqlite.js +23 -21
  281. package/dist/factory-assets/connectors/static-server.js +23 -21
  282. package/dist/factory-assets/connectors/tunnel.js +23 -21
  283. package/dist/factory-assets/connectors/webdav.js +23 -21
  284. package/dist/factory-assets/connectors/xstate-store.js +23 -21
  285. package/dist/factory-assets/connectors/xstate.js +23 -21
  286. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +14 -1
  287. package/dist/{flows-CIUPK7SB.js → flows-I6ODIPZZ.js} +11 -11
  288. package/dist/{flows-CIUPK7SB.js.map → flows-I6ODIPZZ.js.map} +1 -1
  289. package/dist/{helpers-YHDQHQEQ.js → helpers-PJNUTZXZ.js} +28 -26
  290. package/dist/{helpers-YHDQHQEQ.js.map → helpers-PJNUTZXZ.js.map} +1 -1
  291. package/dist/library/index.js +9 -9
  292. package/dist/library/install.js +3 -3
  293. package/dist/library/src/manifest-writer.d.ts +5 -0
  294. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  295. package/dist/{library-publish-MUGUST43.js → library-publish-FNNDWVBO.js} +54 -52
  296. package/dist/library-publish-FNNDWVBO.js.map +1 -0
  297. package/dist/model-endpoint/index.js +10 -9
  298. package/dist/open-library-R5EZROFN.js +59 -0
  299. package/dist/{open-library-BVQCB37E.js.map → open-library-R5EZROFN.js.map} +1 -1
  300. package/dist/{open-registry-JCSIAKEC.js → open-registry-RZW2AFD6.js} +13 -13
  301. package/dist/{open-registry-JCSIAKEC.js.map → open-registry-RZW2AFD6.js.map} +1 -1
  302. package/dist/{paths-XLKCAFRZ.js → paths-RPK5PNZQ.js} +9 -9
  303. package/dist/{paths-XLKCAFRZ.js.map → paths-RPK5PNZQ.js.map} +1 -1
  304. package/dist/{plugin-store-NGRUTCJI.js → plugin-store-OJTERUEZ.js} +9 -9
  305. package/dist/{plugin-store-NGRUTCJI.js.map → plugin-store-OJTERUEZ.js.map} +1 -1
  306. package/dist/project-S2FT3LLR.js +90 -0
  307. package/dist/{project-BGYMLAS6.js.map → project-S2FT3LLR.js.map} +1 -1
  308. package/dist/resolver/index.js +7 -7
  309. package/dist/runner/index.js +39 -37
  310. package/dist/runner/src/capability-roundtrip.d.ts +6 -6
  311. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  312. package/dist/runner/src/composition/run-snapshot.d.ts +7 -1
  313. package/dist/runner/src/composition/run-snapshot.d.ts.map +1 -1
  314. package/dist/runner/src/external-mcp.d.ts +22 -0
  315. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  316. package/dist/runner/src/mcp-tools-snapshot.d.ts +13 -0
  317. package/dist/runner/src/mcp-tools-snapshot.d.ts.map +1 -0
  318. package/dist/runner/src/resources.d.ts +14 -0
  319. package/dist/runner/src/resources.d.ts.map +1 -1
  320. package/dist/runner/src/serve.d.ts.map +1 -1
  321. package/dist/sdk/asset-manager.js +12 -12
  322. package/dist/sdk/bridge.js +19 -17
  323. package/dist/sdk/core.js +6 -6
  324. package/dist/sdk/flow.js +7 -7
  325. package/dist/sdk/index.js +39 -37
  326. package/dist/sdk/index.js.map +1 -1
  327. package/dist/sdk/resolver.js +7 -7
  328. package/dist/sdk/runner.js +39 -37
  329. package/dist/sdk/session.js +2 -2
  330. package/dist/sdk/transport/ws/server.js +7 -7
  331. package/dist/sdk/transport/ws.js +7 -7
  332. package/dist/sdk/transport.js +7 -7
  333. package/dist/sdk/types.js +1 -1
  334. package/dist/serve-preflight-AADSOUO2.js +58 -0
  335. package/dist/{serve-preflight-GQY5DZX6.js.map → serve-preflight-AADSOUO2.js.map} +1 -1
  336. package/dist/session/index.js +2 -2
  337. package/dist/{setup-2NWSKSCO.js → setup-HOAJHUFQ.js} +29 -27
  338. package/dist/setup-HOAJHUFQ.js.map +1 -0
  339. package/dist/{skills-PXZOL2FZ.js → skills-KHHW3RZ3.js} +12 -12
  340. package/dist/{skills-PXZOL2FZ.js.map → skills-KHHW3RZ3.js.map} +1 -1
  341. package/dist/source-FOELFCY6.js +88 -0
  342. package/dist/{source-XA3L4H6I.js.map → source-FOELFCY6.js.map} +1 -1
  343. package/dist/{source-manifest-publish-QEGMTS33.js → source-manifest-publish-Q7P5AEVU.js} +51 -49
  344. package/dist/source-manifest-publish-Q7P5AEVU.js.map +1 -0
  345. package/dist/transport/index.js +7 -7
  346. package/dist/transport/ws/server.js +7 -7
  347. package/dist/transport/ws.js +7 -7
  348. package/dist/tui/index.js +63 -44
  349. package/dist/tui/index.js.map +1 -1
  350. package/dist/tui/src/repl.d.ts +10 -0
  351. package/dist/tui/src/repl.d.ts.map +1 -1
  352. package/dist/types/index.js +1 -1
  353. package/dist/types/src/version.d.ts +4 -4
  354. package/dist/workspace-plugin/adapters/mcp.js +30 -28
  355. package/dist/workspace-plugin/adapters/omp.js +14 -14
  356. package/dist/workspace-plugin/index.js +2 -2
  357. package/package.json +1 -1
  358. package/dist/chunk-22ZX33H6.js.map +0 -1
  359. package/dist/chunk-23SG4JRV.js.map +0 -1
  360. package/dist/chunk-2HS357RA.js.map +0 -1
  361. package/dist/chunk-7EMS2GZO.js.map +0 -1
  362. package/dist/chunk-AVFRFGM2.js.map +0 -1
  363. package/dist/chunk-B436SG5P.js.map +0 -1
  364. package/dist/chunk-B4BLJUYN.js.map +0 -1
  365. package/dist/chunk-DKXNKFKP.js.map +0 -1
  366. package/dist/chunk-DNXPXJ3X.js.map +0 -1
  367. package/dist/chunk-EN5REMWV.js.map +0 -1
  368. package/dist/chunk-ETF6Q3R3.js.map +0 -1
  369. package/dist/chunk-IS3NIZBX.js.map +0 -1
  370. package/dist/chunk-IWKKTCXY.js.map +0 -1
  371. package/dist/chunk-J5JWLKLB.js.map +0 -1
  372. package/dist/chunk-KA2GLAPS.js.map +0 -1
  373. package/dist/chunk-NSIOBKDX.js.map +0 -1
  374. package/dist/chunk-OLHHN3NO.js.map +0 -1
  375. package/dist/chunk-S7DVT2BV.js.map +0 -1
  376. package/dist/chunk-SRTWKZP2.js.map +0 -1
  377. package/dist/chunk-SZTHSPRC.js.map +0 -1
  378. package/dist/chunk-T7HGEMNB.js.map +0 -1
  379. package/dist/chunk-TGUMN5G7.js.map +0 -1
  380. package/dist/chunk-THX5EE3K.js.map +0 -1
  381. package/dist/chunk-TNQLDEM6.js.map +0 -1
  382. package/dist/chunk-TROEC2Z2.js.map +0 -1
  383. package/dist/chunk-UMLCKKIA.js.map +0 -1
  384. package/dist/chunk-X44XKBZX.js.map +0 -1
  385. package/dist/ensure-sources-6O54DUQB.js.map +0 -1
  386. package/dist/library-publish-MUGUST43.js.map +0 -1
  387. package/dist/open-library-BVQCB37E.js +0 -57
  388. package/dist/project-BGYMLAS6.js +0 -88
  389. package/dist/serve-preflight-GQY5DZX6.js +0 -56
  390. package/dist/setup-2NWSKSCO.js.map +0 -1
  391. package/dist/source-XA3L4H6I.js +0 -86
  392. package/dist/source-manifest-publish-QEGMTS33.js.map +0 -1
package/dist/cli/index.js CHANGED
@@ -1,98 +1,100 @@
1
1
  #!/usr/bin/env node
2
- import { status, enable, disable, install, uninstall } from '../chunk-LE6QS4PG.js';
3
- import { makeValidateCommand, scanIdentities } from '../chunk-TROEC2Z2.js';
4
- import { storeNotInstallableReason, mcpNotRunnableHere } from '../chunk-K4DHYTUM.js';
5
- import { checkHarnessSdk } from '../chunk-SRTWKZP2.js';
6
- import { makeProvidersCommand, loadRegistryView, addProviderEntry, ProviderRegistryWriteError, removeProviderEntry } from '../chunk-6EKQENAP.js';
7
- import { makeInstallCommand, makeCheckCommand, makeCleanCommand, pinComposedAgents, reportRewritten, reportReplaced, reportRelocked, reportMoved, reportStoreNotChecked, globalProblems, editedConventionFiles, supportsInstallManifest, runYamlInstall, REF_HINT, reportInstalledSoftDeps } from '../chunk-J5JWLKLB.js';
8
- import { reportUnknownHarnesses, reportProjectConfig, agentInstanceErrorLines } from '../chunk-J6YPKMMY.js';
9
- import { isRecord } from '../chunk-ETF6Q3R3.js';
2
+ import { status, enable, disable, install, uninstall } from '../chunk-BKLDBUQA.js';
3
+ import { makeValidateCommand, scanIdentities } from '../chunk-Q2NYTMT6.js';
4
+ import { storeNotInstallableReason, mcpNotRunnableHere } from '../chunk-TXX3OUYI.js';
5
+ import { checkHarnessSdk } from '../chunk-OGTQUEAO.js';
6
+ import { makeProvidersCommand, loadRegistryView, addProviderEntry, ProviderRegistryWriteError, removeProviderEntry } from '../chunk-WKENHNDM.js';
7
+ import { makeInstallCommand, makeCheckCommand, makeCleanCommand, pinComposedAgents, reportRewritten, reportReplaced, reportRelocked, reportMoved, reportStoreNotChecked, reportStoreNotCheckedForUpdates, globalProblems, editedConventionFiles, supportsInstallManifest, runYamlInstall, REF_HINT, reportInstalledSoftDeps } from '../chunk-37AYPPOO.js';
8
+ import { reportUnknownHarnesses, reportProjectConfig, agentInstanceErrorLines } from '../chunk-CTRTFMCX.js';
9
+ import { isRecord } from '../chunk-DFP476EU.js';
10
10
  import { createSpinner } from '../chunk-NESV47MF.js';
11
- import { loadDeclaredPlugins } from '../chunk-THX5EE3K.js';
12
- import { getStoreConfig, storeFetch, isStoreAuthenticated, getStoreToken } from '../chunk-KUADKMNX.js';
13
- import { makeSourceCommand, syncProjectSources, divergedSourceClones } from '../chunk-DNXPXJ3X.js';
14
- import { manifestEntryFilesRefusals, libraryAssetRefusals, manifestEntryRenames, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, exitOnLibrarySymlinks, resolveLibraryPublisherDetailed, getStoreIdentity, warnLibraryNameFallback, indexLibrary, warnIgnoredDomainFiles, removedDomainOption, rejectRemovedDomainOption, requireValidPublisherOrExit, exitOnManifestPublisherProblems, findAssetManifestFile, checkAssetFile, registerLibraryAsset, DOMAIN_REMOVED_HINT, reportLibrarySymlinks, checkAsset, manifestPublisherProblems, exitOnManifestPathProblems, manifestRequiresProblems, composeRefContext, registeredAssetKeys, assetEntryRef, duplicateAssetMessage, manifestParseFailureLine, manifestParseErrorText, unresolvedManifestDependencies, findEntryManifestFile, unheldRequiresOfFile, warnLegacyBundleFiles, checkComposeKinds } from '../chunk-7EMS2GZO.js';
15
- import { openCatalogSource, LocalCatalogDisabledError, openLibraryManager, openLibrary } from '../chunk-YRC2EFOU.js';
16
- import { getKindRegistry, getKnownKinds } from '../chunk-WFLQMAR5.js';
17
- import { AI_RESOURCES } from '../chunk-UZET67SO.js';
18
- import { logErr, unknownHarnessTargetMessage, S, logOk, setActiveCommand, logInfo, logWarnErr, unknownHarnessMessage, logWarn, TARGET_DEFAULT_HINT, parseHarnessFilter, requireProjectConfig, deferredWarnings, warnPlaceholderBodies, warnFilesOnlyDelegates, reportLegacyOmpCopies, logNoProject, warnStaleHarnessCopies, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, driverAliasOption, foldDriverFlag, friendlyHarnessError, harnessErrorNotes, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth, KIND_COL_WIDTH } from '../chunk-Z2X7UZEZ.js';
11
+ import { loadDeclaredPlugins } from '../chunk-QW5B3TEO.js';
12
+ import { getStoreConfig, storeFetch, isStoreAuthenticated, getStoreToken } from '../chunk-72TLO2AG.js';
13
+ import { makeSourceCommand, dropVanishedSourceRows, syncProjectSources, divergedSourceClones, uncachedSources } from '../chunk-ZM4SDVUV.js';
14
+ import { manifestEntryRootRefusals, manifestEntryFilesRefusals, libraryAssetRefusals, manifestEntryRenames, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, exitOnLibrarySymlinks, resolveLibraryPublisherDetailed, getStoreIdentity, warnLibraryNameFallback, indexLibrary, warnIgnoredDomainFiles, removedDomainOption, rejectRemovedDomainOption, requireValidPublisherOrExit, exitOnManifestPublisherProblems, findAssetManifestFile, checkAssetFile, registerLibraryAsset, DOMAIN_REMOVED_HINT, reportLibrarySymlinks, checkAsset, manifestPublisherProblems, exitOnManifestPathProblems, manifestRequiresProblems, composeRefContext, registeredAssetKeys, assetEntryRef, duplicateAssetMessage, manifestParseFailureLine, manifestParseErrorText, unresolvedManifestDependencies, findEntryManifestFile, unheldRequiresOfFile, warnLegacyBundleFiles, warnUntrackedAssetFiles, checkComposeKinds } from '../chunk-J7VEQORJ.js';
15
+ import { openCatalogSource, LocalCatalogDisabledError, openLibraryManager, openLibrary } from '../chunk-WIYVR24B.js';
16
+ import { getKindRegistry, getKnownKinds } from '../chunk-QCR5AE5E.js';
17
+ import { AI_RESOURCES } from '../chunk-237BMOZW.js';
18
+ import { logErr, unknownHarnessTargetMessage, S, logOk, setActiveCommand, logInfo, logWarnErr, unknownHarnessMessage, logWarn, TARGET_DEFAULT_HINT, parseHarnessFilter, requireProjectConfig, deferredWarnings, warnPlaceholderBodies, warnFilesOnlyDelegates, reportLegacyOmpCopies, logNoProject, warnStaleHarnessCopies, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, driverAliasOption, foldDriverFlag, friendlyHarnessError, harnessErrorNotes, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth, KIND_COL_WIDTH } from '../chunk-L3JQJ6D5.js';
19
19
  import { LocalSecretsProvider } from '../chunk-ILFGVSTJ.js';
20
- import { resolveInstanceAgentDir, instanceSessionOverrides, runAgentChat, isCompositionError, resolveSessionId, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, hashAgentFiles, createCompositionContentSource, compileComposition, manifestModelForHarness, instanceForSession, resolveAgentInstance, describeComposition, MarkdownStreamer, createFinalTextFallback } from '../chunk-TNQLDEM6.js';
21
- import '../chunk-TDPQOR3C.js';
22
- import '../chunk-3KSLUVKB.js';
23
- import '../chunk-OBZ5WQ32.js';
24
- import '../chunk-YBEJCQE5.js';
20
+ import { resolveInstanceAgentDir, instanceSessionOverrides, loadAgentManifest, manifestModelForHarness, runAgentChat, isCompositionError, resolveSessionId, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, hashAgentFiles, createCompositionContentSource, compileComposition, MarkdownStreamer, createFinalTextFallback, instanceForSession, resolveAgentInstance, describeComposition } from '../chunk-6RPS7JEH.js';
21
+ import '../chunk-RAHAZ7LP.js';
22
+ import '../chunk-37X4A6VZ.js';
23
+ import '../chunk-L7QOZG5V.js';
24
+ import '../chunk-BB5EJLKZ.js';
25
25
  import '../chunk-WYZXSJBK.js';
26
- import '../chunk-6Y3SC7O4.js';
27
- import '../chunk-KYNCY3F3.js';
26
+ import '../chunk-GTAHU4N4.js';
27
+ import '../chunk-HQAPUPBE.js';
28
28
  import '../chunk-KW37WNXY.js';
29
29
  import '../chunk-3MWQKQUB.js';
30
- import '../chunk-SN663FCA.js';
30
+ import '../chunk-U52FYGK5.js';
31
31
  import '../chunk-O7SG5PC2.js';
32
32
  import '../chunk-7QBNJTTQ.js';
33
33
  import '../chunk-O2SYFJWP.js';
34
- import '../chunk-7H4GTP7V.js';
34
+ import '../chunk-HLAEYFUN.js';
35
35
  import '../chunk-32NA4TVC.js';
36
36
  import '../chunk-W3UDISS2.js';
37
- import '../chunk-HTGTNN2B.js';
38
- import { runFlow, resumeFlow } from '../chunk-USVUS4DJ.js';
37
+ import '../chunk-CMXDFTA2.js';
38
+ import { runFlow, resumeFlow } from '../chunk-IRK3LNG3.js';
39
39
  import '../chunk-4R6DROGN.js';
40
- import { parseSkillRequirements, validateRequirements } from '../chunk-W5KCAWGN.js';
41
- import '../chunk-3DA74PLW.js';
42
- import '../chunk-B4BLJUYN.js';
43
- import '../chunk-2M3VLKT2.js';
44
- import '../chunk-2IAWVUW3.js';
45
- import { checkHarnessModel, checkModelProvider } from '../chunk-B436SG5P.js';
46
- import '../chunk-S7DVT2BV.js';
47
- import '../chunk-EN5REMWV.js';
48
- import '../chunk-OLHHN3NO.js';
40
+ import { parseSkillRequirements, validateRequirements } from '../chunk-PTJTOPE5.js';
41
+ import '../chunk-USSP43U3.js';
42
+ import '../chunk-LX4TTTRR.js';
43
+ import '../chunk-NURTGAWM.js';
44
+ import '../chunk-ZBA4P5TD.js';
45
+ import { checkHarnessModel, checkOmpListedModel, isUnlistedModel, checkModelSurface } from '../chunk-HMVAGPYR.js';
46
+ import '../chunk-UCB7FK25.js';
47
+ import '../chunk-HPXONAI2.js';
48
+ import '../chunk-N6ZGB5ES.js';
49
49
  import '../chunk-LOO5CB5M.js';
50
- import '../chunk-KSUT5KAE.js';
51
- import '../chunk-ZUU2PLA3.js';
50
+ import '../chunk-LZPJOF7Y.js';
51
+ import '../chunk-SBNUXJ6E.js';
52
+ import { findHarnessBinary, HARNESS_BINARIES } from '../chunk-WWSRIT3J.js';
53
+ import '../chunk-4C2E5QUP.js';
52
54
  import '../chunk-5DE3DGVR.js';
53
55
  import '../chunk-7DN6JKP2.js';
54
- import '../chunk-E6UWI3TP.js';
55
- import '../chunk-EO7KGX6P.js';
56
- import '../chunk-SZTHSPRC.js';
57
- import { listHarnesses, getProviderPreset, AI_PROVIDER_PRESETS } from '../chunk-NSIOBKDX.js';
56
+ import '../chunk-PLLZSKOO.js';
57
+ import { listHarnesses } from '../chunk-XON6ODIC.js';
58
58
  import '../chunk-G5SUWZEU.js';
59
+ import '../chunk-3HSLJAMJ.js';
60
+ import { getProviderPreset, AI_PROVIDER_PRESETS } from '../chunk-6UP2EDFN.js';
59
61
  import '../chunk-IFGTRL2I.js';
60
- import { loadFlow, flowLookupRoots, findFlowFileInRoots, loadAllFlowEntries } from '../chunk-X44XKBZX.js';
62
+ import { loadFlow, flowLookupRoots, findFlowFileInRoots, loadAllFlowEntries } from '../chunk-WFK4MUBL.js';
61
63
  import '../chunk-WD3L5QSU.js';
62
64
  import { nodeLabel, nodeSkillAsset, nodeIsInert, nodeIsOptional, nodeRunKind, nodeAssets } from '../chunk-7RGTAEG6.js';
63
- import '../chunk-G5SYFFMD.js';
64
- import { setLibraryAssetCheck, setRenamedEntryLookup, LibraryEntryError, AssetManager, parseRefTolerant, MissingManifestError, parseCanonicalLockKey, normalizeRepoUrl } from '../chunk-IS3NIZBX.js';
65
- import { CatalogHttpError, libraryDirMissing, missingLibraryDirMessage, cloneOrInitGitRepo, trackOriginBranch, stampManifestPublisher, isGitRepo, ensureGitRepo, conflictingAssetRoot, scanUnlistedAssets, setManifestPublisher, LIBRARY_OWNERSHIPS, assertManifestEditable, installLibraryAsset, getStoreManifestsDir, assertValidLibraryName, unparsableAssetFiles, syncManifestWithDisk, renamedLibraryName, storeManifestFile, getDefaultValue, isSecretPlaceholder } from '../chunk-TGUMN5G7.js';
66
- import { flowFileNameError, SEMVER_RE } from '../chunk-22ZX33H6.js';
67
- import '../chunk-U6KRTCNA.js';
65
+ import '../chunk-ASBZOTEO.js';
66
+ import { setLibraryAssetCheck, setRenamedEntryLookup, LibraryEntryError, AssetManager, parseRefTolerant, MissingManifestError, parseCanonicalLockKey, normalizeRepoUrl } from '../chunk-ZDTDS62B.js';
67
+ import { CatalogHttpError, libraryDirMissing, missingLibraryDirMessage, cloneOrInitGitRepo, trackOriginBranch, stampManifestPublisher, isGitRepo, ensureGitRepo, conflictingAssetRoot, scanUnlistedAssets, setManifestPublisher, LIBRARY_OWNERSHIPS, assertManifestEditable, installLibraryAsset, getStoreManifestsDir, assertValidLibraryName, unparsableAssetFiles, syncManifestWithDisk, renamedLibraryName, storeManifestFile, getDefaultValue, isSecretPlaceholder } from '../chunk-G44FFUMA.js';
68
+ import { flowFileNameError, SEMVER_RE } from '../chunk-O5Y7VMVQ.js';
69
+ import '../chunk-OSABUEWA.js';
68
70
  import '../chunk-F3D25RGM.js';
69
71
  import '../chunk-3TXEJN4W.js';
70
72
  import '../chunk-ISHJITXJ.js';
71
73
  import '../chunk-LNFKL23K.js';
72
74
  import '../chunk-JRN5QF4C.js';
73
75
  import '../chunk-NUELZWCF.js';
74
- import { installTargetOf, SCAFFOLD_KINDS } from '../chunk-2HS357RA.js';
76
+ import { installTargetOf, SCAFFOLD_KINDS } from '../chunk-KO3VSZQP.js';
75
77
  import '../chunk-PKE3PXOK.js';
76
78
  import '../chunk-KTBKW2FI.js';
77
79
  import '../chunk-UQ6LFBPZ.js';
78
- import '../chunk-T7HGEMNB.js';
80
+ import '../chunk-4CD2R4MJ.js';
79
81
  import { effectiveComposes, validatePreset, validateAgent, composeSlotDiagnostics, agentDeprecationDiagnostics, SLOT_ID_PATTERN } from '../chunk-VT6G5AJV.js';
80
- import { LockParseError, loadSettings, globalSettingsPath, resolveSettings, projectSettingsPath, saveSettings, WorkspaceYamlEditor, readLock, resolveLibraryDir, checkAgentSkillConformance, resolveSettingsWithSources, resolveConfiguredHarnessName, FACTORY_SOURCE_URL, globalInstallDir, GLOBAL_INSTALL_DIR_NAME, workspaceProviderRegistryPath, userProviderRegistryPath, loadProviderRegistryFile, aiResourceRoots } from '../chunk-UMLCKKIA.js';
82
+ import { RUN_STATE_GITIGNORE_ENTRIES, LockParseError, loadSettings, globalSettingsPath, resolveSettings, projectSettingsPath, saveSettings, WorkspaceYamlEditor, readLock, resolveLibraryDir, checkAgentSkillConformance, resolveSettingsWithSources, resolveConfiguredHarnessName, FACTORY_SOURCE_URL, globalInstallDir, GLOBAL_INSTALL_DIR_NAME, workspaceProviderRegistryPath, userProviderRegistryPath, loadProviderRegistryFile, aiResourceRoots } from '../chunk-TMJBEGS4.js';
81
83
  import '../chunk-4GY63JU6.js';
82
- import { factoryAssetRoots } from '../chunk-G4NCSYWR.js';
84
+ import { factoryAssetRoots } from '../chunk-G7NMF5WQ.js';
83
85
  import { deployedDir } from '../chunk-5KRMNUL4.js';
84
86
  import { DEFAULT_HARNESS_ID, HARNESS_DEFAULTS } from '../chunk-C5HFK34M.js';
85
87
  import { findKindDirs } from '../chunk-MWXYN6NY.js';
86
- import { SourceEntryError, LegacyKeyError, ConfigParseError, resolveSkWorkspaceConfig, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, AgentRefResolutionError, resolveAgentDefinitionDir, effectiveAgentInstances, matchPin, coerceVersion, loadSkWorkspaceConfig, configParseErrorOf, findWorkspaceRoot, isWorkspaceConfigFilename, SKAILE_YAML_DEFAULT, AGENT_PROFILE_FIELDS } from '../chunk-IWKKTCXY.js';
88
+ import { SourceEntryError, LegacyKeyError, ConfigParseError, resolveSkWorkspaceConfig, unselectedInstanceIds, instanceChoiceText, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, AgentRefResolutionError, resolveAgentDefinitionDir, effectiveAgentInstances, matchPin, coerceVersion, loadSkWorkspaceConfig, configParseErrorOf, findWorkspaceRoot, isWorkspaceConfigFilename, SKAILE_YAML_DEFAULT, AGENT_PROFILE_FIELDS } from '../chunk-O7ADRMCR.js';
87
89
  import { globalCacheRoot, globalSkaileDir, userConfigPath } from '../chunk-L5VSIPQD.js';
88
90
  import { HARNESS_TARGETS, SUPPORTED_HARNESSES, harnessNameForHarnessId } from '../chunk-VTETQCR6.js';
89
- import { SKAILE_MANIFEST_FILENAME, loadSkPublishManifest, decodeSkaileManifest, LIBRARY_GITIGNORE, librarySymlinkMessage, isNonAssetPath, isNonAssetDir, encodeSkaileManifest } from '../chunk-23SG4JRV.js';
90
- import { setWalkTruncationSink, dedupeRequirements, parseFrontmatter, scanDirectory, parseRequires } from '../chunk-AVFRFGM2.js';
91
+ import { SKAILE_MANIFEST_FILENAME, loadSkPublishManifest, decodeSkaileManifest, LIBRARY_GITIGNORE, librarySymlinkMessage, isNonAssetPath, isNonAssetDir, encodeSkaileManifest } from '../chunk-QC5BYUED.js';
92
+ import { setWalkTruncationSink, dedupeRequirements, parseFrontmatter, scanDirectory, parseRequires } from '../chunk-GNUA7XT2.js';
91
93
  import { pluginTitle } from '../chunk-RVRB27AN.js';
92
94
  import { parseAssetRef, isValidPublisher, PUBLISHER_HINT, isValidAssetName, ASSET_NAME_HINT, depToStr, assetRefToStr, slugifyAssetName, parseAssetRefLoose } from '../chunk-V5KG6CCV.js';
93
95
  import { portableSpawn, portableSpawnSync } from '../chunk-VSX2G7LA.js';
94
96
  import { parseModelRef, resolveEntryBaseUrl } from '../chunk-RXGPFAMN.js';
95
- import { openSqlite } from '../chunk-DKXNKFKP.js';
97
+ import { openSqlite } from '../chunk-SGI5MRKP.js';
96
98
  import '../chunk-C3CAXQMA.js';
97
99
  import { registerLogStore, LogStore, StdoutSink } from '../chunk-BOFL7GIF.js';
98
100
  import '../chunk-NSBPE2FW.js';
@@ -239,7 +241,7 @@ async function runSearch(kind, query, opts) {
239
241
  }
240
242
  }
241
243
  async function searchIndex(query, kind, projectDir) {
242
- const { openLibrary: openLibrary2 } = await import('../open-library-BVQCB37E.js');
244
+ const { openLibrary: openLibrary2 } = await import('../open-library-R5EZROFN.js');
243
245
  const library = await openLibrary2();
244
246
  try {
245
247
  const { libraryDirMissing: libraryDirMissing2 } = await import('../library/index.js');
@@ -415,14 +417,14 @@ async function withAddVersions(entries, projectDir) {
415
417
  }
416
418
  async function searchLocal(query, kind, opts, showStore, airGapped) {
417
419
  const projectDir = path19__default.resolve(opts.projectDir);
418
- const { restoreSourceReaders } = await import('../source-XA3L4H6I.js');
420
+ const { restoreSourceReaders } = await import('../source-FOELFCY6.js');
419
421
  for (const name of await restoreSourceReaders(projectDir)) {
420
422
  logInfo(`Re-registered source "${name}" (its library entry was removed elsewhere).`);
421
423
  }
422
424
  const factory = await searchFactory(projectDir, query, kind);
423
425
  let entries = unionEntries(await searchIndex(query, kind, projectDir), factory);
424
426
  if (entries.length === 0 && !query && !kind && !airGapped) {
425
- const { autoSyncForSearch } = await import('../source-XA3L4H6I.js');
427
+ const { autoSyncForSearch } = await import('../source-FOELFCY6.js');
426
428
  if (await autoSyncForSearch(projectDir)) {
427
429
  entries = unionEntries(await searchIndex(query, kind, projectDir), factory);
428
430
  }
@@ -540,7 +542,7 @@ async function searchStore(query, kind, opts, airGapped) {
540
542
  logInfo("air-gapped (cache_ttl: 0) \u2014 local sources only");
541
543
  return "skipped";
542
544
  }
543
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BVQCB37E.js');
545
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-R5EZROFN.js');
544
546
  try {
545
547
  const remote = await openCatalogSource2({ projectDir: path19__default.resolve(opts.projectDir) });
546
548
  const assets = await remote.listAssets(kind ? { kind } : {});
@@ -1071,7 +1073,8 @@ function infoShowsLocked(locked, latest) {
1071
1073
  }
1072
1074
  function infoVersionLine(locked, latest) {
1073
1075
  if (infoShowsLocked(locked, latest)) return `locked ${locked} (latest ${latest})`;
1074
- return latest || void 0;
1076
+ if (latest) return latest;
1077
+ return locked && !locked.startsWith("0.0.0-sha") ? locked : void 0;
1075
1078
  }
1076
1079
  function lockedVersionOf(projectDir, kind, name, publisher) {
1077
1080
  try {
@@ -1086,6 +1089,20 @@ function lockedVersionOf(projectDir, kind, name, publisher) {
1086
1089
  }
1087
1090
  return void 0;
1088
1091
  }
1092
+ function lockedUpstreamOf(projectDir, kind, name, publisher) {
1093
+ try {
1094
+ const lock = readLock(path19__default.join(projectDir, "skaile.lock.yaml"));
1095
+ for (const [key, entry] of Object.entries(lock?.assets ?? {})) {
1096
+ const id = parseCanonicalLockKey(key);
1097
+ if (id.kind !== kind || id.name !== name || entry.library || !entry.source) continue;
1098
+ if (publisher && id.publisher && id.publisher !== publisher.replace(/^@/, "")) continue;
1099
+ const commit = /^0+$/.test(entry.source.commit) ? "" : entry.source.commit.slice(0, 7);
1100
+ return commit ? `${entry.source.url}@${commit}` : entry.source.url;
1101
+ }
1102
+ } catch {
1103
+ }
1104
+ return void 0;
1105
+ }
1089
1106
  async function resolveInfoEntry(am2, ref, opts) {
1090
1107
  const local = await am2.info(ref);
1091
1108
  if (local) return { entry: local };
@@ -1095,14 +1112,17 @@ async function resolveInfoEntry(am2, ref, opts) {
1095
1112
  if (deployed) {
1096
1113
  if (isFile(deployed.source)) {
1097
1114
  const { data } = parseFrontmatter(readTextOrEmpty(deployed.source));
1098
- if (typeof data.name === "string" && data.name !== deployed.name) return { entry: deployed };
1115
+ if (typeof data.name === "string" && data.name !== deployed.name) {
1116
+ return { entry: deployed, deployed: true };
1117
+ }
1099
1118
  const description = typeof data.description === "string" ? data.description : "";
1100
1119
  return {
1101
1120
  entry: {
1102
1121
  ...deployed,
1103
1122
  description: description || deployed.description,
1104
1123
  version: lockedVersionOf(opts.projectDir, deployed.kind, deployed.name) ?? deployed.version
1105
- }
1124
+ },
1125
+ deployed: true
1106
1126
  };
1107
1127
  }
1108
1128
  const scanned = await scanDirectory(deployed.source, deployed.publisher ?? "", {
@@ -1112,10 +1132,10 @@ async function resolveInfoEntry(am2, ref, opts) {
1112
1132
  // kind. Never fall back across kinds — a nested manifest of another kind
1113
1133
  // is a different asset, not this one.
1114
1134
  scanned.find((e) => e.kind === deployed.kind);
1115
- return { entry: match ?? deployed };
1135
+ return { entry: match ?? deployed, deployed: true };
1116
1136
  }
1117
1137
  const lookup = opts.storeLookup ?? (async (filter) => {
1118
- const { resolveCatalogSource } = await import('../open-library-BVQCB37E.js');
1138
+ const { resolveCatalogSource } = await import('../open-library-R5EZROFN.js');
1119
1139
  const { source, close } = await resolveCatalogSource({ projectDir: opts.projectDir });
1120
1140
  try {
1121
1141
  return await source.listAssets(filter);
@@ -1131,7 +1151,7 @@ async function resolveInfoEntry(am2, ref, opts) {
1131
1151
  );
1132
1152
  return { entry: hit ? catalogAssetToEntry(hit) : null };
1133
1153
  } catch (err) {
1134
- const { LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BVQCB37E.js');
1154
+ const { LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-R5EZROFN.js');
1135
1155
  const storeNote = err instanceof Error ? err.message : String(err);
1136
1156
  const disabled = err instanceof LocalCatalogDisabledError2 || /catalog\.url/i.test(storeNote);
1137
1157
  return { entry: null, storeNote, ...disabled ? { storeDisabled: true } : {} };
@@ -1179,8 +1199,10 @@ function makeInfoCommand() {
1179
1199
  if (infoVersionText) console.log(` version: ${infoVersionText}`);
1180
1200
  if (entry.description) console.log(` description: ${entry.description}`);
1181
1201
  if (entry.publisher) console.log(` repository: ${S.dim(entry.publisher)}`);
1202
+ const upstream = lookup.deployed ? lockedUpstreamOf(projectDir, entry.kind, entry.name, parseRefTolerant(ref)?.publisher) : void 0;
1182
1203
  const infoSource = showLocked && entry.source.endsWith(`#${entry.version}`) ? `${entry.source.slice(0, -`#${entry.version}`.length)}#${infoLocked}` : entry.source;
1183
- console.log(` source: ${S.dim(infoSource)}`);
1204
+ console.log(` source: ${S.dim(upstream ?? infoSource)}`);
1205
+ if (upstream) console.log(` deployed: ${S.dim(infoSource)}`);
1184
1206
  const infoLibrary = await am2.lockedLibraryOf(
1185
1207
  entry.kind,
1186
1208
  entry.name,
@@ -1270,15 +1292,20 @@ function makeDoctorCommand() {
1270
1292
  // A library that went back past the lock is no drift either (p1257).
1271
1293
  ...await am2.libraryOlderNotices()
1272
1294
  ];
1273
- if (gaps.length === 0 && edited.length === 0) {
1295
+ await am2.probeStoreOrigins();
1296
+ const notChecked = am2.takeStoreNotChecked();
1297
+ const storeUnreachable = notChecked.some((n) => n.reason === "unreachable");
1298
+ if (gaps.length === 0 && edited.length === 0 && !storeUnreachable) {
1274
1299
  if (configErrors === 0) logOk("No missing dependencies.");
1275
1300
  for (const n of notices) logWarn(n);
1301
+ reportStoreNotCheckedForUpdates(notChecked);
1276
1302
  return;
1277
1303
  }
1278
1304
  for (const n of notices) logWarn(n);
1279
1305
  process.exitCode = 1;
1280
1306
  for (const e of edited) logErr(e);
1281
1307
  for (const g of gaps) if (g.type !== "requires") logErr(g.message);
1308
+ reportStoreNotCheckedForUpdates(notChecked);
1282
1309
  const missing = gaps.filter((g) => g.type === "requires" && g.asset !== void 0);
1283
1310
  if (missing.length === 0) return;
1284
1311
  const assetW = Math.max(5, ...missing.map((g) => (g.asset ?? "").length));
@@ -1374,7 +1401,8 @@ ${body}
1374
1401
  function copyFilter(root) {
1375
1402
  return (src) => {
1376
1403
  const rel = path19.relative(root, src).split(path19.sep).join("/");
1377
- return rel === "" || !(isNonAssetPath(rel) || isNonAssetDir(path19.basename(src)));
1404
+ return rel === "" || !(isNonAssetPath(rel, "asset-root") || // The generic build names count only directly in the copied folder.
1405
+ isNonAssetDir(path19.basename(src), !rel.includes("/")));
1378
1406
  };
1379
1407
  }
1380
1408
  async function resolveDefByRef(library, ref, opts) {
@@ -1755,9 +1783,9 @@ function dirSizeOfDir(dir) {
1755
1783
  return total;
1756
1784
  }
1757
1785
  function removeCacheTargets(targets, opts) {
1758
- const present = targets.filter((t) => existsSync(t));
1759
- for (const t of present) rmSync(t, { recursive: true, force: true });
1760
- return present;
1786
+ const present2 = targets.filter((t) => existsSync(t));
1787
+ for (const t of present2) rmSync(t, { recursive: true, force: true });
1788
+ return present2;
1761
1789
  }
1762
1790
  function fmtBytes(n) {
1763
1791
  const u = ["B", "KB", "MB", "GB"];
@@ -1805,6 +1833,7 @@ function makeCacheCommand() {
1805
1833
  const removed = removeCacheTargets(targets);
1806
1834
  console.log();
1807
1835
  for (const r of removed) logOk(`Removed ${r}`);
1836
+ if (opts.global) await dropVanishedSourceRows();
1808
1837
  });
1809
1838
  cmd.command("dir").description("Print the resolved cache roots").option("--global", "Include the global cache root").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
1810
1839
  console.log(path19__default.join(path19__default.resolve(opts.projectDir), ".skaile", "cache"));
@@ -1859,7 +1888,7 @@ function makeCatalogCommand() {
1859
1888
  return catalog;
1860
1889
  }
1861
1890
  async function runLocalCatalogTest(projectDir) {
1862
- const { resolveCatalogSource } = await import('../open-library-BVQCB37E.js');
1891
+ const { resolveCatalogSource } = await import('../open-library-R5EZROFN.js');
1863
1892
  let resolved;
1864
1893
  try {
1865
1894
  resolved = await resolveCatalogSource({ projectDir });
@@ -2035,7 +2064,7 @@ async function scanLibraryFlowEntries() {
2035
2064
  const { LocalIndex, resolveIndexPath, scanAuthoringLibraries } = await import('../library/index.js');
2036
2065
  const indexPath = resolveIndexPath();
2037
2066
  if (!existsSync(indexPath)) return entries;
2038
- const { getKindRegistry: getKindRegistry2 } = await import('../open-registry-JCSIAKEC.js');
2067
+ const { getKindRegistry: getKindRegistry2 } = await import('../open-registry-RZW2AFD6.js');
2039
2068
  const index = new LocalIndex({ indexPath });
2040
2069
  try {
2041
2070
  for (const { library, assets } of await scanAuthoringLibraries(index, getKindRegistry2())) {
@@ -2247,6 +2276,20 @@ async function unsetCatalogKey(key) {
2247
2276
  console.log(S.dim(` \u2192 ${filePath}`));
2248
2277
  }
2249
2278
  var API_KEY_PREFIX = "apiKey.";
2279
+ function unknownKeyMessage(key) {
2280
+ if (CATALOG_KEYS.has(key) || PERSONAL_KEYS.has(key) || key.startsWith(API_KEY_PREFIX)) {
2281
+ return null;
2282
+ }
2283
+ if (key === "provider" || key === "cloud" || key === "cloudConfig") {
2284
+ return `'${key}' is no longer a setting \u2014 an endpoint is an AI provider registry entry and a session selects one with a model reference.
2285
+ Define it: skaile providers add <id> --preset <preset>
2286
+ Select it: skaile config set model <providerId>/<modelId>`;
2287
+ }
2288
+ return `'${key}' is not a personal setting.
2289
+ Personal keys: ${[...PERSONAL_KEYS].join(", ")}, ${API_KEY_PREFIX}<provider>
2290
+ Catalog keys: ${[...CATALOG_KEYS].join(", ")}
2291
+ Project config (harness, model, paths, resources) belongs in skaile.yaml`;
2292
+ }
2250
2293
  function collectWorkspaceDefaults(projectDir) {
2251
2294
  const wsDefaults = {};
2252
2295
  const ws = resolveSkWorkspaceConfig(projectDir);
@@ -2417,6 +2460,11 @@ function makeConfigCommand() {
2417
2460
  console.log(resolveConfig({ projectDir }).catalog[field]);
2418
2461
  return;
2419
2462
  }
2463
+ const refusal = unknownKeyMessage(key);
2464
+ if (refusal) {
2465
+ logErr(refusal);
2466
+ process.exit(1);
2467
+ }
2420
2468
  const config = opts.global ? await loadSettings(globalSettingsPath()) : await resolveSettings(projectDir);
2421
2469
  const value = config[key];
2422
2470
  console.log(value ?? S.dim("(not set)"));
@@ -2431,23 +2479,12 @@ function makeConfigCommand() {
2431
2479
  await setCatalogKey(key, value);
2432
2480
  return;
2433
2481
  }
2434
- if (key === "provider" || key === "cloud" || key === "cloudConfig") {
2435
- logErr(
2436
- `'${key}' is no longer a setting \u2014 an endpoint is an AI provider registry entry and a session selects one with a model reference.
2437
- Define it: skaile providers add <id> --preset <preset>
2438
- Select it: skaile config set model <providerId>/<modelId>`
2439
- );
2482
+ const refusal = unknownKeyMessage(key);
2483
+ if (refusal) {
2484
+ logErr(refusal);
2440
2485
  process.exit(1);
2441
2486
  }
2442
2487
  const isApiKey = key.startsWith(API_KEY_PREFIX);
2443
- if (!PERSONAL_KEYS.has(key) && !isApiKey) {
2444
- logErr(
2445
- `'${key}' is not a personal setting.
2446
- Personal keys: ${[...PERSONAL_KEYS].join(", ")}, ${API_KEY_PREFIX}<provider>
2447
- Project config (harness, model, paths, resources) belongs in skaile.yaml`
2448
- );
2449
- process.exit(1);
2450
- }
2451
2488
  if (isApiKey) {
2452
2489
  setApiKeySugar(key.slice(API_KEY_PREFIX.length), value, projectDir);
2453
2490
  return;
@@ -2463,13 +2500,13 @@ function makeConfigCommand() {
2463
2500
  if (key === "model") {
2464
2501
  await loadDeclaredPlugins(projectDir);
2465
2502
  const harness = (await resolveSettings(projectDir)).harness ?? DEFAULT_HARNESS_ID;
2466
- const refusal = checkHarnessModel(harness, {
2503
+ const refusal2 = checkHarnessModel(harness, {
2467
2504
  registry: loadRegistryView({ projectDir }).merged,
2468
2505
  model: value,
2469
2506
  roles: resolveSkWorkspaceConfig(projectDir).roles
2470
2507
  });
2471
- if (refusal) {
2472
- logErr(`${refusal} (the project's harness is ${harness})`);
2508
+ if (refusal2) {
2509
+ logErr(`${refusal2} (the project's harness is ${harness})`);
2473
2510
  process.exit(1);
2474
2511
  }
2475
2512
  }
@@ -3200,7 +3237,7 @@ async function ensureTargetsRegistered(projectDir) {
3200
3237
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
3201
3238
  const config = resolveSkWorkspaceConfig2(projectDir);
3202
3239
  if (config.plugins && config.plugins.length > 0) {
3203
- const { ensurePluginsLoaded } = await import('../plugin-store-NGRUTCJI.js');
3240
+ const { ensurePluginsLoaded } = await import('../plugin-store-OJTERUEZ.js');
3204
3241
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
3205
3242
  for (const f of result.failed) logWarn(f.error);
3206
3243
  }
@@ -4426,6 +4463,7 @@ async function reindexLibrary(lib, library, name) {
4426
4463
  (failing > 0 ? logWarn : logOk)(`Indexed ${res.assetsUpdated} asset(s) from ${name}.`);
4427
4464
  warnIgnoredDomainFiles(lib.path);
4428
4465
  warnLegacyBundleFiles(lib.path);
4466
+ warnUntrackedAssetFiles(lib.path);
4429
4467
  if (skippedUnparsable > 0) {
4430
4468
  logErr(`${skippedUnparsable} asset(s) skipped: manifest could not be parsed.`);
4431
4469
  process.exitCode = 1;
@@ -4569,6 +4607,18 @@ function canonicalDir(dir) {
4569
4607
  }
4570
4608
  return path19.join(fs8.realpathSync(existing), ...missing);
4571
4609
  }
4610
+ function libraryContaining(libraries, cwd) {
4611
+ const here = canonicalDir(cwd);
4612
+ let best;
4613
+ for (const lib of libraries) {
4614
+ if (lib.ownership === "reader" || libraryDirMissing(lib)) continue;
4615
+ const root = canonicalDir(lib.path);
4616
+ const rel = path19.relative(root, here);
4617
+ const inside = rel === "" || !rel.startsWith(`..${path19.sep}`) && rel !== ".." && !path19.isAbsolute(rel);
4618
+ if (inside && (!best || root.length > best.root.length)) best = { lib, root };
4619
+ }
4620
+ return best?.lib;
4621
+ }
4572
4622
  function refuseGlobalInstallFolder(name, dir) {
4573
4623
  const reserved = globalInstallDir();
4574
4624
  const rel = path19.relative(canonicalDir(reserved).toLowerCase(), canonicalDir(dir).toLowerCase());
@@ -4686,6 +4736,23 @@ function readOriginTracking(dir) {
4686
4736
  });
4687
4737
  return { url, branch: head.status === 0 && head.stdout.trim() || "main" };
4688
4738
  }
4739
+ function exitOnCloneWithoutCheckout(dir, name) {
4740
+ const head = spawnSync("git", ["rev-parse", "--verify", "-q", "HEAD"], {
4741
+ cwd: dir,
4742
+ encoding: "utf-8"
4743
+ });
4744
+ if (head.status === 0) return;
4745
+ const refs = spawnSync("git", ["for-each-ref", "--format=%(refname)", "refs/remotes/origin"], {
4746
+ cwd: dir,
4747
+ encoding: "utf-8"
4748
+ });
4749
+ const branches = (refs.stdout ?? "").split("\n").map((ref) => ref.trim().replace(/^refs\/remotes\/origin\//, "")).filter((branch) => branch !== "" && branch !== "HEAD" && !branch.startsWith("refs/"));
4750
+ if (branches.length === 0) return;
4751
+ logErr(
4752
+ `${dir} is a git clone with no branch checked out (its remote HEAD names a branch that does not exist): run \`git -C ${dir} checkout ${branches[0]}\` (remote branches: ${branches.join(", ")}), then re-run \`skaile library init ${name} --path ${dir}\`.`
4753
+ );
4754
+ process.exit(1);
4755
+ }
4689
4756
  function requireGitBackend(lib, verb) {
4690
4757
  if (lib.backend !== "git") {
4691
4758
  logErr(
@@ -4732,7 +4799,7 @@ function remoteBranches(url) {
4732
4799
  return r.stdout.split("\n").map((line) => line.split(" ")[1]?.replace(/^refs\/heads\//, "")).filter((b) => !!b);
4733
4800
  }
4734
4801
  async function warnIfNotGithubRemote(name, url) {
4735
- const { isGithubRemote, notGithubRemoteMessage } = await import('../library-publish-MUGUST43.js');
4802
+ const { isGithubRemote, notGithubRemoteMessage } = await import('../library-publish-FNNDWVBO.js');
4736
4803
  if (!isGithubRemote(url)) logWarn(notGithubRemoteMessage(name, url));
4737
4804
  }
4738
4805
  function scaffoldLibraryFiles(dir, name) {
@@ -4771,23 +4838,59 @@ by the same ref.
4771
4838
  }
4772
4839
  return written;
4773
4840
  }
4841
+ function commitScaffold(dir, files) {
4842
+ const run2 = (args) => spawnSync("git", args, { cwd: dir, encoding: "utf-8" });
4843
+ const add = run2(["add", "--", ...files]);
4844
+ if (add.status !== 0) return add.stderr.trim().split("\n")[0] || "git add failed";
4845
+ const commit = run2(["commit", "-q", "-m", "skaile: scaffold library", "--", ...files]);
4846
+ if (commit.status === 0) return void 0;
4847
+ return (commit.stderr.trim() || commit.stdout.trim()).split("\n")[0] || "git commit failed";
4848
+ }
4849
+ async function refuseRemoteOfSource(manager, url) {
4850
+ const key = sourceCacheKey(url);
4851
+ const libraries = await manager.listLibraries();
4852
+ const cacheRoot = path19.resolve(getGlobalCacheDir()) + path19.sep;
4853
+ const clash = libraries.find(
4854
+ (l) => path19.resolve(l.path).startsWith(cacheRoot) && "url" in l.backendConfig && sourceCacheKey(l.backendConfig.url) === key
4855
+ );
4856
+ if (!clash) return;
4857
+ logErr(
4858
+ `${url} is already registered as the source "${clash.name}"; it needs no library \u2014 its assets are searchable already. Run \`skaile source remove\` first to register it as a library.`
4859
+ );
4860
+ process.exit(1);
4861
+ }
4774
4862
  function makeLibraryCommand() {
4775
4863
  const cmd = new Command("library").description("Manage user authoring libraries (local / git)").enablePositionalOptions();
4776
4864
  cmd.command("list").description("List all registered libraries").option("--json", "Output as JSON").action(async (opts) => {
4777
4865
  const { manager, close } = await openLibraryManager();
4778
4866
  try {
4779
- const ls = await manager.listLibraries();
4867
+ const scoped = new AssetManager({
4868
+ registry: getKindRegistry(),
4869
+ projectDir: process.cwd()
4870
+ }).scopeLibraryList(await manager.listLibraries());
4871
+ const ls = scoped.libraries;
4780
4872
  if (opts.json) {
4781
4873
  return console.log(
4782
4874
  JSON.stringify(
4783
- ls.map((l) => libraryDirMissing(l) ? { ...l, directoryMissing: true } : l),
4875
+ ls.map((l) => ({
4876
+ ...l,
4877
+ ...libraryDirMissing(l) ? { directoryMissing: true } : {},
4878
+ ...scoped.sources.has(l.id) ? { source: true } : {}
4879
+ })),
4784
4880
  null,
4785
4881
  2
4786
4882
  )
4787
4883
  );
4788
4884
  }
4885
+ const uncached = uncachedSources(process.cwd());
4886
+ const hintUncached = () => {
4887
+ for (const name of uncached) {
4888
+ logInfo(`source ${name} is not cloned: run \`skaile source sync\` to clone it.`);
4889
+ }
4890
+ };
4789
4891
  if (ls.length === 0) {
4790
4892
  logInfo("No libraries registered. Run `skaile library init personal` to start.");
4893
+ hintUncached();
4791
4894
  return;
4792
4895
  }
4793
4896
  console.log();
@@ -4799,13 +4902,14 @@ function makeLibraryCommand() {
4799
4902
  for (const l of ls) {
4800
4903
  const def = l.isDefault ? pc5.green("\u25B8 ") : " ";
4801
4904
  console.log(
4802
- `${def}${S.cmd(l.name.padEnd(nameW))} ${pc5.dim(l.backend.padEnd(backendW))} ${pc5.dim(l.ownership.padEnd(ownerW))} ${pc5.dim(l.path)}${libraryDirMissing(l) ? ` ${pc5.red("(directory missing)")}` : ""}`
4905
+ `${def}${S.cmd(l.name.padEnd(nameW))} ${pc5.dim(l.backend.padEnd(backendW))} ${pc5.dim(l.ownership.padEnd(ownerW))} ${pc5.dim(l.path)}${scoped.sources.has(l.id) ? ` ${pc5.dim("(source)")}` : ""}${libraryDirMissing(l) ? ` ${pc5.red("(directory missing)")}` : ""}`
4803
4906
  );
4804
4907
  }
4805
4908
  console.log(`
4806
4909
  ${S.dim(`${ls.length} library(s)`)}
4807
4910
  `);
4808
4911
  for (const l of ls) if (libraryDirMissing(l)) logWarn(missingLibraryDirMessage(l));
4912
+ hintUncached();
4809
4913
  } finally {
4810
4914
  close();
4811
4915
  }
@@ -4865,6 +4969,7 @@ function makeLibraryCommand() {
4865
4969
  process.exit(1);
4866
4970
  }
4867
4971
  const adopted = opts.git ? null : readOriginTracking(libPath);
4972
+ if (adopted) exitOnCloneWithoutCheckout(libPath, name);
4868
4973
  if (ownership !== "owner" && !opts.git && !adopted) {
4869
4974
  logErr(
4870
4975
  `--${ownership} needs --git <url> or an existing git clone: ${LOCAL_OWNERSHIP_REASON}`
@@ -4878,6 +4983,7 @@ function makeLibraryCommand() {
4878
4983
  logErr(`A library named "${name}" is already registered.`);
4879
4984
  process.exit(1);
4880
4985
  }
4986
+ if (opts.git) await refuseRemoteOfSource(manager, opts.git);
4881
4987
  if (existing) await manager.removeLibrary(name);
4882
4988
  await assertLibraryPathFree(manager, libPath);
4883
4989
  await refuseNestedLibraryPath(manager, libPath);
@@ -4923,6 +5029,16 @@ function makeLibraryCommand() {
4923
5029
  `Library "${name}" ${blank ? "created" : "registered"} at ${libPath}${isDefault ? " (default)" : ""}`
4924
5030
  );
4925
5031
  if (scaffolded.length > 0) logInfo(`Scaffolded ${scaffolded.join(", ")}.`);
5032
+ if (scaffolded.length > 0 && opts.git) {
5033
+ const failure = commitScaffold(libPath, scaffolded);
5034
+ if (failure) {
5035
+ logWarn(
5036
+ `Could not commit the scaffold (${failure}). Run \`skaile library commit ${name} -m "init"\` before \`pull\` or \`sync\`.`
5037
+ );
5038
+ } else {
5039
+ logInfo("Committed the scaffold.");
5040
+ }
5041
+ }
4926
5042
  if (adopted) {
4927
5043
  logInfo(
4928
5044
  `Adopted existing git clone as a git library tracking ${adopted.url} (ownership: ${ownership}).`
@@ -4979,6 +5095,7 @@ function makeLibraryCommand() {
4979
5095
  const { manager, close } = await openLibraryManager();
4980
5096
  try {
4981
5097
  const lib = await manager.requireLibraryDir(name);
5098
+ await refuseRemoteOfSource(manager, url);
4982
5099
  if (lib.backend === "git") {
4983
5100
  logErr(
4984
5101
  `Library "${name}" is already git-backed. Use \`skaile library set ${name} backendConfig.url=${url}\` to change its remote.`
@@ -5096,7 +5213,7 @@ function makeLibraryCommand() {
5096
5213
  logErr(res.path);
5097
5214
  process.exit(1);
5098
5215
  }
5099
- logOk(`Created ${effectiveKind}: ${pc5.dim(res.path)}`);
5216
+ logOk(`Created ${effectiveKind} in library ${target.name}: ${pc5.dim(res.path)}`);
5100
5217
  if (opts.description === void 0) {
5101
5218
  logWarn(
5102
5219
  `Description is a TODO placeholder \u2014 edit it (what the ${effectiveKind} does and when to use it) or \`skaile validate\` will fail.`
@@ -5125,6 +5242,8 @@ function makeLibraryCommand() {
5125
5242
  );
5126
5243
  async function resolveTargetLibrary(manager, libraryName) {
5127
5244
  if (libraryName) return manager.requireLibraryDir(libraryName);
5245
+ const here = libraryContaining(await manager.listLibraries(), process.cwd());
5246
+ if (here) return manager.requireLibraryDir(here.name);
5128
5247
  const def = await manager.findDefaultLibrary();
5129
5248
  if (def) return manager.requireLibraryDir(def.name);
5130
5249
  if ((await manager.listLibraries()).length === 0) {
@@ -5483,16 +5602,16 @@ function makeLibraryCommand() {
5483
5602
  "With --create-repo: create the repo private (the store only accepts public repos)"
5484
5603
  ).option("--ref <gitref>", "Git ref to ingest (default: the library branch or main)").option("--dry-run", "Print the plan; push nothing and call no store endpoint").action(
5485
5604
  async (lib, opts) => {
5486
- const { runLibraryPublish } = await import('../library-publish-MUGUST43.js');
5605
+ const { runLibraryPublish } = await import('../library-publish-FNNDWVBO.js');
5487
5606
  await withStoreErrorHandling(() => runLibraryPublish(lib, opts));
5488
5607
  }
5489
5608
  );
5490
5609
  cmd.command("register <lib>").description("Register the library's manifest without pushing (bytes already on github)").option("--asset <ref>", "Publish only the single asset matching this ref/name").option("--ref <gitref>", "Git ref to ingest (default: the library branch or main)").option("--dry-run", "Print the plan; call no store endpoint").action(async (lib, opts) => {
5491
- const { runLibraryRegister } = await import('../library-publish-MUGUST43.js');
5610
+ const { runLibraryRegister } = await import('../library-publish-FNNDWVBO.js');
5492
5611
  await withStoreErrorHandling(() => runLibraryRegister(lib, opts));
5493
5612
  });
5494
5613
  cmd.command("yank <lib>").description("Retract the library's published assets from the store").option("--asset <ref>", "Yank only the single asset matching this ref/name").action(async (lib, opts) => {
5495
- const { runLibraryYank } = await import('../library-publish-MUGUST43.js');
5614
+ const { runLibraryYank } = await import('../library-publish-FNNDWVBO.js');
5496
5615
  await withStoreErrorHandling(() => runLibraryYank(lib, opts));
5497
5616
  });
5498
5617
  return cmd;
@@ -6152,7 +6271,7 @@ function scheduleSoftDepPreview() {
6152
6271
  }
6153
6272
  async function loadAssets() {
6154
6273
  softDepPreviewCache.clear();
6155
- const { gatherAssetFeeds } = await import('../asset-feeds-4I6Z4OI3.js');
6274
+ const { gatherAssetFeeds } = await import('../asset-feeds-4A7PJ4OB.js');
6156
6275
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
6157
6276
  if (notes.length > 0) {
6158
6277
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
@@ -6356,7 +6475,7 @@ function reconcileCollapsedSets(rows) {
6356
6475
  async function loadSourcesAndLibraries() {
6357
6476
  try {
6358
6477
  const [{ openLibraryManager: openLibraryManager2 }, { getGlobalCacheDir: getGlobalCacheDir2, globalSkaileDir: globalSkaileDir2 }] = await Promise.all([
6359
- import('../open-library-BVQCB37E.js'),
6478
+ import('../open-library-R5EZROFN.js'),
6360
6479
  import('../core/index.js')
6361
6480
  ]);
6362
6481
  const { manager, library, close } = await openLibraryManager2();
@@ -8220,7 +8339,7 @@ function existingIdentities(root) {
8220
8339
  }
8221
8340
  return found;
8222
8341
  }
8223
- function planMarkdownMoves(root, knownKinds, manual, unknownTypes, identities, conflicts, existing) {
8342
+ function planMarkdownMoves(root, knownKinds, manual, unknownTypes, identities, conflicts, existing, notConverted) {
8224
8343
  const moves = [];
8225
8344
  const changes = [];
8226
8345
  const targets = /* @__PURE__ */ new Set();
@@ -8238,6 +8357,9 @@ function planMarkdownMoves(root, knownKinds, manual, unknownTypes, identities, c
8238
8357
  manual.push(
8239
8358
  `${posix2(path19__default.relative(root, file))}: ${posix2(path19__default.relative(root, to))} already exists; not moved`
8240
8359
  );
8360
+ notConverted.push(
8361
+ `${posix2(path19__default.relative(root, file))} (${posix2(path19__default.relative(root, to))} exists)`
8362
+ );
8241
8363
  continue;
8242
8364
  }
8243
8365
  const identity = finalIdentity(found.type, base.replace(/\.md$/i, ""));
@@ -8248,10 +8370,10 @@ function planMarkdownMoves(root, knownKinds, manual, unknownTypes, identities, c
8248
8370
  );
8249
8371
  continue;
8250
8372
  }
8251
- const present = existing.get(identity);
8252
- if (present !== void 0) {
8373
+ const present2 = existing.get(identity);
8374
+ if (present2 !== void 0) {
8253
8375
  conflicts.push(
8254
- `${present} already is ${identity}, and ${posix2(path19__default.relative(root, file))} would become it too: rename one first. Nothing was changed.`
8376
+ `${present2} already is ${identity}, and ${posix2(path19__default.relative(root, file))} would become it too: rename one first. Nothing was changed.`
8255
8377
  );
8256
8378
  continue;
8257
8379
  }
@@ -8339,7 +8461,7 @@ function repoPublisher(root) {
8339
8461
  }
8340
8462
  return DEFAULT_PUBLISHER;
8341
8463
  }
8342
- function planBundles(root, skaileYamls, publisher, notes, manual, conflicts, identities, existing) {
8464
+ function planBundles(root, skaileYamls, publisher, notes, manual, conflicts, identities, existing, notConverted) {
8343
8465
  const changes = [];
8344
8466
  const presets = [];
8345
8467
  const handled = /* @__PURE__ */ new Set();
@@ -8365,12 +8487,13 @@ function planBundles(root, skaileYamls, publisher, notes, manual, conflicts, ide
8365
8487
  }
8366
8488
  if (existsSync(target)) {
8367
8489
  manual.push(`${rel(target)} already exists; bundle ${name} not converted`);
8490
+ notConverted.push(`${origin.replace(/\/$/, "")} (${rel(target)} exists)`);
8368
8491
  return;
8369
8492
  }
8370
- const present = existing.get(identity);
8371
- if (present !== void 0) {
8493
+ const present2 = existing.get(identity);
8494
+ if (present2 !== void 0) {
8372
8495
  conflicts.push(
8373
- `${present} already is ${identity}, and ${origin} would become it too: rename the bundle first. Nothing was changed.`
8496
+ `${present2} already is ${identity}, and ${origin} would become it too: rename the bundle first. Nothing was changed.`
8374
8497
  );
8375
8498
  return;
8376
8499
  }
@@ -8403,6 +8526,7 @@ function planBundles(root, skaileYamls, publisher, notes, manual, conflicts, ide
8403
8526
  manual.push(
8404
8527
  `bundle ${name}: no dependencies found${bundleFile ? ` in ${rel(bundleFile)}` : ` and no skills under ${rel(path19__default.join(dir, "skills"))}`}; no preset generated`
8405
8528
  );
8529
+ notConverted.push(`${origin.replace(/\/$/, "")} (no dependencies found)`);
8406
8530
  return;
8407
8531
  }
8408
8532
  claimed.set(target, origin);
@@ -8452,7 +8576,7 @@ function planBundles(root, skaileYamls, publisher, notes, manual, conflicts, ide
8452
8576
  return changes;
8453
8577
  }
8454
8578
  var PUBLICATION_KEYS = ["publisher", "version", "assets"];
8455
- function planSkaileYaml(root, file, source, notes, manual) {
8579
+ function planSkaileYaml(root, file, source, notes, manual, notConverted) {
8456
8580
  const doc = parseDocument(source);
8457
8581
  if (doc.errors.length > 0 || !isMap(doc.contents)) return [];
8458
8582
  const map = doc.contents;
@@ -8480,6 +8604,7 @@ function planSkaileYaml(root, file, source, notes, manual) {
8480
8604
  manual.push(
8481
8605
  `${rel(file)}: publisher/version/assets left in place \u2014 ${rel(manifestPath)} already exists; merge by hand`
8482
8606
  );
8607
+ notConverted.push(`${rel(file)} (${rel(manifestPath)} exists)`);
8483
8608
  } else {
8484
8609
  const dropped = Array.isArray(raw.assets) ? raw.assets.length : 0;
8485
8610
  const draft = {};
@@ -8490,6 +8615,7 @@ function planSkaileYaml(root, file, source, notes, manual) {
8490
8615
  const failed = decoded.diagnostics.filter((d) => d.severity === "error");
8491
8616
  if (failed.length > 0) {
8492
8617
  manual.push(`${rel(file)}: not converted \u2014 ${failed[0]?.message ?? "invalid manifest"}`);
8618
+ notConverted.push(`${rel(file)} (${failed[0]?.message ?? "invalid manifest"})`);
8493
8619
  } else {
8494
8620
  if (Object.keys(decoded.manifest).length > 0) {
8495
8621
  changes.push({
@@ -8537,6 +8663,7 @@ function planAssetMigration(options) {
8537
8663
  const notes = [];
8538
8664
  const manual = [];
8539
8665
  const conflicts = [];
8666
+ const notConverted = [];
8540
8667
  const unknownTypes = [];
8541
8668
  const identities = /* @__PURE__ */ new Map();
8542
8669
  const existing = existingIdentities(root);
@@ -8547,7 +8674,8 @@ function planAssetMigration(options) {
8547
8674
  unknownTypes,
8548
8675
  identities,
8549
8676
  conflicts,
8550
- existing
8677
+ existing,
8678
+ notConverted
8551
8679
  );
8552
8680
  for (const move of moves) {
8553
8681
  notes.push(
@@ -8575,16 +8703,18 @@ function planAssetMigration(options) {
8575
8703
  manual,
8576
8704
  conflicts,
8577
8705
  identities,
8578
- existing
8706
+ existing,
8707
+ notConverted
8579
8708
  );
8580
8709
  const skaileChanges = skaileYamls.flatMap(
8581
- ({ file, source }) => planSkaileYaml(root, file, source, notes, manual)
8710
+ ({ file, source }) => planSkaileYaml(root, file, source, notes, manual, notConverted)
8582
8711
  );
8583
8712
  return {
8584
8713
  changes: [...moveChanges, ...agentChanges, ...bundleChanges, ...skaileChanges],
8585
8714
  notes,
8586
8715
  manual,
8587
8716
  conflicts,
8717
+ notConverted,
8588
8718
  unknownTypes
8589
8719
  };
8590
8720
  }
@@ -8668,8 +8798,9 @@ function migrateHarnessSettings(text, label = "settings.json") {
8668
8798
  notes.push(`${label}: \`driver\` \u2192 \`harness\``);
8669
8799
  }
8670
8800
  }
8801
+ const oneLine = !text.trim().includes("\n");
8671
8802
  const trailing = text.endsWith("\n") ? "\n" : "";
8672
- return { output: `${JSON.stringify(out, null, 2)}${trailing}`, notes };
8803
+ return { output: `${JSON.stringify(out, null, oneLine ? void 0 : 2)}${trailing}`, notes };
8673
8804
  }
8674
8805
  function workspaceYamlFiles(projectDir) {
8675
8806
  const files = [];
@@ -8688,11 +8819,10 @@ function planHarnessMigration(opts) {
8688
8819
  const changes = [];
8689
8820
  const notes = [];
8690
8821
  const seen = /* @__PURE__ */ new Set();
8691
- const plan = (file, rewrite) => {
8822
+ const plan = (file, rewrite, label = path19__default.basename(file), notChanged) => {
8692
8823
  if (seen.has(file) || !existsSync(file)) return;
8693
8824
  seen.add(file);
8694
8825
  const before = readText(file);
8695
- const label = path19__default.basename(file);
8696
8826
  let result;
8697
8827
  try {
8698
8828
  result = rewrite(before, label);
@@ -8701,18 +8831,27 @@ function planHarnessMigration(opts) {
8701
8831
  return;
8702
8832
  }
8703
8833
  if (result.output === before) return;
8834
+ if (notChanged !== void 0) {
8835
+ notes.push(`${label}: \`driver\` still set, not changed (${notChanged})`);
8836
+ return;
8837
+ }
8704
8838
  notes.push(...result.notes);
8705
8839
  changes.push({ type: "write", path: file, before, after: result.output });
8706
8840
  };
8707
8841
  for (const file of workspaceYamlFiles(opts.projectDir)) plan(file, migrateHarnessYaml);
8708
- plan(projectSettingsPath(opts.projectDir), migrateHarnessSettings);
8709
- plan(globalSettingsPath(), migrateHarnessSettings);
8842
+ plan(projectSettingsPath(opts.projectDir), migrateHarnessSettings, "project settings.json");
8843
+ plan(
8844
+ globalSettingsPath(),
8845
+ migrateHarnessSettings,
8846
+ "user settings.json",
8847
+ opts.user === true ? void 0 : "run `skaile migrate harness --user` to migrate it"
8848
+ );
8710
8849
  return { changes, notes };
8711
8850
  }
8712
8851
  function runMigrateHarness(opts) {
8713
8852
  const cwd = process.cwd();
8714
8853
  const projectDir = path19__default.resolve(opts.projectDir ?? findWorkspaceRoot(cwd) ?? cwd);
8715
- const plan = planHarnessMigration({ projectDir });
8854
+ const plan = planHarnessMigration({ projectDir, user: opts.user === true });
8716
8855
  for (const note of plan.notes) console.log(` ${note}`);
8717
8856
  printChanges(plan.changes, projectDir);
8718
8857
  if (opts.dryRun === true && plan.changes.length > 0) {
@@ -8727,13 +8866,14 @@ function runMigrateHarness(opts) {
8727
8866
  function addMigrateHarnessCommand(migrate) {
8728
8867
  migrate.command("harness").description(
8729
8868
  "Rename the `driver` key to `harness` and remove the retired `agent` key in skaile.yaml and settings.json"
8730
- ).option("--project-dir <path>", "Project directory (default: the workspace root of the cwd)").option("--dry-run", "Print the diff and write nothing").addHelpText(
8869
+ ).option("--project-dir <path>", "Project directory (default: the workspace root of the cwd)").option("--user", "Also migrate the user-level settings.json ($SKAILE_HOME, else ~/.skaile)").option("--dry-run", "Print the diff and write nothing").addHelpText(
8731
8870
  "after",
8732
8871
  `
8733
8872
  Rewrites (the connector/mount \`driver\` of connectors: and mounts: is never touched):
8734
8873
  skaile.yaml agent-config.<profile>.driver -> harness (also the flat agent-config: { driver: \u2026 } shape)
8735
8874
  skaile.yaml agent-config.<profile>.agent removed (nothing reads it)
8736
- .skaile/settings.json, ~/.skaile/settings.json driver -> harness
8875
+ .skaile/settings.json (project settings.json) driver -> harness
8876
+ ~/.skaile/settings.json (user settings.json) driver -> harness, only with --user
8737
8877
  A profile or file that sets both keys keeps \`harness\` and drops \`driver\`.
8738
8878
 
8739
8879
  Prints a unified diff per file and writes the files. Pass --dry-run to print the diff only.
@@ -9186,7 +9326,12 @@ async function runMigrateAssets(root, opts) {
9186
9326
  );
9187
9327
  }
9188
9328
  printChanges(plan.changes, base);
9189
- finish(plan.changes, write, base);
9329
+ if (plan.changes.length > 0 || plan.notConverted.length === 0) finish(plan.changes, write, base);
9330
+ if (plan.notConverted.length > 0) {
9331
+ console.log();
9332
+ logErr(`${plan.notConverted.length} file(s) not converted: ${plan.notConverted.join(", ")}.`);
9333
+ process.exitCode = 1;
9334
+ }
9190
9335
  }
9191
9336
  function makeMigrateCommand() {
9192
9337
  const cmd = new Command("migrate").description("One-time config and asset migrations");
@@ -9358,17 +9503,28 @@ function makeOutdatedCommand() {
9358
9503
  const unreachable = am2.takeUnreachableSources();
9359
9504
  for (const u of unreachable) {
9360
9505
  logWarn(
9361
- `Source ${u.name}: could not reach its origin (${u.reason}); commits behind not checked.`
9506
+ u.notCompared ? `Source ${u.name}: ${u.reason}; commits behind not checked.` : `Source ${u.name}: could not reach its origin (${u.reason}); commits behind not checked.`
9362
9507
  );
9363
9508
  }
9364
9509
  if (unreachable.length > 0) process.exitCode = 1;
9510
+ const notChecked = am2.takeStoreNotChecked().filter((n) => {
9511
+ if (!filter) return true;
9512
+ const p6 = parseAssetRef(n.ref);
9513
+ return matchesOutdatedFilter(
9514
+ { kind: p6.kind, name: p6.name, publisher: p6.publisher ?? "" },
9515
+ filter
9516
+ );
9517
+ });
9518
+ if (reportStoreNotCheckedForUpdates(notChecked)) process.exitCode = 1;
9519
+ const allChecked = unreachable.length === 0 && notChecked.length === 0;
9520
+ for (const notice of am2.legacyLockNotices()) logWarn(notice);
9365
9521
  if (entries.length === 0) {
9366
- if (unreachable.length === 0) logInfo("All assets are up to date.");
9522
+ if (allChecked) logInfo("All assets are up to date.");
9367
9523
  return;
9368
9524
  }
9369
9525
  const filtered = filter ? entries.filter((e) => matchesOutdatedFilter(e, filter)) : entries;
9370
9526
  if (filtered.length === 0) {
9371
- if (unreachable.length === 0) logInfo(`${filter} is up to date.`);
9527
+ if (allChecked) logInfo(`${filter} is up to date.`);
9372
9528
  return;
9373
9529
  }
9374
9530
  const refW = Math.max(4, ...filtered.map((e) => outdatedRef(e).length));
@@ -9457,14 +9613,14 @@ function action2(fn) {
9457
9613
  try {
9458
9614
  await fn(...args);
9459
9615
  } catch (err) {
9460
- const { condensePluginFailure } = await import('../plugin-store-NGRUTCJI.js');
9616
+ const { condensePluginFailure } = await import('../plugin-store-OJTERUEZ.js');
9461
9617
  logErr(condensePluginFailure(err instanceof Error ? err.message : String(err)));
9462
9618
  process.exitCode = 1;
9463
9619
  }
9464
9620
  };
9465
9621
  }
9466
9622
  async function reconcileAndReport(projectDir, plugins, opts = {}) {
9467
- const { reconcilePlugins } = await import('../plugin-store-NGRUTCJI.js');
9623
+ const { reconcilePlugins } = await import('../plugin-store-OJTERUEZ.js');
9468
9624
  if (plugins.length === 0) {
9469
9625
  logInfo("No plugins declared \u2014 nothing to reconcile.");
9470
9626
  return;
@@ -9475,29 +9631,37 @@ async function reconcileAndReport(projectDir, plugins, opts = {}) {
9475
9631
  else logInfo(`Plugin store ${result.reason}.`);
9476
9632
  } catch (err) {
9477
9633
  if (opts.strict) throw err;
9478
- const { condensePluginFailure } = await import('../plugin-store-NGRUTCJI.js');
9634
+ const { condensePluginFailure } = await import('../plugin-store-OJTERUEZ.js');
9479
9635
  logWarn(
9480
9636
  `reconcile skipped: ${condensePluginFailure(err instanceof Error ? err.message : String(err))}`
9481
9637
  );
9482
9638
  }
9483
9639
  }
9484
- async function verifyPluginLoads(projectDir, spec) {
9485
- const { loadPlugins } = await import('../plugin-store-NGRUTCJI.js');
9640
+ async function verifyPluginLoads(projectDir, spec, declared) {
9641
+ const { loadPlugins } = await import('../plugin-store-OJTERUEZ.js');
9486
9642
  const { createPluginRegistry } = await import('../plugin-registry/index.js');
9487
9643
  const registry = createPluginRegistry();
9644
+ await loadPlugins(
9645
+ projectDir,
9646
+ declared.filter((other) => other !== spec),
9647
+ registry
9648
+ );
9649
+ const before = new Set(
9650
+ ["harness", "connector", "deployTarget"].flatMap(
9651
+ (kind) => registry.list(kind).map((m) => `${kind} ${m.id}`)
9652
+ )
9653
+ );
9488
9654
  const result = await loadPlugins(projectDir, [spec], registry);
9489
9655
  const failure = result.failed[0];
9490
9656
  if (failure) throw new Error(failure.error);
9491
- const contributed = ["harness", "connector", "deployTarget"].flatMap(
9492
- (kind) => registry.list(kind).map((m) => `${kind} ${m.id}`)
9493
- );
9657
+ const contributed = ["harness", "connector", "deployTarget"].flatMap((kind) => registry.list(kind).map((m) => `${kind} ${m.id}`)).filter((entry) => !before.has(entry));
9494
9658
  logOk(`Loaded ${S.cmd(spec)}${contributed.length > 0 ? ` (${contributed.join(", ")})` : ""}`);
9495
9659
  }
9496
9660
  async function runInstall2(typedSpec, opts) {
9497
9661
  const rawSpec = typedSpec.trim();
9498
9662
  const projectDir = path19__default.resolve(opts.projectDir);
9499
9663
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
9500
- const { specName, rollbackPluginStore, npmSpecError, projectRelativeFileSpec } = await import('../plugin-store-NGRUTCJI.js');
9664
+ const { specName, rollbackPluginStore, npmSpecError, projectRelativeFileSpec } = await import('../plugin-store-OJTERUEZ.js');
9501
9665
  const specError = npmSpecError(rawSpec);
9502
9666
  if (specError) throw new Error(specError);
9503
9667
  const spec = projectRelativeFileSpec(rawSpec, process.cwd(), projectDir);
@@ -9508,28 +9672,33 @@ async function runInstall2(typedSpec, opts) {
9508
9672
  const original = readFileSync(yamlPath, "utf8");
9509
9673
  const editor = WorkspaceYamlEditor2.load(yamlPath);
9510
9674
  const previousPlugins = [...editor.getPlugins()];
9675
+ let recorded;
9511
9676
  if (previousPlugins.includes(spec)) {
9512
9677
  logInfo(`${S.cmd(spec)} already declared in skaile.yaml`);
9678
+ recorded = "same";
9513
9679
  } else {
9514
- const replaced = editor.addPlugin(spec, specName);
9680
+ recorded = editor.addPlugin(spec, specName) ? "replaced" : "added";
9515
9681
  editor.save();
9516
- if (replaced) logOk(`Updated ${S.cmd(specName(spec))} \u2192 ${S.cmd(spec)} in skaile.yaml`);
9517
- else logOk(`Added ${S.cmd(spec)} to skaile.yaml plugins`);
9518
9682
  }
9519
9683
  try {
9520
9684
  await reconcileAndReport(projectDir, editor.getPlugins(), { strict: true });
9521
- await verifyPluginLoads(projectDir, spec);
9685
+ await verifyPluginLoads(projectDir, spec, editor.getPlugins());
9522
9686
  } catch (err) {
9523
9687
  writeFileSync(yamlPath, original);
9524
9688
  logInfo("skaile.yaml restored; the plugin was not recorded.");
9525
9689
  await rollbackPluginStore(projectDir, previousPlugins);
9526
9690
  throw err;
9527
9691
  }
9692
+ if (recorded === "replaced") {
9693
+ logOk(`Updated ${S.cmd(specName(spec))} \u2192 ${S.cmd(spec)} in skaile.yaml`);
9694
+ } else if (recorded === "added") {
9695
+ logOk(`Added ${S.cmd(spec)} to skaile.yaml plugins`);
9696
+ }
9528
9697
  }
9529
9698
  async function runRemove(name, opts) {
9530
9699
  const projectDir = path19__default.resolve(opts.projectDir);
9531
9700
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
9532
- const { specName } = await import('../plugin-store-NGRUTCJI.js');
9701
+ const { specName } = await import('../plugin-store-OJTERUEZ.js');
9533
9702
  const yamlPath = path19__default.join(projectDir, "skaile.yaml");
9534
9703
  if (!existsSync(yamlPath)) {
9535
9704
  logInfo(`No plugin matching ${S.cmd(name)}: there is no skaile.yaml in ${projectDir}.`);
@@ -9545,7 +9714,7 @@ async function runRemove(name, opts) {
9545
9714
  logOk(`Removed ${S.cmd(name)} from skaile.yaml plugins`);
9546
9715
  const remaining = editor.getPlugins();
9547
9716
  if (remaining.length === 0) {
9548
- const { rollbackPluginStore } = await import('../plugin-store-NGRUTCJI.js');
9717
+ const { rollbackPluginStore } = await import('../plugin-store-OJTERUEZ.js');
9549
9718
  await rollbackPluginStore(projectDir, []);
9550
9719
  logInfo("No plugins declared; removed .skaile/plugins/.");
9551
9720
  return;
@@ -9568,7 +9737,7 @@ async function runList(opts) {
9568
9737
  const registry = createPluginRegistry();
9569
9738
  if (declared.length > 0) {
9570
9739
  try {
9571
- const { loadPlugins } = await import('../plugin-store-NGRUTCJI.js');
9740
+ const { loadPlugins } = await import('../plugin-store-OJTERUEZ.js');
9572
9741
  const result = await loadPlugins(projectDir, declared, registry);
9573
9742
  for (const f of result.failed) logWarn(f.error);
9574
9743
  } catch (err) {
@@ -10428,6 +10597,67 @@ function makeRebuildCommand() {
10428
10597
  logInfo(`Written: ${result.manifestPath}`);
10429
10598
  });
10430
10599
  }
10600
+
10601
+ // cli/src/session-hint.ts
10602
+ async function sessionIdsHint(projectDir) {
10603
+ const sessions = await listSessions(projectDir);
10604
+ return sessions.length > 0 ? "Run skaile session list to see the ids." : null;
10605
+ }
10606
+
10607
+ // cli/src/commands/harness-preflight.ts
10608
+ var present = (...lines) => lines.filter((l) => !!l);
10609
+ var OR_PICK_ANOTHER = "Or pick another harness with --harness.";
10610
+ function missingBinary(harnessId) {
10611
+ const hint = HARNESS_BINARIES[harnessId]?.hint ?? `${harnessId} is not installed.`;
10612
+ return `${hint} ${OR_PICK_ANOTHER}`;
10613
+ }
10614
+ var claudeSdk = async (input, deps) => present(
10615
+ await deps.sdkProblem(input.projectDir, input.harness),
10616
+ checkHarnessModel("claude-sdk", input),
10617
+ checkModelSurface("claude-sdk", input)
10618
+ );
10619
+ var codex = async (input, deps) => present(
10620
+ await deps.sdkProblem(input.projectDir, input.harness),
10621
+ checkHarnessModel("codex", input)
10622
+ );
10623
+ var omp = async (input, deps) => {
10624
+ if (!deps.hasBinary("omp")) return [missingBinary("omp")];
10625
+ const refusal = checkHarnessModel("omp", input);
10626
+ if (refusal) return [refusal];
10627
+ const own = input.model && !input.model.startsWith("@") ? input.model : void 0;
10628
+ const unlisted = own && isUnlistedModel(input);
10629
+ return present(unlisted ? await deps.ompListed(own) : void 0);
10630
+ };
10631
+ function cliHarness(harnessId) {
10632
+ return async (input, deps) => deps.hasBinary(harnessId) ? present(checkHarnessModel(harnessId, input), checkModelSurface(harnessId, input)) : [missingBinary(harnessId)];
10633
+ }
10634
+ var PREFLIGHTS = {
10635
+ "claude-sdk": claudeSdk,
10636
+ codex,
10637
+ omp,
10638
+ gemini: cliHarness("gemini"),
10639
+ qwen: cliHarness("qwen"),
10640
+ opencode: cliHarness("opencode"),
10641
+ goose: cliHarness("goose"),
10642
+ continue: cliHarness("continue")
10643
+ };
10644
+ async function preflightHarness(input, deps = {}) {
10645
+ const check = PREFLIGHTS[input.harness];
10646
+ if (!check) return [];
10647
+ return check(
10648
+ {
10649
+ ...input,
10650
+ registry: input.registry ?? loadRegistryView({ projectDir: input.projectDir }).merged
10651
+ },
10652
+ {
10653
+ hasBinary: deps.hasBinary ?? ((id) => findHarnessBinary(HARNESS_BINARIES[id])),
10654
+ sdkProblem: deps.sdkProblem ?? checkHarnessSdk,
10655
+ ompListed: deps.ompListed ?? checkOmpListedModel
10656
+ }
10657
+ );
10658
+ }
10659
+
10660
+ // cli/src/commands/run.ts
10431
10661
  function resolveSingleShotAgentDir(projectDir, agentDefinition) {
10432
10662
  if (!agentDefinition) return resolveAgentDir(projectDir);
10433
10663
  const asPath = agentDefinition.endsWith("agent.yaml") ? path19__default.dirname(path19__default.resolve(projectDir, agentDefinition)) : agentDefinition;
@@ -10439,13 +10669,12 @@ function resolveSingleShotAgentDir(projectDir, agentDefinition) {
10439
10669
  }
10440
10670
  return dir;
10441
10671
  }
10442
- async function printCompositionDryRun(projectDir, agentDir, harness, model, instanceIdOverride) {
10672
+ async function printCompositionDryRun(projectDir, agentDir, harness, model, check, instanceIdOverride) {
10443
10673
  const manifest = agentDir ? await loadAgentManifest(agentDir) : void 0;
10444
- const refusal = checkHarnessModel(harness, {
10445
- registry: loadRegistryView({ projectDir }).merged,
10446
- model: model ?? manifestModelForHarness(manifest, harness)
10447
- });
10448
- if (refusal) throw new Error(refusal);
10674
+ await printCompositionPlan(projectDir, agentDir, manifest, harness, model, instanceIdOverride);
10675
+ return reportPreflight(await check(model ?? manifestModelForHarness(manifest, harness)));
10676
+ }
10677
+ async function printCompositionPlan(projectDir, agentDir, manifest, harness, model, instanceIdOverride) {
10449
10678
  console.log();
10450
10679
  console.log(` ${S.label("Project dir:")} ${projectDir}`);
10451
10680
  console.log(` ${S.label("Agent dir:")} ${agentDir ?? S.dim("(none)")}`);
@@ -10453,7 +10682,15 @@ async function printCompositionDryRun(projectDir, agentDir, harness, model, inst
10453
10682
  console.log(` ${S.warn("(dry run \u2014 no model will be started)")}`);
10454
10683
  console.log();
10455
10684
  if (!agentDir || !manifest) {
10456
- logInfo("No agent definition \u2014 nothing to resolve.");
10685
+ const unselected = unselectedInstanceIds(resolveSkWorkspaceConfig(projectDir));
10686
+ if (unselected.length > 0) {
10687
+ logInfo(
10688
+ "No primary agent (neither `agent:` nor `agents.default`): a plain run starts the generic assistant."
10689
+ );
10690
+ logInfo(`Agent instances: ${instanceChoiceText(unselected)}`);
10691
+ } else {
10692
+ logInfo("No agent definition \u2014 nothing to resolve.");
10693
+ }
10457
10694
  return;
10458
10695
  }
10459
10696
  const { instanceId: instanceId2, instance } = instanceForSession(
@@ -10612,7 +10849,11 @@ function isNearFlowId(typed, id) {
10612
10849
  return a.length >= 3 && (b.includes(a) || a.includes(b) || editDistance2(a, b) <= 2);
10613
10850
  }
10614
10851
  function harnessOptionDescription() {
10615
- return `Harness to run (${listHarnesses().map((d) => d.id).join(", ")})`;
10852
+ return `Harness to run (${listHarnesses().map((d) => d.id).join(", ")}); claude-code (deploy) = claude-sdk (run)`;
10853
+ }
10854
+ function reportPreflight(problems) {
10855
+ for (const line of problems) logErr(line);
10856
+ return problems.length > 0;
10616
10857
  }
10617
10858
  function nodeSkillRefs(flow) {
10618
10859
  const refs = /* @__PURE__ */ new Map();
@@ -10643,7 +10884,10 @@ async function reportMissingNodeSkills(projectDir, flow) {
10643
10884
  }
10644
10885
  }
10645
10886
  function makeRunCommand() {
10646
- 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("--harness <name>", harnessOptionDescription()).addOption(driverAliasOption()).option("--model <name>", "Model override").option("--label <label>", "Human-readable session label").option("--dry-run", "Print plan without executing (single-shot: resolved composition items)").option(
10887
+ 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("--harness <name>", harnessOptionDescription()).addOption(driverAliasOption()).option("--model <name>", "Model override").option("--label <label>", "Human-readable session label").option(
10888
+ "--dry-run",
10889
+ "Print the plan without executing (single-shot: resolved composition items), then one line per problem the real run would stop on (harness program or SDK, provider, model); exit 1 if any"
10890
+ ).option(
10647
10891
  "--agent-definition <ref|path>",
10648
10892
  "Agent asset for this one invocation (agent:@pub/name, ai-assets://\u2026, or a directory with agent.yaml); single-shot prompts only"
10649
10893
  ).option(
@@ -10655,7 +10899,7 @@ function makeRunCommand() {
10655
10899
  if (await reportProjectConfig(projectDir, { harness: false, instances: true }) > 0) {
10656
10900
  process.exit(1);
10657
10901
  }
10658
- const cliHarness = foldDriverFlag(opts).harness;
10902
+ const cliHarness2 = foldDriverFlag(opts).harness;
10659
10903
  const dryRun = opts.dryRun ?? false;
10660
10904
  const agentDefinition = opts.agentDefinition?.trim() || void 0;
10661
10905
  const instanceId2 = opts.instance?.trim() || void 0;
@@ -10689,7 +10933,7 @@ function makeRunCommand() {
10689
10933
  flowId = selected;
10690
10934
  }
10691
10935
  const config = await resolveSettings(projectDir, {
10692
- harness: cliHarness,
10936
+ harness: cliHarness2,
10693
10937
  model: opts.model
10694
10938
  });
10695
10939
  const harness = config.harness ?? DEFAULT_HARNESS_ID;
@@ -10699,21 +10943,7 @@ function makeRunCommand() {
10699
10943
  logErr(unknownHarness);
10700
10944
  process.exit(1);
10701
10945
  }
10702
- const providerRefusal = checkModelProvider(harness, {
10703
- registry: loadRegistryView({ projectDir }).merged,
10704
- model
10705
- });
10706
- if (providerRefusal) {
10707
- logErr(providerRefusal);
10708
- process.exit(1);
10709
- }
10710
- if (dryRun) {
10711
- const sdkProblem = await checkHarnessSdk(projectDir, harness);
10712
- if (sdkProblem) {
10713
- logErr(sdkProblem);
10714
- process.exit(1);
10715
- }
10716
- }
10946
+ const preflightFor = (forModel) => preflightHarness({ projectDir, harness, model: forModel, roles: config.roles });
10717
10947
  const flowPath = findProjectFlowFile(flowId, projectDir);
10718
10948
  if (flowPath && agentDefinition) {
10719
10949
  logErr(
@@ -10753,21 +10983,43 @@ function makeRunCommand() {
10753
10983
  }
10754
10984
  try {
10755
10985
  const agentDir = instanceId2 ? resolveInstanceAgentDir(projectDir, resolveSkWorkspaceConfig(projectDir), instanceId2) : resolveSingleShotAgentDir(projectDir, agentDefinition);
10986
+ const overrides = instanceId2 ? instanceSessionOverrides(resolveSkWorkspaceConfig(projectDir), instanceId2) : {};
10987
+ const instanceModel = opts.model ? void 0 : overrides.model;
10988
+ const sessionModel = instanceModel ?? config.model;
10756
10989
  if (dryRun) {
10757
- await printCompositionDryRun(projectDir, agentDir, harness, model, instanceId2);
10758
- if (opts.skill && !await printSkillDryRun(projectDir, opts.skill)) {
10759
- process.exit(1);
10760
- }
10990
+ const problem = await printCompositionDryRun(
10991
+ projectDir,
10992
+ agentDir,
10993
+ harness,
10994
+ sessionModel,
10995
+ preflightFor,
10996
+ instanceId2
10997
+ );
10998
+ const skillFound = !opts.skill || await printSkillDryRun(projectDir, opts.skill);
10999
+ if (problem) process.exitCode = 1;
11000
+ if (!skillFound) process.exit(1);
10761
11001
  return;
10762
11002
  }
10763
- const overrides = instanceId2 ? instanceSessionOverrides(resolveSkWorkspaceConfig(projectDir), instanceId2) : {};
10764
- const instanceModel = opts.model ? void 0 : overrides.model;
11003
+ const manifest = agentDir ? await loadAgentManifest(agentDir) : void 0;
11004
+ if (reportPreflight(
11005
+ await preflightFor(sessionModel ?? manifestModelForHarness(manifest, harness))
11006
+ )) {
11007
+ process.exit(1);
11008
+ }
11009
+ if (!agentDir) {
11010
+ const unselected = unselectedInstanceIds(resolveSkWorkspaceConfig(projectDir));
11011
+ if (unselected.length > 0) {
11012
+ console.error(
11013
+ ` ${S.dim("\xB7")} ${S.dim(`Agent instances: ${instanceChoiceText(unselected)}`)}`
11014
+ );
11015
+ }
11016
+ }
10765
11017
  await runAgentChat({
10766
11018
  projectDir,
10767
11019
  ...agentDir ? { agentDir } : {},
10768
11020
  ...instanceId2 ? { instanceId: instanceId2 } : {},
10769
11021
  harness: config.harness,
10770
- model: instanceModel ?? config.model,
11022
+ model: sessionModel,
10771
11023
  ...instanceModel ? { modelRef: instanceModel } : {},
10772
11024
  ...overrides.maxTurns !== void 0 ? { maxTurns: overrides.maxTurns } : {},
10773
11025
  message: textPrompt,
@@ -10790,6 +11042,7 @@ function makeRunCommand() {
10790
11042
  }
10791
11043
  return;
10792
11044
  }
11045
+ if (!dryRun && reportPreflight(await preflightFor(model))) process.exit(1);
10793
11046
  let flow;
10794
11047
  try {
10795
11048
  flow = loadFlow(flowPath);
@@ -10823,6 +11076,7 @@ function makeRunCommand() {
10823
11076
  logErr(friendly ?? (err instanceof Error ? err.message : String(err)));
10824
11077
  process.exit(1);
10825
11078
  }
11079
+ if (dryRun && reportPreflight(await preflightFor(model))) process.exitCode = 1;
10826
11080
  });
10827
11081
  return cmd;
10828
11082
  }
@@ -10844,8 +11098,10 @@ function makeResumeCommand() {
10844
11098
  }
10845
11099
  const session = sessionId ? await loadSessionById(projectDir, sessionId) : await loadSession(projectDir);
10846
11100
  if (!session) {
10847
- logErr(`No session in ${projectDir}`);
10848
- console.log(` ${S.dim("Run")} ${S.cmd("skaile run <flow-id>")} ${S.dim("first.")}`);
11101
+ const idsHint = await sessionIdsHint(projectDir);
11102
+ logErr(opts.session ? `Session not found: ${opts.session}` : `No session in ${projectDir}`);
11103
+ if (idsHint) console.log(` ${S.dim(idsHint)}`);
11104
+ else console.log(` ${S.dim("Run")} ${S.cmd("skaile run <flow-id>")} ${S.dim("first.")}`);
10849
11105
  process.exit(1);
10850
11106
  }
10851
11107
  console.log();
@@ -10971,14 +11227,13 @@ function makeReplCommand() {
10971
11227
  } catch {
10972
11228
  }
10973
11229
  }
10974
- const providerRefusal = checkModelProvider(effective.harness ?? DEFAULT_HARNESS_ID, {
10975
- registry: loadRegistryView({ projectDir }).merged,
10976
- model: effectiveModel
11230
+ const preflight = await preflightHarness({
11231
+ projectDir,
11232
+ harness: effective.harness ?? DEFAULT_HARNESS_ID,
11233
+ model: effectiveModel,
11234
+ roles: effective.roles
10977
11235
  });
10978
- if (providerRefusal) {
10979
- logErr(providerRefusal);
10980
- process.exit(1);
10981
- }
11236
+ if (reportPreflight(preflight)) process.exit(1);
10982
11237
  try {
10983
11238
  await startRepl({
10984
11239
  projectDir,
@@ -11112,7 +11367,7 @@ function makeServeCommand() {
11112
11367
  process.exitCode = 1;
11113
11368
  return;
11114
11369
  }
11115
- const dirProblem = (await import('../serve-preflight-GQY5DZX6.js')).checkServeProjectDir(
11370
+ const dirProblem = (await import('../serve-preflight-AADSOUO2.js')).checkServeProjectDir(
11116
11371
  opts.projectDir
11117
11372
  );
11118
11373
  if (dirProblem) {
@@ -11141,7 +11396,7 @@ function makeServeCommand() {
11141
11396
  }
11142
11397
  let providers = parseProviderIds(opts.providers);
11143
11398
  if (!managedCodex) {
11144
- const { resolveServeProvider } = await import('../serve-preflight-GQY5DZX6.js');
11399
+ const { resolveServeProvider } = await import('../serve-preflight-AADSOUO2.js');
11145
11400
  const picked = resolveServeProvider(opts.projectDir, opts.provider, providers);
11146
11401
  if ("problem" in picked) {
11147
11402
  logErr(picked.problem);
@@ -11151,9 +11406,9 @@ function makeServeCommand() {
11151
11406
  providers = [...picked.providers];
11152
11407
  }
11153
11408
  const modelEndpoint = parseModelEndpointFlag(opts.modelEndpoint);
11154
- const { checkHarnessSdk: checkHarnessSdk2, checkModelEndpointPeer, checkServeModel } = await import('../serve-preflight-GQY5DZX6.js');
11155
- const { checkServeHarness, checkServeAgentDefinition } = await import('../serve-preflight-GQY5DZX6.js');
11156
- const startProblem = managedCodex ? null : await checkServeHarness(opts.projectDir, opts.harness) ?? checkServeAgentDefinition(opts.projectDir);
11409
+ const { checkHarnessSdk: checkHarnessSdk2, checkModelEndpointPeer, checkServeModel } = await import('../serve-preflight-AADSOUO2.js');
11410
+ const { checkServeHarness, checkServeAgents } = await import('../serve-preflight-AADSOUO2.js');
11411
+ const startProblem = managedCodex ? null : await checkServeHarness(opts.projectDir, opts.harness) ?? checkServeAgents(opts.projectDir);
11157
11412
  if (startProblem) {
11158
11413
  logErr(startProblem);
11159
11414
  process.exitCode = 1;
@@ -11219,12 +11474,12 @@ function makeServeCommand() {
11219
11474
  );
11220
11475
  }
11221
11476
  async function ensurePluginsLoadedForServe(projectDir) {
11222
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-YHDQHQEQ.js');
11477
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-PJNUTZXZ.js');
11223
11478
  try {
11224
11479
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
11225
11480
  const config = resolveSkWorkspaceConfig2(projectDir);
11226
11481
  if (!config.plugins || config.plugins.length === 0) return;
11227
- const { ensurePluginsLoaded } = await import('../plugin-store-NGRUTCJI.js');
11482
+ const { ensurePluginsLoaded } = await import('../plugin-store-OJTERUEZ.js');
11228
11483
  const { pluginRegistry } = await import('../plugin-registry/index.js');
11229
11484
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
11230
11485
  if (result.loaded.length > 0) {
@@ -11238,14 +11493,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
11238
11493
  }
11239
11494
  }
11240
11495
  async function runCompileTest(opts) {
11241
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-YHDQHQEQ.js');
11496
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-PJNUTZXZ.js');
11242
11497
  const { tmpdir } = await import('os');
11243
11498
  const { dirname: dirname3, join: join6, resolve: resolve4 } = await import('path');
11244
11499
  const { fileURLToPath: fileURLToPath2 } = await import('url');
11245
11500
  const { unlinkSync, existsSync: existsSync22 } = await import('fs');
11246
11501
  const { spawn } = await import('child_process');
11247
11502
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
11248
- const { MONOREPO_ROOT } = await import('../paths-XLKCAFRZ.js');
11503
+ const { MONOREPO_ROOT } = await import('../paths-RPK5PNZQ.js');
11249
11504
  if (MONOREPO_ROOT === null) {
11250
11505
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
11251
11506
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -11962,7 +12217,9 @@ async function requireSession(projectDir, idOrPrefix) {
11962
12217
  }
11963
12218
  const session = runId ? await loadSessionById(projectDir, runId) : null;
11964
12219
  if (!runId || !session) {
11965
- logErr(`Session not found: ${idOrPrefix}`);
12220
+ const hint = await sessionIdsHint(projectDir);
12221
+ logErr(`Session not found: ${idOrPrefix}${hint ? `
12222
+ ${hint}` : ""}`);
11966
12223
  process.exit(1);
11967
12224
  }
11968
12225
  return { runId, session };
@@ -12203,8 +12460,8 @@ function makeStoreCommand() {
12203
12460
  "--all",
12204
12461
  `List every match (default: ${STORE_ROW_LIMIT} rows, only what \`skaile add\` can install)`
12205
12462
  ).option("-C, --project-dir <dir>", "Project directory (catalog config overlay)", process.cwd()).action(async (query, opts) => {
12206
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BVQCB37E.js');
12207
- const { getKnownKinds: getKnownKinds2 } = await import('../open-registry-JCSIAKEC.js');
12463
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-R5EZROFN.js');
12464
+ const { getKnownKinds: getKnownKinds2 } = await import('../open-registry-RZW2AFD6.js');
12208
12465
  const projectDir = path19__default.resolve(opts.projectDir);
12209
12466
  if (opts.kind && !getKnownKinds2().has(opts.kind)) {
12210
12467
  logErr(
@@ -12262,8 +12519,8 @@ function makeStoreCommand() {
12262
12519
  }
12263
12520
  });
12264
12521
  store.command("show <ref>").description("Show a store asset's details + provenance (source, files, integrity)").option("-C, --project-dir <dir>", "Project directory (catalog config overlay)", process.cwd()).action(async (ref, opts) => {
12265
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-BVQCB37E.js');
12266
- const { supportsInstallManifest: supportsInstallManifest2 } = await import('../project-BGYMLAS6.js');
12522
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError: LocalCatalogDisabledError2 } = await import('../open-library-R5EZROFN.js');
12523
+ const { supportsInstallManifest: supportsInstallManifest2 } = await import('../project-S2FT3LLR.js');
12267
12524
  try {
12268
12525
  parseAssetRef(ref);
12269
12526
  } catch (e) {
@@ -12543,11 +12800,12 @@ function makeUpdateCommand() {
12543
12800
  }
12544
12801
  reportRewritten(result.rewritten);
12545
12802
  for (const r of result.removed) logWarn(`Removed: ${r}`);
12803
+ for (const f of result.agentFilesRemoved ?? []) logWarn(`Removed: ${f}`);
12546
12804
  reportReplaced(result.replaced);
12547
12805
  reportRelocked(result.relocked);
12548
12806
  reportMoved(result.moved);
12549
- await pinComposedAgents(projectDir);
12550
- const changed = result.deployed.length > 0 || result.removed.length > 0 || !!result.replaced?.length || !!result.moved?.length || !!result.relocked?.length;
12807
+ if (!failed) await pinComposedAgents(projectDir, { repin: true });
12808
+ const changed = result.deployed.length > 0 || result.removed.length > 0 || !!result.replaced?.length || !!result.agentFilesRemoved?.length || !!result.moved?.length || !!result.relocked?.length;
12551
12809
  if (result.lockWritten) {
12552
12810
  logInfo(`Lock file written: ${S.dim("skaile.lock.yaml")}`);
12553
12811
  }
@@ -12680,7 +12938,7 @@ async function updateOne(am2, projectDir, target, force) {
12680
12938
  return;
12681
12939
  }
12682
12940
  spinner.stop(process.exitCode === 1 ? "Failed" : "Done");
12683
- await pinComposedAgents(projectDir);
12941
+ if (process.exitCode !== 1) await pinComposedAgents(projectDir, { repin: true });
12684
12942
  for (const d of deployed) logOk(`Updated ${d}`);
12685
12943
  if (deployed.length > 0) return;
12686
12944
  if (readText2(lockPath) !== before) logInfo(`Re-locked ${target.ref}`);
@@ -12879,7 +13137,8 @@ function makeWhyCommand() {
12879
13137
  }
12880
13138
  const otherKind = await am2.otherKindHint(ref);
12881
13139
  if (otherKind) {
12882
- logErr(`${ref} is not a locked skill. ${otherKind}`);
13140
+ const kinded = /^[^@/#\s]+:/.test(ref.trim());
13141
+ logErr(`${ref} is not ${kinded ? "locked" : "a locked skill"}. ${otherKind}`);
12883
13142
  process.exitCode = 1;
12884
13143
  return;
12885
13144
  }
@@ -13063,6 +13322,17 @@ Advanced:
13063
13322
  connector ... Connector operations
13064
13323
  path Show resolved paths
13065
13324
 
13325
+ More:
13326
+ asset import|migrate|install|list|show Author and install AI assets
13327
+ migrate providers|agents|assets|harness One-time config and asset migrations
13328
+ providers list|add|set|rm|test AI provider registry
13329
+ auth status|set-key-strategy Secret key strategy and provider status
13330
+ cache clean|dir|size Inspect and reclaim the re-derivable cache
13331
+ npx skills add <url> Compatibility shim for npx skills syntax
13332
+ rebuild Re-snapshot composition items, bump prompt version
13333
+ verify Verify installed assets against store signatures
13334
+ complete --shell <shell> Shell completion script (zsh | bash | fish)
13335
+
13066
13336
  Run skaile <command> --help for per-command options.
13067
13337
  `;
13068
13338
  }
@@ -13171,6 +13441,9 @@ async function initGitScaffold(resolved, created) {
13171
13441
  ".skaile/providers.yml",
13172
13442
  ".skaile/history.yaml",
13173
13443
  ".skaile/model-endpoint.json",
13444
+ // Machine state of the runs: one compiled-prompt snapshot per run, and the ledger of the
13445
+ // agent files an install wrote.
13446
+ ...RUN_STATE_GITIGNORE_ENTRIES,
13174
13447
  // Per-machine files a run writes into the project: the system prompt handed to the harness
13175
13448
  // (it carries the host path) and omp's session logs.
13176
13449
  ".codex/skaile-session-instructions.md",
@@ -13181,6 +13454,8 @@ async function initGitScaffold(resolved, created) {
13181
13454
  // extension: it is committed, so it is not listed here.
13182
13455
  ".codex/config.toml",
13183
13456
  ".skaile/plugin-state.json",
13457
+ // What the plugin store installed on this machine; a clone that took it along would skip the install.
13458
+ ".skaile/plugins/.reconcile-hash",
13184
13459
  // `.mcp.json` and `.skaile/assets/` are committed on purpose, so they are not listed: the
13185
13460
  // entries use `.` for the project root and secrets are only `${NAME}` references, so the
13186
13461
  // files read the same in every clone (p1294).
@@ -13227,7 +13502,7 @@ async function bootstrapUserConfig() {
13227
13502
  }
13228
13503
  async function hydrateInitSources(resolved, created) {
13229
13504
  try {
13230
- const { ensureSourcesCloned } = await import('../ensure-sources-6O54DUQB.js');
13505
+ const { ensureSourcesCloned } = await import('../ensure-sources-F6VQDCWY.js');
13231
13506
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
13232
13507
  for (const n of hydrate.cloned) created.push(`~/.skaile/cache/sources/${n}/`);
13233
13508
  if (hydrate.failed.length > 0) {
@@ -13268,7 +13543,7 @@ function printInitSummary(resolved, projectDir, created) {
13268
13543
  }
13269
13544
  program.hook("preAction", (_program, actionCommand) => setActiveCommand(actionCommand));
13270
13545
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
13271
- const { cmdSetup } = await import('../setup-2NWSKSCO.js');
13546
+ const { cmdSetup } = await import('../setup-HOAJHUFQ.js');
13272
13547
  await cmdSetup([], { projectDir: process.cwd() });
13273
13548
  });
13274
13549
  program.addCommand(makeInstallCommand());
@@ -13349,7 +13624,7 @@ program.hook("postAction", async (_thisCommand, actionCommand) => {
13349
13624
  const opts = actionCommand.opts();
13350
13625
  if (opts.global || opts.dryRun) return;
13351
13626
  const projectDir = path19__default.resolve(opts.projectDir ?? process.cwd());
13352
- const { refreshPluginSkills } = await import('../claude-code-JY6CYEG7.js');
13627
+ const { refreshPluginSkills } = await import('../claude-code-BLFRZU2X.js');
13353
13628
  try {
13354
13629
  if (await refreshPluginSkills(projectDir)) {
13355
13630
  logInfo(`Updated ${S.cmd(".claude/plugins/skaile/skills")} (the --full plugin copy)`);
@@ -13368,6 +13643,7 @@ process.once("beforeExit", () => {
13368
13643
  process.exit(1);
13369
13644
  });
13370
13645
  setLibraryAssetCheck((asset, libraryPath) => [
13646
+ ...manifestEntryRootRefusals(libraryPath, asset.kind, asset.name),
13371
13647
  ...manifestEntryFilesRefusals(libraryPath, asset.kind, asset.name),
13372
13648
  ...libraryAssetRefusals(asset, libraryPath, getKindRegistry())
13373
13649
  ]);